自 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
期限引數啟動模型準備和執行作業。對於可估算任務所需時間的駕駛,如果驅動程式預估無法在期限前完成工作,這個期限可讓駕駛人在工作開始前取消任務。同樣地,如果駕駛程式預估某項持續性工作無法在期限前完成,則可使用期限來中止該工作。如果工作未在期限前完成,或期限已過,期限引數不會強制驅動程式中止工作。您可以使用 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/
),可確保驅動程式正確處理截止期限。