嵌入式中的人工神經網路
人工神經網路在AI中具有舉足輕重的地位,除了找到最好的神經網路模型和訓練資料集之外,人工神經網路的另一個挑戰是如何在嵌入式裝置上實現它,同時優化效能和功率效率。 使用雲端計算並不總是一個選項,尤其是當裝置沒有連線的時候。 在這種情況下,需要一個能夠實時進行訊號預處理和執行神經網路的平臺,需要最低功耗,尤其是在一個電池裝置上執行的時候。
通過使用不同的工具(如 python 指令碼) ,可以訓練一個數據格式的網路(在 Caffe 和 Tensorflow),然後使用Snapdragon 神經處理引擎的SDK將其轉換為可在Snapdragon 平臺上執行的神經網路。
概述
高通的Snapdragon 平臺和Snapdragon 神經處理引擎SDK是一個非常好的選擇,可以在低功耗和小規模裝置上建立一個定製的神經網路。 Snapdragon NPE 是為了給開發者提供工具,使他們能夠輕鬆地將智慧從雲端遷移到邊緣裝置。
Snapdragon NPE 為開發者提供軟體工具,深度神經網路上的工作負載在移動和其他邊緣物聯網(IoT)裝置上,由 Snapdragon 處理器提供軟體工具。 開發者可以為所需的使用者體驗選擇最佳的 Snapdragon 核心—— Qualcomm Kryo CPU、 Qualcomm Adreno GPU 或Hexagon DSP。
本文探討了利用 Matlab 工具在 Snapdragon 平臺上開發和實現神經網路,並主要關注 ONNX 格式。 同時,我們還研究了 Snapdragon 平臺如何通過使用 Snapdragon 核心和 SNPE SDK 提供的工具來幫助減少電力和處理時間。
設計並開發簡單的 DNN
從設計和培訓深度神經網路開始,使用 Matlab並移植帶Snapdragon的設計,尋找Snapdragon上最好的子系統來完成這項工作。
手寫數字識別系統
從使用 DNN 的手寫數字識別系統開始。 這個網路與(音訊數字識別系統)之間的主要區別之一是這個系統沒有對輸入訊號進行任何預處理。 具有異構計算架構的 Snapdragon 平臺擁有強大的音訊和影象處理引擎,使用數字訊號處理(dsp)和圖形處理單元(GPU)進行音訊和影象處理。
該網路是一個基於三層卷積的網路。為了開發和訓練這個網路,可以使用 Matlab,還可以使用 Matlab 的手寫資料庫(與 MNIST 資料庫相同; 關於該資料庫的資料,請檢視 Matlab 文件)。
編寫指令碼
選擇資料庫
[XTrain,YTrain] = digitTrain4DArrayData;
[XValidation,YValidation] = digitTest4DArrayData;
設定圖層
layers = [ imageInputLayer([28 28 1],'Name','input', 'Normalization', 'none')
convolution2dLayer(5,16,'Padding','same','Name','conv_1')
batchNormalizationLayer('Name','BN_1')
reluLayer('Name','relu_1')
convolution2dLayer(3,32,'Padding','same','Name','conv_2')
batchNormalizationLayer('Name','BN_2')
reluLayer('Name','relu_2')
fullyConnectedLayer(10,'Name','fc')
softmaxLayer('Name','softmax')
classificationLayer('Name','classOutput')];
建立網路
options = trainingOptions('sgdm',...
'MaxEpochs',6,...
'Shuffle','every-epoch',...
'ValidationData',{XValidation,YValidation},...
'ValidationFrequency',20,...
'Verbose',false,...
'Plots','training-progress');
進行訓練(有關訓練過程的細節,參見 Matlab的相關文件)。
圖1 訓練結果
為了驗證網路,使用這個影象作為分類器,網路可以正確地對它進行分類。
圖2 分類器
現在,在將網路轉換為 ONNX 格式之後,進入了下一步,即使用 SNPE 工具。
首先,需要將 ONNX 格式轉換為 DLC。
snpe-onnx-to-dlc -m handwritten-onnx --debug
這將建立一個 DLC 格式網路,可用於SNPE。
然後使用此命令,可以驗證網路結構與在 Matlab 中建立的結構是否匹配。
圖3 拓撲對比(左側 SNPE DLC,右側 Matlab)
現在使用相同的測試影象並在 Snapdragon 目標板上驗證它。 以下是 ARM,cDSP 和 GPU 的結果摘要,使用了以下步驟:
-
拉取平臺上不同核(使用 dsp 和使用 gpu)的 snpe-net-run 結果
-
對照拉取的結果在主機上執行 snpe-diagview
ARM | GPU |
---|---|
Dnn Runtime Load/Deserialize/Create Statistics: Load: 4627 us Deserialize: 5148 us Create: 126428 us Average SNPE Statistics: ------------------------------ Total Inference Time: 10956 us Forward Propagate Time: 3080 us Layer Times: --------------- 0: 1 us 1: 1298 us 2: 74 us 3: 8 us 4: 908 us 5: 257 us 6: 16 us 7: 465 us 8: 6 us | Dnn Runtime Load/Deserialize/Create Statistics: Load: 4099 us Deserialize: 4931 us Create: 1136097 us Average SNPE Statistics: ------------------------------ Total Inference Time: 3723 us Forward Propagate Time: 3648 us Layer Times: --------------- 0: 5 us 1: 31 us 4: 83 us 7: 381 us 8: 5 us |
比較結果表明,DSP 和 GPU 關係密切,但在這些平臺上,與 GPU 相比,cDSP 沒有較大負載(特別是當有圖形應用程式執行時).
使用訊號預處理子系統
到目前為止,已經實現的 DNN 網路不需要對輸入訊號進行任何預處理(比如從輸入影象中提取特徵)。 然而,並不是所有的實現都是這樣。
對於這些情況和實現較低的功耗,可以使用Snapdragon-aDSP,mDSP,cDSP,GPU,dsp/hvx,arm/neon 的不同子系統。看看xDSP和如何使用這些處理器進行特徵提取的例子。
Snapdragon上的Hexagon xDSP
Hexagon DSP 是一種具有 L1/2快取和記憶體管理單元的多執行緒DSP,在大多數 Snapdragon SOC上,它和其他核心一樣可以訪問一些資源。QuRT OS這個獨特的結構建立了一個靈活的 DSP 平臺,為不同的用例建立應用程式。
圖4 DSP 硬體體系結構
影象處理
對於實時影象處理,可以在 ISP 管道中注入定製的 HVX 模組。 該模組的管道位置可能不同,取決於Snapdragon 具體型號。 在某些平臺上,可以在相機感測器介面模組之後使用它。
圖5 影象的管道處理
或者在其他地方,可以在相機管道的不同位置(紅點)中注入 HVX 模組。
圖6 HVX模組的注入點
或者可以用於 ISP 之後的記憶體轉移中。有幾個例子可以在 Hexagon sdk3.3中找到。
例如,一個使用 HVX 的噪聲640x480影象上的 Sobel 處理,可以使用大約10K 的指令週期。
圖7 噪聲影象的sobel 處理
音訊處理
對於音訊預處理,aDSP 及其 Elite 框架適用於實時特徵提取。 在數字識別系統的 DNN 網路中,該網路的輸入為 Mel-frequency cepstral coefficients (MFCC) ,使用一秒音訊檔案和14個係數,輸入層為14x98。 這個資料是從 https://aiyprojects.withgoogle.com/open_speech_recording 中收集的,每個數字(0-9)使用1500個音訊檔案。 這裡有一個用於數字1的 MFCC 例子。
圖8 數字1的音訊訊號
網路配置為
圖9 數字的DNN
DNN將嘗試學習和分類這些型別的影象為不同的數字。 特徵提取部分是在 aDSP 中完成的,是 Elite 框架中音訊路徑拓撲中的一個定製模組。
處理方式 | ARM | GPU | DSP |
---|---|---|---|
DNN執行時負載 | 2532 us | 1729 us | 15103 us |
DNN執行時反序列化 | 1196 us | 1168 us | 7678 us |
DNN執行時建立 | 122546 us | 1137250 us | 216279 us |
平均SPNE總推理時間 | 9020 us | 3429 us | 4289 us |
平均SPNE前向傳播時間 | 3712 us | 3382 us | 4244 us |
平均SPNE層處理時間 | 0: 2 us 1: 1441 us 2: 117 us 3: 18 us 4: 1736 us 5: 86 us 6: 166 us 7: 91 us 8: 4 us | 0: 5 us 1: 132 us 4: 209 us 7: 211 us 8: 4 us | 0: 38 us 1: 263 us 2: 1527 us 3: 9 us 4: 154 us 5: 609 us 6: 5 us 7: 128 us 8: 29 us |
感測器處理
平臺包含一個感測器集線器,是Snapdragon 感測器核心,可以幫助整合來自不同感測器的資料並處理它們。 這種技術可以幫助從中央處理器解除安裝這些任務,減少電池消耗,同時提供更好的效能。 針對感測器行為識別目標的任何感測器資訊的任何DNN預處理都可以從 DSP 上解除安裝,並且可以實時完成。
在上述所有情況下,可以不使用分配的 DSP 進行輸入,而是使用 FastRPC 從 ARM 中解除安裝處理到任何其他子系統(如 mDSP) ,但是這種技術有它自己的處理開銷。
小結
Snapdragon 平臺和 Snapdragon 神經處理引擎SDK提供了強大的平臺和工具,可以在低功耗和小規模的邊緣裝置上建立一個定製的人工神經網路。
(本文編譯自 http://www.embedded-computing.com/iot/artificial-neural-networks-ann-on-snapdragon-based-edge-devices)