神經網路 API 驅動程式

本頁概述如何實作神經網路 API (NNAPI) 驅動程式。有關更多詳細信息,請參閱hardware/interfaces/neuralnetworks中 HAL 定義文件中的文件。範例驅動程式實作位於frameworks/ml/nn/driver/sample中。

有關神經網路 API 的更多信息,請參閱神經網路 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 基準應用程式來測量對應資料類型的效能。建議使用 MobileNet v1 和 v2、 asr_floattts_float模型來測量 32 位元浮點數值的效能,建議使用 MobileNet v1 和 v2 量化模型來測量 8 位元量化值。有關更多信息,請參閱Android 機器學習測試套件

在 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通知框架。

傳遞給execute方法的Request參數列出了用於執行的輸入和輸出運算元。儲存運算元資料的記憶體必須使用行主序,第一個維度迭代最慢,並且在任何行的末尾都沒有填入。有關操作數類型的更多信息,請參閱操作數

對於 NN HAL 1.2 或更高版本的驅動程序,當請求完成時,錯誤狀態、輸出形狀計時資訊將返回到框架。在執行期間,模型的輸出或內部操作數可以具有一個或多個未知維度或未知等級。當至少一個輸出運算元具有未知的維度或等級時,驅動程式必須傳回動態大小的輸出資訊。

對於 NN HAL 1.1 或更低版本的驅動程序,請求完成時僅傳回錯誤狀態。必須完全指定輸入和輸出操作數的維度才能成功完成執行。內部運算元可以具有一個或多個未知維度,但它們必須具有指定的秩。

對於跨越多個驅動程式的使用者請求,框架負責保留中間記憶體並按順序呼叫每個驅動程式。

可以在同一個@1.3::IPreparedModel上並行發起多個請求。驅動程式可以並行執行請求或串行執行。

此框架可以要求驅動程式保留多個準備好的模型。例如,準備模型m1 、準備m2 、對m1執行請求r1 、對m2 r2m1執行r3 、對m2執行r4 、釋放(在Cleanup中描述) m1和釋放m2

為了避免首次執行緩慢而導致較差的使用者體驗(例如,第一幀卡頓),驅動程式應在編譯階段執行大部分初始化。首次執行時的初始化應僅限於早期執行時會對系統運作狀況產生負面影響的操作,例如保留大型暫存緩衝區或增加裝置的時脈速率。只能準備有限數量的並發模型的驅動程式可能必須在首次執行時進行初始化。

在 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對象,該物件會在執行完成時發出訊號。這減少了小序列模型和串流用例的開銷。受保護的執行也允許與可以發出訊號或等待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對象時自動銷毀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屬性中設定了適當的標記時才記錄訊息。在呼叫VLOG之前必須呼叫initVLogMask()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 方法並驗證驅動程式支援的所有操作是否正常運作並提供滿足精度要求的結果。

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

  • 浮點型: abs(預期 - 實際) <= atol + rtol * abs(預期);在哪裡:

    • 對於 fp32,atol = 1e-5f,rtol = 5.0f * 1.1920928955078125e-7
    • 對於 fp16,atol = rtol = 5.0f * 0.0009765625f
  • 量化:偏離一(除了mobilenet_quantized ,偏離三)

  • 布林值:精確匹配

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 來評估驅動程式的延遲和準確性。

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

模型和資料集

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

  • MobileNetV1 float 和 u8 以不同大小量化,針對 Open Images Dataset v4 的一小部分(1500 張影像)運行。
  • MobileNetV2 float 和 u8 以不同大小量化,針對開放影像資料集 v4 的一小部分(1500 張影像)運行。
  • 基於長短期記憶 (LSTM) 的文本轉語音聲學模型,針對 CMU Arctic 集的一小部分運行。
  • 基於 LSTM 的自動語音辨識聲學模型,針對 LibriSpeech 資料集的一小部分運行。

有關更多信息,請參閱platform/test/mlts/models

壓力測試

Android 機器學習測試套件包括一系列碰撞測試,以驗證驅動程式在頻繁使用條件下或用戶端行為極端情況下的復原能力。

所有撞擊測試都提供以下功能:

  • 掛起檢測:如果 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 版本中引入的變更。

安卓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),因為應用程式可以指示其模型的相對優先順序、準備模型的最大預期時間以及完成執行的預期最大時間。有關詳細信息,請參閱服務品質
  • 支援為驅動程式管理的緩衝區提供分配器介面的記憶體域。這允許跨執行傳遞設備本機內存,從而抑制同一驅動程式上連續執行之間不必要的資料複製和轉換。有關詳細信息,請參閱內存域

安卓10

Android 10 引入了 NN HAL 1.2,其中包括以下顯著變化。

  • Capabilities結構包括所有資料類型(包括標量資料類型),並使用向量而不是命名欄位來表示非寬鬆效能。
  • getVersionStringgetType方法允許框架檢索裝置類型 ( DeviceType ) 和版本資訊。請參閱設備發現和分配
  • 預設會呼叫executeSynchronously方法來同步執行。 execute_1_2方法告訴框架非同步執行。請參閱執行
  • executeSynchronouslyexecute_1_2和突發執行的MeasureTiming參數指定驅動程式是否要測量執行持續時間。結果在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 參考文檔中的操作代碼

  • 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

安卓9

NN HAL 1.1 在 Android 9 中引入,包括以下顯著變化。

  • IDevice::prepareModel_1_1包含ExecutionPreference參數。駕駛員可以使用它來調整其準備工作,因為知道應用程式更喜歡節省電池或將在快速連續調用中執行模型。
  • 新增了九個新作業: BATCH_TO_SPACE_NDDIVMEANPADSPACE_TO_BATCH_NDSQUEEZESTRIDED_SLICESUBTRANSPOSE
  • 應用程式可以透過將Model.relaxComputationFloat32toFloat16設為true來指定可以使用 16 位元浮點範圍和/或精確度來運行 32 位元浮點計算。 Capabilities結構體具有附加欄位relaxedFloat32toFloat16Performance ,以便驅動程式可以向框架報告其寬鬆的效能。

安卓8.1

最初的神經網路 HAL (1.0) 在 Android 8.1 中發布。有關更多信息,請參閱/neuralnetworks/1.0/