1+1>2,Paddle Lite與EdgeBoard無縫連線,快速實現部署應用

PaddlePaddle發表於2019-10-09

1.  基於飛槳開源深度學習平臺的AI解決方案


作為飛槳開源深度學習平臺的重要組成部分,Paddle Lite和EasyEdge通過有機組合,可以快速實現基於FPGA的嵌入式AI解決方案,具有高效能、高通用、低成本、易開發等四大優點,適用於開發驗證、產品整合、科研教學、專案落地等應用方向,以及安防監控、工業質檢、醫療診斷、農作物生長監控、無人駕駛、無人零售等應用場景。


2.  真實案例:蔬菜種類識別


針對真實的業務需求:蔬菜種類識別,本文進行了完整的案例實現。簡便起見,我們採用了百度AI Studio的公開蔬菜識別模型,為了進一步提高識別速度和效率,採用的是int8量化訓練的模型,量化的優點包括低記憶體頻寬、低功耗、低計算資源佔用以及低模型儲存需求等。這裡,硬體我們採用EdgeBoard來實現

1+1>2,Paddle Lite與EdgeBoard無縫連線,快速實現部署應用

圖1 EdgeBoard計算卡


 2.1.   量化訓練原理

量化是將浮點數量化成定點數,以最大絕對值量化(max-abs)為例,量化公式如下:

1+1>2,Paddle Lite與EdgeBoard無縫連線,快速實現部署應用

前向計算量化過程如下:

a. 輸入和權重被量化為8-bit整數

b. 在8-bit整數上執行矩陣乘法或卷積

c. 對矩陣乘法或者卷積操作的輸出結果進行反量化,輸出為32-bit浮點數

d. 在32-bit浮點型資料上執行偏置加法操作

1+1>2,Paddle Lite與EdgeBoard無縫連線,快速實現部署應用

圖2 量化訓練前向過程(左為量化過程,右為等價工作流)


為了充分的利用GPU提供的加速支援,上述的前向計算流可以等價為圖2右的工作流:

對應反向傳播計算過程:

1+1>2,Paddle Lite與EdgeBoard無縫連線,快速實現部署應用

圖3 量化計算反向傳播過程



2.2.   模型訓練


本文采用的模型是Resnet50模型,它引入了新的殘差結構,解決了隨著網路加深,準確率下降的問題,在分類問題上表現良好,可以通過以下步驟進行模型訓練:

a.  開啟百度AI Studio官網https://aistudio.baidu.com/

b.  點選頂部選單:專案->公開專案, 搜尋 “EdgeBoard-Resnet50”,點選開啟。

1+1>2,Paddle Lite與EdgeBoard無縫連線,快速實現部署應用

c.  載入訓練資料和float模型,量化訓練8bit模型

1+1>2,Paddle Lite與EdgeBoard無縫連線,快速實現部署應用

d.  CPU評估量化訓練模型效果

1+1>2,Paddle Lite與EdgeBoard無縫連線,快速實現部署應用

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的最優排程、混合部署等功能,進一步實現了模型加速。整體結構原理如圖所示。

1+1>2,Paddle Lite與EdgeBoard無縫連線,快速實現部署應用

圖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 CxxConfigCxxConfig 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 CxxConfigpredictor = 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 predictorfor (int i = 0;i < 2; i++) {  predictor->Run();}


3.3.6. 獲取執行結果

// 5. Get outputstd::unique_ptr<const Tensor> output_tensor;std::move(predictor->GetOutput(0)));


3.4.   應用測試

將EdgeBoard計算卡與攝像頭相連,可以測試我們的蔬菜識別模型的效果與執行速度,整個測試結果如下:


3.4.1.  檢測結果測試

隨便選取若干張圖片,測試結果如下:

1+1>2,Paddle Lite與EdgeBoard無縫連線,快速實現部署應用

圖5 EdgeBoard後臺模型執行過程

再把圖片視覺化的效果看一下:

1+1>2,Paddle Lite與EdgeBoard無縫連線,快速實現部署應用

1+1>2,Paddle Lite與EdgeBoard無縫連線,快速實現部署應用

圖6 EdgeBoard執行效果

3.4.2.  執行效能測試

對比ARM端晶片,EdgeBoard的效能有4-14倍提升,如下圖所示:

1+1>2,Paddle Lite與EdgeBoard無縫連線,快速實現部署應用

圖7 EdgeBoard對比ARM晶片,其他晶片資料均來測於Paddle Lite beta1版本 armv8+4執行緒,縱軸單位為ms

對比主流邊緣及端類晶片,EdgeBoard也有不錯的表現:

1+1>2,Paddle Lite與EdgeBoard無縫連線,快速實現部署應用

圖8 與同類主流晶片效能比較,縱軸單位為ms


4.  總結

本文利用Paddle Lite推理引擎在EdgeBoard計算卡上部署Resnet50 int8量化蔬菜識別模型,實現了邊緣端智慧識別蔬菜品類的功能,可用於多種場景。整個應用藉助Paddle Lite的上層框架優化能力與FPGA的底層計算加速能力,每秒可識別50幀,真正實現實時高效的蔬菜識別。

本案例具有極高的擴充性,由於Paddle Lite可以和飛槳PaddlePaddle模型無縫對接,加上EdgeBoard計算卡的軟體可持續迭代、op持續更新等特點,在模型支援上的數量上和速度上均會有很大優勢,如本文所用模型也可以更換成Inception等常用的分類模型或檢測模型。

相關文章