昆仑芯 XTCL

Paddle Lite 已支持昆仑芯系列芯片及板卡 在 X86 和 ARM 服务器上进行预测部署。 目前支持子图接入方式,其接入原理是在线分析 Paddle 模型,将 Paddle 算子先转为统一的 NNAdapter 标准算子,再通过 XTCL 组网 API 进行网络构建,在线生成并执行模型。

XPU Tensor Compilation Library (XTCL),即昆仑芯针对机器学习领域实践而提供的图编译引擎库,可提供基于昆仑芯硬件相关的图层分析框架和加速优化能力。

支持现状

已支持的芯片

  • 昆仑芯1代 AI 芯片 CK10 / CK20

  • 昆仑芯2代 AI 芯片 CR20

已支持的 AI 加速卡

  • 昆仑芯 AI 加速卡 K100 / K200

  • 昆仑芯 AI 加速卡 R200

已验证支持的 Paddle 模型

性能

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

模型 Intel CPU 性能 (ms) x86 + R200 性能 (ms)
AlexNet 37.777400 0.689400
DenseNet121 76.767599 4.015600
EfficientNetB0 96.174400 1.564200
GoogLeNet 46.062800 1.464400
Inception-v3 77.464400 2.183400
Inception-v4 151.721399 3.128800
MobileNet-v1 23.442400 0.500800
MobileNet-v2 19.889200 1.411200
ResNet-18 47.691199 0.429400
ResNet-50 108.112999 0.815200
ResNet-101 200.134998 1.392200
ResNeXt50 110.684799 1.648600
SqueezeNet-v1 33.140800 0.902400
VGG16 491.237994 1.542200
VGG19 613.287396 1.675200
DPN68 88.027000 2.805000
DarkNet53 11197.110547 1.139400
GhostNet 19.538400 5.726200
Res2Net50 371.824005 2.664400
SE_ResNet50 140.231198 1.521600
ch_PP-OCRv2_det 111.911003 3.690000
ch_PP-OCRv2_rec 40.988998 5.419000
ch_ppocr_server_v2.0_det 987.729980 6.303000
ch_ppocr_server_v2.0_rec 370.881012 16.434999
CRNN-mv3-CTC 13.041000 4.146000
FaceBoxes 336.138000 43.075001
NCF 0.010000 0.147000
PP-TSN 29140.355469 90.681000
SSD-MobileNetV1(1.8) 33.758300 2.078400
YOLOv3-DarkNet53 1828.807058 18.015895
YOLOv3-MobileNetV1 541.669899 9.348368
YOLOv4 6887.933979 25.008631

已支持(或部分支持)的 Paddle 算子

您可以查阅 NNAdapter 算子支持列表获得各算子在不同新硬件上的最新支持信息。

参考示例演示

