Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

神經網絡API驅動程序

該頁面概述瞭如何實現神經網絡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基準測試應用程序來測量相應數據類型的性能。建議使用MobileNet v1和v2, asr_floattts_float模型來測量32位浮點值的性能,建議使用MobileNet v1和v2量化模型來進行8位量化。有關更多信息,請參閱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方法(請參見executeFenced執行)異步執行請求,也可以使用突發執行執行請求

與異步調用相比,同步執行調用提高了性能並減少了線程開銷,因為僅在執行完成後才將控制權返回給應用程序進程。這意味著驅動程序不需要單獨的機制來通知應用進程執行已完成。

使用異步execute_1_3方法,控制將在執行開始後返回到應用程序進程,並且驅動程序必須在執行完成時使用@1.3::IExecutionCallback通知驅動程序。

傳遞給execute方法的Request參數列出了用於執行的輸入和輸出操作數。存儲操作數數據的內存必須使用行優先順序,並且第一維的迭代速度最慢,並且在任何行的末尾都不得填充。有關操作數類型的更多信息,請參見操作數

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

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

對於跨越多個驅動程序的用戶請求,該框架負責保留中間內存並負責對每個驅動程序的調用排序。

可以在同一@1.3::IPreparedModel上並行啟動多個請求。驅動程序可以並行執行請求或序列化執行。

該框架可以要求驅動程序保留多個準備好的模型。例如,製備模型m1 ,製備m2 ,執行請求r1m1 ,執行r2m2 ,執行r3m1 ,執行r4m2 ,釋放(描述於清理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更多信息,請參見Synchronization Framework

在受防護的執行中,框架調用IPreparedModel::executeFenced方法以在準備好的模型上啟動受防護的異步執行,該模型具有等待同步防護的向量。如果異步任務在調用返回之前完成,則可以為sync_fence返回空句柄。還必須返回IFencedExecutionCallback對象,以允許框架查詢錯誤狀態和持續時間信息。

執行完成後,可以通過IFencedExecutionCallback::getExecutionInfo查詢以下兩個測量執行時間的計時值。

  • timingLaunched :從當時間executeFenced被調用時executeFenced信號返回syncFence
  • timingFenced :從發出信號等待執行等待的所有同步executeFencedexecuteFenced信號通知返回的syncFence

控制流

對於運行Android 11或更高版本的設備,NNAPI包括兩個控制流操作IFWHILE ,它們將其他模型作為參數並有條件地執行( IF )或重複執行( WHILE )。有關如何實現此功能的更多信息,請參見控制流

服務質量

在Android 11中,NNAPI通過允許應用指示其模型的相對優先級,準備模型所需的最大時間量以及執行所需的最大時間量,從而改善了服務質量(QoS)要完成的。有關更多信息,請參見服務質量

清理

應用程序使用準備好的模型完成後,框架將釋放其對@1.3::IPreparedModel對象的引用。當IPreparedModel像不再被引用時,它會在創建它的驅動程序服務中自動銷毀。此時,可以在驅動程序的析構函數實現中回收特定於模型的資源。如果駕駛員服務希望IPreparedModel在沒有客戶端不再需要到自動銷毀的對象,它不能撐到任何引用IPreparedModel後的對象IPreparedeModel對象已通過返回IPreparedModelCallback::notify_1_3

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()然後再調用VLOGVLOG_IS_ON宏可用於檢查當前是否啟用了VLOG ,如果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文件包含宏,以簡化將systracing信息添加到Neural Networks代碼的過程。有關示例,請參見示例驅動程序中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來評估驅動程序的延遲和準確性。

可以在AOSP的兩個項目中找到NNAPI基準:

模型和數據集

NNAPI基準測試使用以下模型和數據集。

  • MobileNetV1 float和u8以不同大小進行了量化,並與Open Images Dataset v4的一小部分(1500張圖像)相對應。
  • 以不同大小量化的MobileNetV2 float和u8與Open Images Dataset 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和Neural Networks 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結構中報告。參見時間
  • 支持一個或多個輸出操作數具有未知維或等級的執行。請參閱輸出形狀
  • 支持供應商擴展,這是供應商定義的操作和數據類型的集合。驅動程序通過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

Android 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以便驅動程序可以向框架報告其寬鬆的性能。

Android 8.1

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