Neural Networks API 驅動程式

本頁概略說明如何實作 Neural Networks API (NNAPI) 驅動程式。詳情請參閱 hardware/interfaces/neuralnetworks 中 HAL 定義檔的說明文件。範例驅動程式實作項目位於 frameworks/ml/nn/driver/sample 中。

如要進一步瞭解 Neural Networks API,請參閱 Neural Networks API

Neural Networks HAL

類神經網路 (NN) HAL 定義了產品中各種裝置的抽象化機制,例如圖形處理器 (GPU) 和數位訊號處理器 (DSP) 會在產品中 (例如手機或平板電腦)。這些裝置的驅動程式必須符合 NN HAL。該介面是在 hardware/interfaces/neuralnetworks 的 HAL 定義檔案中指定。

架構與驅動程式之間的介面一般流程如圖 1 所示。

類神經網路流

圖 1. 類神經網路流動

初始化

在初始化時,架構會使用 IDevice::getCapabilities_1_3 查詢驅動程式對其功能的能力。@1.3::Capabilities 結構包含所有資料類型,並以向量呈現非寬鬆的效能。

為了決定如何將運算作業分配給可用裝置,這項架構會使用相關功能,瞭解每個驅動程式執行執行作業的速度和能源效率。為提供這類資訊,驅動程式必須提供根據參考工作負載的執行結果提供標準化的效能數字。

如要判斷驅動程式在回應 IDevice::getCapabilities_1_3 時傳回的值,請使用 NNAPI 基準應用程式來評估對應資料類型的效能。如要測量 32 位元浮點值的效能,建議使用 MobileNet v1 和 v2、asr_floattts_float 模型;如果是 8 位元的量化值,建議使用 MobileNet v1 和 v2 量化模型。詳情請參閱 Android Machine Learning Test Suite

在 Android 9 以下版本中,Capabilities 結構體只會納入浮點和量化張量的驅動程式效能資訊,不會納入標量資料類型。

在初始化過程中,架構可使用 IDevice::getTypeIDevice::getVersionStringIDevice:getSupportedExtensionsIDevice::getNumberOfCacheFilesNeeded 查詢更多資訊。

產品重新啟動時,架構預期本節所述的所有查詢一律向特定驅動程式回報相同的值。否則,使用該驅動程式的應用程式可能會出現效能降低或行為不正確的情況。

編譯

此架構會決定收到應用程式要求時要使用的裝置。在 Android 10 中,應用程式可以探索及指定架構挑選的裝置。詳情請參閱「裝置探索與指派」。

在模型編譯期間,架構會透過呼叫 IDevice::getSupportedOperations_1_3,將模型傳送至每個候選驅動程式。每個驅動程式都會傳回布林值陣列,指出模型支援哪些作業。驅動程式可能會因多種原因判斷無法支援特定作業。例如:

  • 驅動程式不支援資料類型。
  • 驅動程式僅支援具有特定輸入參數的作業。舉例來說,某個驅動程式可能支援 3x3 和 5x5,但不支援 7x7 卷積作業。
  • 驅動程式受限於記憶體限制,無法處理大型圖形或輸入內容。

在編譯期間,如 OperandLifeTime 所述,模型的輸入、輸出和內部運算元可能會有不明維度或排名。詳情請參閱「輸出形狀」。

此架構會指示每個所選驅動程式,透過呼叫 IDevice::prepareModel_1_3 準備執行模型的子集。每個驅動程式都會編譯其子集。例如,駕駛可以產生程式碼,或建立重新排序的權重副本。因為從模型編譯到執行要求之間可能會有大量時間,所以不應在編譯期間指派大型裝置記憶體區塊等資源。

如果成功,驅動程式會傳回 @1.3::IPreparedModel 句柄。如果驅動程式在準備模型子集時傳回錯誤代碼,架構就會在 CPU 上執行整個模型。

為了減少應用程式啟動時所需的編譯時間,驅動程式可以快取編譯構件。詳情請參閱編譯快取一文。

