NVIDIA Triton Inference Server または TorchServe を使用して、学習済みの PyTorch モデルを ACK 上の GPU 加速推論サービスとしてデプロイします。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
-
GPU ノードを含む Kubernetes クラスター。詳細については、「クラスターへの GPU ノードの追加」をご参照ください。
-
クラスターノードからのインターネットアクセス。詳細については、「クラスターノードによるインターネットへのアクセス許可」をご参照ください。
-
Arena コンポーネントのインストール。詳細については、「Arena クライアントの構成」をご参照ください。
デプロイ方法の選択
| 方法 | 推奨用途 |
|---|---|
| Triton(推奨) | マルチフレームワーク対応、KFServing 互換 API、RESTful および gRPC エンドポイントを備えた本番運用向けサービング |
| TorchServe | PyTorch 専用モデル、マルチフレームワーク要件のない簡易セットアップ |
ほとんどの本番運用シナリオでは、Triton の採用を推奨します。これは、複数のモデルフレームワークをサポートし、KFServing 互換の RESTful および gRPC エンドポイントを提供するためです。ワークフローが PyTorch ネイティブであり、軽量なセットアップを希望する場合は、TorchServe をご使用ください。
Triton によるデプロイ(推奨)
この例では、PyTorch 1.16 で学習された BERT(Bidirectional Encoder Representations from Transformers)モデルをデプロイします。まず、モデルを TorchScript に変換し、Object Storage Service (OSS) にアップロードします。その後、永続ボリューム要求 (PVC) を介してクラスターにマウントし、NVIDIA Triton Inference Server を使用してデプロイします。
ステップ 1:モデルの準備
1.1 モデルの学習と変換
スタンドアロンの PyTorch トレーニングジョブを実行し、PyTorch モデルを TorchScript に変換します。詳細については、「Arena を使用したスタンドアロン PyTorch トレーニングジョブの送信」をご参照ください。
1.2 利用可能な GPU リソースの確認
arena top node
期待される出力:
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%)
クラスターには、現在割り当てられていない GPU ノードが 3 台あります。
ステップ 2:モデルリポジトリの構造化
Triton では、特定のディレクトリ構造が必要です。
<model-repository>/
<model-name>/
config.pbtxt
<version>/
<model-definition-file>
この例における構造は以下のとおりです。
triton/
└── chnsenticorp/ # モデル名
├── 1623831335/ # モデルバージョン
│ └── model.savedmodel/
│ ├── saved_model.pb
│ └── variables/
│ ├── variables.data-00000-of-00001
│ └── variables.index
└── config.pbtxt # Triton 構成ファイル
ステップ 3:モデルの OSS へのアップロード
以下のコマンドは Linux に適用されます。その他のオペレーティングシステムについては、「ossutil」をご参照ください。
-
examplebucketという名前のバケットを作成します。ossutil64 mb oss://examplebucket以下の出力が表示された場合、バケットの作成に成功しています。
0.668238(s) elapsed -
モデルをアップロードします。
ossutil64 cp model.savedmodel oss://examplebucket
ステップ 4:PV および PVC の作成
-
以下のテンプレートを使用して、
pytorch-pv-pvc.yamlという名前のファイルを作成します。パラメーター 説明 bucketOSS バケット名。OSS 内でグローバルに一意である必要があります。「バケット命名規則」をご参照ください。 urlOSS バケットへのアクセスに使用する URL。「単一ファイルまたは複数ファイルの URL の取得」をご参照ください。 akIdOSS アクセス用の AccessKey ID。権限を制限するため、RAM ユーザーの認証情報を使用してください。「AccessKey ペアの作成」をご参照ください。 akSecretAccessKey ID に対応する AccessKey Secret。 otherOptsOSS バケットのマウントオプション。 -o max_stat_cache_size=0により属性キャッシュが無効化され、各ファイルアクセス時に最新の属性が OSS から取得されます。-o allow_otherossfs の対応パラメーターオプション により、他のユーザーがマウントされたファイルシステムにアクセスできるようになります。「」をご参照ください。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 # PV 名と同一である必要があります。 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 namespace: inference spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi以下のパラメーターを置き換えます。
-
PV および PVC を作成します。
kubectl apply -f pytorch-pv-pvc.yaml
ステップ 5:モデルのデプロイ
arena serve triton \
--name=bert-triton \
--namespace=inference \
--gpus=1 \
--replicas=1 \
--image=nvcr.io/nvidia/tritonserver:20.12-py3 \
--data=model-pvc:/models \
--model-repository=/models/triton
期待される出力:
configmap/bert-triton-202106251740-triton-serving created
configmap/bert-triton-202106251740-triton-serving labeled
service/bert-triton-202106251740-tritoninferenceserver created
deployment.apps/bert-triton-202106251740-tritoninferenceserver created
INFO[0001] The Job bert-triton has been submitted successfully
INFO[0001] You can run `arena get bert-triton --type triton-serving` to check the job status
TorchServe によるデプロイ
この方法では、モデルを .mar(Model Archive)形式にパッケージ化し、TorchServe でサービングします。
ステップ 1:モデルのパッケージ化
torch-model-archiver を使用して、PyTorch モデルを .mar 形式にパッケージ化します。詳細については、「torch-model-archiver」をご参照ください。
ステップ 2:モデルの OSS へのアップロード
以下のコマンドは Linux 用です。その他のオペレーティングシステムの場合、「ossutil」をご参照ください。
-
examplebucketという名前のバケットを作成します。ossutil64 mb oss://examplebucket以下の出力が表示された場合、バケットの作成に成功しています。
0.668238(s) elapsed -
モデルをアップロードします。
ossutil64 cp model.savedmodel oss://examplebucket
ステップ 3:PV および PVC の作成
-
Triton 方法と同じテンプレートを使用して、
pytorch-pv-pvc.yamlという名前のファイルを作成します。「ステップ 4」でテンプレートおよびパラメーターの説明をご確認ください。 -
PV および PVC を作成します。
kubectl apply -f pytorch-pv-pvc.yaml
ステップ 4:モデルのデプロイ
arena serve custom \
--name=torchserve-demo \
--gpus=1 \
--replicas=1 \
--image=pytorch/torchserve:0.4.2-gpu \
--port=8000 \
--restful-port=8001 \
--metrics-port=8002 \
--data=model-pvc:/data \
'torchserve --start --model-store /data/models --ts-config /data/config/ts.properties'
--model-storeパスは、マウントされた PVC 内のモデルの実際のパスと一致している必要があります。イメージは、公式のpytorch/torchserveイメージまたはカスタム TorchServe イメージのいずれかを使用できます。
期待される出力:
service/torchserve-demo-202109101624 created
deployment.apps/torchserve-demo-202109101624-custom-serving created
INFO[0001] The Job torchserve-demo has been submitted successfully
INFO[0001] You can run `arena get torchserve-demo --type custom-serving` to check the job status
推論サービスの検証
以下の手順では、Triton デプロイ(bert-triton)を例として説明します。
-
デプロイメントのステータスを確認します。
arena serve list -n inference期待される出力:
NAME TYPE VERSION DESIRED AVAILABLE ADDRESS PORTS bert-triton Triton 202106251740 1 1 172.16.70.14 RESTFUL:8000,GRPC:8001 -
デプロイメントの詳細を取得します。
arena serve get bert-triton -n inference期待される出力:
Name: bert-triton Namespace: inference Type: Triton Version: 202106251740 Desired: 1 Available: 1 Age: 5m Address: 172.16.70.14 Port: RESTFUL:8000,GRPC:8001 Instances: NAME STATUS AGE READY RESTARTS NODE ---- ------ --- ----- -------- ---- bert-triton-202106251740-tritoninferenceserver-667cf4c74c-s6nst Running 5m 1/1 0 cn-beijing.192.168.0.89このサービスは、RESTful 用ポート 8000 および gRPC 用ポート 8001 の 2 つの API エンドポイントを公開します。
-
サービスを外部から利用可能にします。NVIDIA Triton Inference Server はデフォルトで ClusterIP を使用するため、クラスター外から推論 API を呼び出すには、パブリック Ingress を構成する必要があります。
-
クラスター ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウから、ネットワーク > Ingresses を選択します。
-
名前空間 リストから、
inference名前空間を選択します。 -
右上隅の Ingress の作成 をクリックします。
-
サービス名 を
bert-tritonに設定します。 -
RESTful ポート を
8501に設定します。 -
他のパラメーターを必要に応じて設定します。詳細については、「Nginx Ingress を作成してサービスを公開する」をご参照ください。
-
-
-
Ingress が作成された後、ルール 列の Ingresses ページで Ingress アドレスを確認します。

-
Ingress アドレスを使用して推論 API を呼び出します。NVIDIA Triton Inference Server は KFServing API 仕様に準拠しています。完全な API リファレンスについては、「NVIDIA Triton Server API」をご参照ください。
curl "http://<Ingress address>"期待される出力:
{ "name":"chnsenticorp", "versions":[ "1623831335" ], "platform":"tensorflow_savedmodel", "inputs":[ { "name":"input_ids", "datatype":"INT64", "shape":[ -1, 128 ] } ], "outputs":[ { "name":"probabilities", "datatype":"FP32", "shape":[ -1, 2 ] } ] }