自 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 快。
包含 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/
),確保驅動程式會正確處理期限。