PaddleLite使用RK NPU预测部署

Paddle Lite已支持RK NPU的预测部署。 其接入原理是与之前华为NPU类似,即加载并分析Paddle模型,将Paddle算子转成RK组网API进行网络构建,在线生成并执行模型。

支持现状

已支持的芯片

  • RK1808, RK1806,暂时不支持RK3399Pro。

已支持的设备

  • RK1808/1806 EVB。

已支持的Paddle模型

已支持(或部分支持)的Paddle算子

  • relu
  • conv2d
  • depthwise_conv2d
  • pool2d
  • fc
  • softmax
  • batch_norm
  • concat
  • elementwise_add
  • elementwise_sub
  • elementwise_mul
  • elementwise_div

参考示例演示

测试设备(RK1808 EVB)

https://paddlelite-demo.bj.bcebos.com/devices/rockchip/rk1808_evb_front.jpgrk1808_evb_front

https://paddlelite-demo.bj.bcebos.com/devices/rockchip/rk1808_evb_back.jpgrk1808_evb_back

准备设备环境

  • 需要依赖特定版本的firmware,请参照rknpu_ddk的说明对设备进行firmware的更新;
  • 由于RK1808 EVB在刷firmware后,只是一个纯净的Linux系统,无法像Ubuntu那样使用apt-get命令方便的安装软件,因此,示例程序和PaddleLite库的编译均采用交叉编译方式;
  • 将MicroUSB线插入到设备的MicroUSB OTG口,就可以使用Android的adb命令进行设备的交互,再也不用配置网络使用ssh或者通过串口的方式访问设备了,这个设计非常赞!

准备交叉编译环境

  • 为了保证编译环境一致,建议参考编译环境准备中的Docker开发环境进行配置。

运行图像分类示例程序

  1. - PaddleLite-linux-demo
  2. - image_classification_demo
  3. - assets
  4. - images
  5. - tabby_cat.jpg # 测试图片
  6. - tabby_cat.raw # 已处理成raw数据的测试图片
  7. - labels
  8. - synset_words.txt # 1000分类label文件
  9. - models
  10. - mobilenet_v1_int8_224_for_cpu.nb # 已通过opt转好的、适合arm cpu的mobilenetv1量化模型
  11. - mobilenet_v1_int8_224_for_rknpu.nb # 已通过opt转好的、适合rknpu的mobilenetv1量化模型
  12. - shell
  13. - CMakeLists.txt # 示例程序CMake脚本
  14. - build
  15. - image_classification_demo # 已编译好的示例程序
  16. - image_classification_demo.cc # 示例程序源码
  17. - convert_to_raw_image.py # 将测试图片保存为raw数据的python脚本
  18. - build.sh # 示例程序编译脚本
  19. - run.sh # 示例程序运行脚本
  20. - libs
  21. - PaddleLite
  22. - arm64
  23. - include # PaddleLite头文件
  24. - lib
  25. - libGAL.so # RK DDK库
  26. - libOpenVX.so
  27. - libVSC.so
  28. - librknpu_ddk.so
  29. - libgomp.so.1 # gnuomp库
  30. - libpaddle_light_api_shared.so # 预编译PaddleLite库
  31. - armhf
  32. - include # PaddleLite头文件
  33. - lib
  34. - libGAL.so
  35. - libOpenVX.so
  36. - libVSC.so
  37. - librknpu_ddk.so
  38. - libgomp.so.1
  39. - libpaddle_light_api_shared.so
  • 进入PaddleLite-linux-demo/image_classification_demo/shell,直接执行./run.sh arm64即可,注意:run.sh不能在docker环境执行,否则无法找到设备;
  1. $ cd PaddleLite-linux-demo/image_classification_demo/shell
  2. $ ./run.sh arm64 # For RK1808 EVB
  3. $ ./run.sh armhf # For RK1806 EVB
  4. ...
  5. warmup: 5 repeat: 10, average: 6.499500 ms, max: 6.554000 ms, min: 6.468000 ms
  6. results: 3
  7. Top0 Egyptian cat - 0.532328
  8. Top1 tabby, tabby cat - 0.345136
  9. Top2 tiger cat - 0.111146
  10. Preprocess time: 2.414000 ms
  11. Prediction time: 6.499500 ms
  12. Postprocess time: 0.414000 ms
  • 如果需要更改测试图片,可通过convert_to_raw_image.py工具生成;
  • 如果需要重新编译示例程序,直接运行./build.sh即可,注意:build.sh的执行必须在docker环境中,否则可能编译出错。

更新模型

  1. $ ./opt --model_dir=mobilenet_v1_int8_224_fluid \
  2. --optimize_out_type=naive_buffer \
  3. --optimize_out=mobilenet_v1_int8_224_for_rknpu \
  4. --valid_targets=rknpu,arm
  • 注意:opt生成的模型只是标记了RKNPU支持的Paddle算子,并没有真正生成RK NPU模型,只有在执行时才会将标记的Paddle算子转成RK NPU组网API,最终生成并执行模型。

更新支持RK NPU的Paddle Lite库

  • 下载PaddleLite源码和RK DDK;
  1. $ git clone https://github.com/PaddlePaddle/Paddle-Lite.git
  2. $ cd Paddle-Lite
  3. $ git checkout <release-version-tag>
  4. $ git clone https://github.com/airockchip/rknpu_ddk.git
  • 编译full_publish and tiny_publish for RK1808 and RK1806 EVB
  1. For RK1808 EVB
  2. $ ./lite/tools/build.sh --arm_os=armlinux --arm_abi=armv8 --arm_lang=gcc --build_extra=ON --with_log=ON --build_rknpu=ON --rknpu_ddk_root=./rknpu_ddk full_publish
  3. $ ./lite/tools/build.sh --arm_os=armlinux --arm_abi=armv8 --arm_lang=gcc --build_extra=ON --with_log=ON --build_rknpu=ON --rknpu_ddk_root=./rknpu_ddk tiny_publish
  4. For RK1806 EVB
  5. $ ./lite/tools/build.sh --arm_os=armlinux --arm_abi=armv7 --arm_lang=gcc --build_extra=ON --with_log=ON --build_rknpu=ON --rknpu_ddk_root=./rknpu_ddk full_publish
  6. $ ./lite/tools/build.sh --arm_os=armlinux --arm_abi=armv7 --arm_lang=gcc --build_extra=ON --with_log=ON --build_rknpu=ON --rknpu_ddk_root=./rknpu_ddk tiny_publish
  • 将编译生成的build.lite.armlinux.armv8.gcc/inference_lite_lib.armlinux.armv8.rknpu/cxx/include替换PaddleLite-linux-demo/libs/PaddleLite/arm64/include目录;
  • 将编译生成的build.lite.armlinux.armv8.gcc/inference_lite_lib.armlinux.armv8.rknpu/cxx/lib/libpaddle_light_api_shared.so替换PaddleLite-linux-demo/libs/PaddleLite/arm64/lib/libpaddle_light_api_shared.so文件;
  • 将编译生成的build.lite.armlinux.armv7.gcc/inference_lite_lib.armlinux.armv7.rknpu/cxx/include替换PaddleLite-linux-demo/libs/PaddleLite/armhf/include目录;
  • 将编译生成的build.lite.armlinux.armv7.gcc/inference_lite_lib.armlinux.armv7.rknpu/cxx/lib/libpaddle_light_api_shared.so替换PaddleLite-linux-demo/libs/PaddleLite/armhf/lib/libpaddle_light_api_shared.so文件。

其它说明

  • RK研发同学正在持续增加用于适配Paddle算子bridge/converter,以便适配更多Paddle模型。