Back to Paddle Lite

华为昇腾 NPU

docs/demo_guides/huawei_ascend_npu.md

2.1247.4 KB
Original Source

华为昇腾 NPU

Paddle Lite 已支持华为昇腾 NPU( Ascend310、Ascend310P 和 Ascend910 )在 X86 和 ARM 服务器上进行预测部署。 目前支持子图接入方式,其接入原理是在线分析 Paddle 模型,将 Paddle 算子先转为统一的 NNAdapter 标准算子,再通过 Ascend NPU 组网 API 进行网络构建,在线生成并执行模型。

支持现状

已支持的芯片

  • Ascend 310 (CANN Version ≥ 3.3.0)
  • Ascend 310P (CANN Version ≥ 5.0.2.alpha005)
  • Ascend 910 (CANN Version ≥ 5.0.2.alpha005)

已支持的设备

  • Atlas 300I 推理卡(型号:3000/3010)
  • Atlas 200 DK 开发者套件
  • Atlas 800 推理服务器(型号:3000/3010)
  • Atlas 300I Pro(CANN Version ≥ 5.0.2.alpha005)
  • Atlas 300T 训练卡(CANN Version ≥ 5.0.2.alpha005)

已验证支持的版本

  • CANN 版本 ≥ 3.3.0
  • 固件与驱动版本 ≥ 1.0.9.alpha
  • 设备的版本配套关系见 Ascend 官网

已验证支持的 Paddle 模型

模型

性能(基于 CANN 3.3.0 版本测试)

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

模型Intel CPU性能 (ms)x86 + Ascend310 性能 (ms)鲲鹏 920 CPU 性能 (ms)鲲鹏920 + Ascend310 性能 (ms)
AlexNet81.164.3267.393.64
DenseNet121529.457.81157.626.23
EfficientNetB0167.5921.0885.987.14
ERNIE-TINY-12.31347.4710.72
ESRGAN41774.81103.759755.14103.06
GoogLeNet104.552.6571.242.40
HigherHRNet6760.83386.026482.55396.17
HRNet1245.5412.58752.9312.08
Inception-v3415.005.91159.403.46
Inception-v41082.009.00706.726.72
MobileNet-v133.883.0635.081.43
MobileNet-v225.673.8225.271.74
MobileNetV3_large43.538.9620.462.83
MobileNetV3_small29.386.388.662.24
ch_ppocr_mobile_v2.0_det359.1610.75129.0110.78
ch_ppocr_mobile_v2.0_rec32.398.7515.055.87
ResNet-101528.437.33401.144.27
ResNet-18136.102.8489.411.59
ResNet-50258.215.66229.042.87
ResNeXt50353.435.32261.283.10
ShuffleNetV237.935.4114.124.06
SqueezeNet-v151.123.0640.501.49
SSD-MobileNetV1(1.8)64.826.5670.406.19
SSD-MobileNetV1(2.0+)70.728.7973.168.17
SSD-VGG161999.3227.351001.0625.93
VGG161204.2310.53443.209.43
VGG191512.8211.50667.2010.23
YOLOv3-DarkNet534241.3538.462806.4234.47
YOLOv3-MobileNetV11181.5627.20941.6223.13
YOLOv3-MobileNetV31396.5727.97789.0227.06
YOLOv3-ResNet50_vd15521.8455.412444.0848.96
YOLOv47389.5477.805503.7771.78

性能(基于 CANN 5.1.RC1.alpha001 版本测试)

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

