1. 基於飛槳開源深度學習平臺的AI解決方案
作為飛槳開源深度學習平臺的重要組成部分,Paddle Lite和EasyEdge通過有機組合,可以快速實現基於FPGA的嵌入式AI解決方案,具有高效能、高通用、低成本、易開發等四大優點,適用於開發驗證、產品整合、科研教學、專案落地等應用方向,以及安防監控、工業質檢、醫療診斷、農作物生長監控、無人駕駛、無人零售等應用場景。
2. 真實案例:蔬菜種類識別
針對真實的業務需求:蔬菜種類識別,本文進行了完整的案例實現。簡便起見,我們採用了百度AI Studio的公開蔬菜識別模型,為了進一步提高識別速度和效率,採用的是int8量化訓練的模型,量化的優點包括低記憶體頻寬、低功耗、低計算資源佔用以及低模型儲存需求等。這裡,硬體我們採用EdgeBoard來實現
圖1 EdgeBoard計算卡
2.1. 量化訓練原理
量化是將浮點數量化成定點數,以最大絕對值量化(max-abs)為例,量化公式如下:
前向計算量化過程如下:
a. 輸入和權重被量化為8-bit整數
b. 在8-bit整數上執行矩陣乘法或卷積
c. 對矩陣乘法或者卷積操作的輸出結果進行反量化,輸出為32-bit浮點數
d. 在32-bit浮點型資料上執行偏置加法操作
圖2 量化訓練前向過程(左為量化過程,右為等價工作流)
為了充分的利用GPU提供的加速支援,上述的前向計算流可以等價為圖2右的工作流:
對應反向傳播計算過程:
圖3 量化計算反向傳播過程
2.2. 模型訓練
本文采用的模型是Resnet50模型,它引入了新的殘差結構,解決了隨著網路加深,準確率下降的問題,在分類問題上表現良好,可以通過以下步驟進行模型訓練:
a. 開啟百度AI Studio官網https://aistudio.baidu.com/
b. 點選頂部選單:專案->公開專案, 搜尋 “EdgeBoard-Resnet50”,點選開啟。
c. 載入訓練資料和float模型,量化訓練8bit模型
d. CPU評估量化訓練模型效果
3. 模型的部署與測試
3.1. Paddle Lite支援FPGA硬體原理
Paddle Lite完整支援從Mobile到Server多種硬體,這主要得益於對不同硬體的統一抽象,不同的硬體提供統一的介面給上層框架,形成了硬體的可插拔,極大方便了底層硬體的擴充套件與支援。FPGA作為Paddle Lite的Backends之一,將自身硬體相關的kernel、驅動及核心進行了包裝並向Paddle Lite提供了統一的op呼叫介面,使得Paddle Lite能很方便的整合FPGA的計算能力。同時通過Paddle Lite上層框架對模型的優化能力,包括各種op融合、計算剪枝、儲存複用、量化融合的優化pass,以及kernel的最優排程、混合部署等功能,進一步實現了模型加速。整體結構原理如圖所示。
圖4 Paddle Lite支援EdgeBoard原理
3.2. Paddle Lite庫編譯
3.2.1. 拉取Paddle Lite庫
git clone https://github.com/PaddlePaddle/Paddle Lite.git
3.2.2.編譯Paddle Lite FPGA庫
可以使用Paddle Lite使用的docker
cd Paddle Lite && ./lite/tools/build_FPGA.sh
編譯完成時build_FPGA/lite/inference_lite_lib.armlinux.armv8.FPGA/cxx裡包含了所需的標頭檔案資料夾include和庫資料夾lib,lib下靜態庫libpaddle_api_full_bundled.a是我們所需的Paddle Lite靜態庫檔案
3.3. EdgeBoard模型部署
利用Paddle Lite在EdgeBoard上進行模型部署很簡單,只需將include下標頭檔案包含到呼叫Paddle Lite的程式碼檔案中,將靜態庫檔案與工程檔案聯編成可執行程式,即可執行。其中呼叫Paddle Lite的步驟如下:
3.3.1. 包含標頭檔案
#include "paddle_api.h"
#include "paddle_use_kernels.h"
#include "paddle_use_ops.h"
#include "paddle_use_passes.h"
using namespace paddle::lite_api;
3.3.2. 設定配置引數
std::vector<Place> valid_places({Place{TARGET(kFPGA), PRECISION(kFP16), DATALAYOUT(kNHWC)},
Place{TARGET(kHost), PRECISION(kFloat), DATALAYOUT(kNCHW)}});
std::string model_dir = j["model"];
std::string model_file = model_dir + "/model";
std::string params_file = model_dir + "/params";
// 1. Set CxxConfig
CxxConfig config;
config.set_model_dir(model_dir);
config.set_model_file(model_file);
config.set_param_file(params_file);
config.set_preferred_place(Place{TARGET(kFPGA), PRECISION(kFP16), DATALAYOUT(kNHWC)});
config.set_valid_places(valid_places);
3.3.3. 建立預測器
// 2. Create PaddlePredictor by CxxConfig
predictor = CreatePaddlePredictor<CxxConfig>(config);
3.3.4. 設定輸入資料
std::unique_ptr<Tensor> input_tensor(std::move(predictor->GetInput(0)));
input_tensor->Resize(shape_t({1, 3, 224, 224}));
auto* input = input_tensor->mutable_data<float>();
read_image(value, input);
3.3.5. 開始預測
// 4. Run predictor
for (int i = 0;i < 2; i++) {
predictor->Run();
}
3.3.6. 獲取執行結果
// 5. Get output
std::unique_ptr<const Tensor> output_tensor;
std::move(predictor->GetOutput(0)));
3.4. 應用測試
將EdgeBoard計算卡與攝像頭相連,可以測試我們的蔬菜識別模型的效果與執行速度,整個測試結果如下:
3.4.1. 檢測結果測試
隨便選取若干張圖片,測試結果如下:
圖5 EdgeBoard後臺模型執行過程
再把圖片視覺化的效果看一下:
圖6 EdgeBoard執行效果
3.4.2. 執行效能測試
對比ARM端晶片,EdgeBoard的效能有4-14倍提升,如下圖所示:
圖7 EdgeBoard對比ARM晶片,其他晶片資料均來測於Paddle Lite beta1版本 armv8+4執行緒,縱軸單位為ms
對比主流邊緣及端類晶片,EdgeBoard也有不錯的表現:
圖8 與同類主流晶片效能比較,縱軸單位為ms
4. 總結
本文利用Paddle Lite推理引擎在EdgeBoard計算卡上部署Resnet50 int8量化蔬菜識別模型,實現了邊緣端智慧識別蔬菜品類的功能,可用於多種場景。整個應用藉助Paddle Lite的上層框架優化能力與FPGA的底層計算加速能力,每秒可識別50幀,真正實現實時高效的蔬菜識別。
本案例具有極高的擴充性,由於Paddle Lite可以和飛槳PaddlePaddle模型無縫對接,加上EdgeBoard計算卡的軟體可持續迭代、op持續更新等特點,在模型支援上的數量上和速度上均會有很大優勢,如本文所用模型也可以更換成Inception等常用的分類模型或檢測模型。