執行

當應用程式要求架構執行要求時,架構會預設呼叫 IPreparedModel::executeSynchronously_1_3 HAL 方法,對已準備好的模型執行同步執行作業。您也可以使用 execute_1_3 方法、executeFenced 方法 (請參閱「柵欄式執行」),或使用爆發式執行,以非同步方式執行要求。

與非同步呼叫相比,同步執行呼叫可提高效能並減少執行緒負擔,這是因為控制項只會在執行完成後傳回至應用程式程序。也就是說,驅動程式不需要另外使用機制,通知應用程式程序執行作業已完成。

使用非同步 execute_1_3 方法時,控制權會在執行作業開始後傳回應用程式程序,且驅動程式必須使用 @1.3::IExecutionCallback 在執行作業完成時通知架構。

傳遞至執行方法的 Request 參數會列出用於執行作業的輸入和輸出運算元。儲存運算元資料的記憶體必須使用資料列主要順序,且第一個維度用於疊代最慢,且在任何資料列結尾沒有邊框間距。如要進一步瞭解運算元類型,請參閱運算元

對於 NN HAL 1.2 以上版本的驅動程式,在要求完成後,系統會將錯誤狀態、輸出形狀時間資訊傳回至架構。執行期間,模型的輸出或內部運算元可能會有一或多個未知維度或未知秩,如果至少有一個輸出運算子的維度或秩不明確,驅動程式就必須傳回動態大小的輸出資訊。

對於使用 NN HAL 1.1 以下版本的驅動程式,只有在要求完成時才會傳回錯誤狀態。輸入和輸出運算元的維度必須完整指定,才能順利執行。內部運算元可以有一或多個未知的維度,但必須已指定排名。

對於跨越多個驅動程式的使用者要求,此架構會負責保留中介記憶體,並為每個驅動程式的呼叫排序。

您可在同一個 @1.3::IPreparedModel 上同時啟動多項要求。驅動程式可以平行執行要求,或將執行作業序列化。

架構可以要求驅動程式保留多個已準備的模型。例如,準備模型 m1、準備 m2、在 m1 上執行 r2、在 m1 上執行 r2、在 m1 上執行 r3、在 m2 上執行 r4、發布 (如清理) m1m2 版本。m2r1

為避免首次執行速度緩慢而可能導致使用者體驗不佳 (例如第一個影格延遲),驅動程式應在編譯階段執行大部分的初始化作業。首次執行時的初始化作業應限於在早期執行時會對系統健康狀況造成負面影響的動作,例如保留大型暫時緩衝區或提高裝置的時脈率。如果驅動程式只能準備有限數量的並行模型,則可能必須在首次執行時完成初始化作業。

在 Android 10 以上版本中,如果有許多執行作業以相同的準備模型快速依序執行,用戶端可以選擇使用執行爆發物件,在應用程式和驅動程式程序之間進行通訊。詳情請參閱爆發執行和快速訊息佇列

為了改善連續執行多個作業的效能,驅動程式可以保留暫時緩衝區或提高時脈速率。如果在固定時間後未建立新要求,建議您建立監視線程來釋出資源。

輸出形狀

如果要求中有一或多個輸出運算元未指定所有維度,驅動程式必須提供輸出形狀清單,其中包含執行後每個輸出運算元的維度資訊。如要進一步瞭解維度,請參閱 OutputShape

如果執行作業因輸出緩衝區大小不足而失敗,驅動程式必須在輸出形狀清單中指出哪些輸出運算元有緩衝區大小不足的問題,並盡可能回報大量的維度資訊,並將未知的維度設為零。

時間

在 Android 10 中,如果應用程式已在編譯程序期間指定單一裝置要使用的裝置,應用程式可以要求執行時間。詳情請參閱 MeasureTiming 和「裝置探索與指派」。在這種情況下,NN HAL 1.2 驅動程式必須在執行要求時,評估執行時間長度,或回報 UINT64_MAX (表示無法取得時間長度)。驅動程式應盡量減少測量執行時對效能產生的負面影響。

