昆仑芯 XPU

Paddle Lite 已支持昆仑芯 XPU 在 x86 和 Arm 服务器(例如飞腾 FT-2000+/64)上进行预测部署, 支持 Kernel 接入方式。

支持现状

已支持的芯片

  • 昆仑 818-100(推理芯片)

  • 昆仑 818-300(训练芯片)

已支持的设备

  • K100/K200 昆仑 AI 加速卡

  • R200 昆仑芯 AI 加速卡

已验证支持的 Paddle 模型

性能

性能仅供参考,以实际运行效果为准。

模型 x86 + R200 性能 (ms) arm64 + R200 性能 (ms)
AlexNet 0.5762 1.27252
DarkNet53 1.04676 3.15686
DenseNet121 3.4908 10.35096
DPN68 2.5757 8.11432
EfficientNetB0 1.51762 4.92276
GhostNet 2.21846 7.01912
GoogLeNet 1.25748 4.20796
Inception-v3 1.86128 5.69168
Inception-v4 2.84598 8.1627
MobileNet-v1 0.48536 1.72218
MobileNet-v2 0.71952 2.5511
Res2Net50 2.4858 7.46974
ResNet-101 1.55288 3.48088
ResNet-18 0.41304 1.35338
ResNet-50 0.90894 2.27986
ResNeXt50 1.0345 2.47522
SE_ResNet50 1.44298 5.42808
SqueezeNet-v1 0.5519 1.97804
VGG16 1.4011 1.94392
VGG19 1.51684 2.02728
ch_PP-OCRv2_det 2.563 12.648
ch_PP-OCRv2_rec 2.851 7.069
ch_ppocr_server_v2.0_det 4.21 12.643
ch_ppocr_server_v2.0_rec 23.843 25.78
CRNN-mv3-CTC 1.606 5.363
NCF 0.125 0.493
PP-TSN 145.632 179.704
YOLOv3-DarkNet53 7.1474 18.8239
YOLOv3-MobileNetV1 5.0864 18.2639

已支持(或部分支持)的 Paddle 算子( Kernel 接入方式)

参考示例演示

测试设备(昆仑芯 AI 加速卡 R200)

kunlunxin_xtcl

准备设备环境

  • 昆仑芯 AI 加速卡 R200 产品手册

  • R200 为全高全长 PCI-E 卡,要求使用 PCIe4.0 x16 插槽,且需要单独的 8 针供电线进行供电;

  • 安装 R200 XRE 驱动,目前支持 Ubuntu 和 CentOS 系统,由于驱动依赖 Linux kernel 版本,请正确安装对应版本的驱动安装包。

准备本地编译环境

