PAI-Blade は、単一の Python 呼び出しを通じてハードウェア固有の最適化を適用することで、PyTorch モデルの推論を高速化します。本ガイドでは、NVIDIA Tesla T4 GPU を使用した ResNet50 モデルを例として、モデルの読み込みからベンチマーク結果の評価までの一連の最適化ワークフローを説明します。
学習内容:
PyTorch モデルを PAI-Blade で使用可能な ScriptModule 形式に変換する方法
blade.optimizeの呼び出し方と、そのパラメーターおよび戻り値の解釈方法最適化レポートの読み取り方および推論速度向上率の測定方法
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
PyTorch および PAI-Blade の WHL パッケージがインストール済みであること。詳細については、「PAI-Blade のインストール」をご参照ください。
トレーニング済みの PyTorch モデルがあること。本ガイドでは、torchvision から提供される公開 ResNet50 モデルを使用します。
PyTorch モデルの最適化
ステップ 1:依存関係のインポート
import os
import time
import torch
import torchvision.models as models
import bladeステップ 2:モデルの読み込みと変換
PAI-Blade は torch.jit.ScriptModule オブジェクトのみを受け付けます。標準の nn.Module モデルはサポートされません。PAI-Blade に渡す前に、torch.jit.script を使用してモデルを変換してください。
model = models.resnet50().float().cuda() # ResNet50 モデルを読み込みます。
model = torch.jit.script(model).eval() # ScriptModule に変換します。
dummy = torch.rand(1, 3, 224, 224).cuda() # テスト用入力テンソルを作成します。ステップ 3:最適化の実行
blade.optimize を呼び出してモデルを最適化します。このメソッドは以下の主要なパラメーターを受け付けます。
| パラメーター | 説明 | 本例での値 |
|---|---|---|
model | 最適化対象のモデル | model(メモリ上の ScriptModule) |
'o1' | 最適化レベル。有効な値: o1 および o2 | 'o1' |
device_type | 推論対象のデバイスタイプ。有効な値: gpu、cpu | 'gpu' |
test_data | 代表的な入力テンソル。タプルのリストを指定します。各タプルが 1 セットの入力に対応します。 | [(dummy,)] |
全パラメーターのリファレンスについては、「Python メソッド」をご参照ください。
optimized_model, opt_spec, report = blade.optimize(
model, # 最適化対象のモデル。
'o1', # 最適化レベル。
device_type='gpu', # 対象デバイスタイプ。
test_data=[(dummy,)], # テスト用入力データ。
)blade.optimize は以下の 3 つのオブジェクトを返します。
`optimized_model`:推論に即時使用可能な、最適化済みの
torch.jit.ScriptModuleオブジェクト。`opt_spec`:最適化の再現に必要な外部依存関係(構成、環境変数、リソースファイル)。これらの依存関係を有効化するには、Python の
with文を使用します。`report`:最適化レポート。直接出力可能です。各フィールドの詳細については、「最適化レポート」をご参照ください。
最適化には時間がかかります。 PAI-Blade は、最適化済みモデルを生成する前に複数の分析フェーズを実行します。最適化の進行状況は以下のように表示されます。
[Progress] 5%, phase: user_test_data_validation.
[Progress] 10%, phase: test_data_deduction.
[Progress] 15%, phase: CombinedSwitch_4.
[Progress] 95%, phase: model_collecting.このコンパイルは 1 回限りのコストです。最適化が完了すると、optimized_model を使用した推論は、元のモデルよりも一貫して高速になります。
ステップ 4:最適化レポートの確認
print("Report: {}".format(report))レポートには、適用された最適化とそのレイテンシーへの影響が示されます。サンプルレポートを以下に示します。
{
"optimizations": [
{
"name": "PtTrtPassFp32",
"status": "effective",
"speedup": "1.50", // この最適化による速度向上率。
"pre_run": "5.29 ms", // 最適化前のレイテンシー。
"post_run": "3.54 ms" // 最適化後のレイテンシー。
}
],
"overall": {
"baseline": "5.30 ms", // 元のモデルのレイテンシー。
"optimized": "3.59 ms", // 最適化済みモデルのレイテンシー。
"speedup": "1.48" // 端から端までの速度向上率。
}
}この例では、端から端までの速度向上率は 1.48 倍 であり、最適化済みモデルの実行時間は 3.59 ms で、元のモデルの 5.30 ms より短くなっています。「"status": "effective"」を確認することで、測定可能な効果をもたらした最適化パスを特定できます。
ステップ 5:推論パフォーマンスのベンチマーク
以下の関数を使用して、元のモデルおよび最適化済みモデルの定常状態レイテンシーを測定します。最初の 100 回の実行は GPU のウォームアップに使用し、その後の 200 回の実行が計測対象となります。
@torch.no_grad()
def benchmark(model, inp):
for i in range(100): # ウォームアップ。
model(inp)
start = time.time()
for i in range(200): # 計測対象の実行。
model(inp)
elapsed_ms = (time.time() - start) * 1000
print("Latency: {:.2f}".format(elapsed_ms / 200))
benchmark(model, dummy) # 元のモデル。
benchmark(optimized_model, dummy) # 最適化済みモデル。ファイルからモデルを読み込む
上記の例では、モデルはメモリ上の torch.jit.ScriptModule オブジェクトとして渡されています。また、torch.jit.save で保存された ScriptModule ファイルのパスを渡すこともできます。
optimized_model, opt_spec, report = blade.optimize(
'path/to/torch_model.pt', # 保存済み ScriptModule ファイルのパス。
'o1',
device_type='gpu',
)次のステップ
最適化後、モデルを実行するための選択肢は以下の 3 つがあります。
Python 推論:任意の
optimized_modelを、通常のtorch.jit.ScriptModuleと同様の API を使用して、Python 内で直接実行します。サービスとしてデプロイ:最適化済みモデルを、Machine Learning Platform for AI (PAI) の Elastic Algorithm Service (EAS) にデプロイして、本番規模でのサービングを行います。
C++ 統合:PAI-Blade C++ SDK を使用して、最適化済みモデルを独自のアプリケーションに埋め込みます。
デプロイ手順については、「SDK を使用した PyTorch モデルの推論向けデプロイ」をご参照ください。
注: 最適化中にご質問がある場合は、テクニカルサポートを受けるために、PAI-Blade ユーザー向け DingTalk グループに参加してください。アクセス方法については、「アクセストークンの取得」をご参照ください。