驅動程式會在 Timing 結構體中以微秒為單位回報下列時間長度:

  • 裝置上的執行時間:不包含在主機處理器上執行的驅動程式執行時間。
  • 驅動程式執行時間:包含裝置上的執行時間。

這些時間長度必須包含執行作業暫停的時間,例如執行作業遭到其他任務先佔,或是正在等待資源可供使用時。

如未要求驅動程式測量執行時間長度,或是發生執行錯誤,驅動程式就必須將持續時間回報為 UINT64_MAX。即使系統要求驅動程式測量執行時間長度,也可以改為回報 UINT64_MAX 在裝置上的時間、驅動程式中的時間,或同時回報兩者。如果驅動程式回報的兩個時間長度皆為 UINT64_MAX 以外的值,驅動程式中的執行時間必須等於或超過裝置上的時間。

圍欄執行

在 Android 11 中,NNAPI 可讓執行作業等待 sync_fence 控點清單,並視需要傳回 sync_fence 物件,該物件會在執行完成時發出信號。這麼做可減少小型序列模型和串流用途的負擔。此外,Fenced 執行也讓其他可發出信號或等待 sync_fence 的元件,更有效率地互通。如要進一步瞭解 sync_fence,請參閱「同步處理架構」。

在柵欄執行作業中,架構會呼叫 IPreparedModel::executeFenced 方法,在已準備好的模型上啟動柵欄式非同步執行作業,並使用要等待的同步柵欄向量。如果非同步工作在呼叫傳回前完成,系統會為 sync_fence 傳回空的句柄。您也必須傳回 IFencedExecutionCallback 物件,讓架構查詢錯誤狀態和持續時間資訊。

執行完成後,您可以透過 IFencedExecutionCallback::getExecutionInfo 查詢執行時間長度的下列兩個時間值。

  • timingLaunched:從呼叫 executeFencedexecuteFenced 傳送傳回 syncFence 的時間長度。
  • timingFenced:從執行作業等待所有同步區塊收到訊號,到 executeFenced 傳送傳回 syncFence 訊號的時間長度。

控制流程

對於搭載 Android 11 以上版本的裝置,NNAPI 包含兩個控制流程運算:IFWHILE,這兩個運算會將其他模型做為引數,並以條件式 (IF) 或重複 (WHILE) 方式執行。如要進一步瞭解如何實作這項功能,請參閱「控制流程」一文。

服務品質

在 Android 11 中,NNAPI 可在應用程式中指出模型的相對優先順序、模型準備時間上限,以及執行執行作業的預期最長時間,藉此改善服務品質 (QoS)。詳情請參閱服務品質

清除

應用程式使用完備的模型後,架構會釋出對 @1.3::IPreparedModel 物件的參照。當 IPreparedModel 物件不再被參照時,系統會在建立該物件的驅動程式服務中自動銷毀該物件。此時,驅動程式在實作析構函式時,可以回收特定模型的資源。如果驅動程式服務希望在用戶端不再需要時自動刪除 IPreparedModel 物件,則在透過 IPreparedModelCallback::notify_1_3 傳回 IPreparedeModel 物件後,不得保留對 IPreparedModel 物件的任何參照。

CPU 使用率

驅動程式應使用 CPU 設定運算作業。驅動程式不應使用 CPU 執行圖形運算,因為這會影響架構,以正確分配工作。驅動程式應向架構回報無法處理的部分,讓架構處理其餘部分。

此架構為所有 NNAPI 作業提供 CPU 實作,供應商定義的作業除外。詳情請參閱「供應商擴充功能」。

Android 10 中推出的作業 (API 級別 29) 僅有參考 CPU 實作,用於驗證 CTS 和 VTS 測試是否正確。行動裝置機器學習架構包含的最佳化實作,而非 NNAPI CPU 實作。

公用函式

