從 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 示例驅動程序。
錯誤代碼
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/
) 的測試以確保驅動程序正確處理截止日期。