Android 11以降、NNAPIは、アプリがモデルの相対的な優先順位、特定のモデルの準備に予想される最大時間、およびに予想される最大時間を表示できるようにすることで、より優れたサービス品質(QoS)を提供します。完了すべき特定の実行。さらに、Android 11では追加のNNAPIエラー値が導入されており、障害が発生したときにサービスが何がうまくいかなかったかをより正確に示すことができるため、クライアントアプリはより適切に対応して回復できます。
優先度
Android 11以降の場合、モデルはNN HAL1.3で優先的に準備されます。この優先度は、同じアプリが所有する他の準備されたモデルと比較しています。優先度の高い実行は、優先度の低い実行よりも多くのコンピューティングリソースを使用する可能性があり、優先度の低い実行をプリエンプトまたは枯渇させる可能性があります。
明示的な引数としてPriority
を含むNNHAL 1.3呼び出しは、 IDevice::prepareModel_1_3
です。 IDevice::prepareModelFromCache_1_3
には、キャッシュ引数にPriority
が暗黙的に含まれていることに注意してください。
ドライバーとアクセルの機能に応じて、優先順位をサポートするための多くの可能な戦略があります。ここにいくつかの戦略があります:
- 優先度サポートが組み込まれているドライバーの場合、
Priority
フィールドをアクセラレーターに直接伝達します。 - アプリごとの優先度キューを使用して、実行がアクセラレータに到達する前でも、さまざまな優先度をサポートします。
現在実行中の優先度の低いモデルを一時停止またはキャンセルして、アクセラレータを解放して優先度の高いモデルを実行します。これを行うには、優先度の低いモデルにチェックポイントを挿入し、到達時にフラグをクエリして現在の実行を途中で停止するかどうかを判断するか、モデルをサブモデルに分割してサブモデルの実行間でフラグをクエリします。優先度を付けて作成されたモデルでチェックポイントまたはサブモデルを使用すると、NN HAL1.3より前のバージョンでは優先度のないモデルには存在しない追加のオーバーヘッドが発生する可能性があることに注意してください。
- プリエンプションをサポートするには、実行される次の操作またはサブモデル、および関連する中間オペランドデータを含む実行コンテキストを保持します。この実行コンテキストを使用して、後で実行を再開します。
- 完全なプリエンプションのサポートは必要ないため、実行コンテキストを保持する必要はありません。 NNAPIモデルの実行は決定論的であるため、後で実行を最初から再開できます。
Androidを使用すると、サービスはAID(Android UID)を使用してさまざまな呼び出し元アプリを区別できます。 HIDLには、メソッド::android::hardware::IPCThreadState::getCallingUid
を介して呼び出し元アプリのUIDを取得するメカニズムが組み込まれています。 AIDのリストは、 libcutils/include/cutils/android_filesystem_config.h
ます。
締め切り
Android 11以降、モデルの準備と実行は、 OptionalTimePoint
の期限引数を使用して起動できます。タスクにかかる時間を見積もることができるドライバーの場合、この期限により、ドライバーは、期限前にタスクを完了できないと見積もった場合に、タスクを開始する前にタスクを中止できます。同様に、期限により、ドライバーは、期限前に完了しないと推定される進行中のタスクを中止できます。期限引数は、タスクが期限までに完了していない場合、または期限が過ぎている場合に、ドライバーにタスクの中止を強制しません。期限引数を使用すると、ドライバー内のコンピューティングリソースを解放し、期限なしの場合よりも速く制御をアプリに戻すことができます。
引数としてOptionalTimePoint
の期限を含むNNHAL1.3呼び出しは次のとおりです。
-
IDevice::prepareModel_1_3
-
IDevice::prepareModelFromCache_1_3
-
IPreparedModel::execute_1_3
-
IPreparedModel::executeSynchronously_1_3
-
IPreparedModel::executeFenced
上記の各メソッドの期限機能のリファレンス実装を確認するには、 frameworks/ml/nn/driver/sample/SampleDriver.cpp
/SampleDriver.cppにあるNNAPIサンプルドライバーを参照してください。
エラーコード
Android11にはNNHAL 1.3に4つのエラーコード値が含まれており、エラーレポートが改善され、ドライバーが状態とアプリをより適切に伝達して、より適切に回復できるようになります。これらは、 ErrorStatus
のエラーコード値です。
-
MISSED_DEADLINE_TRANSIENT
-
MISSED_DEADLINE_PERSISTENT
-
RESOURCE_EXHAUSTED_TRANSIENT
-
RESOURCE_EXHAUSTED_PERSISTENT
Android 10以下では、ドライバーはGENERAL_FAILURE
エラーコードを介してのみ障害を示すことができました。 Android 11から、2つのMISSED_DEADLINE
エラーコードを使用して、期限に達したため、またはドライバーが期限までにワークロードが完了しないと予測したために、ワークロードが中止されたことを示すことができます。 2つのRESOURCE_EXHAUSTED
エラーコードを使用して、ドライバーに呼び出し用の十分なメモリがないなど、ドライバー内のリソース制限が原因でタスクが失敗したことを示すことができます。
両方のエラーのTRANSIENT
バージョンは、問題が一時的なものであり、同じタスクへの今後の呼び出しが少し遅れて成功する可能性があることを示しています。たとえば、このエラーコードは、ドライバーが以前の長時間実行またはリソースを大量に消費する作業でビジー状態の場合に返される必要がありますが、ドライバーが以前の作業でビジー状態でない場合、新しいタスクは正常に完了します。両方のエラーのPERSISTENT
バージョンは、同じタスクへの将来の呼び出しが常に失敗すると予想されることを示しています。たとえば、このエラーコードは、完全な条件下でもタスクが期限までに完了しないとドライバーが推定した場合、またはモデルが本質的に大きすぎてドライバーのリソースを超えている場合に返されます。
検証
サービス品質機能は、NNAPI VTSテスト( VtsHalNeuralnetworksV1_3Target
)でテストされます。これには、ドライバーが無効な優先順位を拒否することを確認するための検証用の一連のテスト( TestGenerated/ValidationTest#Test/
)と、ドライバーが期限を正しく処理することを確認するためのDeadlineTest
( TestGenerated/DeadlineTest#Test/
)と呼ばれる一連のテストが含まれます。