模型Intel CPU性能 (ms)x86 + Ascend310 性能 (ms)鲲鹏 920 CPU 性能 (ms)鲲鹏920 + Ascend310 性能 (ms)
DarkNet5311791.14.2608347.0083.3928
DeiT-20.48741593.2319.9074
DPN68199.3214.7786171.644.1362
GhostNet26.67125.851216.59463.7472
HRNet-W18271.7918.3446245.8337.2004
PP-LCNet3.50062.15922.8931.5552
Res2Net50652.9828.1164246.6737.0866
SE_ResNet50231.06412.3792236.1615.3052
ViT-20.46441556.6219.9086
Picodet94.61714.93889.912.083
PP-YOLO_mbv356.46078.200992.88854.5504
PP-YOLO_r50vd_dcn6487.5657.50383213.6551.7323
PP-YOLO_tiny30.102611.134648.2456.33
PP-YOLOv2_r50vd_dcn10019.383.27275727.97124.624
SSDLite-MobileNetV3_large63.92768.20555.68686.6285
SSDLite-MobileNetV3_small30.144412.098922.83347.7404
PP-TinyPose25.6858.89812.0099.394
BlazeFace217.84251.311162.82829.823
FaceBoxes503.52982.158285.39451.057
ch_ppocr_server_v2.0_det1046.4521.5561323.8318.661
ch_ppocr_server_v2.0_rec283.47955.651730.87641.489
ch_PP-OCRv2_det167.61615.24202.87313.491
ch_PP-OCRv2_rec47.57714.53348.639.43
CRNN-mv3-CTC12.1469.92110.1254.751
e2e_server_pgnetA843284.44100210715107.522003
BERT-13.545233.98213.489
ERNIE-13.249211.62112.763
ERNIE-TINY-6.02100.0795.78
Transformer--899.997665.344
DeepFM0.3971.4260.3631.394
NAML-2.6056.2012.211
NCF0.0110.7270.0310.464
Wide&Deep0.3991.4480.3231.339
BiseNetV23670.16133.8413880.19124.746
DeepLabV3+(CityScapes)52215.8671.8676647.2653.046
PP-HumanSeg-Lite44.05312.60215.50212.08
PP-HumanSeg-Server(DeepLabV3+)6569.85125.6557923.12123.139
SegFormer-82.7891440.2383.664
STDCSeg457.7521.626529.45117.376
U-Net50527.6986.40934502977.992
PP-TSN69786.5807.35253438644.648
resnet50_int8_224_per_layer---4.58
mobilenet_v1_int8_224_per_layer---2.53

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

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

参考示例演示(以社区版 CANN 5.1.RC1.alpha001 为例)

测试设备(Atlas300I 推理卡)

准备设备环境(如 ubuntu18.04-x86_64)

shell
增加可执行权限
$ chmod +x *.run

安装驱动和固件包
$ ./A300-3010-npu-driver_21.0.4_linux-x86_64.run --full
$ ./A300-3010-npu-firmware_1.80.22.2.220.run --full

重启服务器
$ reboot

查看驱动信息,确认安装成功
$ npu-smi info

准备本地编译环境

  • 为了保证编译环境一致,建议使用Docker开发环境进行配置;

  • 若想使用新版本的 CANN,请自行更新 Dockerfile 文件内的 CANN 下载路径,当前 Dockerfile 内默认为 CANN 5.1.RC1.alpha001

  • for arm64

    shell
    下载 Dockerfile
    $ wget https://paddlelite-demo.bj.bcebos.com/devices/huawei/ascend/kunpeng920_arm/Ascend_ubuntu18.04_aarch64_5.1.rc1.alpha001.Dockerfile
    
    通过 Dockerfile 生成镜像
    $ docker build --network=host -f Ascend_ubuntu18.04_aarch64_5.1.rc1.alpha001.Dockerfile -t paddlelite/ascend_aarch64:cann_5.1.1.alpha001 .
    
    创建容器
    $ docker run -itd --privileged --name=ascend-aarch64 --net=host -v $PWD:/Work -w /Work --device=/dev/davinci0 --device=/dev/davinci_manager --device=/dev/hisi_hdc --device=/dev/devmm_svm -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi  -v /usr/local/Ascend/driver/:/usr/local/Ascend/driver/ paddlelite/ascend_aarch64:cann_5.1.1.alpha001 /bin/bash
    
    进入容器
    $ docker exec -it ascend-aarch64 /bin/bash
    
    确认容器的 Ascend 环境是否创建成功
    $ npu-smi info
    
  • for amd64

    shell
    下载 Dockerfile
    $ wget https://paddlelite-demo.bj.bcebos.com/devices/huawei/ascend/intel_x86/Ascend_ubuntu18.04_x86_5.1.rc1.alpha001.Dockerfile
    
    通过 Dockerfile 生成镜像
    $ docker build --network=host -f Ascend_ubuntu18.04_x86_5.1.rc1.alpha001.Dockerfile -t paddlelite/ascend_x86:cann_5.1.1.alpha001 .
    
    创建容器
    $ docker run -itd --privileged --name=ascend-x86 --net=host -v $PWD:/Work -w /Work --device=/dev/davinci0 --device=/dev/davinci_manager --device=/dev/hisi_hdc --device=/dev/devmm_svm -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi  -v /usr/local/Ascend/driver/:/usr/local/Ascend/driver/ paddlelite/ascend_x86:cann_5.1.1.alpha001 /bin/bash
    
    进入容器
    $ docker exec -it ascend-x86 /bin/bash
    
    确认容器的 Ascend 环境是否创建成功
    $ npu-smi info
    

