服務品質

自 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/) 的測試,確保驅動程式能正確處理期限。