コンテンツにスキップ

Android - NNAPI

ONNX RuntimeとNNAPI実行プロバイダーを使用して、AndroidデバイスでONNXモデルを高速化します。Android Neural Networks API (NNAPI)は、Android上のCPU、GPU、およびNNアクセラレーターへの統一されたインターフェースです。

NNAPI実行プロバイダー(EP)には、Android 8.1以降を搭載したAndroidデバイスが必要です。最適なパフォーマンスを得るには、Android 9以降を搭載したAndroidデバイスを使用することをお勧めします。

Android用NNAPI EPを搭載したONNX Runtimeのビルド済みパッケージはMavenで公開されています。

インストール手順については、こちらを参照してください。

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

ONNX Runtime APIの詳細はこちらです。

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

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

Ort::Env env = Ort::Env{ORT_LOGGING_LEVEL_ERROR, "Default"};
Ort::SessionOptions so;
uint32_t nnapi_flags = 0;
Ort::ThrowOnError(OrtSessionOptionsAppendExecutionProvider_Nnapi(so, nnapi_flags));
Ort::Session session(env, model_path, so);

NNAPI EPには、いくつかのランタイムオプションがあります。

NNAPI EPランタイムオプションを使用するには、オプションを表す符号なし整数を作成し、ビット単位のOR演算子を使用して各個別のオプションを設定します。

uint32_t nnapi_flags = 0;
nnapi_flags |= NNAPI_FLAG_USE_FP16;

NNAPI EPでfp16緩和を使用します。

これによりパフォーマンスが向上する可能性がありますが、精度が低下する可能性もあります。

NNAPI EPでNCHWレイアウトを使用します。

これはAndroid APIレベル29以降でのみ利用可能です。現時点では、NNAPIはNHWCを使用する場合と比較してNCHWを使用するとパフォーマンスが低下する可能性があることに注意してください。

NNAPIがCPUデバイスを使用するのを防ぎます。

NNAPIは実行にGPUまたはNPUを使用する方が効率的ですが、GPU/NPUでサポートされていない操作についてはCPU実装にフォールバックする場合があります。NNAPIのCPU実装(nnapi-referenceと呼ばれます)は、ORTの操作の最適化されたバージョンよりも効率が悪いことがよくあります。このため、NNAPI CPUフォールバックを無効にし、ORTカーネルを使用して実行を処理することが有利な場合があります。

一部のモデルでは、NNAPIがCPUを使用して操作を実行する場合、このフラグが設定されていると、モデルの実行がORTカーネルにフォールバックする可能性があります。

このオプションはAndroid APIレベル29以降でのみ利用可能であり、Android APIレベル28以前では無視されます。

NNAPIデバイスの割り当てについては、https://developer.android.com/ndk/guides/neuralnetworks#device-assignmentを参照してください。

NNAPI CPUフォールバックについては、https://developer.android.com/ndk/guides/neuralnetworks#cpu-fallbackを参照してください。

NNAPI EPでCPUのみを使用します。これによりパフォーマンスは低下しますが、精度の低下なしに参照出力値が提供されるため、検証に役立ちます。

このオプションはAndroid APIレベル29以降でのみ利用可能であり、Android APIレベル28以前では無視されます。

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

演算子注意
ai.onnx:Abs
ai.onnx:Add
ai.onnx:AveragePool2Dプールのみがサポートされています。
ai.onnx:BatchNormalization
ai.onnx:Cast
ai.onnx:Clip
ai.onnx:Concat
ai.onnx:Conv2D Convのみがサポートされています。
重みとバイアスは定数である必要があります。
ai.onnx:DepthToSpaceDCRモードのDepthToSpaceのみがサポートされています。
ai.onnx:DequantizeLinearすべての量子化スケールとゼロ点は定数である必要があります。
ai.onnx:Div
ai.onnx:Elu
ai.onnx:Exp
ai.onnx:Flatten
ai.onnx:Floor
ai.onnx:Gatherint32型でない場合、入力インデックスは定数である必要があります。
ai.onnx:Gemm入力Bが定数でない場合、transBは1である必要があります。
ai.onnx:GlobalAveragePool2Dプールのみがサポートされています。
ai.onnx:GlobalMaxPool2Dプールのみがサポートされています。
ai.onnx:Identity
ai.onnx:LeakyRelu
ai.onnx:Log
ai.onnx:LRN
ai.onnx:MatMul
ai.onnx:MaxPool2Dプールのみがサポートされています。
ai.onnx:Max
ai.onnx:Min
ai.onnx:Mul
ai.onnx:Neg
ai.onnx:Pad定数モードのPadのみがサポートされています。
入力パッドとconstant_valueは定数である必要があります。
入力パッドの値は非負である必要があります。
ai.onnx:Pow
ai.onnx:PRelu
ai.onnx:QLinearConv2D Convのみがサポートされています。
重みとバイアスは定数である必要があります。
すべての量子化スケールとゼロ点は定数である必要があります。
ai.onnx:QLinearMatMulすべての量子化スケールとゼロ点は定数である必要があります。
ai.onnx:QuantizeLinearすべての量子化スケールとゼロ点は定数である必要があります。
ai.onnx:ReduceMean
ai.onnx:Relu
ai.onnx:Reshape
ai.onnx:Resize2Dリサイズのみがサポートされています。
ai.onnx:Sigmoid
ai.onnx:Sin
ai.onnx:Slice
ai.onnx:Softmax
ai.onnx:Split分割数は分割軸サイズを均等に割り切る必要があります。指定されている場合、入力分割は定数である必要があります。
ai.onnx:Sqrt
ai.onnx:Squeeze入力軸は定数である必要があります。
ai.onnx:Sub
ai.onnx:Tanh
ai.onnx:Transpose
ai.onnx:Unsqueeze入力軸は定数である必要があります。
com.microsoft:QLinearAddすべての量子化スケールとゼロ点は定数である必要があります。
com.microsoft:QLinearAveragePool2Dプールのみがサポートされています。
すべての量子化スケールとゼロ点は定数である必要があります。
com.microsoft:QLinearSigmoidすべての量子化スケールとゼロ点は定数である必要があります。