從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。可以在libcutils/include/cutils/android_filesystem_config.h
找到AID列表。
截止期限
從Android 11開始,可以使用OptionalTimePoint
截止日期參數啟動模型準備和執行。對於可以估計任務花費多長時間的駕駛員,如果駕駛員估計任務不能在截止日期之前完成,則該截止日期允許駕駛員在任務開始之前中止該任務。同樣,截止日期允許駕駛員中止正在進行的任務,該任務估計在截止日期之前將無法完成。如果任務未在截止日期之前完成或如果截止日期已過,則截止日期參數不會強制駕駛員中止任務。截止時間參數可用於釋放驅動程序內的計算資源,並比沒有截止時間的情況更快地將控制返回給應用程序。
包含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示例驅動frameworks/ml/nn/driver/sample/SampleDriver.cpp
。
錯誤代碼
Android 11在NN HAL 1.3中包含四個錯誤代碼值,以改善錯誤報告,使驅動程序可以更好地交流其狀態,並讓應用程序更優雅地恢復。這些是ErrorStatus
中的錯誤代碼值。
-
MISSED_DEADLINE_TRANSIENT
-
MISSED_DEADLINE_PERSISTENT
-
RESOURCE_EXHAUSTED_TRANSIENT
-
RESOURCE_EXHAUSTED_PERSISTENT
在Android 10或更低版本中,驅動程序只能通過GENERAL_FAILURE
錯誤代碼指示失敗。從Android 11開始,兩個MISSED_DEADLINE
錯誤代碼可用於指示由於達到了截止日期或驅動程序預測工作負載將在截止日期之前完成而中止工作負載。這兩個RESOURCE_EXHAUSTED
錯誤代碼可用於指示由於驅動程序內的資源限制(例如,驅動程序沒有足夠的內存用於調用)而導致任務失敗。
這兩個錯誤的TRANSIENT
版本表示該問題是暫時的,並且在短暫的延遲後,以後對同一任務的調用可能會成功。例如,當驅動程序忙於先前的長時間運行或占用大量資源的工作時,應返回此錯誤代碼,但是如果驅動程序不忙於先前的工作,則新任務將成功完成。這兩個錯誤的PERSISTENT
版本表明,將來對同一任務的調用總是會失敗。例如,當駕駛員估計即使在理想條件下,任務也無法在截止日期之前完成任務時,或者模型固有地太大而超出駕駛員的資源時,應返回此錯誤代碼。
驗證方式
服務質量功能的質量已在NNAPI VTS測試( VtsHalNeuralnetworksV1_3Target
)中進行了測試。這包括一組用於驗證的測試( TestGenerated/ValidationTest#Test/
)以確保驅動程序拒絕無效的優先級,還包括一組稱為DeadlineTest
的測試( TestGenerated/DeadlineTest#Test/
)以確保驅動程序正確地處理期限。