Bootstrap

1+1>2,Paddle Lite与EdgeBoard无缝连接,快速实现部署应用

导读:Paddle Lite高性能推理引擎支持FPGA作为其底层加速硬件,其支持的模型可以很简单的部署到FPGA计算卡上,利用Paddle Lite上层框架的优化能力,加上FPGA底层超强的计算能力,在精度损失很小的情况下,模型运行速度可以得到很大的提升。本文通过Paddle Lite高性能推理引擎在百度EdgeBoard计算卡上部署蔬菜识别模型,达到了实时高效识别蔬菜品类的效果。

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等常用的分类模型或检测模型。

;