NNAPI 程式碼集包含可供驅動程式服務使用的公用程式函式。

frameworks/ml/nn/common/include/Utils.h 檔案含有各種公用程式函式,例如用於記錄及用於不同 NN HAL 版本轉換的公用程式函式。

  • VLogging:VLOG 是 Android LOG 的包裝函式巨集,只有在 debug.nn.vlog 屬性中設定適當的標記時,才會記錄訊息。您必須先呼叫 initVLogMask(),再呼叫 VLOG。您可以使用 VLOG_IS_ON 巨集檢查 VLOG 目前是否已啟用,如果不需要,可以略過複雜的記錄程式碼。該屬性的值必須為下列其中一個值:

    • 空字串,表示沒有任何記錄。
    • 1all 符記,表示所有記錄都已完成。
    • 標記清單,以空格、半形逗號或冒號分隔,用於指出要執行哪些記錄。這些標記為 compilationcpuexedriverexecutionmanagermodel
  • compliantWithV1_*:如果 NN HAL 物件可以轉換為相同類型的不同 HAL 版本,而不會遺失資訊,則傳回 true。舉例來說,如果模型包含 NN HAL 1.1 或 NN HAL 1.2 導入的運算類型,對 V1_2::Model 呼叫 compliantWithV1_0 就會傳回 false

  • convertToV1_*:將 NN HAL 物件從一個版本轉換為另一個版本。如果轉換導致資訊遺失 (也就是該類型的新版本無法完整代表值),系統會記錄警告。

  • 功能:nonExtensionOperandPerformanceupdate 函式可用來建構 Capabilities::operandPerformance 欄位。

  • 查詢類型屬性:isExtensionOperandTypeisExtensionOperationTypenonExtensionSizeOfDatanonExtensionOperandSizeOfDatanonExtensionOperandTypeIsScalartensorHasUnspecifiedDimensions

frameworks/ml/nn/common/include/ValidateHal.h 檔案包含公用程式函式,用於根據其 HAL 版本規格驗證 NN HAL 物件是否有效。

  • validate*:如果 NN HAL 物件符合 HAL 版本規格,則會傳回 true。OEM 類型和擴充功能類型未經過驗證。舉例來說,如果模型包含的運算參照了不存在的運算元索引,或是該 HAL 版本不支援的作業,則 validateModel 會傳回 false

frameworks/ml/nn/common/include/Tracing.h 檔案包含巨集,可簡化在類神經網路程式碼中加入系統追蹤資訊的流程。如需範例,請參閱驅動程式範例中的 NNTRACE_* 巨集叫用。

frameworks/ml/nn/common/include/GraphDump.h 檔案包含公用函式,可將 Model 的內容以圖形形式轉儲,以利偵錯。

  • graphDump:將模型的表示法以 Graphviz (.dot) 格式寫入指定的串流 (如果提供),或寫入 logcat (如果沒有提供串流)。

驗證

如要測試 NNAPI 的實作結果,請使用 Android 架構中包含的 VTS 和 CTS 測試。VTS 會直接測試驅動程式 (不使用架構),而 CTS 則會透過架構間接測試驅動程式。這些 API 方法會測試每個 API 方法,並確認驅動程式支援的所有作業都能正常運作,並提供符合精確度要求的結果。

NNAPI 在 CTS 和 VTS 中的精確度要求如下:

  • 浮點:abs(expected - actual) <= atol + rtol  * abs(expected);其中:

    • 針對 fp32,atol = 1e-5f,rtol = 5.0f * 1.1920928955078125e-7
    • 針對 fp16,atol = rtol = 5.0f * 0.0009765625f
  • 量化:偏差為 1 (mobilenet_quantized 除外,偏差為 3)

  • 布林值:完全比對

