Neural Networks API 驅動程式

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

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

類神經網路 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 方法 (請參閱 Fenced 執行作業) 以非同步方式執行要求,或使用爆發執行執行。

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

使用非同步 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 精確度要求如下:

  • 浮點: Ab(預期 - 實際) <= atol + rtol * Ab(預期);其中:

    • 針對 fp32,atol = 1e-5f、 rtol = 5.0f * 1.1920928955078125e-7
    • 針對 fp16,atol = rtol = 5.0f * 0.0009765625f
  • 「Quantized」(量化):逐一關閉 (mobilenet_quantized 除外,因為必須倒數 3)

  • 布林值:完全比對

CTS 測試 NNAPI 的其中一種方法是產生固定的虛擬隨機圖,用於測試及比較每個驅動程式的執行結果與 NNAPI 參考實作。對於具有 NN HAL 1.2 以上版本的驅動程式,如果結果不符合精確度條件,CTS 會回報錯誤,並在 /data/local/tmp 下傾印失敗模型的規格檔案以供偵錯。如要進一步瞭解精確度條件,請參閱 TestRandomGraph.cppTestHarness.h

模糊測試

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

如要執行模糊測試來驗證驅動程式實作成果,請在 Android 開放原始碼計畫中找到的 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 來評估驅動程式的延遲和準確率。

您可以在 Android 開放原始碼計畫的兩項專案中找到 NNAPI 基準:

模型和資料集

NNAPI 基準採用下列模型和資料集。

  • MobileNetV1 浮點值,並以不同大小量化的 u8 量化,針對 Open Images 資料集 v4 的一小部分 (1500 張圖片) 執行。
  • MobileNetV2 浮點值,並以不同大小量化的 u8 量化,針對 Open Images 資料集 v4 的一小部分 (1500 張圖片) 執行。
  • 用於文字轉語音的長短期記憶體 (LSTM) 接音模型,針對一小群 CMU 北極集合執行。
  • 自動語音辨識的 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 方法,在準備好的模型上透過同步圍欄向量啟動圍欄的非同步執行作業。詳情請參閱「Fenced 執行作業」。
  • 支援控制流程。新增 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,指定使用 16 位元浮點範圍和/或精確度執行 32 位元浮點運算。Capabilities 結構包含額外的 relaxedFloat32toFloat16Performance 欄位,可讓驅動程式向架構回報其寬鬆效能。

Android 8.1

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