TensorFlow モデルのトレーニング後、アプリケーションから呼び出せるように、ネットワークアクセス可能な API として公開する必要があります。このガイドでは、Arena を使用して TensorFlow SavedModel を Container Service for Kubernetes (ACK) クラスター上の TensorFlow Serving 推論サービスとしてデプロイする方法を説明します。これには、Object Storage Service (OSS) へのモデルのアップロード、永続ストレージの設定、サービングインスタンスの起動、Ingress を介した外部アクセスなどが含まれます。
前提条件
開始する前に、以下が準備できていることを確認してください。
このガイドでは、TensorFlow 1.15 でトレーニングされ、SavedModel としてエクスポートされた BERT モデルを使用します。
モデルストレージの準備
ステップ 1: 利用可能な GPU リソースの確認
次のコマンドを実行して、クラスター内の GPU の可用性を確認します。
arena top node出力には、すべての GPU ノードとその割り当て状況が一覧表示されます。
NAME IPADDRESS ROLE STATUS GPU(Total) GPU(Allocated)
cn-beijing.192.168.0.100 192.168.0.100 <none> Ready 1 0
cn-beijing.192.168.0.101 192.168.0.101 <none> Ready 1 0
cn-beijing.192.168.0.99 192.168.0.99 <none> Ready 1 0
---------------------------------------------------------------------------------------------------
Allocated/Total GPUs of nodes which own resource nvidia.com/gpu In Cluster:
0/3 (0.0%)このクラスターには 3 つの GPU ノードがあり、それぞれに未割り当ての GPU が 1 つあります。
ステップ 2: モデルの OSS へのアップロード
以下の手順では、Linux 上で ossutil を使用します。他のオペレーティングシステムについては、「ossutil」をご参照ください。
examplebucketという名前のバケットを作成します。ossutil64 mb oss://examplebucket次の出力は、バケットが作成されたことを確認します。
0.668238(s) elapsedSavedModel をバケットにアップロードします。
ossutil64 cp model.savedmodel oss://examplebucket
ステップ 3: 永続ボリューム (PV) と永続ボリューム要求 (PVC) の作成
OSS バケットをサービングコンテナ内のボリュームとしてマウントするには、永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成します。
Tensorflow.yamlという名前のファイルに次の内容を記述して作成します。apiVersion: v1 kind: PersistentVolume metadata: name: model-csi-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: model-csi-pv # Must match the PV name above volumeAttributes: bucket: "Your Bucket" url: "Your oss url" akId: "Your Access Key Id" akSecret: "Your Access Key Secret" otherOpts: "-o max_stat_cache_size=0 -o allow_other" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: model-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi次のパラメーターを置き換えます。
パラメーター 説明 bucketOSS バケットの名前。命名規則については、「バケットの命名規則」をご参照ください。 urlバケットのエンドポイント URL。URL の取得方法については、「単一または複数のオブジェクトの URL の取得」をご参照ください。 akIdOSS バケットへのアクセスに使用される AccessKey ID。Resource Access Management (RAM) ユーザーの AccessKey を使用してください。詳細については、「AccessKey ペアの作成」をご参照ください。 akSecret上記の AccessKey ID とペアになる AccessKey Secret。 otherOptsOSS バケットのカスタムマウントオプション。 -o max_stat_cache_size=0はメタデータキャッシングを無効にし、システムが常に最新のオブジェクトのメタデータを OSS から読み取るようにします。-o allow_otherは、ノード上の他のユーザーがマウントされたバケットにアクセスできるようにします。追加のオプションについては、「ossfs でサポートされるカスタムパラメーター」をご参照ください。マニフェストを適用して PV と PVC を作成します。
kubectl apply -f Tensorflow.yaml
推論サービスのデプロイ
ステップ 4: TensorFlow Serving の起動
次のコマンドを実行して、bert-tfserving という名前の TensorFlow Serving インスタンスをデプロイします。
arena serve tensorflow \
--name=bert-tfserving \
--model-name=chnsenticorp \
--gpus=1 \
--image=tensorflow/serving:1.15.0-gpu \
--data=model-pvc:/models \
--model-path=/models/tensorflow \
--version-policy=specific:1623831335| パラメーター | 説明 |
|---|---|
--name | サービングジョブの名前。 |
--model-name | TensorFlow Serving が API リクエストでモデルを識別するために使用するモデル名。 |
--gpus | サービングインスタンスに割り当てる GPU の数。 |
--image | TensorFlow Serving のコンテナイメージ。トレーニング中に使用した TensorFlow のバージョンと一致する必要があります。 |
--data | PVC をコンテナにマウントします。フォーマット: <pvc-name>:<mount-path>。 |
--model-path | モデルが格納されているコンテナ内のパス。 |
--version-policy | ロードするモデルのバージョン。specific:<version> は、サービングを単一のバージョンに固定します。 |
次の出力は、ジョブが送信されたことを確認します。
configmap/bert-tfserving-202106251556-tf-serving created
configmap/bert-tfserving-202106251556-tf-serving labeled
configmap/bert-tfserving-202106251556-tensorflow-serving-cm created
service/bert-tfserving-202106251556-tensorflow-serving created
deployment.apps/bert-tfserving-202106251556-tensorflow-serving created
INFO[0003] The Job bert-tfserving has been submitted successfully
INFO[0003] You can run `arena get bert-tfserving --type tf-serving` to check the job statusステップ 5: サービスの実行状況の確認
実行中のすべての推論サービスを一覧表示します。
arena serve list出力には、bert-tfserving サービスとそのアドレスおよびポートが表示されます。
NAME TYPE VERSION DESIRED AVAILABLE ADDRESS PORTS
bert-tfserving Tensorflow 202106251556 1 1 172.16.95.171 GRPC:8500,RESTFUL:8501サービスの詳細を取得します。
arena serve get bert-tfservingName: bert-tfserving
Namespace: inference
Type: Tensorflow
Version: 202106251556
Desired: 1
Available: 1
Age: 4m
Address: 172.16.95.171
Port: GRPC:8500,RESTFUL:8501
Instances:
NAME STATUS AGE READY RESTARTS NODE
---- ------ --- ----- -------- ----
bert-tfserving-202106251556-tensorflow-serving-8554d58d67-jd2z9 Running 4m 1/1 0 cn-beijing.192.168.0.88サービスは inference 名前空間にデプロイされます。ポート 8500 は gRPC リクエストを、ポート 8501 は HTTP/RESTful リクエストを処理します。
外部からのサービスへのアクセス
arena serve tensorflow は、デフォルトでクラスター IP を割り当てますが、これはクラスター内からのみ到達可能です。外部アクセス用にサービスを公開するには、Ingress を作成します。
ステップ 6: Ingress の作成
ACK コンソールで、[クラスター] ページに移動し、対象のクラスターをクリックして、左側のナビゲーションウィンドウで [ネットワーク] > [Ingress] に移動します。
ページ上部の [名前空間] ドロップダウンリストから、
inference名前空間 (上記のサービス詳細に表示されているものと同じ名前空間) を選択します。右上隅にある [Ingress の作成] をクリックします。Ingress パラメーターの完全な説明については、「NGINX Ingress の作成」をご参照ください。次の設定を使用します。
名前:
Tensorflowルール:
ドメイン名: カスタムドメインを入力します。例:
test.example.comパス:
/ルール: ImplementationSpecific (デフォルト)
サービス名:
kubectl get serviceによって返されるサービス名ポート:
8501
Ingress が作成されたら、[Ingress] ページに戻ります。[ルール] 列に Ingress アドレスが表示されます。

ステップ 7: 推論 API の呼び出し
次のコマンドを実行して、推論サービスの API を呼び出します。TensorFlow Serving の詳細については、「TensorFlow Serving API」をご参照ください。
curl "http://<Ingress address>"成功した応答は次のようになります。
{
"model_version_status": [
{
"version": "1623831335",
"state": "AVAILABLE",
"status": {
"error_code": "OK",
"error_message": ""
}
}
]
}state: AVAILABLE フィールドは、モデルがロードされ、推論リクエストを処理する準備ができていることを確認します。