CTS 測試 NNAPI 的方式之一,是產生固定的偽隨機圖表,用於測試並比較每個驅動程式的執行結果,以及 NNAPI 參考實作項目。如果驅動程式使用 NN HAL 1.2 以上版本,且結果未達精確度標準,CTS 就會回報錯誤,並在 /data/local/tmp 下轉儲失敗模型的規格檔案,以便進行偵錯。如要進一步瞭解精確度條件,請參閱 TestRandomGraph.cppTestHarness.h

模糊測試

模糊測試的目的是找出因輸入內容等因素導致的測試程式碼發生當機、斷言、記憶體違規事件,或一般未定義行為。針對 NNAPI 模糊測試,Android 使用以 libFuzzer 為基礎的測試,由於這些測試會使用先前測試案例的行涵蓋率來產生新的隨機輸入內容,因此更有效率。例如,libFuzzer 會偏好在新程式碼行執行的測試案例。這可大幅縮短測試尋找有問題的程式碼所需的時間。

如要執行模糊測試來驗證驅動程式實作方式,請修改 AOSP 中 libneuralnetworks_driver_fuzzer 測試公用程式中的 frameworks/ml/nn/runtime/test/android_fuzzing/DriverFuzzTest.cpp,以納入驅動程式程式碼。如要進一步瞭解 NNAPI 模糊測試,請參閱「frameworks/ml/nn/runtime/test/android_fuzzing/README.md」。

安全性

由於應用程式程序會直接與驅動程式的程序通訊,因此驅動程式必須驗證所收到的呼叫引數。此驗證由 VTS 驗證。驗證碼位於 frameworks/ml/nn/common/include/ValidateHal.h

使用同一部裝置時,驅動程式也應確保應用程式不會幹擾其他應用程式。

Android 機器學習測試套件

Android 機器學習測試套件 (MLTS) 是 CTS 和 VTS 中包含的 NNAPI 基準測試,可用於驗證供應商裝置上實際模型的準確度。該基準會評估延遲時間和準確率,並針對相同的模型和資料集,將驅動程式結果與透過 CPU 上執行的 TF Lite 完成的作業相比較。這可確保驅動程式的準確率不低於 CPU 參照實作項目。

Android 平台開發人員也會使用 MLTS 評估驅動程式的延遲時間和準確度。

您可以在 AOSP 的兩個專案中找到 NNAPI 基準:

模型和資料集

NNAPI 基準測試會使用下列模型和資料集。

  • 以不同大小的 MobileNetV1 浮點和 u8 量化,針對 Open Images Dataset v4 的小型子集 (1,500 張圖片) 執行。
  • MobileNetV2 浮點值,並以不同大小量化的 u8 量化,針對 Open Images 資料集 v4 的一小部分 (1500 張圖片) 執行。
  • 以長短期記憶 (LSTM) 為基礎的語音轉文字音訊模型,針對 CMU Arctic 資料集的一小部分執行。
  • 用於自動語音辨識的 LSTM 原聲模型,對 LibriSpeech 資料集的一小部分執行。

詳情請參閱 platform/test/mlts/models

壓力測試

Android Machine Learning Test Suite 提供一系列當機測試,可在高用量條件或用戶端行為的極端情況中,驗證驅動程式的恢復能力。

所有碰撞測試都提供下列功能:

  • 懸掛偵測:如果 NNAPI 用戶端在測試期間停止運作,測試失敗並顯示失敗原因 HANG,測試套件會移至下一個測試。
  • NNAPI 用戶端當機偵測:測試在用戶端當機後仍然有效,且測試失敗,並顯示失敗原因 CRASH
  • 驅動程式當機偵測:測試可偵測導致 NNAPI 呼叫失敗的驅動程式當機情形。請注意,驅動程式程序中可能會發生當機情形,但不會導致 NNAPI 失敗,也不會導致測試失敗。為了因應這種故障情形,建議您在系統記錄上執行 tail 指令,找出驅動程式相關錯誤或當機情況。
  • 指定所有可用的加速器:系統會針對所有可用驅動程式執行測試。

