Intel OpenVINO¶
Paddle Lite 已支持 Intel OpenVINO 在 X86 服务器上进行预测部署。 目前支持子图接入方式,其接入原理是在线分析 Paddle 模型,将 Paddle 算子先转为统一的 NNAdapter 标准算子,再通过 OpenVINO 组网 API (API 2.0) 进行网络构建,在线生成并执行模型。
支持现状¶
已支持的设备¶
Intel® CPU
已支持的操作系统平台¶
Linux
Ubuntu 18.04 long-term support (LTS), 64-bit
Ubuntu 20.04 long-term support (LTS), 64-bit
已支持 OpenVINO 版本¶
OpenVINO 2022.1
注: OpenVINO 2022.1 对于操作系统以及硬件的相关约束可查看: https://docs.openvino.ai/2022.1/openvino_docs_install_guides_installing_openvino_linux.html#system-requirement
已支持(或部分支持)的 Paddle 算子¶
您可以查阅 NNAdapter 算子支持列表获得各算子在不同新硬件上的最新支持信息。
参考示例演示¶
测试设备(Intel® CPU X86 服务器)
准备设备环境(如 ubuntu18.04-x86_64)¶
OpenVINO Runtime 安装
安装链接:https://docs.openvino.ai/2022.1/openvino_docs_install_guides_install_runtime.html
安装方式: 推荐使用 Installer 工具以『安静模式』安装。
安装命令示例:
l_openvino_toolkit_p_2022.1.0.643_offline.sh -a -s --eula accept
安装结束后请确认运行 OpenVINO Runtime 所需的环境变量已正确设置。
运行图像分类示例程序¶
下载示例程序 PaddleLite-generic-demo.tar.gz ,解压后清单如下:
- PaddleLite-generic-demo
- image_classification_demo
- assets
- configs
- imagenet_224.txt # config 文件
- synset_words.txt # 1000 分类 label 文件
- datasets
- test # dataset
- inputs
- tabby_cat.jpg # 输入图片
- outputs
- tabby_cat.jpg # 输出图片
- list.txt # 图片清单
- models
- resnet50_fp32_224 # Paddle non-combined 格式的 resnet50 float32 模型
- __model__ # Paddle fluid 模型组网文件,可拖入 https://lutzroeder.github.io/netron/ 进行可视化显示网络结构
- bn2a_branch1_mean # Paddle fluid 模型参数文件
- bn2a_branch1_scale
...
- shell
- CMakeLists.txt # 示例程序 CMake 脚本
- build.linux.amd64 # 已编译好的,适用于 amd64
- demo # 已编译好的,适用于 amd64 的示例程序
- build.linux.arm64 # 已编译好的,适用于 arm64
- demo # 已编译好的,适用于 arm64 的示例程序
...
...
- demo.cc # 示例程序源码
- build.sh # 示例程序编译脚本
- run.sh # 示例程序本地运行脚本
- run_with_ssh.sh # 示例程序 ssh 运行脚本
- run_with_adb.sh # 示例程序 adb 运行脚本
- libs
- PaddleLite
- android
- arm64-v8a
- armeabi-v7a
- linux
- amd64
- include # Paddle Lite 头文件
- lib # Paddle Lite 库文件
- cpu
- libiomp5.so # Intel OpenMP 库
- libmklml_intel.so # Intel MKL 库
- libmklml_gnu.so # GNU MKL 库
- intel_openvino # NNAdapter 运行时库、device HAL 库
- libnnadapter.so # NNAdapter 运行时库
- libintel_openvino.so # NNAdapter device HAL 库
- libpaddle_full_api_shared.so # 预编译 Paddle Lite full api 库
- libpaddle_light_api_shared.so # 预编译 Paddle Lite light api 库
- arm64
- include
- lib
- armhf
...
- OpenCV # OpenCV 预编译库
- object_detection_demo # 目标检测示例程序
进入
PaddleLite-generic-demo/image_classification_demo/shell/
;执行以下命令比较 resnet50_fp32_224 模型的性能和结果;
运行 resnet50_fp32_224 模型 For amd64 (intel x86 cpu only) $ ./run.sh resnet50_fp32_224 imagenet_224.txt test linux amd64 Top1 tabby, tabby cat - 0.705223 Top2 tiger cat - 0.134570 Top3 Egyptian cat - 0.121521 Top4 lynx, catamount - 0.028652 Top5 ping-pong ball - 0.001043 Preprocess time: 3.832000 ms, avg 3.832000 ms, max 3.832000 ms, min 3.832000 ms Prediction time: 158.328000 ms, avg 158.328000 ms, max 158.328000 ms, min 158.328000 ms Postprocess time: 5.354000 ms, avg 5.354000 ms, max 5.354000 ms, min 5.354000 ms (intel x86 cpu + OpenVINO) $ ./run.sh resnet50_fp32_224 imagenet_224.txt test linux amd64 intel_openvino Top1 tabby, tabby cat - 0.705224 Top2 tiger cat - 0.134570 Top3 Egyptian cat - 0.121519 Top4 lynx, catamount - 0.028652 Top5 ping-pong ball - 0.001043 Preprocess time: 4.293000 ms, avg 4.293000 ms, max 4.293000 ms, min 4.293000 ms Prediction time: 16.415000 ms, avg 16.415000 ms, max 16.415000 ms, min 16.415000 ms Postprocess time: 5.891000 ms, avg 5.891000 ms, max 5.891000 ms, min 5.891000 ms
如果需要更改测试图片,可将图片拷贝到
PaddleLite-generic-demo/image_classification_demo/assets/datasets/test/inputs
目录下,同时将图片文件名添加到PaddleLite-generic-demo/image_classification_demo/assets/datasets/test/list.txt
中;如果需要重新编译示例程序,直接运行
$ ./build.sh linux amd64
更新支持 Intel OpenVINO 的 Paddle Lite 库¶
下载 Paddle Lite 源码
$ git clone https://github.com/PaddlePaddle/Paddle-Lite.git
$ cd Paddle-Lite
$ git checkout <release-version-tag>
编译并生成 PaddleLite + NNAdapter + OpenVINO Runtime 的部署库
full_publish 编译
$ ./lite/tools/build_linux.sh --arch=x86 --with_extra=ON --with_log=ON --with_exception=ON --with_nnadapter=ON --nnadapter_with_intel_openvino=ON --nnadapter_intel_openvino_sdk_root=/opt/intel/openvino_2022 full_publish
替换头文件和库
清理原有 include 目录 $ rm -rf PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/include/ 替换 include 目录 $ cp -rf build.lite.linux.x86.gcc/inference_lite_lib/cxx/include/ PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/include/ 替换 NNAdapter 运行时库 $ cp build.lite.linux.x86.gcc/inference_lite_lib/cxx/lib/libnnadapter.so PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/lib/intel_openvino/ 替换 NNAdapter device HAL 库 $ cp build.lite.linux.x86.gcc/inference_lite_lib/cxx/lib/libintel_openvino.so PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/lib/intel_openvino/ 替换 libpaddle_full_api_shared.so $ cp build.lite.linux.x86.gcc/inference_lite_lib/cxx/lib/libpaddle_full_api_shared.so PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/lib/ 替换 libpaddle_light_api_shared.so $ cp build.lite.linux.x86.gcc/inference_lite_lib/cxx/lib/libpaddle_light_api_shared.so PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/lib/
替换头文件后需要重新编译示例程序