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 版本

已支持(或部分支持)的 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
      - 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/
      
  • 替换头文件后需要重新编译示例程序