所有碰撞測試都可能有以下四種結果:

  • SUCCESS:執行完成,未出現錯誤。
  • FAILURE:執行失敗。原因通常是測試模型時發生失敗,表示驅動程式無法編譯或執行模型。
  • HANG:測試程序沒有回應。
  • CRASH:測試程序異常終止。

如要進一步瞭解壓力測試和完整的當機測試清單,請參閱「platform/test/mlts/benchmark/README.txt」。

使用 MLTS

如要使用 MLTS:

  1. 將目標裝置連線至工作站,並確保可透過 ADB 存取。如果連接多部裝置,請匯出目標裝置 ANDROID_SERIAL 環境變數。
  2. cd 至 Android 頂層來源目錄。

    source build/envsetup.sh
    lunch aosp_arm-userdebug # Or aosp_arm64-userdebug if available.
    ./test/mlts/benchmark/build_and_run_benchmark.sh
    

    基準測試執行結束後,結果會以 HTML 網頁的形式呈現,並傳遞至 xdg-open

詳情請參閱 platform/test/mlts/benchmark/README.txt

類神經網路 HAL 版本

本節說明 Android 和神經網路 HAL 版本中引進的變更。

Android 11

Android 11 推出 NN HAL 1.3,其中包含下列重要變更。

  • 支援 NNAPI 中已簽署的 8 位元量化功能。新增 TENSOR_QUANT8_ASYMM_SIGNED 運算元類型。支援未簽署量化運算的 NN HAL 1.3 驅動程式,也必須支援這些運算的已簽署變化版本。執行大部分量化運算的已簽署和未簽署版本時,驅動程式必須產生相同的結果,偏移量最多為 128。這項規定有五個例外狀況:CASTHASHTABLE_LOOKUPLSH_PROJECTIONPAD_V2QUANTIZED_16BIT_LSTMQUANTIZED_16BIT_LSTM 作業不支援已簽署的運算元,另外四個運算支援已簽署量化,但結果不必相同。
  • 支援圍欄執行作業,此時架構會呼叫 IPreparedModel::executeFenced 方法,在準備好的模型上透過同步圍欄向量啟動圍欄的非同步執行作業。詳情請參閱「區隔執行」。
  • 支援控制流程。新增 IFWHILE 作業,以便將其他模型做為引數,並有條件地執行 (IF) 或重複執行 (WHILE)。詳情請參閱「控制流程」一文。
  • 改善服務品質 (QoS),因為應用程式可指示模型的相對優先順序、準備模型的預計最長時間,以及完成執行作業的預計最長時間。詳情請參閱服務品質
  • 支援為驅動程式代管緩衝區提供配置器介面的記憶體網域。這樣就能在各執行作業之間傳遞裝置原生記憶,避免在同一驅動程式的連續執行之間傳送不必要的資料複製與轉換。詳情請參閱「記憶體網域」。

Android 10

Android 10 推出 NN HAL 1.2,其中包含下列重要變更。

  • Capabilities 結構包含所有資料類型 (包括純量資料類型),並使用向量 (而非已命名的欄位) 表示非寬鬆的效能。
  • getVersionStringgetType 方法可讓架構擷取裝置類型 (DeviceType) 和版本資訊。請參閱「裝置探索與指派」。
  • 根據預設,系統會呼叫 executeSynchronously 方法,以便同步執行。execute_1_2 方法會指示架構以非同步方式執行執行作業。請參閱「執行」一節。
  • executeSynchronouslyexecute_1_2 和突發執行作業的 MeasureTiming 參數,可指定驅動程式是否要評估執行時間長度。結果會在 Timing 結構中回報。請參閱 Timing 一節。
  • 支援在執行時,一或多個輸出運算元有不明的維度或秩序的情況。請參閱「輸出形狀」一節。
  • 支援廠商擴充功能,其中包含供應商定義的作業與資料類型集合。驅動程式會透過 IDevice::getSupportedExtensions 方法回報支援的擴充功能。請參閱「供應商額外資訊」。
  • 可讓爆發物件使用快速訊息佇列 (FMQ) 控管一組爆發執行作業,藉此在應用程式與驅動程式程序之間進行通訊,進而縮短延遲時間。請參閱「爆發執行作業和快速訊息佇列」。
  • 支援 AHardwareBuffer,讓驅動程式可在未複製資料的情況下執行。請參閱 AHardwareBuffer
  • 改善編譯構件快取支援功能,以便在應用程式啟動時減少編譯所需的時間。請參閱「編譯快取」一文。

