XNNPACK
XNNPACK実行プロバイダー
Section titled “XNNPACK実行プロバイダー”ONNX RuntimeとXNNPACK実行プロバイダーを使用して、Android/iOSデバイスおよびWebAssembly上でONNXモデルを高速化します。XNNPACKは、Arm®ベース、WebAssembly、x86プラットフォーム向けの高度に最適化された浮動小数点ニューラルネットワーク推論演算子ライブラリです。
インストール
Section titled “インストール”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);設定オプション
Section titled “設定オプション”XNNPACKには独立した内部スレッドプールがあり、ORTのintra-opスレッドプールと競合する可能性があります。 これを最小限に抑えるために、以下のオプションを設定することをお勧めします:
- セッションオプションに以下を追加して、ORTのintra-opスレッドプールのスピニングを無効にします:
so.AddConfigEntry(kOrtSessionOptionsConfigAllowIntraOpSpinning, "0");- XNNPACK EPを登録する際にXNNPACKのintra-opスレッドプールサイズを設定します。推奨値はデバイスの物理コア数です。
so.AppendExecutionProvider("XNNPACK", {"intra_op_num_threads", std::to_string(intra_op_num_threads)});- ORTのintra-opスレッドプールサイズを1に設定します:
so.SetIntraOpNumThreads(1);この設定は、モデルが計算集約的な作業を実行するノードでXNNPACKを使用している場合に適しています。これらの演算子はintra-opスレッドプールを使用する可能性が高いためです(例:Conv、Gemm、MatMul演算子)。
モデルにXNNPACK EPで現在サポートされていない演算子を使用する計算集約的なノードが含まれている場合、これらはCPU EPで処理されます。その場合、ORTのintra-opスレッドプールのサイズを増やし、場合によってはスピニングを再有効化することで、より良いパフォーマンスが得られる可能性があります。パフォーマンステストは、モデルの最適な設定を決定する最良の方法です。
利用可能なオプション
Section titled “利用可能なオプション”intra_op_num_threads
Section titled “intra_op_num_threads”XNNPACK EPの内部intra-opスレッドプールで使用するスレッド数。これは、ノード内での実行を並列化するために使用されるスレッド数です。デフォルト値は1です。値は1以上である必要があります。
サポートされている演算子
Section titled “サポートされている演算子”以下の演算子がXNNPACK実行プロバイダーでサポートされています:
| 演算子 | 注記 | |
|---|---|---|
| ai.onnx:AveragePool | 2Dプールのみサポート。 | |
| ai.onnx:Conv | 2D Convのみサポート。 重みとバイアスは定数である必要があります。 | |
| ai.onnx:ConvTranspose | 2D ConvTransposeのみサポート。 重みとバイアスは定数である必要があります。 | 1.14以降 |
| ai.onnx:MaxPool | 2Dプールのみサポート。 | |
| ai.onnx:Softmax | opset 13未満はすべてサポート、opset 13はAXISが最後の次元の場合のみサポート | |
| ai.onnx:QLinearConv | 2D Convのみサポート。 重みとバイアスは定数である必要があります。 すべての量子化スケールとゼロポイントは定数である必要があります。 | |
| ai.onnx:Resize | Bilinearモードでの2D/4D Resizeがサポートされています | 1.14以降 |
| ai.onnx:Gemm | 2D演算のみサポート | 1.14以降 |
| ai.onnx:Matmul | 2D演算のみサポート | 1.14以降 |
| com.microsoft:QLinearAveragePool | 2Dプールのみサポート。 すべての量子化スケールとゼロポイントは定数である必要があります。 | |
| com.microsoft:QLinearSoftmax | すべての量子化スケールとゼロポイントは定数である必要があります。 | |
| com.microsoft:QLinearConvTranspose | すべての量子化スケールとゼロポイントは定数である必要があります。 | 1.14以降 |