服務品質

從 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截止時間參數啟動模型準備與執行。對於可以估計任務需要多長時間的驅動程序,如果驅動程式估計任務無法在截止日期之前完成,則此截止日期允許驅動程式在任務開始之前中止任務。同樣,截止日期允許驅動程式中止估計在截止日期之前無法完成的正在進行的任務。如果任務未在截止日期前完成或已過了截止日期,截止日期參數不會強制驅動程式中止任務。截止日期參數可用於釋放驅動程式內的計算資源,並將控制權返回應用程序,速度比沒有截止日期時更快。

包含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/ ) 的測試以確保驅動程式正確處理截止日期。