如今各種機(jī)器學(xué)習(xí)框架的普及使得個(gè)人搭建和訓(xùn)練一個(gè)機(jī)器學(xué)習(xí)模型越來(lái)越容易。然而現(xiàn)實(shí)中大量的機(jī)器學(xué)習(xí)模型訓(xùn)練完后需要在邊緣端部署,那么我們看看借助Xilinx Vitis-AI工具,如何僅僅使用10行代碼,就能在ZYNQ MP器件上部署深度學(xué)習(xí)模型實(shí)現(xiàn)圖像分類。
簡(jiǎn)介
Xilinx Vitis-AI 是用于 Xilinx 硬件平臺(tái)上的 AI 推理的開發(fā)堆棧。它由優(yōu)化的 IP、工具、庫(kù)、模型和示例設(shè)計(jì)組成。
簡(jiǎn)單來(lái)說,它主要包含:
- AI推理加速器IP,即DPU;
- 支持將AI模型優(yōu)化 (Optimizer)、量化 (Quantizer)、最后編譯 (Compiler) 成DPU運(yùn)行指令集的整套工具;
- 支撐模型運(yùn)行的運(yùn)行時(shí)庫(kù)(Vitis-AI runtime, Vitis-AI library);
更多具體介紹請(qǐng) 訪問如下鏈接至官方文檔:
https://github.com/Xilinx/Vitis-AI
https://www.xilinx.com/support/documentation/sw_manuals/vitis_ai/1_4/ug1...
本案例中,我們將使用 Xilinx Kria KV260開發(fā)板(包含ZynqMP器件)為目標(biāo)運(yùn)行設(shè)備。
本文使用的Vitis-AI 版本為1.4, 使用的platform基于Vitis/Vivado 2020.2。為了方便快速部署,我們直接使用官方發(fā)布的Linux系統(tǒng)啟動(dòng)鏡像, 并且使用Vitis-AI library為編程接口。
準(zhǔn)備工作
開始工作前我們需要先搭建好運(yùn)行環(huán)境,包括設(shè)置host端(X86機(jī)器)的交叉編譯環(huán)境,以及 target端(KV260)的啟動(dòng)鏡像燒寫。
本文的主要目的是闡述 Vitis-AI Library 的使用,故運(yùn)行環(huán)境的搭建不做過多介紹,可以完全參考以下鏈接中的步驟
“Step1: Setup cross-compiler”
“Step2: Setup the Target”
https://github.com/Xilinx/Vitis-AI/tree/master/setup/mpsoc/VART
注意因?yàn)镵V260 的Vitis-AI 1.4 platform基于Vitis/Vivado 2020.2, 配置交叉編譯環(huán)境使用的腳本為host_cross_compiler_setup_2020.2.sh
因?yàn)槲覀兪褂霉俜絾?dòng)鏡像,Step2中標(biāo)注為“Optional”的步驟我們都可以省略。
當(dāng)KV260成功啟動(dòng),我們會(huì)在console中看到如下提示符:
root@xilinx-k26-starterkit-2020_2:~#
程序編譯
可通過如下方式獲得本案例中的代碼,
git clone https://github.com/lobster1989/Image-classification-on-edge-with-10-lines-of-code.git
主要用到的文件為classification.cpp和Makefile。另外幾個(gè)Jpeg文件可用于后續(xù)測(cè)試輸入。
安裝準(zhǔn)備工作章節(jié)中配置好交叉編譯環(huán)境后,切換到源碼目錄中直接運(yùn)行make。make完成后文件夾中會(huì)生成執(zhí)行文件“classification”。
運(yùn)行演示
KV260 連接好串口,從SD卡啟動(dòng)運(yùn)行(記得提前把執(zhí)行文件和測(cè)試圖片拷貝到SD下),
切換到執(zhí)行文件和測(cè)試圖片目錄下,運(yùn)行 ./classification.JPEG
分類結(jié)果如下:
代碼分析
Vitis-AI包含了兩組編程接口:VART (Vitis-AI Runtime) 比較底層,提供更大的自由度;Vitis-AI library屬于高層次API,構(gòu)建于 VART 之上,通過封裝許多高效、高質(zhì)量的神經(jīng)網(wǎng)絡(luò),提供更易于使用的統(tǒng)一接口。
Vitis-AI Library的組成如下圖,包含 base libraries, model libraries, library test samples, application demos幾個(gè)部分:
- base libraries提供底層接口;
- model libraries是重要的部分,提供了主流模型(classification, detection, segmentation…) 的調(diào)用方法;
- library test samples和application demos主要提供library的使用示例;
更多Vitis-AI library的細(xì)節(jié)可參考官方文檔,
https://www.xilinx.com/support/documentation/sw_manuals/vitis_ai/1_4/ug1...
再來(lái)看本例子,如何用簡(jiǎn)單到10行代碼實(shí)現(xiàn)圖片分類:
int main(int argc, char* argv[]) { std::string image_name = argv[1]; auto image = cv::imread(image_name); auto network = vitis::ai::Classification::create("resnet50"); auto result = network->run(image); cout << "Classification result:" << endl; for (const auto &r : result.scores){ cout << result.lookup(r.index) << ": " << r.score << endl; } }
源文件中除去include部分,只有10行代碼,代碼中最重要的有兩句,第一句調(diào)用create方法創(chuàng)建了Classification類的一個(gè)實(shí)例,第二句調(diào)用run方法來(lái)運(yùn)行神經(jīng)網(wǎng)絡(luò)獲得推理結(jié)果。
auto network = vitis::ai::Classification::create("resnet50"); auto result = network->run(image);
vitis::ai::Classification 是 model libraries 中的一個(gè)基礎(chǔ)類,其作用是進(jìn)行圖片分類,這個(gè)類中包含如下方法:
其中create方法接受一個(gè)模型名稱作為參數(shù),返回一個(gè)Classification類的實(shí)例。在安裝了Vitis-AI Library的開發(fā)板上,已經(jīng)訓(xùn)練編譯好的模型文件放在開發(fā)板的/usr/share/vitis_ai_library/models/目錄下,Vitis-AI Library會(huì)通過傳遞給create方法的模型名稱來(lái)調(diào)用這些模型文件,比如我們用到的resnet50模型文件位置如下,
如果用戶訓(xùn)練并編譯好了自己的模型,也可以把自己的模型文件放到對(duì)應(yīng)位置來(lái)使用。
run方法接受一個(gè)/一組圖片作為輸入,輸出這個(gè)/這些圖片的分類結(jié)果。其工作簡(jiǎn)單來(lái)說就是把模型文件和圖片數(shù)據(jù)傳送給DPU, DPU運(yùn)行并輸出推理結(jié)果,CPU再讀回結(jié)果。
再看下添加了注釋的代碼片段,整個(gè)過程實(shí)際上非常簡(jiǎn)單明了。
int main(int argc, char* argv[]) { std::string image_name = argv[1]; auto image = cv::imread(image_name); // 讀入圖片 auto network = vitis::ai::Classification::create("resnet50"); // 用resnet50模型創(chuàng)建Classification類實(shí)例 auto result = network->run(image); //運(yùn)行模型 cout << "Classification result:" << endl; for (const auto &r : result.scores){ cout << result.lookup(r.index) << ": " << r.score << endl; //輸出模型運(yùn)行結(jié)果 } }
除了Classification基礎(chǔ)類, Vitis-AI Library包含了非常多的常用機(jī)器學(xué)習(xí)任務(wù)(classification, detection, segmentation…)的基礎(chǔ)類。這些類的使用方法基本一致,
- 首先通過create方法創(chuàng)建基礎(chǔ)類的實(shí)例,
- 通過getInputWidth()/getInputHeight()來(lái)獲取模型需要的圖片尺寸,
- resize圖片,
- 運(yùn)行run方法來(lái)運(yùn)行網(wǎng)絡(luò)獲得輸出。
總結(jié)
通過這個(gè)例子,我們看到通過Vitis-AI工具,可以大大縮減模型到部署之間的距離。Vitis-AI包含了常用模型的Model-Zoo, 提供簡(jiǎn)單易用的編程接口,甚至可以讓不熟悉機(jī)器學(xué)習(xí)或者FPGA的軟件開發(fā)者都可以在極短的時(shí)間內(nèi)在FPGA/SoC器件上部署神經(jīng)網(wǎng)絡(luò)應(yīng)用。
審核編輯:郭婷
-
AI
+關(guān)注
關(guān)注
87文章
31325瀏覽量
269672 -
代碼
+關(guān)注
關(guān)注
30文章
4813瀏覽量
68832 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8429瀏覽量
132852
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論