Android 10 推出了下列運算元類型和作業。

  • 運算元式類型

    • ANEURALNETWORKS_BOOL
    • ANEURALNETWORKS_FLOAT16
    • ANEURALNETWORKS_TENSOR_BOOL8
    • ANEURALNETWORKS_TENSOR_FLOAT16
    • ANEURALNETWORKS_TENSOR_QUANT16_ASYMM
    • ANEURALNETWORKS_TENSOR_QUANT16_SYMM
    • ANEURALNETWORKS_TENSOR_QUANT8_SYMM
    • ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL
  • 作業套件

    • ANEURALNETWORKS_ABS
    • ANEURALNETWORKS_ARGMAX
    • ANEURALNETWORKS_ARGMIN
    • ANEURALNETWORKS_AXIS_ALIGNED_BBOX_TRANSFORM
    • ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_LSTM
    • ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_RNN
    • ANEURALNETWORKS_BOX_WITH_NMS_LIMIT
    • ANEURALNETWORKS_CAST
    • ANEURALNETWORKS_CHANNEL_SHUFFLE
    • ANEURALNETWORKS_DETECTION_POSTPROCESSING
    • ANEURALNETWORKS_EQUAL
    • ANEURALNETWORKS_EXP
    • ANEURALNETWORKS_EXPAND_DIMS
    • ANEURALNETWORKS_GATHER
    • ANEURALNETWORKS_GENERATE_PROPOSALS
    • ANEURALNETWORKS_GREATER
    • ANEURALNETWORKS_GREATER_EQUAL
    • ANEURALNETWORKS_GROUPED_CONV_2D
    • ANEURALNETWORKS_HEATMAP_MAX_KEYPOINT
    • ANEURALNETWORKS_INSTANCE_NORMALIZATION
    • ANEURALNETWORKS_LESS
    • ANEURALNETWORKS_LESS_EQUAL
    • ANEURALNETWORKS_LOG
    • ANEURALNETWORKS_LOGICAL_AND
    • ANEURALNETWORKS_LOGICAL_NOT
    • ANEURALNETWORKS_LOGICAL_OR
    • ANEURALNETWORKS_LOG_SOFTMAX
    • ANEURALNETWORKS_MAXIMUM
    • ANEURALNETWORKS_MINIMUM
    • ANEURALNETWORKS_NEG
    • ANEURALNETWORKS_NOT_EQUAL
    • ANEURALNETWORKS_PAD_V2
    • ANEURALNETWORKS_POW
    • ANEURALNETWORKS_PRELU
    • ANEURALNETWORKS_QUANTIZE
    • ANEURALNETWORKS_QUANTIZED_16BIT_LSTM
    • ANEURALNETWORKS_RANDOM_MULTINOMIAL
    • ANEURALNETWORKS_REDUCE_ALL
    • ANEURALNETWORKS_REDUCE_ANY
    • ANEURALNETWORKS_REDUCE_MAX
    • ANEURALNETWORKS_REDUCE_MIN
    • ANEURALNETWORKS_REDUCE_PROD
    • ANEURALNETWORKS_REDUCE_SUM
    • ANEURALNETWORKS_RESIZE_NEAREST_NEIGHBOR
    • ANEURALNETWORKS_ROI_ALIGN
    • ANEURALNETWORKS_ROI_POOLING
    • ANEURALNETWORKS_RSQRT
    • ANEURALNETWORKS_SELECT
    • ANEURALNETWORKS_SIN
    • ANEURALNETWORKS_SLICE
    • ANEURALNETWORKS_SPLIT
    • ANEURALNETWORKS_SQRT
    • ANEURALNETWORKS_TILE
    • ANEURALNETWORKS_TOPK_V2
    • ANEURALNETWORKS_TRANSPOSE_CONV_2D
    • ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_LSTM
    • ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_RNN