运行图像分类示例程序

  • 下载示例程序 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 库
                  - xpu # 昆仑芯 XPU API 库、XPU runtime 库
                    - libxpuapi.so # XPU API 库,提供设备管理和算子实现。
                    - libxpurt.so # XPU runtime 库
                    ...
                    - libpaddle_full_api_shared.so # 预编译 Paddle Lite full api 库
                    - libpaddle_light_api_shared.so # 预编译 Paddle Lite light api 库
              - arm64
                - include
                - lib
                  - xpu
          - OpenCV # OpenCV 预编译库
        - object_detection_demo # 目标检测示例程序
    
  • 进入 PaddleLite-generic-demo/image_classification_demo/shell/

  • 执行以下命令观察 mobilenet_v1_fp32_224 模型的性能和结果;

    运行 mobilenet_v1_fp32_224 模型
    
    For amd64
    (intel x86 cpu only)
    本地执行
    $ ./run.sh mobilenet_v1_fp32_224 imagenet_224.txt test linux amd64 cpu
    通过 SSH 远程执行
    $ ./run_with_ssh.sh mobilenet_v1_fp32_224 imagenet_224.txt test linux amd64 cpu <IP地址> 22 <用户名> <密码>
    
      Top1 Egyptian cat - 0.482870
      Top2 tabby, tabby cat - 0.471594
      Top3 tiger cat - 0.039779
      Top4 lynx, catamount - 0.002430
      Top5 ping-pong ball - 0.000508
      [0] Preprocess time: 4.173000 ms Prediction time: 29.930000 ms Postprocess time: 5.028000 ms
      Preprocess time: avg 4.173000 ms, max 4.173000 ms, min 4.173000 ms
      Prediction time: avg 29.930000 ms, max 29.930000 ms, min 29.930000 ms
      Postprocess time: avg 5.028000 ms, max 5.028000 ms, min 5.028000 ms
    
    (intel x86 cpu + xpu)
    本地执行
    $ ./run.sh mobilenet_v1_fp32_224 imagenet_224.txt test linux amd64 xpu
    通过 SSH 远程执行
    $ ./run_with_ssh.sh mobilenet_v1_fp32_224 imagenet_224.txt test linux amd64 xpu <IP地址> 22 <用户名> <密码>
    
      Top1 Egyptian cat - 0.471169
      Top2 tabby, tabby cat - 0.445745
      Top3 tiger cat - 0.070651
      Top4 lynx, catamount - 0.008626
      Top5 cougar, puma, catamount, mountain lion, painter, panther, Felis concolor - 0.000590
      [0] Preprocess time: 54.025000 ms Prediction time: 2.832000 ms Postprocess time: 32.408000 ms
      Preprocess time: avg 54.025000 ms, max 54.025000 ms, min 54.025000 ms
      Prediction time: avg 2.832000 ms, max 2.832000 ms, min 2.832000 ms
      Postprocess time: avg 32.408000 ms, max 32.408000 ms, min 32.408000 ms
    
    For arm64
    (arm cpu only)
    本地执行
    $ ./run.sh mobilenet_v1_fp32_224 imagenet_224.txt test linux arm64 cpu
    通过 SSH 远程执行
    $ ./run_with_ssh.sh mobilenet_v1_fp32_224 imagenet_224.txt test linux arm64 cpu <IP地址> 22 <用户名> <密码>
    
      Top1 Egyptian cat - 0.503239
      Top2 tabby, tabby cat - 0.419854
      Top3 tiger cat - 0.065506
      Top4 lynx, catamount - 0.007992
      Top5 cougar, puma, catamount, mountain lion, painter, panther, Felis concolor - 0.000494
      [0] Preprocess time: 10.734000 ms Prediction time: 65.614000 ms Postprocess time: 8.718000 ms
      Preprocess time: avg 10.734000 ms, max 10.734000 ms, min 10.734000 ms
      Prediction time: avg 65.614000 ms, max 65.614000 ms, min 65.614000 ms
      Postprocess time: avg 8.718000 ms, max 8.718000 ms, min 8.718000 ms
    
    (arm cpu + xpu)
    本地执行
    $ ./run.sh mobilenet_v1_fp32_224 imagenet_224.txt test linux arm64 xpu
    通过 SSH 远程执行
    $ ./run_with_ssh.sh mobilenet_v1_fp32_224 imagenet_224.txt test linux arm64 xpu <IP地址> 22 <用户名> <密码>
    
      Top1 Egyptian cat - 0.471169
      Top2 tabby, tabby cat - 0.445745
      Top3 tiger cat - 0.070651
      Top4 lynx, catamount - 0.008626
      Top5 cougar, puma, catamount, mountain lion, painter, panther, Felis concolor - 0.000590
      [0] Preprocess time: 9.742000 ms Prediction time: 4.063000 ms Postprocess time: 8.097000 ms
      Preprocess time: avg 9.742000 ms, max 9.742000 ms, min 9.742000 ms
      Prediction time: avg 4.063000 ms, max 4.063000 ms, min 4.063000 ms
      Postprocess time: avg 8.097000 ms, max 8.097000 ms, min 8.097000 ms
    
  • 如果需要更改测试模型为 resnet50 ,执行命令修改为如下:

    For amd64
    (intel x86 cpu only)
    本地执行
    $ ./run.sh resnet50_fp32_224 imagenet_224.txt test linux amd64 cpu
    通过 SSH 远程执行
    $ ./run_with_ssh.sh resnet50_fp32_224 imagenet_224.txt test linux amd64 cpu <IP地址> 22 <用户名> <密码>
    
    (intel x86 cpu + xpu)
    本地执行
    $ ./run.sh resnet50_fp32_224 imagenet_224.txt test linux amd64 xpu
    通过 SSH 远程执行
    $ ./run_with_ssh.sh resnet50_fp32_224 imagenet_224.txt test linux amd64 xpu <IP地址> 22 <用户名> <密码>
    
    For arm64
    (arm cpu only)
    本地执行
    $ ./run.sh resnet50_fp32_224 imagenet_224.txt test linux arm64 cpu
    通过 SSH 远程执行
    $ ./run_with_ssh.sh resnet50_fp32_224 imagenet_224.txt test linux arm64 cpu <IP地址> 22 <用户名> <密码>
    
    (arm cpu + xpu)
    本地执行
    $ ./run.sh resnet50_fp32_224 imagenet_224.txt test linux arm64 xpu
    通过 SSH 远程执行
    $ ./run_with_ssh.sh resnet50_fp32_224 imagenet_224.txt test linux arm64 xpu <IP地址> 22 <用户名> <密码>
    
  • 如果需要更改测试图片,可将图片拷贝到 PaddleLite-generic-demo/image_classification_demo/assets/datasets/test/inputs 目录下,同时将图片文件名添加到 PaddleLite-generic-demo/image_classification_demo/assets/datasets/test/list.txt 中;

  • 如果需要重新编译示例程序,直接运行

    For amd64
    $ ./build.sh linux amd64
    
    For arm64
    $ ./build.sh linux arm64
    