运行图像分类示例程序

  • 下载示例程序 PaddleLite-generic-demo.tar.gz (该 demo 的默认预编译库基于 CANN 5.1.RC1.alpha001 版本),解压后清单如下:

    shell
      - 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 库文件
                  - huawei_ascend_npu # 华为昇腾 NPU CANN 库、NNAdapter 运行时库、device HAL 库
                    - libnnadapter.so # NNAdapter 运行时库
                    - libhuawei_ascend_npu.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/

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

    shell
    运行 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: 4.342000 ms, avg 4.342000 ms, max 4.342000 ms, min 4.342000 ms
      Prediction time: 29.534000 ms, avg 29.534000 ms, max 29.534000 ms, min 29.534000 ms
      Postprocess time: 5.343000 ms, avg 5.343000 ms, max 5.343000 ms, min 5.343000 ms
    
    (intel x86 cpu + ascend npu)
    $ ./run.sh mobilenet_v1_fp32_224 imagenet_224.txt test linux amd64 huawei_ascend_npu
    
      Top1 Egyptian cat - 0.481201
      Top2 tabby, tabby cat - 0.473633
      Top3 tiger cat - 0.039490
      Top4 lynx, catamount - 0.002373
      Top5 ping-pong ball - 0.000494
      Preprocess time: 9.980000 ms, avg 9.980000 ms, max 9.980000 ms, min 9.980000 ms
      Prediction time: 1.896000 ms, avg 1.896000 ms, max 1.896000 ms, min 1.896000 ms
      Postprocess time: 12.735000 ms, avg 12.735000 ms, max 12.735000 ms, min 12.735000 ms
    
    For arm64
    (鲲鹏 920 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: 5.275000 ms, avg 5.275000 ms, max 5.275000 ms, min 5.275000 ms
      Prediction time: 34.873000 ms, avg 34.873000 ms, max 34.873000 ms, min 34.873000 ms
      Postprocess time: 4.720000 ms, avg 4.720000 ms, max 4.720000 ms, min 4.720000 ms
    
    (鲲鹏 920 cpu + ascend npu)
    $ ./run.sh mobilenet_v1_fp32_224 imagenet_224.txt test linux arm64 huawei_ascend_npu
    
      Top1 Egyptian cat - 0.481201
      Top2 tabby, tabby cat - 0.473633
      Top3 tiger cat - 0.039490
      Top4 lynx, catamount - 0.002373
      Top5 ping-pong ball - 0.000494
      Preprocess time: 5.237000 ms, avg 5.237000 ms, max 5.237000 ms, min 5.237000 ms
      Prediction time: 1.442000 ms, avg 1.442000 ms, max 1.442000 ms, min 1.442000 ms
      Postprocess time: 4.583000 ms, avg 4.583000 ms, max 4.583000 ms, min 4.583000 ms
    
  • 如果需要更改测试模型为 resnet50,可以将 run.sh 里的 MODEL_NAME 改成 resnet50_fp32_224,或执行命令:

    shell
    (intel x86 cpu + ascend npu)
    $ ./run.sh resnet50_fp32_224 imagenet_224.txt test linux amd64 huawei_ascend_npu
    (鲲鹏 920 cpu + ascend npu)
    $ ./run.sh resnet50_fp32_224 imagenet_224.txt test linux arm64 huawei_ascend_npu
    
  • 如果需要更改测试图片,可将图片拷贝到 PaddleLite-generic-demo/image_classification_demo/assets/datasets/test/inputs 目录下,同时将图片文件名添加到 PaddleLite-generic-demo/image_classification_demo/assets/datasets/test/list.txt 中;

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

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

更新支持华为昇腾 NPU 的 Paddle Lite 库

  • 下载 Paddle Lite 源码

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

    • For amd64

      • full_publish 编译

        shell
        $ ./lite/tools/build_linux.sh --arch=x86 --with_extra=ON --with_log=ON --with_exception=ON --with_nnadapter=ON --nnadapter_with_huawei_ascend_npu=ON --nnadapter_huawei_ascend_npu_sdk_root=/usr/local/Ascend/ascend-toolkit/latest full_publish
        
      • 替换头文件和库

        shell
        清理原有 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/huawei_ascend_npu/
        
        替换 NNAdapter device HAL 库
        $ cp build.lite.linux.x86.gcc/inference_lite_lib/cxx/lib/libhuawei_ascend_npu.so PaddleLite-generic-demo/libs/PaddleLite/linux/amd64/lib/huawei_ascend_npu/
        
        替换 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 编译

        shell
        $ ./lite/tools/build_linux.sh --arch=armv8 --toolchain=gcc --with_extra=ON --with_log=ON --with_exception=ON --with_nnadapter=ON --nnadapter_with_huawei_ascend_npu=ON --nnadapter_huawei_ascend_npu_sdk_root=/usr/local/Ascend/ascend-toolkit/latest full_publish
        
      • 替换头文件和库

        shell
        清理原有 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/huawei_ascend_npu/
        
        替换 NNAdapter device HAL 库
        $ cp build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8.nnadapter/cxx/lib/libhuawei_ascend_npu.so PaddleLite-generic-demo/libs/PaddleLite/linux/arm64/lib/huawei_ascend_npu/
        
        替换 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/
        
  • 替换头文件后需要重新编译示例程序

高级特性

  • Dynamic Shape

    某些模型(例如:CV 类的PPOCR、NLP 类的BERT、ERNIE等模型)能够支持不同的输入尺寸,因此,为了避免每次推理时因输入尺寸变化而导致的模型重新生成的问题,在推理前需要使用 set_nnadapter_dynamic_info 接口设置额外的 dynamic shape 信息。

    目前昇腾NPU支持 Dynamic Shape 特性,根据 CANN 版本的不同,提供下列两种方式的设置。

    • 通过档位方式支持 Dynamic Shape(CANN Version ≥ 3.3.0)

      CANN 早期版本实现的不是真正意义上的动态 shape,而是基于档位方式提供有限的模型输入 shape 范围。

      使用方式: 假设模型有三个输入,输入名分别为 x1、x2 和 x3(模型实际输入名需用 Netron 可视化模型后查看),模型想在 64,128,192,224 四个档位下推理。

      c++
      // Run inference by using light api with MobileConfig
      paddle::lite_api::MobileConfig mobile_config;
      // dynamic info
      std::map<std::string, std::vector<std::vector<int64_t>>> dynamic_shape_info;
      dynamic_shape_info["x1"] = {{1,64,4096},{1,128,4096},{1,192,4096},{1,224,4096}};
      dynamic_shape_info["x2"] = {{1,64,4096},{1,128,4096},{1,192,4096},{1,224,4096}};
      dynamic_shape_info["x3"] = {{1,64,64},{1,128,128},{1,192,192},{1,224,224}};
      mobile_config.set_nnadapter_dynamic_shape_info(dynamic_shape_info);
      
    • 通过 Shape Range 方式支持 Dynamic Shape(CANN Version ≥ 5.1.1.RC1)(试用特性)

      在最新的 CANN 版本,昇腾提供了 Shape Range 特性,实现了更广泛意义上的动态 shape。但该特性还未成熟,调通的模型有限,开发者若有兴趣可自行尝试。

      使用方式一: 假设模型有两个输入,输入名分别为 x1 和 x2 ,设置模型输入 shape 范围时,注意第一列为 shape 最小值,第二列为 shape 最大值,需在nnadapter_context_properties里设置HUAWEI_ASCEND_NPU_ENABLE_DYNAMIC_SHAPE_RANGE =true 开启 shape range 特性。

      下例表示 x1 输入的最后一个维度在[100,150]的范围变化,x2 输入的最后一个维度在[25,50]的范围变化。

      c++
      // Run inference by using light api with MobileConfig
      paddle::lite_api::MobileConfig mobile_config;
      // dynamic info
      std::map<std::string, std::vector<std::vector<int64_t>>> dynamic_shape_info;
      std::string nnadapter_context_properties = "HUAWEI_ASCEND_NPU_ENABLE_DYNAMIC_SHAPE_RANGE=true"
      dynamic_shape_info["x1"] = {{1,3,32,100},{1,3,32,150}};
      dynamic_shape_info["x2"] = {{1,3,25},{1,3,50}};
      mobile_config.set_nnadapter_dynamic_shape_info(dynamic_shape_info);
      mobile_config.set_nnadapter_context_properties(nnadapter_context_properties);
      

      使用方式二: 假设模型有两个输入,输入名分别为 x1 和 x2 ,设置输入 shape 范围时,如果用户不想指定维度的取值,则可以将其设置为-1,表示此维度可以使用>=1的任意取值,需设置nnadapter_context_properties,开启DYNAMIC_SHAPE_RANGE特性。

      c++
      // Run inference by using light api with MobileConfig
      paddle::lite_api::MobileConfig mobile_config;
      // dynamic info
      std::map<std::string, std::vector<std::vector<int64_t>>> dynamic_shape_info;
      std::string nnadapter_context_properties = "HUAWEI_ASCEND_NPU_ENABLE_DYNAMIC_SHAPE_RANGE=true"
      dynamic_shape_info["x1"] = {{1,3,32,-1}};
      dynamic_shape_info["x2"] = {{1,3,-1}};
      mobile_config.set_nnadapter_dynamic_shape_info(dynamic_shape_info);
      mobile_config.set_nnadapter_context_properties(nnadapter_context_properties);
      
  • 混合精度

    支持量化模型的推理,要求模型必须是由 PaddleSlim 产出的量化模型,例如:resnet50_int8_per_layermobilenet_v1_int8_224_per_layer模型。

    使用方式:

    c++
    // Run inference by using full api with CxxConfig
    paddle::lite_api::CxxConfig cxx_config;
    std::string nnadapter_mixed_precision_quantization_config_path{"nnadapter_mixed_precision_quantization_config_path.txt"};
    // nnadapter_mixed_precision
    cxx_config.set_nnadapter_mixed_precision_quantization_config_path(nnadapter_mixed_precision_quantization_config_path);
    

    nnadapter_mixed_precision_quantization_config_path.txt: 该文件表示在全量化模型里,昇腾硬件无法支持量化的算子。

    目前昇腾硬件运行全量化模型时,除 conv2d 和 fc 算子可运行在 INT8 精度下外,其余算子均需运行在 FP16 或 FP32 精度上。

    shell
    softmax
    pool2d
    elementwise_add
    relu
    
  • 高级参数

    • HUAWEI_ASCEND_NPU_SELECTED_DEVICE_IDS:

      指定昇腾设备的 ID号,例如HUAWEI_ASCEND_NPU_SELECTED_DEVICE_IDS=0,1,2,3或HUAWEI_ASCEND_NPU_SELECTED_DEVICE_IDS=0。设备 ID 是指当前机器中可用的昇腾芯片 ID,例如 1 块 Atlas 300I 卡包含 4 颗 Ascend310 芯片,因此,可以将 HUAWEI_ASCEND_NPU_SELECTED_DEVICE_IDS 设置为 0~3,而 1 块 Atlas 300I pro 卡只有一颗 Ascend 310P 芯片,因此只能设置为 0。

    • HUAWEI_ASCEND_NPU_PROFILING_FILE_PATH

      开启 Profiling 功能,指定保存 Profiling 结果的路径。

    • HUAWEI_ASCEND_NPU_DUMP_MODEL_FILE_PATH

      开启保存昇腾 om 模型功能,指定存放 om 模型的路径。

    • HUAWEI_ASCEND_NPU_PRECISION_MODE

      设置网络模型的精度模式,详见参数配置

    • HUAWEI_ASCEND_NPU_MODIFY_MIXLIST_FILE_PATH

      当取值为HUAWEI_ASCEND_NPU_PRECISION_MODE=allow_mix_precision时,如果用户想要在内置优化策略基础上进行调整,自行指定哪些算子允许降精度,哪些算子不允许降精度,则需要指定HUAWEI_ASCEND_NPU_MODIFY_MIXLIST_FILE_PATH参数设置文件路径,详见参数配置

    • HUAWEI_ASCEND_NPU_OP_SELECT_IMPL_MODE

      设置网络模型中算子是高精度实现模式还是高性能实现模式,详见参数配置

    • HUAWEI_ASCEND_NPU_OPTYPELIST_FOR_IMPLMODE

      设置optype列表中算子的实现方式,该参数当前仅支持设置某个具体算子的实现方式,不支持设置多个算子,详见参数配置

    • HUAWEI_ASCEND_NPU_ENABLE_COMPRESS_WEIGHT

      使能全局weight压缩,AICore支持Weight压缩功能,模型转换时通过使能该参数,可以对Weight进行数据压缩,在进行算子计算时,对Weight进行解压缩,从而达到减少带宽、提高性能的目的。

    • HUAWEI_ASCEND_NPU_AUTO_TUNE_MODE

      设置算子的自动调优模式:控制TBE算子编译时,是否对算子进行调优,以便在昇腾AI处理器上寻找最好的性能配置,详见参数配置

    • HUAWEI_ASCEND_NPU_ENABLE_DYNAMIC_SHAPE_RANGE

      使能开启 Dynamic Shape Range 功能。

    • HUAWEI_ASCEND_NPU_INITIAL_BUFFER_LENGTH_OF_DYNAMIC_SHAPE_RANGE

      当开启 Dynamic Shape Range 后,指定输入输出所分配的内存大小。若不指定则采用默认值4 * 3 * 1024 * 1024 bytes。

    使用方式:

    c++
    // Run inference by using light api with MobileConfig
    paddle::lite_api::MobileConfig mobile_config;
    // nnadapter_context_properties, 多个参数之间使用;进行分割
    std::string nnadapter_context_properties = "HUAWEI_ASCEND_NPU_SELECTED_DEVICE_IDS=0;HUAWEI_ASCEND_NPU_OP_SELECT_IMPL_MODE=high_precision;HUAWEI_ASCEND_NPU_OPTYPELIST_FOR_IMPLMODE=LayerNorm;HUAWEI_ASCEND_NPU_ENABLE_COMPRESS_WEIGHT=true;"
    mobile_config.set_nnadapter_context_properties(nnadapter_context_properties);
    

其他说明

  • 华为达芬奇架构的 NPU 内部大量采用 float16 进行运算,因此,预测结果会存在偏差,但大部分情况下精度不会有较大损失。