如何為嵌入式應用最佳化AI?

作者 : Ariel Hershkovitz、Niv Youlevich,CEVA

將經訓練的網路移植到嵌入式應用程式又是一道難關。用PC (或雲端)訓練過的網路在記憶體或功耗方面不會有太多最佳化,但在終端裝置的應用上則必須大量節約能源...

先前的一篇文章中,我們討論到了對於以AI為基礎的臉部辨識(face-id)人機介面;雖然以這種介面來授權設備的使用一開始看來遙不可及,實際上困難度並不如想像的那麼高。市面上有大量AI平台、訓練(資料集)選項、甚至支援臉部辨識的開放源碼應用程式,使用者可以直接製作能在PC上執行的原型,進行快速測試。

不過將經訓練的網路移植到嵌入式應用程式似乎又是一道難關。用PC (或雲端)訓練過的網路在記憶體或功耗方面不會有太多最佳化,可能使用浮點(floating point)或雙字元(double words)進行網路運算,而且大量使用外接記憶體對影像進行滑動窗格(sliding windows)處理。這對於在插電式高性能PC上執行的原型不是問題,但在終端裝置的應用上則必須大量節約能源,同時在性能上沒有妥協。

最佳化要素

最佳化的關鍵步驟之一是量化(quantization)。將權重從浮點切換為定點(fixed point)並縮小定點──例如從32位元浮點改為8位元整數──不僅會影響權重,還會影響中間運算值的大小。僅此一項就能顯著降低記憶體使用量,而且在大多數情況下對辨識品質影響甚微。

第二個關鍵是在最小的精度影響下充分發揮權重的稀疏性(sparsity)。這種做法就是將趨近於零的權重視為零,同時密切注意這對準確性的影響。權重被用於乘以某些部分的加總,但權重為零時就無需進行此操作。

實務上,影像是被漸進處理,權重必須隨著運算在影像窗格上的移動更新;更新量和資料流量可能很大。將大部分權重視為零,可以壓縮權重陣列,將陣列全部或大部分儲存在晶片上 SRAM,按需要進行解壓縮,盡量減少對主記憶體的存取需求、提高性能、降低功耗。載入權重時,還會減少晶片上的資料流量,這也意味著更高的處理量。

另外一個應該考慮的因素是,神經網路與大多數複雜的應用程式同樣依賴複雜的程式庫(libraries)。需要利用專門為微控制器環境設計的程式庫,以及適合所選平台的編譯器。TensorFlow Lite等開放源碼程式庫不失為一個理想的起點,但為充分利用微控制器,量身打造的專用解決方案不可或缺。

當然,知道該做什麼事並不會真正減輕實際動手做的難度,還需要一個可以順暢執行這些操作並提供經硬體最佳化程式庫的平台。

如何實現易於使用的流程?

這時你需要的是一個流程,能導入在特定平台經過訓練的網路,例如TensorFlow;而且只要輸入幾個基本需求,無需其他干預即可直接編譯至嵌入式解決方案。當然,還需要進一步手動最佳化的選項,包括在不同層級設置不同的量化程度,權衡權重閾值與晶片上記憶體容量大小,並且針對為程式庫對硬體進行最佳化。

CEVA的AI平台CDNN除了可以提供用於量化和執行時間(runtime)任務生成的離線處理器工具集,還為CEVA DSP和客戶使用者的硬體加速器提供量身打造的執行時間程式庫。CEVA的解決方案並支援Tensorflow Lite、ONNX、Caffe等各種常見的AI模型格式。

本文由CEVA供稿;責編:Judith Cheng

(參考原文 :Optimizing AI for embedded applications,By Ariel Hershkovitz, Senior Manager of Customer Solutions for Software Development Tools, CEVA and Niv Youlevich, Senior Engineer, Customer Solutions Group, Imaging & Computer BU, CEVA)

 

 

 

加入LINE@,最新消息一手掌握!

發表評論