“torch.compile” による PyTorch のデプロイ

torch.compile 機能を使用すると、PyTorch ネイティブ・アプリケーションで OpenVINO を使用できるようになります。PyTorch コードを最適化されたカーネルに JIT コンパイルすることで、コードを高速化します。デフォルトでは、Torch コードは Eager モードで実行されますが、torch.compile を使用すると、次の手順が実行されます。

  1. グラフの取得 - モデルは、次のいずれかのサブグラフのブロックとして書き換えられます。

    • TorchDynamo によってコンパイルされ、“フラット化” されます。

    • サポートされていない Python 構造 (制御フローコードなど) が原因で、eager モードに戻ります。

  2. グラフの下降 - すべての PyTorch 操作は、選択されたバックエンド固有のカーネル構成に分解されます。

  3. グラフのコンパイル - カーネルは、対応する低レベルのデバイス固有の操作を呼び出します。

使い方

torch.compile を使用するには、import 文を追加し、使用可能な 2 つのバックエンドのいずれかを定義する必要があります。

openvino
このバックエンドを使用すると、追加の PyTorch ベースのトレース/スクリプトを使用せずに、Torch FX サブグラフが OpenVINO 表現に直接変換されます。
openvino_ts
このバックエンドを使用すると、Torch FX サブグラフは最初に PyTorch TorchScript でトレース/スクリプト化され、次に OpenVINO 表現に変換されます。
import openvino.torch
...
model = torch.compile(model, backend='openvino')

実行ダイアグラム:

../_images/torch_compile_backend_openvino.svg
import openvino.torch
...
model = torch.compile(model, backend='openvino_ts')

実行ダイアグラム:

../_images/torch_compile_backend_openvino_ts.svg

オプション

torch.compile の追加引数を使用して、バックエンド・デバイスの設定、モデルキャッシュの有効化、キャッシュ・ディレクトリーの設定などを行うことができます。利用可能なオプションの辞書を使用できます。

  • device - アプリケーションを実行する特定のハードウェア・デバイスを選択できるようにします。デフォルトでは、torch.compile の OpenVINO バックエンドは CPU 上で PyTorch アプリケーションを実行します。例えば、この変数を GPU.0 に設定すると、アプリケーションは統合グラフィックス・プロセッサーを使用します。

  • model_caching - アプリケーションの最初の実行後に、最適化されたモデルファイルをハードドライブに保存できるようにします。これにより、次のアプリケーションの実行でそれらが使用できるようになり、推論のレイテンシーが短縮されます。デフォルトは、False に設定されています。キャッシュを有効にするには、True に設定します。

  • cache_dir - モデルファイルのカスタム・ディレクトリーの定義を有効にします (model_cachingTrue に設定されている場合)。デフォルトでは、OpenVINO IR はアプリケーションのルート・ディレクトリーに作成されるキャッシュ・サブディレクトリーに保存されます。

  • config - 任意の OpenVINO 設定オプションを辞書としてこの変数に渡すことができます。オプションの詳細については、OpenVINO の高度な機能を参照してください。

詳細は、下記の例を参照してください。

model = torch.compile(model, backend="openvino", options = {"device" : "CPU", "model_caching" : True, "cache_dir": "./model_cache"})

optionsconfig キーの下に辞書を追加することで、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_cachingTrue に設定されている場合)。デフォルトでは、OpenVINO IR はアプリケーションのルート・ディレクトリーに作成される cache サブディレクトリーに保存されます。

Windows* のサポート

現在、PyTorch は Windows* 上の torch.compile 機能を公式にサポートしていません。ただし、以下の手順を実行することでアクセスできます。

  1. PyTorch nightly wheel ファイル 2.1.0.dev20230713 をインストールします。

  2. 次にあるファイルを更新します: <python_env_root>/Lib/site-packages/torch/_dynamo/eval_frames.py

  3. 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")
    
  4. 次のように、この関数の最初の 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 のデフォルトのインダクター・バックエンドにフォールバックされます。