4. 飞桨(PaddlePaddle) FastDeploy

4.1. FastDeploy

FastDeploy针对产业落地场景中的重要AI模型,将模型API标准化,提供下载即可运行的Demo示例。 FastDeploy还支持在线(服务化部署)和离线部署形态,满足不同开发者的部署需求。

FastDeploy旨在为AI开发者提供模型部署最优解,具备全场景、简单易用、极致高效三大特点。

全场景:支持 GPU、CPU、Jetson、ARM CPU、瑞芯微NPU、晶晨NPU、恩智浦NPU 等多类硬件,支持本地部署、服务化部署、Web端部署、移动端部署等,支持CV、NLP、Speech 三大领域, 支持图像分类、图像分割、语义分割、物体检测、字符识别(OCR)、人脸检测识别、人像扣图、姿态估计、文本分类、信息抽取、行人跟踪、语音合成等16大主流算法场景。

易用灵活:3行代码完成AI模型的部署,1行代码快速切换后端推理引擎和部署硬件,统一API实现不同部署场景的零成本迁移。

极致高效:相比传统深度学习推理引擎只关注模型的推理时间,FastDeploy则关注模型任务的端到端部署性能。通过高性能前后处理、整合高性能推理引擎、一键自动压缩等技术, 实现了AI模型推理部署的极致性能优化。

本章将介绍下使用FastDeploy在rk356X上部署轻量检测网络PicoDet。

提示

测试环境:鲁班猫板卡使用Debian11,PC端是WSL2(ubuntu20.04)

4.2. 环境配置

4.2.1. PC端模型转换推理环境搭建

需要安装rknn-Toolkit2和FastDeploy工具,用于模型转换等。

1、安装rknn-Toolkit2

参考下 toolkit2相关章节

2、安装FastDeploy等工具安装

# 直接用预编译库安装,也可以FastDeploy编译安装
# 详细参考下:
pip3 install fastdeploy-python -f https://www.paddlepaddle.org.cn/whl/fastdeploy.html

# 安装paddle2onnx

pip3 install paddle2onnx

# 安装paddlepaddle
python -m pip3 install paddlepaddle==0.0.0 -f https://www.paddlepaddle.org.cn/whl/linux/cpu-mkl/develop.html

paddlepaddle安装详细参考下 这里

4.2.2. 板端FastDeploy RKNPU2推理环境搭建

1、安装RKNN驱动环境(可跳过)

