Android 11 以降の NNAPI では、モデルの相対的な優先度、特定のモデルの準備にかかると想定される最大時間、特定の実行が完了するまでにかかると想定される最大時間をアプリが表示できるようにすることで、サービス品質(QoS)を改善しています。さらに、Android 11 では追加の NNAPI エラー値を導入することにより、サービスが障害発生時の状況をより正確に示し、クライアント アプリがより適切に反応して回復できるようになっています。
優先順位
Android 11 以降では、モデルは NN HAL 1.3 における優先順位に基づいて準備されます。この優先順位は、同じアプリが所有している他の準備済みモデルとの相関関係で設定されます。優先順位の高い実行内容は、優先順位の低い実行内容よりも多くのコンピューティング リソースを使用でき、優先順位の低い実行内容をプリエンプトする、または枯渇させる可能性があります。
明示的な引数として Priority
を含む NN HAL 1.3 呼び出しは IDevice::prepareModel_1_3
です。IDevice::prepareModelFromCache_1_3
のキャッシュ引数には、暗黙的に Priority
が含まれています。
ドライバとアクセラレータの機能に応じて、優先順位をサポートする多くの戦略が存在します。たとえば次のような戦略があります。
- 優先順位のサポートが組み込まれたドライバの場合は、
Priority
フィールドをアクセラレータに直接プロパゲートします。 - 実行内容がアクセラレータに到達する前であっても、アプリごとの優先キューを使用して異なる優先順位をサポートします。
実行されている優先順位の低いモデルを一時停止またはキャンセルし、アクセラレータを解放して優先順位の高いモデルを実行できるようにします。これを行うには、優先順位の低いモデルにチェックポイントを挿入し、アクセスがあった場合にフラグをクエリして現在の実行内容を予定より早く終了するかどうかを決定するか、モデルをサブモデルにパーティショニングして、サブモデルの実行間のフラグをクエリします。優先順位に基づいて準備されたモデルでチェックポイントまたはサブモデルを使用すると、優先順位が設定されていない NN HAL 1.3 より前のバージョンのモデルには見られない、オーバーヘッドの増大が発生する可能性があります。
- プリエンプションをサポートするには、次に実行するオペレーションまたはサブモデル、関連する中間オペランド データなどの実行コンテキストを保持します。この実行コンテキストを使用して、後で実行を再開します。
- プリエンプションを完全にサポートする必要がないため、実行コンテキストを保持する必要はありません。NNAPI モデルの実行は確定的であるため、実行は後で一から再開できます。
Android では、AID(Android UID)を使用することで、さまざまな通話アプリ間でサービスを区別できます。HIDL には、::android::hardware::IPCThreadState::getCallingUid
メソッドを使用して呼び出し側アプリの UID を取得するための組み込みメカニズムが用意されています。AID のリストは、libcutils/include/cutils/android_filesystem_config.h
でご確認いただけます。
期限
Android 11 以降では、OptionalTimePoint
deadline 引数を指定して、モデルの準備と実行を開始できます。この期限を設定することによって、タスクに要する時間を推測できるドライバでは、期限前にタスクを完了できないと推定した場合に、ドライバは開始する前にタスクを中止できます。同様に、期限を設定することによって、期限内に完了できないと推測した場合にドライバは進行中のタスクを中止できます。タスクが期限までに完了しなかった場合、または期限を経過した場合に、deadline 引数がタスクを中止するようドライバに強制することはありません。deadline 引数を使用すると、ドライバ内のコンピューティング リソースを解放し、期限が設定されていない場合よりも迅速にアプリに制御を戻すことができます。
OptionalTimePoint
の期限を引数として含む NN HAL 1.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
の NNAPI サンプル ドライバをご確認ください。
エラーコード
Android 11 では NN HAL 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/
)と呼ばれる一連のテストが含まれます。