“torch.compile” による PyTorch のデプロイ¶
torch.compile
機能を使用すると、PyTorch ネイティブ・アプリケーションで OpenVINO を使用できるようになります。PyTorch コードを最適化されたカーネルに JIT コンパイルすることで、コードを高速化します。デフォルトでは、Torch コードは Eager モードで実行されますが、torch.compile
を使用すると、次の手順が実行されます。
-
グラフの取得 - モデルは、次のいずれかのサブグラフのブロックとして書き換えられます。
TorchDynamo によってコンパイルされ、“フラット化” されます。
サポートされていない Python 構造 (制御フローコードなど) が原因で、eager モードに戻ります。
グラフの下降 - すべての PyTorch 操作は、選択されたバックエンド固有のカーネル構成に分解されます。
グラフのコンパイル - カーネルは、対応する低レベルのデバイス固有の操作を呼び出します。
使い方¶
torch.compile
を使用するには、import 文を追加し、使用可能な 2 つのバックエンドのいずれかを定義する必要があります。
openvino
openvino_ts
オプション¶
torch.compile
の追加引数を使用して、バックエンド・デバイスの設定、モデルキャッシュの有効化、キャッシュ・ディレクトリーの設定などを行うことができます。利用可能なオプションの辞書を使用できます。
-
device
- アプリケーションを実行する特定のハードウェア・デバイスを選択できるようにします。デフォルトでは、torch.compile
の OpenVINO バックエンドは CPU 上で PyTorch アプリケーションを実行します。例えば、この変数をGPU.0
に設定すると、アプリケーションは統合グラフィックス・プロセッサーを使用します。 model_caching
- アプリケーションの最初の実行後に、最適化されたモデルファイルをハードドライブに保存できるようにします。これにより、次のアプリケーションの実行でそれらが使用できるようになり、推論のレイテンシーが短縮されます。デフォルトは、False
に設定されています。キャッシュを有効にするには、True
に設定します。cache_dir
- モデルファイルのカスタム・ディレクトリーの定義を有効にします (model_caching
がTrue
に設定されている場合)。デフォルトでは、OpenVINO IR はアプリケーションのルート・ディレクトリーに作成されるキャッシュ・サブディレクトリーに保存されます。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)
重要
以前のリリースで使用されていた環境変数は引き続き使用できますが、推奨されません。これらは将来のリリースでは完全に削除される予定です。
クリックすると、廃止されたオプションが表示されます。
-
OPENVINO_TORCH_BACKEND_DEVICE
- アプリケーションを実行する特定のハードウェア・デバイスを選択できるようにします。デフォルトでは、torch.compile
の OpenVINO バックエンドは CPU 上で PyTorch アプリケーションを実行します。例えば、この変数をGPU.0
に設定すると、アプリケーションは統合グラフィックス・プロセッサーを使用します。 -
OPENVINO_TORCH_MODEL_CACHING
- アプリケーションの最初の実行後に、最適化されたモデルファイルをハードドライブに保存できるようにします。これにより、次のアプリケーションの実行でそれらが使用できるようになり、推論のレイテンシーが短縮されます。デフォルトは、False
に設定されています。キャッシュを有効にするには、True
に設定します。 -
OPENVINO_TORCH_CACHE_DIR
- モデルファイルのカスタム・ディレクトリーの定義を有効にします (model_caching
がTrue
に設定されている場合)。デフォルトでは、OpenVINO IR はアプリケーションのルート・ディレクトリーに作成されるcache
サブディレクトリーに保存されます。
Windows* のサポート¶
現在、PyTorch は Windows* 上の torch.compile
機能を公式にサポートしていません。ただし、以下の手順を実行することでアクセスできます。
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")
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 のデフォルトのインダクター・バックエンドにフォールバックされます。