一. 概述
此篇文章為 eIQ 系列的延伸介紹,相信各位對 NXP 所開發的 eIQ 機器學習開發環境 有一定程度上的認識了 !! 這裡將介紹 eIQ 之中的一個神經網路框架,或稱機器學習框架( Machine Learning Framework)。 後續將帶領各位如何在 ArmNN 的框架上,使用不同的硬體處理器( CPU 或 NPU 的切換 )。如下圖,文章架構圖所示 !! 此架構圖隸屬於 i.MX8M Plus 的方案博文中,並屬於機器學習內的推理引擎(Inference Engine) 的 ArmNN 部分,目前章節介紹 “ArmNN 使用介紹”
若新讀者欲理解更多人工智慧、機器學習以及深度學習的資訊,可點選查閱下方博文
大大通精彩博文 【ATU Book-i.MX8系列】博文索引
ArmNN 系列博文-文章架構示意圖
二. ArmNN 介紹
目前版本 : Arm NN 21.08
ArmNN 是一套開源的機器學習推理引擎框架,由 ARM 與 Linaro 主導開發的人工智能計畫,能夠提供用戶更簡單、輕鬆、快速的機器學習體驗。特別的是 ArmNN 並非有自己的推理引擎,而是可以運行多種深度學習模組框架的 推理引擎(inference engine) 或 委託器(delegates) ,像是 Caffe, TensorFlow, TensorFlow Lite, 以及 ONNX 。 除此之外,亦提供 CPU / GPU/ NPU 等硬體加速資源,並可以搭配 C++ 或 Python 語言進行推理 !! 能夠給予 Arm 的硬體更棒的加速體驗 !!
ArmNN 後端推理框架圖
如下圖所示,首先由各家模組 解譯(parser) 完成後,將託付給 Graph builder 與 Runtime Optimizer 至各硬體設備進行優化,而後續則有三種處理方式 ; 第一種左側路線,就是純 CPU 的運算。第二種就是中間路線,利用 ARM Compute Library 與 ARM Neon 核心作多線程優化進行推理。而第三種則是右側路線,委託給神經網路推理引擎(NNRT),並透過 OVXLIB 與 OpenVX driver 來啟動 GPU 或 NPU 進行硬體加速來完成推理!!
ArmNN 後端推理框架圖
資料來源 : 官方網站
下列提供關於 ArmNN 之 Caffe, TensorFlow, TensorFlow Lite, ONNX 等神經網路框架的推理範例,如下列表格所示。
若欲查看更多範例,請查看 i.MX Machine Learning User's Guide.pdf 的 ArmNN 章節。
原廠提供範例 (Caffe) :
Arm NN binary |
Model file name |
Model definition |
Input data |
Renamed model |
CaffeAlexNet-Armnn |
bvlc_alexnet_1.caffemodel | |||
CaffeInception_BN-Armnn |
Inception-BNbatchsize1.caffemodel | |||
CaffeMnist-Armnn |
lenet_iter_9000.caffemodel |
PS : 此範例適用於 BSP L5.10.72 之前的版本。
原廠提供範例 (TensorFlow) :
Arm NN binary |
Model file name |
Input data |
TfInceptionV3-Armnn |
Dog.jpg, Cat.jpg, shark.jpg | |
TfMnist-Armnn | ||
TfMobileNet-Armnn |
Dog.jpg, Cat.jpg, shark.jpg |
PS : 此範例適用於 BSP L5.10.72 之前的版本。
原廠提供範例 (TensorFlow Lite) :
Arm NN binary |
Model file name |
Input data |
TfLiteInceptionV3Quantized-Armnn |
Dog.jpg, Cat.jpg, | |
TfLiteMnasNet-Armnn |
Dog.jpg, Cat.jpg, shark.jpg | |
TfLiteMobilenetQuantized-Armnn |
Dog.jpg, Cat.jpg, shark.jpg | |
TfLiteMobilenetV2Quantized-Armnn |
mobilenet_v2_1.0_224_quant.tflite | |
TfLiteResNetV2-50-Quantized-Armnn |
Model not available |
N / A |
TfLiteInceptionV4QuantizedArmnn |
Model not available |
N / A |
TfLiteMobileNetSsd-Armnn |
Model not available |
N / A |
TfLiteResNetV2-Armnn |
Model not available |
N / A |
TfLiteVGG16Quantized-Armnn |
Model not available |
N / A |
TfLiteMobileNetQuantizedSoftmax-Armnn |
Model not available |
N / A |
原廠提供範例 (ONNX) :
Arm NN binary |
Model file name |
Input data |
OnnxMnist-Armnn |
t10k-images.idx3-ubyte, t10k-labels.idx1-ubyte | |
OnnxMobileNet-Armnn |
Dog.jpg, Cat.jpg, shark.jpg |
ArmNN 範例使用方式 (C / C++) :
直接進入開發板的 /usr/bin/armnn-21.02 底下,找到相關執行檔(xxx-Armnn),操作下列指令即可使用!!
$ --data-dir=data --model-dir=models --compute=CpuAcc/VsiNpu/CpuRef
--data-dir : 資料路徑
--model-dir : 模組路徑
--compute : CpuRef 為不啟用 CPU 加速 、CpuAcc 為使用 NEON Backend 啟用 CPU 加速 、 VsiNpu 為使用 NPU 或是 GPU 加速運算。
若欲查看代碼編譯方式,請至 i.MX Machine Learning User's Guide.pdf 的 ArmNN 章節。
三. ArmNN 範例實現
1. Object Classification DEMO (TensorFlow Lite)
說明 : 此範例使用 Arm NN - TensorFlow Lite神經網路推理框架與 MobileNet 模型進行分類物件。
實現步驟 :
(1) 於開發板系統中,建立 ArmNN 資料夾
$ cd && mkdir ArmNN
$ cd ~/ArmNN && mkdir models
$ cd ~/ArmNN && mkdir data
(2) 將測試圖片與新的模組傳送至開發板系統
$ scp mobilenet_v1_1.0_224_quant.tflite root@xx.xx.xx.xx: ~/ArmNN/models
$ scp Dog.jpg root@xx.xx.xx.xx: ~/ArmNN/data
$ scp Cat.jpg root@xx.xx.xx.xx: ~/ArmNN/data
$ scp shark.jpg root@xx.xx.xx.xx: ~/ArmNN/data
(3) 範例之運行 CPU 使用方式
$ /usr/bin/armnn-21.08/TfLiteMobilenetQuantized-Armnn --data-dir=data --model-dir=models --compute=CpuAcc
(4) 範例之運行 NPU使用方式
$ /usr/bin/armnn-21.08/TfLiteMobilenetQuantized-Armnn --data-dir=data --model-dir=models --compute=VsiNpu
運行結果 :
如下圖所示,分類結果為 第 209 號標籤的黃金獵犬(golden retriever) ,準確率為 78.9 %。
在 ArmNN 框架下,使用 CPU-ACC 運算 TF Lite模組則平均花費 48 ms,NPU 運算花費 3 ms。
*** 此範例會同時測試三張影像( Dog / Cat / Shark.jpg )。此標籤分類請於該連結查看。
2. Object Classification DEMO (ONNX)
說明 : 此範例使用 Arm NN - TensorFlow Lite神經網路推理框架與 MobileNet 模型進行分類物件。
實現步驟 :
(1) 於開發板系統中,建立 ArmNN 資料夾
$ cd && mkdir ArmNN
$ cd ~/ArmNN && mkdir models
$ cd ~/ArmNN && mkdir data
(2) 將測試圖片與新的模組傳送至開發板系統
$ scp mobilenetv2-1.0.onnx root@xx.xx.xx.xx: ~/ArmNN/models
$ scp Dog.jpg root@xx.xx.xx.xx: ~/ArmNN/data
$ scp Cat.jpg root@xx.xx.xx.xx: ~/ArmNN/data
$ scp shark.jpg root@xx.xx.xx.xx: ~/ArmNN/data
(3) 範例之運行 CPU 使用方式
$ /usr/bin/armnn-21.08/OnnxMobileNet-Armnn --data-dir=data --model-dir=models --compute=CpuAcc
(4) 範例之運行 NPU使用方式
$ /usr/bin/armnn-21.08/OnnxMobileNet-Armnn --data-dir=data --model-dir=models --compute=VsiNpu
運行結果 :
如下圖所示,分類結果為 第 209 號標籤的黃金獵犬(golden retriever) ,準確率為 15.54 %。
在 ArmNN 框架下,使用 CPU-ACC 運算 TF Lite模組則平均花費 272 ms,NPU 運算花費 545 ms。
目前 ONNX 的推理引擎與 AI 晶片的底層描述尚未完善故效能較差。
*** 此範例會同時測試三張影像( Dog / Cat / Shark.jpg )。此標籤分類請於該連結查看。
四. 結語
上述已經介紹了 ArmNN 的使用方式,藉此可以選擇 TensorFlow 或是 ONNX 的神經網路框架進行推理。並可任意使用至 CPU / GPU / NPU 等加速運算晶片。在量化後的 MobileNet 最快可達到每幀 3ms 的推理速度 !! 但可惜的事,目前 ONNX 與硬體間的描述仍存在一些問題,故速度略有落差 !! 請持續關注後續的版本更新 !! 謝謝
五. 參考文件
[1] 官方網站 - i.MX Machine Learning User's Guide.pdf
[2] 官方網站 - Arm NN Developer Guide
如有任何相關 ArmNN 技術問題,歡迎至博文底下留言提問 !!
接下來還會分享更多 ArmNN 的技術文章 !!敬請期待 【ATU Book-i.MX8 系列 - ArmNN】 !!
評論