Android - NNAPI
NNAPI 実行プロバイダー
Section titled “NNAPI 実行プロバイダー”ONNX RuntimeとNNAPI実行プロバイダーを使用して、AndroidデバイスでONNXモデルを高速化します。Android Neural Networks API (NNAPI)は、Android上のCPU、GPU、およびNNアクセラレーターへの統一されたインターフェースです。
NNAPI実行プロバイダー(EP)には、Android 8.1以降を搭載したAndroidデバイスが必要です。最適なパフォーマンスを得るには、Android 9以降を搭載したAndroidデバイスを使用することをお勧めします。
インストール
Section titled “インストール”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);設定オプション
Section titled “設定オプション”NNAPI EPには、いくつかのランタイムオプションがあります。
NNAPI EPランタイムオプションを使用するには、オプションを表す符号なし整数を作成し、ビット単位のOR演算子を使用して各個別のオプションを設定します。
uint32_t nnapi_flags = 0;nnapi_flags |= NNAPI_FLAG_USE_FP16;利用可能なオプション
Section titled “利用可能なオプション”NNAPI_FLAG_USE_FP16
Section titled “NNAPI_FLAG_USE_FP16”NNAPI EPでfp16緩和を使用します。
これによりパフォーマンスが向上する可能性がありますが、精度が低下する可能性もあります。
NNAPI_FLAG_USE_NCHW
Section titled “NNAPI_FLAG_USE_NCHW”NNAPI EPでNCHWレイアウトを使用します。
これはAndroid APIレベル29以降でのみ利用可能です。現時点では、NNAPIはNHWCを使用する場合と比較してNCHWを使用するとパフォーマンスが低下する可能性があることに注意してください。
NNAPI_FLAG_CPU_DISABLED
Section titled “NNAPI_FLAG_CPU_DISABLED”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_FLAG_CPU_ONLY
Section titled “NNAPI_FLAG_CPU_ONLY”NNAPI EPでCPUのみを使用します。これによりパフォーマンスは低下しますが、精度の低下なしに参照出力値が提供されるため、検証に役立ちます。
このオプションはAndroid APIレベル29以降でのみ利用可能であり、Android APIレベル28以前では無視されます。
サポートされている演算子
Section titled “サポートされている演算子”NNAPI実行プロバイダーでは、以下の演算子がサポートされています。
| 演算子 | 注意 |
|---|---|
| ai.onnx:Abs | |
| ai.onnx:Add | |
| ai.onnx:AveragePool | 2Dプールのみがサポートされています。 |
| ai.onnx:BatchNormalization | |
| ai.onnx:Cast | |
| ai.onnx:Clip | |
| ai.onnx:Concat | |
| ai.onnx:Conv | 2D Convのみがサポートされています。 重みとバイアスは定数である必要があります。 |
| ai.onnx:DepthToSpace | DCRモードのDepthToSpaceのみがサポートされています。 |
| ai.onnx:DequantizeLinear | すべての量子化スケールとゼロ点は定数である必要があります。 |
| ai.onnx:Div | |
| ai.onnx:Elu | |
| ai.onnx:Exp | |
| ai.onnx:Flatten | |
| ai.onnx:Floor | |
| ai.onnx:Gather | int32型でない場合、入力インデックスは定数である必要があります。 |
| ai.onnx:Gemm | 入力Bが定数でない場合、transBは1である必要があります。 |
| ai.onnx:GlobalAveragePool | 2Dプールのみがサポートされています。 |
| ai.onnx:GlobalMaxPool | 2Dプールのみがサポートされています。 |
| ai.onnx:Identity | |
| ai.onnx:LeakyRelu | |
| ai.onnx:Log | |
| ai.onnx:LRN | |
| ai.onnx:MatMul | |
| ai.onnx:MaxPool | 2Dプールのみがサポートされています。 |
| 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:QLinearConv | 2D Convのみがサポートされています。 重みとバイアスは定数である必要があります。 すべての量子化スケールとゼロ点は定数である必要があります。 |
| ai.onnx:QLinearMatMul | すべての量子化スケールとゼロ点は定数である必要があります。 |
| ai.onnx:QuantizeLinear | すべての量子化スケールとゼロ点は定数である必要があります。 |
| ai.onnx:ReduceMean | |
| ai.onnx:Relu | |
| ai.onnx:Reshape | |
| ai.onnx:Resize | 2Dリサイズのみがサポートされています。 |
| 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:QLinearAveragePool | 2Dプールのみがサポートされています。 すべての量子化スケールとゼロ点は定数である必要があります。 |
| com.microsoft:QLinearSigmoid | すべての量子化スケールとゼロ点は定数である必要があります。 |