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开发板)
准备设备环境
需要依赖特定版本的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容器后还需要安装如下软件:
# apt-get install openssh-client sshpass
运行图像分类示例程序
按照以下命令分别运行转换后的ARM CPU模型和Imagination NNA模型,比较它们的性能和结果;
注意:
1)run.sh必须在Host机器上运行,且执行前需要配置目标设备的IP地址、SSH账号和密码;
2)build.sh建议在docker环境中执行,目前只支持arm64。
运行适用于ARM CPU的mobilenetv1全量化模型
$ cd PaddleLite-linux-demo/image_classification_demo/assets/models
$ cp mobilenet_v1_int8_224_for_cpu/model.nb mobilenet_v1_int8_224_for_cpu_fluid.nb
$ cd ../../shell
$ vim ./run.sh
MODEL_NAME设置为mobilenet_v1_int8_224_for_cpu_fluid
$ ./run.sh
warmup: 5 repeat: 10, average: 61.408800 ms, max: 61.472000 ms, min: 61.367001 ms
Top0 tabby, tabby cat - 0.522023
Top1 Egyptian cat - 0.395266
Top2 tiger cat - 0.073605
Preprocess time: 0.834000 ms
Prediction time: 61.408800 ms
Postprocess time: 0.161000 ms
$ cd PaddleLite-linux-demo/image_classification_demo/assets/models
$ cp mobilenet_v1_int8_224_for_imagination_nna/model.nb mobilenet_v1_int8_224_for_imagination_nna_fluid.nb
$ cd ../../shell
$ vim ./run.sh
MODEL_NAME设置为mobilenet_v1_int8_224_for_imagination_nna_fluid
warmup: 5 repeat: 10, average: 18.024800 ms, max: 19.073000 ms, min: 17.368999 ms
results: 3
Top0 Egyptian cat - 0.039642
Top1 tabby, tabby cat - 0.039642
Top2 tiger cat - 0.026363
Preprocess time: 0.815000 ms
Prediction time: 18.024800 ms
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
$ git clone https://github.com/PaddlePaddle/Paddle-Lite.git
$ cd Paddle-Lite
$ git checkout <release-version-tag>
$ 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编译方式
$ ./lite/tools/build_linux.sh --with_extra=ON --with_log=ON --with_imagination_nna=ON --imagination_nna_sdk_root=./imagination_nna_sdk full_publish
将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模型。