更新支持昆仑芯 XPU 的 Paddle Lite 库

  • 下载 Paddle Lite 源码

    $ git clone https://github.com/PaddlePaddle/Paddle-Lite.git
    $ cd Paddle-Lite
    $ git checkout <release-version-tag>
    
  • 编译并生成 amd64 和 arm64 的部署库

    • For amd64 (如果报找不到 cxx11:: 符号的编译错误,请将 gcc 切换到 4.8 版本。)

      • 编译

      $ ./lite/tools/build_linux.sh --arch=x86 --with_kunlunxin_xpu=ON
      
      • 替换头文件和库

      替换 include 目录
      $ cp -rf build.lite.linux.x86.gcc.kunlunxin_xpu/inference_lite_lib/cxx/include/ PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/include/
      
      替换 XPU API 库
      $ cp build.lite.linux.x86.gcc.kunlunxin_xpu/inference_lite_lib/cxx/lib/libxpuapi.so PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/lib/xpu/
      
      替换 XPU runtime 库
      $ cp build.lite.linux.x86.gcc.kunlunxin_xpu/inference_lite_lib/cxx/lib/libxpurt.so* PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/lib/xpu/
      
      替换 libpaddle_light_api_shared.so
      $ cp build.lite.linux.x86.gcc.kunlunxin_xpu/inference_lite_lib/cxx/lib/libpaddle_light_api_shared.so PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/lib/xpu/
      
      替换 libpaddle_full_api_shared.so(仅在 full_publish 编译方式下)
      $ cp build.lite.linux.x86.gcc.kunlunxin_xpu/inference_lite_lib/cxx/lib/libpaddle_full_api_shared.so PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/lib/xpu/
      
    • For arm64 (arm 环境下需要设置环境变量 CC 和 CXX,分别指定 C 编译器和 C++ 编译器的路径。)

      • 编译

      $ export CC=<path_to_your_c_compiler>
      $ export CXX=<path_to_your_c++_compiler>
      $ ./lite/tools/build_linux.sh --arch=armv8 --with_kunlunxin_xpu=ON
      
      • 替换头文件和库

      替换 include 目录
      $ cp -rf build.lite.linux.armv8.gcc.kunlunxin_xpu/inference_lite_lib.armlinux.armv8.xpu/cxx/include/ PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/include/
      
      替换 XPU API 库
      $ cp build.lite.linux.armv8.gcc.kunlunxin_xpu/inference_lite_lib.armlinux.armv8.xpu/cxx/lib/libxpuapi.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/xpu/
      
      替换 XPU runtime 库
      $ cp build.lite.linux.armv8.gcc.kunlunxin_xpu/inference_lite_lib.armlinux.armv8.xpu/cxx/lib/libxpurt.so* PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/xpu/
      
      替换 libpaddle_light_api_shared.so
      $ cp build.lite.linux.armv8.gcc.kunlunxin_xpu/inference_lite_lib.armlinux.armv8.xpu/cxx/lib/libpaddle_light_api_shared.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/xpu/
      
      替换 libpaddle_full_api_shared.so(仅在 full_publish 编译方式下)
      $ cp build.lite.linux.armv8.gcc.kunlunxin_xpu/inference_lite_lib.armlinux.armv8.xpu/cxx/lib/libpaddle_full_api_shared.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/xpu/
      
  • 替换头文件后需要重新编译示例程序

高级特性

  • windows 版本的编译适配

    • Paddle Lite 使用 XPU kernel 的方案

    $ cd Paddle-Lite
    $ lite\\tools\\build_windows.bat with_extra without_python use_vs2017 with_dynamic_crt  with_kunlunxin_xpu kunlunxin_xpu_sdk_root D:\\xpu_toolchain_windows\\output
    

    编译脚本 build_windows.bat 使用可参考Windows 环境下编译适用于 Windows 的库进行环境配置和查找相应编译参数

其他说明

  • 如需更进一步的了解相关产品的信息,请联系欧阳剑 ouyangjian@baidu.com;

  • 昆仑芯的研发同学正在持续适配更多的 Paddle 算子,以便支持更多的 Paddle 模型。