“torch.compile” による PyTorch のデプロイ#
torch.compile
機能を使用すると、PyTorch ネイティブ・アプリケーションで OpenVINO を使用できるようになります。PyTorch コードを最適化されたカーネルに JIT コンパイルすることで、コードを高速化します: デフォルトでは、Torch コードは Eager モードで実行されますが、torch.compile
を使用すると、次の手順が実行されます:
グラフの取得 - モデルは、次のいずれかのサブグラフのブロックとして書き換えられます:
TorchDynamo によってコンパイルされ、 “フラット化” されます
サポートされていない Python 構造 (制御フローコードなど) が原因で、eager モードに戻ります
グラフの下降 - すべての PyTorch 操作は、選択されたバックエンド固有のカーネル構成に分解されます。
グラフのコンパイル - カーネルは、対応する低レベルのデバイス固有の操作を呼び出します。
使い方#
torch.compile
を使用するには、PyTorch アプリケーションで openvino
バックエンドを定義する必要があります。この方法では、追加の PyTorch ベースのトレース/スクリプトを使用せずに、Torch FX サブグラフが OpenVINO 表現に直接変換されます。このアプローチは、torch_dynamo_backends entrypoint エントリーポイントで構成されているため、pip 経由で配布されるパッケージに対してのみ機能します。
...
model = torch.compile(model, backend='openvino')
...
conda などの pip 以外のチャネル経由でインストールされた OpenVINO や、2024.1 以前のバージョンでは、追加のインポート文が必要です:
import openvino.torch
...
model = torch.compile(model, backend='openvino')
...
オプション#
torch.compile
の追加引数を使用して、バックエンド・デバイスの設定、モデルキャッシュの有効化、キャッシュ・ディレクトリーの設定などを行うことができます。利用可能なオプションの辞書を使用できます:
device
- アプリケーションを実行する特定のハードウェア・デバイスを選択できるようにします。デフォルトでは、torch.compile
の OpenVINO バックエンドは CPU 上で PyTorch アプリケーションを実行します。例えば、この変数をGPU.0
に設定すると、アプリケーションは統合グラフィックス・プロセッサーを使用します。aot_autograd
- aot_autograd グラフ・キャプチャーを有効にします。動的な形状を有効にしたり、モデルを微調整するには、aot_autograd グラフ・キャプチャーが必要です。動的形状を持つモデルの場合、このオプションをTrue
に設定することを推奨します。デフォルトで、aot_autograd はFalse
に設定されます。model_caching
- アプリケーションの最初の実行後に、最適化されたモデルファイルをハードドライブに保存できるようにします。これにより、次のアプリケーションの実行でそれらが使用できるようになり、推論のレイテンシーが短縮されます。デフォルトは、False
に設定されています。キャッシュを有効にするには、True
に設定します。cache_dir
- モデルファイルのカスタム・ディレクトリーの定義を有効にします (model_caching
がTrue
に設定されている場合)。デフォルトでは、OpenVINO IR はアプリケーションのルート・ディレクトリーに作成されるキャッシュ・サブディレクトリーに保存されます。decompositions
- 追加の演算子分解を定義できるようにします。デフォルトでは、これは空のリストです。例えば、演算子my_op
の分解を追加するには、オプションに'decompositions': [torch.ops.aten.my_op.default]
を追加します。disabled_ops
- openvino 実行から無効にできる演算子を指定して、ネイティブ PyTorch ランタイムにフォールバックできるようにします。例えば、OpenVINO 実行から演算子my_op
を無効にするには、オプションに'disabled_ops': [torch.ops.aten.my_op.default]
を追加します。デフォルトでは、これは空のリストです。config
- 任意の OpenVINO 設定オプションを辞書としてこの変数に渡すことができます。オプションの詳細については、OpenVINO の高度な機能を参照してください。
詳細は、下記の例を参照してください:
model = torch.compile(model, backend="openvino", options = {"device" : "CPU", "model_caching" : True, "cache_dir": "./model_cache"})
options
の config
キーの下に辞書を追加することで、OpenVINO 固有の設定オプションを設定することもできます。
opts = {"device" : "CPU", "config" : {"PERFORMANCE_HINT" : "LATENCY"}}
model = torch.compile(model, backend="openvino", options=opts)
Windows* のサポート#
PyTorch はバージョン 2.3.0 以降、Windows* 上で torch.compile
を公式にサポートしています。
PyTorch バージョン 2.3.0 未満の場合、torch.compile
機能は Windows* では公式にはサポートされていません。ただし、以下の手順を実行することでアクセスできます:
PyTorch nightly wheel ファイル 2.1.0.dev20230713 をインストールします
<python_env_root>/Lib/site-packages/torch/_dynamo/eval_frames.py
にあるファイルを更新しますcheck_if_dynamo_supported()
関数を見つけます:def check_if_dynamo_supported(): if sys.platform == "win32": raise RuntimeError("Windows not yet supported for torch.compile") if sys.version_info >= (3, 11): raise RuntimeError("Python 3.11+ not yet supported for torch.compile")
次のように、この関数の最初の 2 行をコメントにします:
def check_if_dynamo_supported(): #if sys.platform == "win32": # raise RuntimeError("Windows not yet supported for torch.compile") if sys.version_info >= (3, 11): `raise RuntimeError("Python 3.11+ not yet supported for torch.compile")
PyTorch 2 エクスポート量子化のサポート (プレビュー)#
PyTorch 2 エクスポート量子化は、torch.compile
の OpenVINO バックエンドによってサポートされています。この機能にアクセスするには、PyTorch 2 エクスポート後トレーニング量子化を X86 バックエンドで Inductor 経由で実行に記載されている手順に従い、提供されているサンプルを以下の説明に従って更新します。
PyTorch バージョン 2.3.0 以降を使用している場合、OpenVINO バックエンドの最適化の利点を得られるように、量子化における定数の畳み込みを無効にしてください。これは、
fold_quantize=False
パラメーターをconvert_pt2e
関数に渡すことによって実行できます。これを行うには、次の行を変更します:converted_model = convert_pt2e(prepared_model)
を以下にします:
converted_model = convert_pt2e(prepared_model, fold_quantize=False)
torch.compile
バックエンドを OpenVINO に設定し、モデルを実行します。以下の行を更新します:
optimized_model = torch.compile(converted_model)
次のようにします:
optimized_model = torch.compile(converted_model, backend="openvino")
TorchServe 統合#
TorchServe は、本番環境で PyTorch モデルを提供する、パフォーマンスが高く、柔軟性があり、使いやすいツールです。TorchServe の詳細については、TorchServe GitHub リポジトリーを参照してください。OpenVINO torch.compile
を TorchServe に統合すると、PyTorch モデルを本番環境で提供し、さまざまなインテルのハードウェア上で OpenVINO を使用して高速化できます。OpenVINO を TorchServe で使用する詳細な手順については、TorchServe の例を参照してください。
Automatic1111 Stable Diffusion WebUI のサポート#
Automatic1111 Stable Diffusion WebUI は、Stable Diffusion ベースの画像生成用のブラウザーベースのインターフェイスをホストするオープンソース・リポジトリーです。これにより、ユーザーはテキストプロンプトから現実的で創造的な画像を作成できます。Stable Diffusion WebUI は、OpenVINO torch.compile
機能を活用することにより、インテル® CPU、インテル® 統合 GPU、およびインテル® ディスクリート GPU でサポートされます。詳しい手順は、Stable Diffusion WebUI リポジトリーで入手できます。
アーキテクチャー#
torch.compile
機能は、以下に基づく PyTorch 2.0 の一部です:
TorchDynamo - CPython のフレーム評価 API (PEP 523) にフックして、実行直前に Python バイト・コードを動的に変更する Python レベルの JIT (FX グラフに抽出できない PyTorch オペレーターはネイティブ Python 環境で実行されます)。生成されたグラフが有効であることを保証するため、Guards を使用して Eager モード機能を維持します。
AOTAutograd - TorchDynamo によってキャプチャーされた前方グラフに対応する後方グラフを生成します。
PrimTorch - 複雑な PyTorch 操作をより単純で基本的な操作に分解します。
TorchInductor - 複数のアクセラレーターとバックエンド用の高速コードを生成するディープラーニング・コンパイラー。
PyTorch モジュールが torch.compile
でラップされると、TorchDynamo はモジュールをトレースし、Python バイト・コードを書き換えて PyTorch 操作のシーケンスを FX グラフに抽出します。これは OpenVINO バックエンドによって最適化できます。まず、Torch FX グラフがインライン FX グラフに変換され、グラフ分割モジュールがインライン FX グラフを走査して、OpenVINO でサポートされる演算子を識別します。
サポートされるすべての演算子は OpenVINO サブモジュールにクラスター化され、OpenVINO の PyTorch デコーダーを使用して OpenVINO グラフに変換され、OpenVINO ランタイムで最適化され実行されます。サポートされていない演算子は、CPU 上のネイティブ PyTorch ランタイムにフォールバックされます。OpenVINO 変換中にサブグラフが失敗した場合、サブグラフは PyTorch のデフォルトのインダクター・バックエンドにフォールバックされます。