# 更新RKNN运行库
git clone https://github.com/airockchip/rknn-toolkit2
cd rknn-toolkit2
# 如果是lubancat-0/1/2请
sudo cp rknpu2/runtime/Linux/librknn_api/aarch64/* /usr/lib
sudo cp rknpu2/runtime/Linux/librknn_api/include/* /usr/include

2、编译安装FastDeploy Python SDK

需要在板端部署推理,这里测试板端编译Python SDK,然后打包,安装FastDeploy。

# 获取源码
git clone https://github.com/PaddlePaddle/FastDeploy.git

# 环境变量
export ENABLE_ORT_BACKEND=ON
export ENABLE_RKNPU2_BACKEND=ON  # 使用rknpu2作为后端引擎
export ENABLE_VISION=ON
export RKNN2_TARGET_SOC=RK3588   # lubancat-4/5设置RK3588,lubancat-0/1/2设置RK356X

# 切换到FastDeploy/python目录下
cd FastDeploy/python

# 执行命令编译,打包
python3 setup.py build
python3 setup.py bdist_wheel

# 安装
cd dist
pip3 install fastdeploy_python-0.0.0-cp39-cp39-linux_aarch64.whl

提示

rk356X系列板卡编译时卡死,可能内存不够,建议加下swap交换分区,至少4G交换空间,板端编译较慢需要等待下。

4.3. 部署推理示例

4.3.1. 轻量化检测网络PicoDet

1、模型转换

rknn-Toolkit2暂时不支持Paddle模型直接导出为RKNN模型,需要使用Paddle2ONNX转成onnx模型,然后导出rknn模型。

# 获取Paddle静态图模型,并解压(可以从FastDeploy源文件文档中获取,或者从本教程配套例程获取)
git clone https://github.com/PaddlePaddle/FastDeploy.git

# 或者从配套例程
git
tar -xvf picodet_s_416_coco_lcnet.zip

# 静态图模型转换onnx模型,
cd tools/rknpu2/picodet_s_416_coco_lcnet/

paddle2onnx --model_dir picodet_s_416_coco_lcnet \
        --model_filename model.pdmodel \
        --params_filename model.pdiparams \
        --save_file picodet_s_416_coco_lcnet/picodet_s_416_coco_lcnet.onnx \
        --enable_dev_version True

# 固定shape
python -m paddle2onnx.optimize --input_model picodet_s_416_coco_lcnet/picodet_s_416_coco_lcnet.onnx \
                            --output_model picodet_s_416_coco_lcnet/picodet_s_416_coco_lcnet.onnx \
                            --input_shape_dict "{'image':[1,3,416,416]}"

2、导出RKNN模型

Paddle2ONNX版本的不同(测试时使用1.0.5),转换模型的输出节点名称也有所不同, 需要使用 Netron 可视化模型, 找到NonMaxSuppression节点,确认输出节点名称,然后修改下picodet_s_416_coco_lcnet.yaml配置文件中的outputs_nodes参数:

broken
picodet_s_416_coco_lcnet.yaml配置文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mean:
std:
model_path: ./picodet_s_416_coco_lcnet1/picodet_s_416_coco_lcnet.onnx
target_platform: RK3568
outputs_nodes:
- 'p2o.Div.79'
- 'p2o.Concat.9'
do_quantization: False
dataset:
output_folder: "./picodet_s_416_coco_lcnet1"
# 导出模型
cd tools/rknpu2/
python export.py --config_path config/picodet_s_416_coco_lcnet.yaml --target_platform rk3568

3、 板端部署推理

# 在板端推理部署,可以使用前面自己导出的rknn模型,或者直接使用配套例程的。

cd examples/vision/detection/paddledetection/rknpu2/python
sudo python3 infer.py --model_file picodet_s_416_coco_lcnet_rk3568_unquantized.rknn  --config_file infer_cfg.yml  --image 00000014439.jpg

# 其中 --model_file指定模型文件,--config_file 指定配置文件, --image 指定需要推理的图片

运行推理显示:

[INFO] fastdeploy/vision/common/processors/transform.cc(159)::FuseNormalizeColorConvert BGR2RGB and Normalize are fused to Normalize with swap_rb=1
[INFO] fastdeploy/runtime/backends/rknpu2/rknpu2_backend.cc(57)::GetSDKAndDeviceVersion rknn_api/rknnrt version: 1.4.0 (a10f100eb@2022-09-09T09:07:14), driver version: 0.7.2
E RKNN: [15:17:31.563] rknn_set_core_mask: No implementation found for current platform!
index=0, name=image, n_dims=4, dims=[1, 416, 416, 3], n_elems=519168, size=1038336, fmt=NHWC, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000, pass_through=0
index=1, name=scale_factor, n_dims=2, dims=[1, 2, 0, 0], n_elems=2, size=4, fmt=UNDEFINED, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000, pass_through=0
index=0, name=p2o.Div.79, n_dims=4, dims=[1, 3598, 4, 1], n_elems=14392, size=28784, fmt=NCHW, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000, pass_through=0
index=1, name=p2o.Concat.9, n_dims=4, dims=[1, 80, 3598, 1], n_elems=287840, size=575680, fmt=NCHW, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000, pass_through=0
[INFO] fastdeploy/runtime/runtime.cc(449)::CreateRKNPU2Backend  Runtime initialized with Backend::RKNPU2 in Device::RKNPU.
[WARNING] fastdeploy/runtime/backends/rknpu2/rknpu2_backend.cc(315)::Infer      The input tensor type != model's inputs type.The input_type need FP16,but inputs[0].type is FP32
[INFO] fastdeploy/runtime/backends/rknpu2/rknpu2_backend.cc(328)::Infer The input model is not a quantitative model. Close the normalize operation.
[WARNING] fastdeploy/runtime/backends/rknpu2/rknpu2_backend.cc(315)::Infer      The input tensor type != model's inputs type.The input_type need FP16,but inputs[1].type is FP32
[INFO] fastdeploy/runtime/backends/rknpu2/rknpu2_backend.cc(328)::Infer The input model is not a quantitative model. Close the normalize operation.
DetectionResult: [xmin, ymin, xmax, ymax, score, label_id]
268.500000,91.562500, 329.500000, 290.500000, 0.822266, 0
104.312500,84.187500, 129.500000, 171.500000, 0.810547, 0
172.375000,81.875000, 194.375000, 172.000000, 0.762207, 0
68.437500,47.156250, 82.312500, 96.187500, 0.759766, 0
380.000000,117.250000, 398.000000, 183.125000, 0.750977, 0
213.125000,41.343750, 224.125000, 82.125000, 0.666016, 0
246.125000,42.875000, 257.500000, 85.500000, 0.535645, 0
331.750000,119.625000, 389.750000, 283.500000, 0.502930, 0
229.000000,46.625000, 245.125000, 105.937500, 0.500000, 0
37.968750,140.625000, 72.687500, 178.875000, 0.493164, 0
122.000000,47.031250, 129.500000, 63.625000, 0.430420, 0
15.351562,119.625000, 35.531250, 156.750000, 0.406006, 0
328.000000,118.000000, 361.500000, 276.500000, 0.348145, 0
229.000000,45.750000, 239.750000, 85.875000, 0.334229, 0
234.000000,56.343750, 248.875000, 109.875000, 0.318115, 0
0.632812,154.875000, 24.468750, 177.250000, 0.354248, 24
106.250000,89.875000, 399.500000, 354.250000, 0.607422, 33
107.000000,87.250000, 206.250000, 354.000000, 0.363037, 33

Visualized result save in ./visualized_result.jpg

简单测试结果显示:

broken