このページでは、Neural Networks API (NNAPI) ドライバーを実装する方法の概要を説明します。詳細については、 hardware/interfaces/neuralnetworks
の HAL 定義ファイルにあるドキュメントを参照してください。サンプル ドライバーの実装は、 frameworks/ml/nn/driver/sample
にあります。
Neural Networks API の詳細については、 Neural Networks API を参照してください。
ニューラル ネットワーク HAL
ニューラル ネットワーク (NN) HAL は、製品 (携帯電話やタブレットなど) 内のグラフィックス プロセッシング ユニット (GPU) やデジタル シグナル プロセッサ (DSP) などのさまざまなデバイスの抽象化を定義します。これらのデバイスのドライバーは、NN HAL に準拠する必要があります。インターフェイスは、 hardware/interfaces/neuralnetworks
の HAL 定義ファイルで指定されます。
フレームワークとドライバー間のインターフェイスの一般的なフローを図 1 に示します。
図 1.ニューラル ネットワーク フロー
初期化
初期化時に、フレームワークはIDevice::getCapabilities_1_3
を使用してドライバーの機能を照会します。 @1.3::Capabilities
構造体にはすべてのデータ型が含まれ、ベクトルを使用して非緩和パフォーマンスを表します。
使用可能なデバイスに計算を割り当てる方法を決定するために、フレームワークは機能を使用して、各ドライバーが実行を実行できる速度とエネルギー効率を理解します。この情報を提供するために、ドライバーは参照ワークロードの実行に基づいて標準化されたパフォーマンス数値を提供する必要があります。
ドライバーがIDevice::getCapabilities_1_3
に応答して返す値を決定するには、NNAPI ベンチマーク アプリを使用して、対応するデータ型のパフォーマンスを測定します。 MobileNet v1 および v2、 asr_float
、およびtts_float
モデルは、32 ビット浮動小数点値のパフォーマンス測定に推奨され、MobileNet v1 および v2 量子化モデルは 8 ビット量子化値に推奨されます。詳細については、 Android Machine Learning テスト スイートを参照してください。
Android 9 以前では、 Capabilities
構造体には、浮動小数点と量子化されたテンソルのドライバー パフォーマンス情報のみが含まれ、スカラー データ型は含まれません。
初期化プロセスの一部として、フレームワークは、 IDevice::getType
、 IDevice::getVersionString
、 IDevice:getSupportedExtensions
、およびIDevice::getNumberOfCacheFilesNeeded
を使用して、より多くの情報を照会する場合があります。
製品の再起動の間、フレームワークは、このセクションで説明されているすべてのクエリが、特定のドライバーに対して常に同じ値を報告することを期待しています。そうしないと、そのドライバーを使用するアプリのパフォーマンスが低下したり、不適切な動作が発生したりする可能性があります。
コンパイル
フレームワークは、アプリからの要求を受信したときに使用するデバイスを決定します。 Android 10 では、アプリは、フレームワークが選択するデバイスを検出して指定できます。詳細については、デバイスの検出と割り当てを参照してください。
モデルのコンパイル時に、フレームワークはIDevice::getSupportedOperations_1_3
を呼び出して、各候補ドライバーにモデルを送信します。各ドライバーは、モデルのどの操作がサポートされているかを示すブール値の配列を返します。ドライバーは、さまざまな理由で特定の操作をサポートできないと判断できます。例えば:
- ドライバーはデータ型をサポートしていません。
- ドライバーは、特定の入力パラメーターを使用した操作のみをサポートします。たとえば、ドライバーは 3x3 と 5x5 をサポートする場合がありますが、7x7 の畳み込み操作はサポートしません。
- ドライバーにはメモリの制約があり、大きなグラフや入力を処理できません。
OperandLifeTime
で説明されているように、コンパイル中、モデルの入力、出力、および内部オペランドは未知の次元またはランクを持つことができます。詳細については、出力形状を参照してください。
フレームワークは、選択された各ドライバーに、 IDevice::prepareModel_1_3
を呼び出して、モデルのサブセットを実行する準備をするように指示します。次に、各ドライバーはそのサブセットをコンパイルします。たとえば、ドライバーはコードを生成したり、重みの並べ替えられたコピーを作成したりする場合があります。モデルのコンパイルとリクエストの実行の間にかなりの時間がかかる可能性があるため、コンパイル中にデバイス メモリの大きなチャンクなどのリソースを割り当てることはできません。
成功すると、ドライバーは@1.3::IPreparedModel
ハンドルを返します。モデルのサブセットを準備するときにドライバーがエラー コードを返した場合、フレームワークはモデル全体を CPU で実行します。
アプリの起動時にコンパイルにかかる時間を短縮するために、ドライバーはコンパイル アーティファクトをキャッシュできます。詳細については、「コンパイル キャッシュ」を参照してください。
実行
アプリがフレームワークに要求を実行するように要求すると、フレームワークはデフォルトでIPreparedModel::executeSynchronously_1_3
HAL メソッドを呼び出して、準備されたモデルで同期実行を実行します。要求は、 execute_1_3
メソッド、 executeFenced
メソッド (フェンシング実行を参照) を使用して非同期的に実行するか、バースト実行を使用して実行することもできます。
同期実行呼び出しは、実行が完了した後にのみ制御がアプリ プロセスに返されるため、非同期呼び出しと比較してパフォーマンスが向上し、スレッド化のオーバーヘッドが削減されます。これは、実行が完了したことをアプリ プロセスに通知するための別のメカニズムがドライバーに必要ないことを意味します。
非同期のexecute_1_3
メソッドを使用すると、実行の開始後に制御がアプリ プロセスに戻ります。ドライバーは、 @1.3::IExecutionCallback
を使用して、実行の完了時にフレームワークに通知する必要があります。
execute メソッドに渡されるRequest
パラメータには、実行に使用される入力オペランドと出力オペランドがリストされます。オペランド データを格納するメモリは、最初の次元の反復処理が最も遅い行優先順序を使用し、行の最後にパディングがない必要があります。オペランドのタイプの詳細については、 Operands を参照してください。
NN HAL 1.2 以降のドライバーの場合、要求が完了すると、エラー ステータス、出力形状、およびタイミング情報がフレームワークに返されます。実行中、モデルの出力オペランドまたは内部オペランドは、1 つ以上の未知の次元または未知のランクを持つことができます。少なくとも 1 つの出力オペランドの次元またはランクが不明な場合、ドライバーは動的にサイズ設定された出力情報を返す必要があります。
NN HAL 1.1 以下のドライバーの場合、要求が完了したときにエラー ステータスのみが返されます。実行を正常に完了するには、入力オペランドと出力オペランドの次元を完全に指定する必要があります。内部オペランドは 1 つ以上の未知の次元を持つことができますが、ランクを指定する必要があります。
複数のドライバーにまたがるユーザー要求の場合、フレームワークは中間メモリを予約し、各ドライバーへの呼び出しを順序付けます。
同じ@1.3::IPreparedModel
で複数のリクエストを並行して開始できます。ドライバーは、要求を並行して実行することも、実行をシリアル化することもできます。
フレームワークは、複数の準備済みモデルを保持するようドライバーに要求できます。たとえば、モデルm1
を準備し、 m2
を準備し、 m1
でリクエストr1
を実行し、 m2
でr2
を実行し、 m1
でr3
を実行し、 m2
でr4
を実行し、 m1
を解放し (クリーンアップで説明)、 m2
を解放します。
ユーザー エクスペリエンスの低下につながる可能性のある最初の実行の遅延 (たとえば、最初のフレームのスタッター) を回避するために、ドライバーはコンパイル フェーズでほとんどの初期化を実行する必要があります。最初の実行時の初期化は、大規模な一時バッファーの予約やデバイスのクロック レートの増加など、早期に実行するとシステムの状態に悪影響を与えるアクションに限定する必要があります。限られた数の同時実行モデルのみを準備できるドライバーは、最初の実行時に初期化を行う必要がある場合があります。
Android 10 以降では、同じ準備済みモデルを使用した複数の実行が立て続けに実行される場合、クライアントは実行バースト オブジェクトを使用して、アプリとドライバー プロセス間の通信を選択できます。詳細については、バースト実行と高速メッセージ キューを参照してください。
立て続けに複数回実行する場合のパフォーマンスを向上させるために、ドライバーは一時バッファーを保持するか、クロック レートを上げることができます。一定時間経過しても新しいリクエストが作成されない場合にリソースを解放するために、ウォッチドッグ スレッドを作成することをお勧めします。
出力形状
1 つ以上の出力オペランドにすべてのディメンションが指定されていない要求の場合、ドライバーは、実行後に各出力オペランドのディメンション情報を含む出力シェイプのリストを提供する必要があります。次元の詳細については、 OutputShape
を参照してください。
出力バッファーのサイズが小さいために実行が失敗した場合、ドライバーは、出力形状のリストでバッファー サイズが不十分な出力オペランドを示す必要があり、不明な次元にはゼロを使用して、できるだけ多くの次元情報を報告する必要があります。
タイミング
Android 10 では、アプリがコンパイル プロセス中に使用する単一のデバイスを指定した場合、アプリは実行時間を要求できます。詳細については、 MeasureTiming
およびDevice Discovery and Assignmentを参照してください。この場合、NN HAL 1.2 ドライバーは、要求の実行時に実行期間を測定するか、 UINT64_MAX
を報告する必要があります (期間が利用できないことを示すため)。ドライバーは、実行時間の測定に起因するパフォーマンスの低下を最小限に抑える必要があります。
ドライバーは、 Timing
構造体で次の期間をマイクロ秒単位で報告します。
- デバイスでの実行時間:ホスト プロセッサで実行されるドライバーの実行時間は含まれません。
- ドライバーでの実行時間:デバイスでの実行時間を含みます。
これらの期間には、実行が中断されている時間 (たとえば、実行が他のタスクによってプリエンプトされたとき、またはリソースが使用可能になるのを待っているとき) を含める必要があります。
ドライバーが実行期間を測定するように求められていない場合、または実行エラーが発生した場合、ドライバーは期間をUINT64_MAX
として報告する必要があります。ドライバーが実行時間を測定するように求められた場合でも、代わりに、デバイスの時間、ドライバーの時間、またはその両方についてUINT64_MAX
を報告できます。ドライバーが両方の期間をUINT64_MAX
以外の値として報告する場合、ドライバーでの実行時間は、デバイスでの時間と同じかそれ以上である必要があります。
フェンシングされた処刑
Android 11 では、NNAPI を使用して、実行がsync_fence
ハンドルのリストを待機し、必要に応じて実行が完了したときに通知されるsync_fence
オブジェクトを返すことができます。これにより、小さなシーケンス モデルとストリーミングのユース ケースのオーバーヘッドが削減されます。フェンシングされた実行により、 sync_fence
を通知または待機できる他のコンポーネントとのより効率的な相互運用性も可能になります。 sync_fence
の詳細については、「同期フレームワーク」を参照してください。
隔離された実行では、フレームワークはIPreparedModel::executeFenced
メソッドを呼び出して、待機する同期フェンスのベクトルを使用して、準備されたモデルで隔離された非同期実行を開始します。呼び出しが戻る前に非同期タスクが終了した場合、 sync_fence
に対して空のハンドルを返すことができます。フレームワークがエラー ステータスと期間情報を照会できるようにするには、 IFencedExecutionCallback
オブジェクトも返す必要があります。
実行が完了した後、実行の継続時間を測定する次の 2 つのタイミング値は、 IFencedExecutionCallback::getExecutionInfo
を介してクエリできます。
-
timingLaunched
:executeFenced
が呼び出されてから、executeFenced
が返されたsyncFence
を通知するまでの期間。 -
timingFenced
: 実行が待機するすべての同期フェンスが通知されてから、executeFenced
が返された syncFence を通知するまでのsyncFence
。
制御フロー
Android 11 以降を実行しているデバイスの場合、NNAPI にはIF
とWHILE
の 2 つの制御フロー操作が含まれており、他のモデルを引数として取り、それらを条件付き ( IF
) または繰り返し ( WHILE
) 実行します。これを実装する方法の詳細については、「制御フロー」を参照してください。
サービスの質
Android 11 の NNAPI では、モデルの相対的な優先度、モデルの準備に予想される最大時間、および実行に予想される最大時間をアプリが示すことができるようにすることで、サービス品質 (QoS) が改善されています。完了する必要があります。詳細については、「サービスの品質」を参照してください。
掃除
アプリが準備済みモデルの使用を終了すると、フレームワークは@1.3::IPreparedModel
オブジェクトへの参照を解放します。 IPreparedModel
オブジェクトが参照されなくなると、それを作成したドライバー サービスで自動的に破棄されます。モデル固有のリソースは、この時点でドライバーのデストラクタの実装で再利用できます。ドライバー サービスで、クライアントが不要になったときにIPreparedModel
オブジェクトを自動的に破棄する必要がある場合、 IPreparedModelCallback::notify_1_3
によってIPreparedeModel
IPreparedModel
への参照を保持してはなりません。
CPU使用率
ドライバーは、CPU を使用して計算をセットアップする必要があります。ドライバーは、CPU を使用してグラフの計算を実行しないでください。これは、フレームワークが作業を正しく割り当てる機能を妨げるためです。ドライバーは、処理できない部分をフレームワークに報告し、残りはフレームワークに処理させる必要があります。
フレームワークは、ベンダー定義の操作を除くすべての NNAPI 操作に CPU 実装を提供します。詳細については、ベンダー拡張を参照してください。
Android 10 (API レベル 29) で導入された操作には、CTS および VTS テストが正しいことを確認するための参照 CPU 実装のみがあります。モバイル機械学習フレームワークに含まれる最適化された実装は、NNAPI CPU 実装よりも優先されます。
ユーティリティ関数
NNAPI コードベースには、ドライバー サービスで使用できるユーティリティ関数が含まれています。
frameworks/ml/nn/common/include/Utils.h
ファイルには、ロギングや異なる NN HAL バージョン間の変換に使用される関数など、さまざまなユーティリティ関数が含まれています。
VLogging:
VLOG
は Android のLOG
のラッパー マクロであり、debug.nn.vlog
プロパティに適切なタグが設定されている場合にのみメッセージをログに記録します。VLOG
を呼び出す前にinitVLogMask()
を呼び出す必要があります。VLOG_IS_ON
マクロを使用して、VLOG
が現在有効になっているかどうかを確認できます。これにより、複雑なログ コードが不要な場合はスキップできます。プロパティの値は、次のいずれかである必要があります。- ロギングを行わないことを示す空の文字列。
- トークン
1
またはall
。すべてのロギングが実行されることを示します。 - スペース、コンマ、またはコロンで区切られたタグのリストで、どのロギングが実行されるかを示します。タグは、
compilation
、cpuexe
、driver
、execution
、manager
、およびmodel
です。
compliantWithV1_*
: 情報を失うことなく、NN HAL オブジェクトを同じタイプの別の HAL バージョンに変換できる場合はtrue
を返します。たとえば、NN HAL 1.1 または NN HAL 1.2 で導入された操作タイプがモデルに含まれている場合、V1_2::Model
でcompliantWithV1_0
を呼び出すとfalse
が返されます。convertToV1_*
: NN HAL オブジェクトをあるバージョンから別のバージョンに変換します。変換によって情報が失われる場合 (つまり、型の新しいバージョンが値を完全に表現できない場合) は、警告がログに記録されます。機能:
nonExtensionOperandPerformance
およびupdate
関数を使用して、Capabilities::operandPerformance
フィールドを作成できます。タイプのプロパティのクエリ:
isExtensionOperandType
、isExtensionOperationType
、nonExtensionSizeOfData
、nonExtensionOperandSizeOfData
、nonExtensionOperandTypeIsScalar
、tensorHasUnspecifiedDimensions
。
frameworks/ml/nn/common/include/ValidateHal.h
ファイルには、NN HAL オブジェクトがその HAL バージョンの仕様に従って有効であることを検証するためのユーティリティ関数が含まれています。
-
validate*
: NN HAL オブジェクトがその HAL バージョンの仕様に従って有効である場合、true
を返します。 OEM の種類と拡張機能の種類は検証されません。たとえば、存在しないオペランド インデックスを参照する操作、またはその HAL バージョンでサポートされていない操作がモデルに含まれている場合、validateModel
はfalse
を返します。
frameworks/ml/nn/common/include/Tracing.h
ファイルには、Neural Networks コードへの systracing情報の追加を簡素化するためのマクロが含まれています。例については、サンプル ドライバーのNNTRACE_*
マクロ呼び出しを参照してください。
frameworks/ml/nn/common/include/GraphDump.h
ファイルには、デバッグ目的でModel
のコンテンツをグラフィカル形式でダンプするためのユーティリティ関数が含まれています。
-
graphDump
: モデルの表現を Graphviz (.dot
) 形式で、指定されたストリーム (提供されている場合) または logcat (ストリームが提供されていない場合) に書き込みます。
検証
NNAPI の実装をテストするには、Android フレームワークに含まれている VTS および CTS テストを使用します。 VTS は (フレームワークを使用せずに) ドライバーを直接実行しますが、CTS はフレームワークを介して間接的にドライバーを実行します。これらは、各 API メソッドをテストし、ドライバーによってサポートされているすべての操作が正しく機能し、精度要件を満たす結果を提供することを確認します。
NNAPI の CTS および VTS の精度要件は次のとおりです。
浮動小数点: abs(予想 - 実際) <= atol + rtol * abs(予想);どこ:
- fp32 の場合、atol = 1e-5f、rtol = 5.0f * 1.1920928955078125e-7
- fp16 の場合、atol = rtol = 5.0f * 0.0009765625f
Quantized: off-by-one (off-by-three の
mobilenet_quantized
を除く)ブール値:完全一致
CTS が NNAPI をテストする 1 つの方法は、各ドライバーからの実行結果をテストし、NNAPI 参照実装と比較するために使用される固定疑似乱数グラフを生成することです。 NN HAL 1.2 以降のドライバーの場合、結果が精度基準を満たさない場合、CTS はエラーを報告し、失敗したモデルの仕様ファイルをデバッグ用に/data/local/tmp
にダンプします。精度基準の詳細については、 TestRandomGraph.cpp
およびTestHarness.h
を参照してください。
ファズテスト
ファズ テストの目的は、予期しない入力などの要因による、テスト対象のコードのクラッシュ、アサーション、メモリ違反、または一般的な未定義の動作を見つけることです。 NNAPI ファズ テストの場合、Android はlibFuzzerに基づくテストを使用します。これは、以前のテスト ケースのライン カバレッジを使用して新しいランダム入力を生成するため、ファジングに効率的です。たとえば、libFuzzer は新しいコード行で実行されるテスト ケースを優先します。これにより、テストで問題のあるコードを見つけるのにかかる時間が大幅に短縮されます。
ファズ テストを実行してドライバーの実装を検証するには、AOSP にあるlibneuralnetworks_driver_fuzzer
テスト ユーティリティのframeworks/ml/nn/runtime/test/android_fuzzing/DriverFuzzTest.cpp
を変更して、ドライバー コードを含めます。 NNAPI ファズ テストの詳細については、 frameworks/ml/nn/runtime/test/android_fuzzing/README.md
を参照してください。
安全
アプリ プロセスはドライバーのプロセスと直接通信するため、ドライバーは受け取った呼び出しの引数を検証する必要があります。この検証は VTS によって検証されます。検証コードはframeworks/ml/nn/common/include/ValidateHal.h
ます。
ドライバーは、同じデバイスを使用しているときにアプリが他のアプリに干渉できないようにする必要もあります。
Android 機械学習テスト スイート
Android Machine Learning Test Suite (MLTS) は、CTS および VTS に含まれる NNAPI ベンチマークであり、ベンダー デバイスでの実際のモデルの精度を検証します。ベンチマークは、レイテンシと精度を評価し、同じモデルとデータセットについて、CPU で実行されているTF Liteを使用した結果とドライバーの結果を比較します。これにより、ドライバーの精度が CPU リファレンス実装よりも悪くないことが保証されます。
また、Android プラットフォームの開発者は、MLTS を使用して、ドライバーの遅延と精度を評価します。
NNAPI ベンチマークは、AOSP の 2 つのプロジェクトで見つけることができます。
-
platform/test/mlts/benchmark
(ベンチマーク アプリ) -
platform/test/mlts/models
(モデルとデータセット)
モデルとデータセット
NNAPI ベンチマークは、次のモデルとデータセットを使用します。
- 異なるサイズで量子化された MobileNetV1 float および u8 は、Open Images Dataset v4 の小さなサブセット (1500 画像) に対して実行されます。
- 異なるサイズで量子化された MobileNetV2 float および u8 は、Open Images Dataset v4 の小さなサブセット (1500 画像) に対して実行されます。
- テキスト読み上げ用の長期短期記憶 (LSTM) ベースの音響モデルは、CMU 北極セットの小さなサブセットに対して実行されます。
- LibriSpeech データセットの小さなサブセットに対して実行される、自動音声認識用の LSTM ベースの音響モデル。
詳細については、 platform/test/mlts/models
を参照してください。
ストレステスト
Android Machine Learning Test Suite には、負荷の高い使用状況やクライアントの動作のまれなケースでのドライバーの回復力を検証するための一連のクラッシュ テストが含まれています。
すべてのクラッシュ テストは、次の機能を提供します。
- ハング検出:テスト中に NNAPI クライアントがハングした場合、テストは失敗理由
HANG
で失敗し、テスト スイートは次のテストに移動します。 - NNAPI クライアント クラッシュ検出:テストはクライアント クラッシュに耐え、テストは失敗の理由
CRASH
で失敗します。 - ドライバー クラッシュの検出:テストでは、NNAPI 呼び出しでエラーを引き起こすドライバー クラッシュを検出できます。 NNAPI エラーを引き起こさず、テストの失敗を引き起こさないドライバー プロセスでクラッシュが発生する可能性があることに注意してください。この種の障害をカバーするには、ドライバー関連のエラーまたはクラッシュのシステム ログで
tail
コマンドを実行することをお勧めします。 - 利用可能なすべてのアクセラレーターをターゲットにする:テストは、利用可能なすべてのドライバーに対して実行されます。
すべてのクラッシュ テストには、次の 4 つの結果が考えられます。
-
SUCCESS
: エラーなしで実行が完了しました。 -
FAILURE
: 実行に失敗しました。通常、モデルのテスト時のエラーが原因で発生し、ドライバーがモデルのコンパイルまたは実行に失敗したことを示します。 -
HANG
: テスト プロセスが応答しなくなりました。 -
CRASH
: テスト プロセスがクラッシュしました。
ストレス テストの詳細とクラッシュ テストの完全なリストについては、 platform/test/mlts/benchmark/README.txt
を参照してください。
MLTS の使用
MLTS を使用するには:
- ターゲット デバイスをワークステーションに接続し、 adb経由でアクセスできることを確認します。複数のデバイスが接続されている場合は、ターゲット デバイスの
ANDROID_SERIAL
環境変数をエクスポートします。 cd
を Android の最上位ソース ディレクトリに移動します。source build/envsetup.sh lunch aosp_arm-userdebug # Or aosp_arm64-userdebug if available. ./test/mlts/benchmark/build_and_run_benchmark.sh
ベンチマーク実行の最後に、結果が HTML ページとして表示され、
xdg-open
に渡されます。
詳細については、 platform/test/mlts/benchmark/README.txt
を参照してください。
ニューラル ネットワーク HAL バージョン
このセクションでは、Android および Neural Networks HAL バージョンで導入された変更について説明します。
人造人間11号
Android 11 では、NN HAL 1.3 が導入されました。これには、次の重要な変更が含まれています。
- NNAPI での符号付き 8 ビット量子化のサポート。
TENSOR_QUANT8_ASYMM_SIGNED
オペランド タイプを追加します。符号なし量子化を使用する操作をサポートする NN HAL 1.3 を使用するドライバーは、それらの操作の符号付きバリアントもサポートする必要があります。ほとんどの量子化操作の符号付きバージョンと符号なしバージョンを実行する場合、LSH_PROJECTION
は最大CAST
のHASHTABLE_LOOKUP
まで同じPAD_V2
を生成する必要がありQUANTIZED_16BIT_LSTM
。QUANTIZED_16BIT_LSTM
演算は符号付きオペランドをサポートしておらず、他の 4 つの演算は符号付き量子化をサポートしていますが、結果が同じである必要はありません。 - フレームワークが
IPreparedModel::executeFenced
メソッドを呼び出して、待機する同期フェンスのベクトルを使用して、準備されたモデルでフェンスされた非同期実行を開始するフェンス実行のサポート。詳細については、フェンシングされた実行を参照してください。 - 制御フローのサポート。他のモデルを引数として取り、条件付き (
IF
) または繰り返し (WHILE
) 実行するIF
およびWHILE
操作を追加します。詳細については、「制御フロー」を参照してください。 - アプリがそのモデルの相対的な優先度、モデルの準備に予想される最大時間、および実行の完了に予想される最大時間を示すことができるため、サービス品質 (QoS) が向上します。詳細については、「サービスの品質」を参照してください。
- ドライバー管理バッファーのアロケーター インターフェイスを提供するメモリ ドメインのサポート。これにより、実行間でデバイス ネイティブ メモリを渡すことができ、同じドライバーでの連続する実行間での不要なデータのコピーと変換が抑制されます。詳細については、「メモリ ドメイン」を参照してください。
アンドロイド 10
Android 10 では、NN HAL 1.2 が導入されました。これには、次の重要な変更が含まれています。
-
Capabilities
構造体には、スカラー データ型を含むすべてのデータ型が含まれ、名前付きフィールドではなくベクトルを使用して非緩和パフォーマンスを表します。 -
getVersionString
およびgetType
メソッドにより、フレームワークはデバイス タイプ (DeviceType
) およびバージョン情報を取得できます。デバイスの検出と割り当てを参照してください。 - デフォルトでは、
executeSynchronously
メソッドが呼び出され、同期的に実行されます。execute_1_2
メソッドは、非同期で実行するようにフレームワークに指示します。実行を参照してください。 -
executeSynchronously
、execute_1_2
、およびバースト実行のMeasureTiming
パラメーターは、ドライバーが実行時間を測定するかどうかを指定します。結果はTiming
構造体で報告されます。タイミングを参照してください。 - 1 つ以上の出力オペランドが未知の次元またはランクを持つ実行のサポート。出力形状を参照してください。
- ベンダー定義の操作とデータ型のコレクションであるベンダー拡張のサポート。ドライバーは、
IDevice::getSupportedExtensions
メソッドを通じて、サポートされている拡張機能を報告します。ベンダー拡張を参照してください。 - アプリとドライバー プロセス間の通信に高速メッセージ キュー (FMQ) を使用して一連のバースト実行を制御し、待機時間を短縮するバースト オブジェクトの機能。バースト実行と高速メッセージ キューを参照してください。
- ドライバーがデータをコピーせずに実行できるようにする AHardwareBuffer のサポート。 AHardwareBufferを参照してください。
- アプリの起動時にコンパイルにかかる時間を短縮するために、コンパイル アーティファクトのキャッシュのサポートが改善されました。コンパイルのキャッシュを参照してください。
Android 10 では、次のオペランド タイプと演算が導入されています。
ANEURALNETWORKS_BOOL
-
ANEURALNETWORKS_FLOAT16
-
ANEURALNETWORKS_TENSOR_BOOL8
-
ANEURALNETWORKS_TENSOR_FLOAT16
-
ANEURALNETWORKS_TENSOR_QUANT16_ASYMM
-
ANEURALNETWORKS_TENSOR_QUANT16_SYMM
-
ANEURALNETWORKS_TENSOR_QUANT8_SYMM
-
ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL
ANEURALNETWORKS_ABS
-
ANEURALNETWORKS_ARGMAX
-
ANEURALNETWORKS_ARGMIN
-
ANEURALNETWORKS_AXIS_ALIGNED_BBOX_TRANSFORM
-
ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_LSTM
-
ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_RNN
-
ANEURALNETWORKS_BOX_WITH_NMS_LIMIT
-
ANEURALNETWORKS_CAST
-
ANEURALNETWORKS_CHANNEL_SHUFFLE
-
ANEURALNETWORKS_DETECTION_POSTPROCESSING
-
ANEURALNETWORKS_EQUAL
-
ANEURALNETWORKS_EXP
-
ANEURALNETWORKS_EXPAND_DIMS
-
ANEURALNETWORKS_GATHER
-
ANEURALNETWORKS_GENERATE_PROPOSALS
-
ANEURALNETWORKS_GREATER
-
ANEURALNETWORKS_GREATER_EQUAL
-
ANEURALNETWORKS_GROUPED_CONV_2D
-
ANEURALNETWORKS_HEATMAP_MAX_KEYPOINT
-
ANEURALNETWORKS_INSTANCE_NORMALIZATION
-
ANEURALNETWORKS_LESS
-
ANEURALNETWORKS_LESS_EQUAL
-
ANEURALNETWORKS_LOG
-
ANEURALNETWORKS_LOGICAL_AND
-
ANEURALNETWORKS_LOGICAL_NOT
-
ANEURALNETWORKS_LOGICAL_OR
-
ANEURALNETWORKS_LOG_SOFTMAX
-
ANEURALNETWORKS_MAXIMUM
-
ANEURALNETWORKS_MINIMUM
-
ANEURALNETWORKS_NEG
-
ANEURALNETWORKS_NOT_EQUAL
-
ANEURALNETWORKS_PAD_V2
-
ANEURALNETWORKS_POW
-
ANEURALNETWORKS_PRELU
-
ANEURALNETWORKS_QUANTIZE
-
ANEURALNETWORKS_QUANTIZED_16BIT_LSTM
-
ANEURALNETWORKS_RANDOM_MULTINOMIAL
-
ANEURALNETWORKS_REDUCE_ALL
-
ANEURALNETWORKS_REDUCE_ANY
-
ANEURALNETWORKS_REDUCE_MAX
-
ANEURALNETWORKS_REDUCE_MIN
-
ANEURALNETWORKS_REDUCE_PROD
-
ANEURALNETWORKS_REDUCE_SUM
-
ANEURALNETWORKS_RESIZE_NEAREST_NEIGHBOR
-
ANEURALNETWORKS_ROI_ALIGN
-
ANEURALNETWORKS_ROI_POOLING
-
ANEURALNETWORKS_RSQRT
-
ANEURALNETWORKS_SELECT
-
ANEURALNETWORKS_SIN
-
ANEURALNETWORKS_SLICE
-
ANEURALNETWORKS_SPLIT
-
ANEURALNETWORKS_SQRT
-
ANEURALNETWORKS_TILE
-
ANEURALNETWORKS_TOPK_V2
-
ANEURALNETWORKS_TRANSPOSE_CONV_2D
-
ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_LSTM
-
ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_RNN
Android 10 では、既存の操作の多くに更新が導入されています。アップデートは主に以下に関連しています。
- NCHW メモリ レイアウトのサポート
- ソフトマックスおよび正規化操作でのランクが 4 以外のテンソルのサポート
- 膨張畳み込みのサポート
ANEURALNETWORKS_CONCATENATION
での混合量子化による入力のサポート
以下のリストは、Android 10 で変更された操作を示しています。変更の詳細については、NNAPI リファレンス ドキュメントのOperationCodeを参照してください。
-
ANEURALNETWORKS_ADD
-
ANEURALNETWORKS_AVERAGE_POOL_2D
-
ANEURALNETWORKS_BATCH_TO_SPACE_ND
-
ANEURALNETWORKS_CONCATENATION
-
ANEURALNETWORKS_CONV_2D
-
ANEURALNETWORKS_DEPTHWISE_CONV_2D
-
ANEURALNETWORKS_DEPTH_TO_SPACE
-
ANEURALNETWORKS_DEQUANTIZE
-
ANEURALNETWORKS_DIV
-
ANEURALNETWORKS_FLOOR
-
ANEURALNETWORKS_FULLY_CONNECTED
-
ANEURALNETWORKS_L2_NORMALIZATION
-
ANEURALNETWORKS_L2_POOL_2D
-
ANEURALNETWORKS_LOCAL_RESPONSE_NORMALIZATION
-
ANEURALNETWORKS_LOGISTIC
-
ANEURALNETWORKS_LSH_PROJECTION
-
ANEURALNETWORKS_LSTM
-
ANEURALNETWORKS_MAX_POOL_2D
-
ANEURALNETWORKS_MEAN
-
ANEURALNETWORKS_MUL
-
ANEURALNETWORKS_PAD
-
ANEURALNETWORKS_RELU
-
ANEURALNETWORKS_RELU1
-
ANEURALNETWORKS_RELU6
-
ANEURALNETWORKS_RESHAPE
-
ANEURALNETWORKS_RESIZE_BILINEAR
-
ANEURALNETWORKS_RNN
-
ANEURALNETWORKS_ROI_ALIGN
-
ANEURALNETWORKS_SOFTMAX
-
ANEURALNETWORKS_SPACE_TO_BATCH_ND
-
ANEURALNETWORKS_SPACE_TO_DEPTH
-
ANEURALNETWORKS_SQUEEZE
-
ANEURALNETWORKS_STRIDED_SLICE
-
ANEURALNETWORKS_SUB
-
ANEURALNETWORKS_SVDF
-
ANEURALNETWORKS_TANH
-
ANEURALNETWORKS_TRANSPOSE
人造人間 9
NN HAL 1.1 は Android 9 で導入され、次の重要な変更が含まれています。
-
IDevice::prepareModel_1_1
にはExecutionPreference
パラメーターが含まれています。ドライバーはこれを使用して準備を調整できます。アプリがバッテリーを節約することを好むか、モデルを迅速な連続呼び出しで実行することを知っているからです。 - 9 つの新しい操作が追加されました:
BATCH_TO_SPACE_ND
、DIV
、MEAN
、PAD
、SPACE_TO_BATCH_ND
、SQUEEZE
、STRIDED_SLICE
、SUB
、TRANSPOSE
。 - アプリは、
Model.relaxComputationFloat32toFloat16
をtrue
に設定することで、16 ビットの浮動小数点の範囲や精度を使用して 32 ビットの浮動小数点計算を実行できるように指定できます。Capabilities
構造体には、ドライバーがその緩和されたパフォーマンスをフレームワークに報告できるように、追加のフィールドrelaxedFloat32toFloat16Performance
があります。
アンドロイド 8.1
最初のニューラル ネットワーク HAL (1.0) は、Android 8.1 でリリースされました。詳細については、 /neuralnetworks/1.0/
を参照してください。