コンテンツにスキップ

XNNPACK

ONNX RuntimeとXNNPACK実行プロバイダーを使用して、Android/iOSデバイスおよびWebAssembly上でONNXモデルを高速化します。XNNPACKは、Arm®ベース、WebAssembly、x86プラットフォーム向けの高度に最適化された浮動小数点ニューラルネットワーク推論演算子ライブラリです。

Android用のXNNPACK EPを含むONNX Runtime(onnxruntime-android)のプリビルドパッケージがMavenで公開されています。 インストール手順についてはこちらを参照してください。

iOS用のXNNPACK EPを含むONNX Runtimeのプリビルドバイナリ(onnxruntime-objcおよびonnxruntime-c)がCocoaPodsで公開されています。 インストール手順についてはこちらを参照してください。

XNNPACK EPを含むパッケージのビルド手順については、ビルドページを参照してください。

Android、iOS、Windows、LinuxでXNNPACK EPを含むONNX Runtimeをビルドできます。

ONNX Runtime APIの詳細はこちらにあります。

XNNPACK EPは、C、C++、またはJava APIを介して使用できます。

推論セッションを作成する際に、XNNPACK EPを明示的に登録する必要があります。例:

Ort::Env env = Ort::Env{ORT_LOGGING_LEVEL_ERROR, "Default"};
Ort::SessionOptions so;
so.AppendExecutionProvider("XNNPACK", {"intra_op_num_threads", std::to_string(intra_op_num_threads)});
Ort::Session session(env, model_path, so);

XNNPACKには独立した内部スレッドプールがあり、ORTのintra-opスレッドプールと競合する可能性があります。 これを最小限に抑えるために、以下のオプションを設定することをお勧めします:

  1. セッションオプションに以下を追加して、ORTのintra-opスレッドプールのスピニングを無効にします:
so.AddConfigEntry(kOrtSessionOptionsConfigAllowIntraOpSpinning, "0");
  1. XNNPACK EPを登録する際にXNNPACKのintra-opスレッドプールサイズを設定します。推奨値はデバイスの物理コア数です。
so.AppendExecutionProvider("XNNPACK", {"intra_op_num_threads", std::to_string(intra_op_num_threads)});
  1. ORTのintra-opスレッドプールサイズを1に設定します:
so.SetIntraOpNumThreads(1);

この設定は、モデルが計算集約的な作業を実行するノードでXNNPACKを使用している場合に適しています。これらの演算子はintra-opスレッドプールを使用する可能性が高いためです(例:Conv、Gemm、MatMul演算子)。

モデルにXNNPACK EPで現在サポートされていない演算子を使用する計算集約的なノードが含まれている場合、これらはCPU EPで処理されます。その場合、ORTのintra-opスレッドプールのサイズを増やし、場合によってはスピニングを再有効化することで、より良いパフォーマンスが得られる可能性があります。パフォーマンステストは、モデルの最適な設定を決定する最良の方法です。

XNNPACK EPの内部intra-opスレッドプールで使用するスレッド数。これは、ノード内での実行を並列化するために使用されるスレッド数です。デフォルト値は1です。値は1以上である必要があります。

以下の演算子がXNNPACK実行プロバイダーでサポートされています:

演算子注記
ai.onnx:AveragePool2Dプールのみサポート。
ai.onnx:Conv2D Convのみサポート。
重みとバイアスは定数である必要があります。
ai.onnx:ConvTranspose2D ConvTransposeのみサポート。
重みとバイアスは定数である必要があります。
1.14以降
ai.onnx:MaxPool2Dプールのみサポート。
ai.onnx:Softmaxopset 13未満はすべてサポート、opset 13はAXISが最後の次元の場合のみサポート
ai.onnx:QLinearConv2D Convのみサポート。
重みとバイアスは定数である必要があります。
すべての量子化スケールとゼロポイントは定数である必要があります。
ai.onnx:ResizeBilinearモードでの2D/4D Resizeがサポートされています1.14以降
ai.onnx:Gemm2D演算のみサポート1.14以降
ai.onnx:Matmul2D演算のみサポート1.14以降
com.microsoft:QLinearAveragePool2Dプールのみサポート。
すべての量子化スケールとゼロポイントは定数である必要があります。
com.microsoft:QLinearSoftmaxすべての量子化スケールとゼロポイントは定数である必要があります。
com.microsoft:QLinearConvTransposeすべての量子化スケールとゼロポイントは定数である必要があります。1.14以降