モデルが実稼働環境にデプロイする前にデプロイ基準を満たしていることを確認するには、クラウドネイティブAIスイートでサポートされているモデル分析および最適化コマンドを使用して、モデルのベンチマーク、分析、および最適化を行うことができます。 このトピックでは、PyTorchが提供するResNet18モデルを例として使用し、V100 GPUを使用してモデルを高速化します。
前提条件
Container Service for Kubernetes (ACK) Proクラスターが作成され、クラスターのKubernetesバージョンが1.20以降になります。 クラスターには、少なくとも1つのGPU高速化ノードが含まれます。 ACKクラスターの更新方法の詳細については、「ACKクラスターの更新」をご参照ください。
Object Storage Service (OSS) バケットが作成されます。 永続ボリューム (PV) と永続ボリューム要求 (PVC) が作成されます。 詳細については、「静的にプロビジョニングされたOSSボリュームのマウント」をご参照ください。
Arenaクライアントの最新バージョンがインストールされています。 詳細については、「Arenaクライアントの設定」をご参照ください。
背景情報
データ科学者はモデルの精度に焦点を当てていますが、R&Dエンジニアはモデルのパフォーマンスに関心があります。 その結果、モデルをオンラインサービスとしてリリースした後、モデルがパフォーマンス要件を満たさない場合があります。 この問題を防ぐには、モデルをリリースする前にモデルをベンチマークする必要があります。 モデルがパフォーマンス要件を満たしていない場合は、パフォーマンスのボトルネックを特定してモデルを最適化できます。
モデル解析および最適化コマンドの概要
クラウドネイティブAIスイートは、複数のモデル分析および最適化コマンドをサポートします。 コマンドを実行して、モデルをベンチマークし、ネットワーク構造を分析し、各演算子の期間を確認し、GPU使用率を表示できます。 次に、モデルのパフォーマンスのボトルネックを特定し、TensorRTを使用してモデルを最適化できます。 これにより、本番環境のパフォーマンス要件を満たすモデルをリリースできます。 次の図は、モデル分析および最適化コマンドによって支援されるモデルライフサイクルを示しています。
モデルトレーニング: モデルは、所与のデータセットに基づいてトレーニングされる。
モデルベンチマーク: モデルに対してベンチマークを実行して、モデルのレイテンシ、スループット、およびGPU使用率が要件を満たしているかどうかを確認します。
モデルプロファイル: モデルを分析してパフォーマンスのボトルネックを特定します。
モデル最適化: モデルのGPU推論機能は、TensorRTなどのツールを使用して最適化されます。
Model Serving: モデルはオンラインサービスとしてデプロイされます。
モデルを最適化した後でもモデルがパフォーマンス要件を満たしていない場合は、前のフェーズを繰り返すことができます。
コマンドの実行方法
Arenaを使用して、モデル分析、最適化、ベンチマーク、および評価ジョブをACK Proクラスターに送信できます。 arena model analyze -- help
コマンドを実行して、ヘルプ情報を表示できます。
$ arena model analyze --help
submit a model analyze job.
Available Commands:
profile Submit a model profile job.
evaluate Submit a model evaluate job.
optimize Submit a model optimize job.
benchmark Submit a model benchmark job
Usage:
arena model analyze [flags]
arena model analyze [command]
Available Commands:
benchmark Submit a model benchmark job
delete Delete a model job
evaluate Submit a model evaluate job
get Get a model job
list List all the model jobs
optimize Submit a model optimize job, this is a experimental feature
profile Submit a model profile job
を送信する
ステップ1: モデルを準備する
PyTorchモデルのデプロイにはTorchScriptを使用することを推奨します。 このトピックでは、PyTorchが提供するResNet18モデルを例として使用します。
モデルを変換します。 ResNet18モデルをTorchScriptモデルに変換し、モデルを保存します。
import torch import torchvision model = torchvision.models.resnet18(pretrained=True) # Switch the model to eval model model.eval() # An example input you would normally provide to your model's forward() method. dummy_input = torch.rand(1, 3, 224, 224) # Use torch.jit.trace to generate a torch.jit.ScriptModule via tracing. traced_script_module = torch.jit.trace(model, dummy_input) # Save the TorchScript model traced_script_module.save("resnet18.pt")
パラメーター
説明
model_name
モデルの名前。
モデル_プラットフォーム
モデルで使用されるプラットフォームまたはフレームワーク (
TorchScript
やONNX
など) 。model_path
モデルが格納されるパス。
入力
入力パラメーター。
出力
出力パラメーター。
モデルの変換後、モデル設定ファイル
resnet18.pt
をOSSにアップロードします。 設定ファイルのOSSパスは、oss:// bucketname/models/resnet18/resnet18.pt
です。 詳細については、「オブジェクトのアップロード」をご参照ください。
ステップ2: ベンチマークを実行する
モデルを運用環境にデプロイする前に、ベンチマークを実行してモデルのパフォーマンスを評価できます。 このステップでは、ベンチマークジョブがArenaで送信され、クラスターのdefault
名前空間のoss-PVC
という名前のpvcが例として使用されます。 詳細については、「静的にプロビジョニングされたOSSボリュームのマウント」をご参照ください。
モデルの構成ファイルを準備してアップロードします。
モデルの構成ファイルを作成します。 この例では、設定ファイルの名前は
config.json
です。{ "model_name": "resnet18", "model_platform": "torchscript", "model_path": "/data/models/resnet18/resnet18.pt", "inputs": [ { "name": "input", "data_type": "float32", "shape": [1, 3, 224, 224] } ], "outputs": [ { "name": "output", "data_type": "float32", "shape": [ 1000 ] } ] }
設定ファイルをOSSにアップロードします。 設定ファイルのOSSパスは、
oss:// bucketname/models/resnet18/config.json
です。
次のコマンドを実行して、ACK Proクラスターにベンチマークジョブを送信します。
arena model analyze benchmark \ --name=resnet18-benchmark \ --namespace=default \ --image=registry.cn-beijing.aliyuncs.com/kube-ai/easy-inference:1.0.2 \ --gpus=1 \ --data=oss-pvc:/data \ --model-config-file=/data/models/resnet18/config.json \ --report-path=/data/models/resnet18 \ --concurrency=5 \ --duration=60
パラメーター
説明
-- gpus
使用されるGPUの数。
-- データ
クラスターのPVCと、PVCがマウントされるパス。
-- model-config-file
設定ファイルのパス。
-- レポートパス
ベンチマークレポートが保存されるパス。
-- 並行性
同時リクエストの数。
-- duration
ベンチマークジョブの期間。 単位は秒です。
重要-- requests
と-- duration
パラメーターを同時に指定することはできません。 ベンチマークジョブを送信するときに、そのうちの1つだけを指定します。 両方を指定した場合、システムはデフォルトで-- duration
パラメーターを使用します。ベンチマークジョブによって送信されたリクエストの合計数を指定するには、
-- requests
パラメーターを指定します。
次のコマンドを実行して、ジョブのステータスを照会します。
arena model analyze list -A
期待される出力:
NAMESPACE NAME STATUS TYPE DURATION AGE GPU(Requested) default resnet18-benchmark COMPLETE Benchmark 0s 2d 1
ベンチマークレポートを表示します。
STATUS
パラメーターにCOMPLETE
と表示された場合、ベンチマークジョブは完了です。 次に、-- report-path
パラメーターで指定されたパスにbenchmark_result.txt
という名前のベンチマークレポートがあります。期待される出力:
{ "p90_latency":7.511, "p95_latency":7.86, "p99_latency":9.34, "min_latency":7.019, "max_latency":12.269, "mean_latency":7.312, "median_latency":7.206, "throughput":136, "gpu_mem_used":1.47, "gpu_utilization":21.280 }
次の表に、ベンチマークレポートに含まれるメトリックを示します。
メトリック
説明
単位
p90_latency
90パーセンタイル応答時間
ミリ秒
p95_latency
95パーセンタイル応答時間
ミリ秒
p99_latency
99パーセンタイル応答時間
ミリ秒
min_latency
最速の応答時間
ミリ秒
max_latency
最も遅い応答時間
ミリ秒
mean_latency
平均応答時間
ミリ秒
median_latency
中応答時間
ミリ秒
スループット
スループット
回
gpu_mem_used
GPUメモリ使用量
GB
gpu_utilization
GPU使用率
割合
ステップ3: モデルを分析する
ベンチマークを実行した後、arena model analyze profile
コマンドを実行してモデルを分析し、パフォーマンスのボトルネックを特定できます。
次のコマンドを実行して、モデル分析ジョブをACK Proクラスターに送信します。
arena model analyze profile \ --name=resnet18-profile \ --namespace=default \ --image=registry.cn-beijing.aliyuncs.com/kube-ai/easy-inference:1.0.2 \ --gpus=1 \ --data=oss-pvc:/data \ --model-config-file=/data/models/resnet18/config.json \ --report-path=/data/models/resnet18/log/ \ --tensorboard \ --tensorboard-image=registry.cn-beijing.aliyuncs.com/kube-ai/easy-inference:1.0.2
パラメーター
説明
-- gpus
使用されるGPUの数。
-- データ
クラスターのPVCと、PVCがマウントされるパス。
-- model-config-file
設定ファイルのパス。
-- レポートパス
分析レポートが保存されるパス。
-- tensorboard
TensorBoardで分析レポートを表示するかどうかを指定します。
-- tensorboard-イメージ
Tensorboardの展開に使用されるイメージのURL。
次のコマンドを実行して、ジョブのステータスを照会します。
arena model analyze list -A
期待される出力:
NAMESPACE NAME STATUS TYPE DURATION AGE GPU(Requested) default resnet18-profile COMPLETE Profile 13s 2d 1
次のコマンドを実行して、TensorBoardのステータスを照会します。
kubectl get service -n default
期待される出力:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE resnet18-profile-tensorboard NodePort 172.16.158.170 <none> 6006:30582/TCP 2d20h
次のコマンドを実行して、ポート転送を有効にし、TensorBoardにアクセスします。
kubectl port-forward svc/resnet18-profile-tensorboard -n default 6006:6006
期待される出力:
127.0.X.Xからの
Forwarding from 127.0.X.X:6006 -> 6006 Forwarding from [::1]:6006 -> 6006
からの転送
ブラウザのアドレスバーに
http:// localhost:6006
と入力して、分析結果を表示します。 左側のナビゲーションウィンドウで、[ビュー] をクリックして、複数のディメンションに基づく分析結果を表示し、パフォーマンスのボトルネックを特定します。 分析結果に基づいてモデルを最適化できます。
ステップ4: モデルを最適化する
Arenaを使用してモデルを最適化できます。
次のコマンドを実行して、モデル最適化ジョブをACK Proクラスターに送信します。
arena model analyze optimize \ --name=resnet18-optimize \ --namespace=default \ --image=registry.cn-beijing.aliyuncs.com/kube-ai/easy-inference:1.0.2 \ --gpus=1 \ --data=oss-pvc:/data \ --optimizer=tensorrt \ --model-config-file=/data/models/resnet18/config.json \ --export-path=/data/models/resnet18
パラメーター
説明
-- gpus
使用されるGPUの数。
-- データ
クラスターのPVCと、PVCがマウントされるパス。
-- optimizer
最適化メソッド。 有効な値:
tensorrt
(デフォルト)aiacc-トーチ
-- model-config-file
設定ファイルのパス。
-- export-path
最適化されたモデルが格納されるパス。
次のコマンドを実行して、ジョブのステータスを照会します。
arena model analyze list -A
期待される出力:
NAMESPACE NAME STATUS TYPE DURATION AGE GPU(Requested) default resnet18-optimize COMPLETE Optimize 16s 2d 1
最適化モデルの設定ファイルを表示します。
STATUS
パラメーターにCOMPLETE
と表示された場合、最適化ジョブは完了です。 次に、-- export-path
パラメーターで指定されたパスにopt_resnet18.pt
という名前の設定ファイルがあります。ベンチマークジョブの
-- model_path
パラメーターの値を、前の手順で取得した設定ファイルのパスに変更し、ベンチマークを再度実行します。 ベンチマークの実行方法の詳細については、「手順2: ベンチマークの実行」をご参照ください。次の表に、モデルを最適化する前後のメトリック値を示します。
メトリック
最適化の前
最適化後
p90_latency
7.511ミリ秒
5.162ミリ秒
p95_latency
7.86ミリ秒
5.428ミリ秒
p99_latency
9.34ミリ秒
6.64ミリ秒
min_latency
7.019ミリ秒
4.827ミリ秒
max_latency
12.269ミリ秒
8.426ミリ秒
mean_latency
7.312ミリ秒
5.046ミリ秒
median_latency
7.206ミリ秒
4.972ミリ秒
スループット
136回
198回
gpu_mem_used
1.47 GB
1.6 GB
gpu_utilization
21.280%
10.912%
統計は、モデルのパフォーマンスとGPU使用率が最適化後に大幅に改善されることを示しています。 それでもモデルがパフォーマンス要件を満たしていない場合は、上記の手順を繰り返してモデルを分析および最適化できます。
ステップ5: モデルのデプロイ
モデルがパフォーマンス要件を満たしている場合は、モデルをオンラインサービスとしてデプロイできます。 Arenaでは、NVIDIA Triton Inference Serverを使用してTorchScriptモデルをデプロイできます。 詳細については、「Nvidia Triton Server」をご参照ください。
config.pbtxt
という名前の設定ファイルを作成します。重要ファイル名は変更しないでください。
name: "resnet18" platform: "pytorch_libtorch" max_batch_size: 1 default_model_filename: "opt_resnet18.pt" input [ { name: "input__0" format: FORMAT_NCHW data_type: TYPE_FP32 dims: [ 3, 224, 224 ] } ] output [ { name: "output__0", data_type: TYPE_FP32, dims: [ 1000 ] } ]
説明構成ファイルのパラメーターの詳細については、「モデルリポジトリ」をご参照ください。
OSSに次のディレクトリ構造を作成します。
oss://bucketname/triton/model-repository/ resnet18/ config.pbtxt 1/ opt_resnet18.pt
説明1/
はNVIDIA Triton Inference Serverの規約です。 値は、モデルのバージョン番号を示します。 モデルリポジトリは、モデルの異なるバージョンを格納できます。 詳細については、「モデルリポジトリ」をご参照ください。Arenaを使用してモデルをデプロイします。 モデルは、GPU共有モードまたはGPU排他モードでデプロイできます。
GPU排他モード: このモードを使用して、高い安定性を必要とする推論サービスをデプロイできます。 このモードでは、各GPUは1つのモデルのみを加速します。 モデルはGPUリソースと競合しません。 次のコマンドを実行して、GPU排他モードでモデルをデプロイできます。
arena serve triton \ --name=resnet18-serving \ --gpus=1 \ --replicas=1 \ --image=nvcr.io/nvidia/tritonserver:21.05-py3 \ --data=oss-pvc:/data \ --model-repository=/data/triton/model-repository \ --allow-metrics=true
GPU共有モード: このモードを使用して、ロングテール推論サービスまたはコスト効率が必要な推論サービスをデプロイできます。 このモードでは、GPUは複数のモデルで共有されます。 各モデルは、指定された量のGPUメモリのみを使用できます。 次のコマンドを実行して、モデルをGPU共有モードでデプロイできます。
モデルをGPU共有モードでデプロイする場合は、
-- gpumemory
パラメーターを設定する必要があります。 このパラメータは、各ポッドに割り当てられるメモリの量を指定します。 ベンチマーク結果のgpu_mem_used
メトリックに基づいて適切な値を指定できます。 たとえば、gpu_mem_used
メトリックの値が1.6 GBの場合、-- gpumemory
パラメーターを2 GBに設定できます。 このパラメーターの値は正の整数でなければなりません。arena serve triton \ --name=resnet18 \ --gpumemory=2 \ --replicas=1 \ --image=nvcr.io/nvidia/tritonserver:21.12-py3 \ --data=oss-pvc:/data \ --model-repository=/data/triton/model-repository \ --allow-metrics=true
次のコマンドを実行して、デプロイメントのステータスを照会します。
arena serve list -A
期待される出力:
NAMESPACE NAME TYPE VERSION DESIRED AVAILABLE ADDRESS PORTS GPU default resnet18-serving Triton 202202141817 1 1 172.16.147.248 RESTFUL:8000,GRPC:8001 1
AVAILABLE
パラメーターの値がDESIRED
パラメーターの値と等しい場合、モデルがデプロイされます。