测试设备(昆仑芯 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 库
                  - kunlunxin_xtcl # 昆仑芯 XTCL 库、NNAdapter 运行时库、device HAL 库
                    - libnnadapter.so # NNAdapter 运行时库
                    - libkunlunxin_xtcl.so # NNAdapter device HAL 库
                    - libxtcl.so # 昆仑芯 XTCL 库
                    ...
                  - 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/

  • 执行以下命令比较 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
    
      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
      Preprocess time: 3.133000 ms, avg 3.133000 ms, max 3.133000 ms, min 3.133000 ms
      Prediction time: 12.594000 ms, avg 12.594000 ms, max 12.594000 ms, min 12.594000 ms
      Postprocess time: 4.235000 ms, avg 4.235000 ms, max 4.235000 ms, min 4.235000 ms
    
    (intel x86 cpu + kunlunxin xtcl)
    $ ./run.sh mobilenet_v1_fp32_224 imagenet_224.txt test linux amd64 kunlunxin_xtcl
    
      Top1 Egyptian cat - 0.482607
      Top2 tabby, tabby cat - 0.471841
      Top3 tiger cat - 0.039819
      Top4 lynx, catamount - 0.002419
      Top5 ping-pong ball - 0.000505
      Preprocess time: 2.653000 ms, avg 2.653000 ms, max 2.653000 ms, min 2.653000 ms
      Prediction time: 0.524000 ms, avg 0.524000 ms, max 0.524000 ms, min 0.524000 ms
      Postprocess time: 4.077000 ms, avg 4.077000 ms, max 4.077000 ms, min 4.077000 ms
    
     For arm64
    (arm cpu only)
    $ ./run.sh mobilenet_v1_fp32_224 imagenet_224.txt test linux arm64
    
      Top1 Egyptian cat - 0.482871
      Top2 tabby, tabby cat - 0.471594
      Top3 tiger cat - 0.039779
      Top4 lynx, catamount - 0.002430
      Top5 ping-pong ball - 0.000508
      Preprocess time: 8.123000 ms, avg 8.123000 ms, max 8.123000 ms, min 8.123000 ms
      Prediction time: 78.482000 ms, avg 78.482000 ms, max 78.482000 ms, min 78.482000 ms
      Postprocess time: 8.023000 ms, avg 8.023000 ms, max 8.023000 ms, min 8.023000 ms
    
    (arm cpu + kunlunxin xtcl)
    $ ./run.sh mobilenet_v1_fp32_224 imagenet_224.txt test linux arm64 kunlunxin_xtcl
    
      Top1 Egyptian cat - 0.482583
      Top2 tabby, tabby cat - 0.471810
      Top3 tiger cat - 0.039866
      Top4 lynx, catamount - 0.002433
      Top5 ping-pong ball - 0.000506
      Preprocess time: 8.135000 ms, avg 8.135000 ms, max 8.135000 ms, min 8.135000 ms
      Prediction time: 3.223000 ms, avg 3.223000 ms, max 3.223000 ms, min 3.223000 ms
      Postprocess time: 8.605000 ms, avg 8.605000 ms, max 8.605000 ms, min 8.605000 ms
    
  • 如果需要更改测试模型为 resnet50,可以将 run.sh 里的 MODEL_NAME 改成 resnet50_fp32_224,或执行命令:

    (intel x86 cpu + kunlunxin xtcl)
    $ ./run.sh resnet50_fp32_224 imagenet_224.txt test linux amd64 kunlunxin_xtcl
    
    (arm cpu + kunlunxin xtcl)
    $ ./run.sh resnet50_fp32_224 imagenet_224.txt test linux arm64 kunlunxin_xtcl
    
  • 如果需要更改测试图片,可将图片拷贝到 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
    

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

  • 下载 Paddle Lite 源码

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

    • For amd64

      • full_publish 编译

      默认自动从云上下载 kunlunxin_xtcl_sdk,如需指定,请使用参数--nnadapter_kunlunxin_xtcl_sdk_root
      $ ./lite/tools/build_linux.sh --arch=x86 --with_extra=ON --with_log=ON --with_exception=ON --with_nnadapter=ON --nnadapter_with_kunlunxin_xtcl=ON 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/kunlunxin_xtcl/
      
      替换 NNAdapter device HAL 库
      $ cp build.lite.linux.x86.gcc/inference_lite_lib/cxx/lib/libkunlunxin_xtcl.so PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/lib/kunlunxin_xtcl/
      
      替换 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/
      
    • For arm64

      • full_publish 编译

      arm 环境下需要设置环境变量 CC 和 CXX,分别指定 C 编译器和 C++ 编译器的路径
      默认自动从云上下载 kunlunxin_xtcl_sdk,如需指定,请使用参数--nnadapter_kunlunxin_xtcl_sdk_root
      $ export CC=<path_to_your_c_compiler>
      $ export CXX=<path_to_your_c++_compiler>
      $ ./lite/tools/build_linux.sh --arch=armv8 --with_extra=ON --with_log=ON --with_exception=ON --with_nnadapter=ON --nnadapter_with_kunlunxin_xtcl=ON full_publish
      
      • 替换头文件和库

      清理原有 include 目录
      $ rm -rf PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/include/
      
      替换 include 目录
      $ cp -rf build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/include/ PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/include/
      
      替换 NNAdapter 运行时库
      $ cp build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libnnadapter.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/kunlunxin_xtcl/
      
      替换 NNAdapter device HAL 库
      $ cp build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libkunlunxin_xtcl.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/kunlunxin_xtcl/
      
      替换 libpaddle_full_api_shared.so
      $ cp build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libpaddle_full_api_shared.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/
      
      替换 libpaddle_light_api_shared.so
      $ cp build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libpaddle_light_api_shared.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/
      

高级特性

本节主要说明在不同的昆仑芯AI加速卡上如何设置不同的参数。以下列出了 Paddle Lite 下支持的两种高级参数。

  • 高级参数

    • KUNLUNXIN_XTCL_SELECTED_DEVICE_IDS

      指定昆仑芯产品的 ID 号。例如 KUNLUNXIN_XTCL_SELECTED_DEVICE_IDS=0 或 KUNLUNXIN_XTCL_SELECTED_DEVICE_IDS=0,1,2,3

    • KUNLUNXIN_XTCL_DEVICE_TARGET

      指定昆仑芯的不同类型的 AI 加速卡。例如 KUNLUNXIN_XTCL_DEVICE_TARGET=xpu -libs=xdnn -device-type=xpu1 或者 KUNLUNXIN_XTCL_DEVICE_TARGET=xpu -libs=xdnn -device-type=xpu2。XPU 代指昆仑芯自主研发的芯片硬件架构,XPU1 用在昆仑芯 1 代系列产品,包括 K100 和 K200;XPU2 用在昆仑芯 2 代系列产品,包括 R200 等。

  • 使用方式

    • c++ 代码示例

    // Run inference by using light api with MobileConfig
    paddle::lite_api::MobileConfig mobile_config;
    // nnadapter_context_properties, 多个参数之间使用;进行分割
    std::string nnadapter_context_properties = "KUNLUNXIN_XTCL_SELECTED_DEVICE_IDS=0;KUNLUNXIN_XTCL_DEVICE_TARGET=xpu -libs=xdnn -device-type=xpu1"
    mobile_config.set_nnadapter_context_properties(nnadapter_context_properties);
    
    • shell 脚本示例

    export KUNLUNXIN_XTCL_SELECTED_DEVICE_IDS=0
    export KUNLUNXIN_XTCL_DEVICE_TARGET="xpu -libs=xdnn -device-type=xpu1"
    

其他说明

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