1. 程式人生 > >安卓 Neural Networks API 釋疑

安卓 Neural Networks API 釋疑

NNAPI 是什麼?

Android Neural Networks API(以下簡稱 NNAPI) 是 NDK 中的一套 API,由 C 語言實現,標頭檔案見 NeuralNetworks.h

設計 NNAPI 的初衷是,扮演底層平臺的角色,支撐上層的各種機器學習框架(TensorFlow Lite、Caffe2 等)高效的完成推理計算,甚至是構建/訓練模型。

NNAPI 有兩個顯著特徵:

  • 內置於安卓系統,從 8.1 系統開始出現於 NDK 中;
  • 能夠利用硬體加速,使用安卓裝置的 GPU/DSP 或各種專用人工智慧加速晶片完成神經網路的推理運算,大大提高計算效率;

NNAPI 的應用場景是什麼?

首先,在 8.1 (API level 27)及更高版本系統上才能使用該功能。

其次,NNAPI 是給機器學習框架和工具庫呼叫的,理想情況下,各種機器學習框架在內部將構建模型、訓練模型、推理運算等操作交由 NNAPI 完成,而 NNAPI 會根據安卓裝置的硬體效能,適當的將這些繁重的計算部署到合適的計算單元(CPU & GPU & DSP),從而使用硬體加速功能完成推理運算。

對於應用開發商,谷歌官方推薦其不要直接使用 NNAPI,而是隻與 TF Lite 之類的機器學習框架打交道,構建出適用於 TF Lite 的模型並部署到安卓裝置上,其餘的工作交給 TF Lite 和 NNAPI 完成。

當然,普通的開發者同樣可以按照 NDK 的開發量流程來開發基於 NNAPI 的應用(參見 nn_sample),或者利用其封裝出自己的機器學習庫(參見 DNNLibrary)。

NNAPI 的工作原理是什麼?

這裡寫圖片描述
如上圖,狹義上,NNAPI 單指一組 C 語言 API;廣義上,NNAPI 由 NNAPI、NN Runtime、NN HAL 組成。

其中,NN Runtime 是 NNAPI 的執行引擎。和其他的 HAL 相同,NN HAL 提供了統一的介面,遮蔽了不同裝置廠商的實現差異。從而使開發者只需開發一套程式碼,便能運行於帶有各種加速晶片的裝置上。

自頂往下,安卓應用呼叫機器學習框架的介面完成推理運算並將結果呈現在介面上,而機器學習框架內部以 NDK 的形式呼叫 NNAPI,NN Runtime 作為 NNAPI 的執行引擎,完成構建模型、裝填模型資料、載入輸入資料、推理運算等。此外,NN Runtime 還能對程式碼進行優化、生成為特殊加速晶片專用的機器程式碼等。

如果安卓裝置上沒有 GPU、DSP 或專用加速晶片,NNAPI 將退化到 CPU 執行。

NNAPI 如何使用?

開發流程

開發流程
NNAPI 裡包含了 4 類抽象:

模型(Model):一個計算圖,由數學運算子和運算陣列成。這裡的運算子是神經網路專用的一些操作,比如 2d 卷積運算、啟用函式等。運算數是在模型訓練過程中形成的常數。在 NNAPI 中,一個模型由 ANeuralNetworksModel 表示。

編譯(Compilation):配置資訊,用於將模型編譯成底層程式碼,一個編譯由 ANeuralNetworksCompilation 表示。

記憶體(Memory):記憶體緩衝區或記憶體對映檔案。NNAPI 利用記憶體能更加高效的將資料傳遞給驅動。在程式碼中,一個Memory 用 ANeuralNetworksMemory 表示。

執行(Execution):輸入資料、執行模型進行推理運算,收集推理結果。該過程為非同步操作,過個執行緒可以同時等待同一個執行結果。在程式碼中一個執行用 ANeuralNetworksExecution 表示。

上述 4 個抽象之間的協作關係如下圖:
這裡寫圖片描述

例項展示

以實際程式碼構建如下模型並執行之。

具體程式碼即註釋參見 此處

這裡寫圖片描述

執行效果截圖:
這裡寫圖片描述

NNAPI 和 TF Lite 是何種關係?

NNAPI 具有機器學習框架的功能,只不過跟 TF Lite 比起來,NNAPI 更加底層,功能有限,沒有那麼多花哨的東西。不僅如此,NNAPI 還具有 NN Runtime 這個功能強大的執行引擎,能夠利用安卓裝置上各種 XPU,合理分配計算量,提高運算速度。

據 谷歌 IO 大會表述,TF Lite 後續開發將與 NNAPI 對接,使 TF Lite 的內部執行呼叫 NNAPI 完成(見下圖)。
這裡寫圖片描述

在 TensorFlow Lite 中支援 GPU 加速 (iOS 和 Android);
使用 Android 神經網路 API (NN API)支援硬體加速器;

NNAPI 有什麼優缺點?

優點

  • 賦能移動裝置,使其不再依賴網路和後端,獨自完成推理操作,提高響應速度、保證隱私、降低後端叢集成本等
  • 內建安卓系統,無需額外引用庫
  • 使用硬體加速,提高執行效率

缺點

  • 版本限制,8.1 及以上系統才能使用
  • 執行神經網路模型是計算繁重的操作,這會導致裝置的耗電增加
  • 如果將模型內置於 app,會導致 app 體積增大
  • 如果直接使用 NNAPI,開發工具較少,開發不方便,流程繁瑣,容易出錯

參考文章