PaddleLite使用颖脉NNA预测部署

    • 紫光展锐虎贲T7510

    已支持的设备

    • 海信F50,Roc1开发板(基于T7510的微型电脑主板)

    • 酷派X10(暂未提供demo)

    已支持的Paddle模型

    模型

    性能

    • 测试环境

      • 编译环境

        • Ubuntu 18.04,GCC 5.4 for ARMLinux aarch64
      • 硬件环境

        • 紫光展锐虎贲T7510

          • Roc1开发板

          • CPU:4 x Cortex-A75 2.0 GHz + 4 x Cortex-A55 1.8 GHz

          • NNA:4 TOPs @1.0GHz

    • 测试方法

      • warmup=10,repeats=30,统计平均时间,单位是ms

      • 线程数为1,设置LITE_POWER_HIGH

      • 分类模型的输入图像维度是{1,3,224,224}

    • 测试结果

    • depthwise_conv2d

    • pool2d

    • fc

    可以通过访问获得最新的算子支持列表。

    测试设备(Roc1开发板)

    roc1_back

    准备设备环境

    • 需要依赖特定版本的firmware,请联系Imagination相关研发同学 jason.wang@imgtec.com;

    • 确定能够通过SSH方式远程登录Roc 1开发板;

    • 由于Roc 1的ARM CPU能力较弱,示例程序和PaddleLite库的编译均采用交叉编译方式。

    • 按照以下两种方式配置交叉编译环境:

      • Docker交叉编译环境:由于Roc1运行环境为Ubuntu 18.04,且Imagination NNA DDK依赖高版本的glibc,因此不能直接使用编译环境准备中的docker image,而需要按照如下方式在Host机器上手动构建Ubuntu 18.04的docker image;

      • Ubuntu交叉编译环境:要求Host为Ubuntu 18.04系统,参考中的”交叉编译ARM Linux”步骤安装交叉编译工具链。

    • 由于需要通过scp和ssh命令将交叉编译生成的PaddleLite库和示例程序传输到设备上执行,因此,在进入Docker容器后还需要安装如下软件:

      1. # apt-get install openssh-client sshpass

    运行图像分类示例程序

    • 按照以下命令分别运行转换后的ARM CPU模型和Imagination NNA模型,比较它们的性能和结果;

      1. 注意:
      2. 1run.sh必须在Host机器上运行,且执行前需要配置目标设备的IP地址、SSH账号和密码;
      3. 2build.sh建议在docker环境中执行,目前只支持arm64
      4. 运行适用于ARM CPUmobilenetv1全量化模型
      5. $ cd PaddleLite-linux-demo/image_classification_demo/assets/models
      6. $ cp mobilenet_v1_int8_224_for_cpu/model.nb mobilenet_v1_int8_224_for_cpu_fluid.nb
      7. $ cd ../../shell
      8. $ vim ./run.sh
      9. MODEL_NAME设置为mobilenet_v1_int8_224_for_cpu_fluid
      10. $ ./run.sh
      11. warmup: 5 repeat: 10, average: 61.408800 ms, max: 61.472000 ms, min: 61.367001 ms
      12. Top0 tabby, tabby cat - 0.522023
      13. Top1 Egyptian cat - 0.395266
      14. Top2 tiger cat - 0.073605
      15. Preprocess time: 0.834000 ms
      16. Prediction time: 61.408800 ms
      17. Postprocess time: 0.161000 ms
      18. $ cd PaddleLite-linux-demo/image_classification_demo/assets/models
      19. $ cp mobilenet_v1_int8_224_for_imagination_nna/model.nb mobilenet_v1_int8_224_for_imagination_nna_fluid.nb
      20. $ cd ../../shell
      21. $ vim ./run.sh
      22. MODEL_NAME设置为mobilenet_v1_int8_224_for_imagination_nna_fluid
      23. warmup: 5 repeat: 10, average: 18.024800 ms, max: 19.073000 ms, min: 17.368999 ms
      24. results: 3
      25. Top0 Egyptian cat - 0.039642
      26. Top1 tabby, tabby cat - 0.039642
      27. Top2 tiger cat - 0.026363
      28. Preprocess time: 0.815000 ms
      29. Prediction time: 18.024800 ms
      30. Postprocess time: 0.169000 ms
    • 如果需要更改测试图片,可通过convert_to_raw_image.py工具生成;

    • 如果需要重新编译示例程序,直接运行./build.sh即可,注意:build.sh的执行建议在docker环境中,否则可能编译出错。

    更新模型

    • 通过Paddle Fluid训练,或X2Paddle转换得到MobileNetv1 foat32模型mobilenet_v1_fp32_224_fluid

    • 参考使用PaddleSlim对float32模型进行量化(注意:由于Imagination NNA只支持tensor-wise的全量化模型,在启动量化脚本时请注意相关参数的设置),最终得到全量化MobileNetV1模型mobilenet_v1_int8_224_fluid

    • 参考,利用opt工具转换生成Imagination NNA模型,仅需要将valid_targets设置为imagination_nna,arm即可。

    • 注意:opt生成的模型只是标记了Imagination NNA支持的Paddle算子,并没有真正生成Imagination NNA模型,只有在执行时才会将标记的Paddle算子转成Imagination DNN APIs,最终生成并执行模型。

    • 下载PaddleLite源码和Imagination NNA DDK

      1. $ git clone https://github.com/PaddlePaddle/Paddle-Lite.git
      2. $ cd Paddle-Lite
      3. $ git checkout <release-version-tag>
      4. $ curl -L https://paddlelite-demo.bj.bcebos.com/devices/imagination/imagination_nna_sdk.tar.gz -o - | tar -zx
    • 编译并生成PaddleLite+ImaginationNNA for armv8的部署库

      • For Roc1

        • tiny_publish编译方式

        • full_publish编译方式

          1. $ ./lite/tools/build_linux.sh --with_extra=ON --with_log=ON --with_imagination_nna=ON --imagination_nna_sdk_root=./imagination_nna_sdk full_publish
          2. full_publish模式下编译生成的build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nna/cxx/lib/libpaddle_full_api_shared.so替换PaddleLite-linux-demo/libs/PaddleLite/arm64/lib/libpaddle_full_api_shared.so文件;
      • 将编译生成的build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nna/cxx/include替换PaddleLite-linux-demo/libs/PaddleLite/arm64/include目录;

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