Android 10 推出了許多現有作業的更新。更新內容主要與下列項目相關:

  • 支援 NCHW 記憶體配置
  • 在 softmax 和規格化運算中,支援秩序不等於 4 的張量
  • 支援擴大卷積
  • 支援在 ANEURALNETWORKS_CONCATENATION 中使用混合量化功能的輸入內容

以下清單列出在 Android 10 中修改的作業。如需變更的完整詳細資料,請參閱 NNAPI 參考說明文件中的 OperationCode

  • ANEURALNETWORKS_ADD
  • ANEURALNETWORKS_AVERAGE_POOL_2D
  • ANEURALNETWORKS_BATCH_TO_SPACE_ND
  • ANEURALNETWORKS_CONCATENATION
  • ANEURALNETWORKS_CONV_2D
  • ANEURALNETWORKS_DEPTHWISE_CONV_2D
  • ANEURALNETWORKS_DEPTH_TO_SPACE
  • ANEURALNETWORKS_DEQUANTIZE
  • ANEURALNETWORKS_DIV
  • ANEURALNETWORKS_FLOOR
  • ANEURALNETWORKS_FULLY_CONNECTED
  • ANEURALNETWORKS_L2_NORMALIZATION
  • ANEURALNETWORKS_L2_POOL_2D
  • ANEURALNETWORKS_LOCAL_RESPONSE_NORMALIZATION
  • ANEURALNETWORKS_LOGISTIC
  • ANEURALNETWORKS_LSH_PROJECTION
  • ANEURALNETWORKS_LSTM
  • ANEURALNETWORKS_MAX_POOL_2D
  • ANEURALNETWORKS_MEAN
  • ANEURALNETWORKS_MUL
  • ANEURALNETWORKS_PAD
  • ANEURALNETWORKS_RELU
  • ANEURALNETWORKS_RELU1
  • ANEURALNETWORKS_RELU6
  • ANEURALNETWORKS_RESHAPE
  • ANEURALNETWORKS_RESIZE_BILINEAR
  • ANEURALNETWORKS_RNN
  • ANEURALNETWORKS_ROI_ALIGN
  • ANEURALNETWORKS_SOFTMAX
  • ANEURALNETWORKS_SPACE_TO_BATCH_ND
  • ANEURALNETWORKS_SPACE_TO_DEPTH
  • ANEURALNETWORKS_SQUEEZE
  • ANEURALNETWORKS_STRIDED_SLICE
  • ANEURALNETWORKS_SUB
  • ANEURALNETWORKS_SVDF
  • ANEURALNETWORKS_TANH
  • ANEURALNETWORKS_TRANSPOSE

Android 9

NN HAL 1.1 已在 Android 9 中推出,並包含下列重要變更。

  • IDevice::prepareModel_1_1 包含 ExecutionPreference 參數。駕駛人可以使用此功能調整準備作業,因為知道應用程式偏好節省電池電力,或將在快速連續的呼叫中執行模型。
  • 已新增 9 項作業:BATCH_TO_SPACE_NDDIVMEANPADSPACE_TO_BATCH_NDSQUEEZESTRIDED_SLICESUBTRANSPOSE
  • 應用程式可以將 Model.relaxComputationFloat32toFloat16 設為 true,指定 32 位元浮點運算可使用 16 位元浮點範圍和/或精確度執行。Capabilities 結構體有額外的欄位 relaxedFloat32toFloat16Performance,讓驅動程式可將放寬的效能回報給架構。

Android 8.1

初始類神經網路 HAL (1.0) 是在 Android 8.1 中發布。詳情請參閱 /neuralnetworks/1.0/