\u200E
洞见 AI 硬件,部署“桨”坛 | 昇腾310多方案部署,Paddle Lite在Atlas 200 DK部署实战
发布日期:2021-10-29T11:59:00.000+0000 浏览量:2436次


随着AI应用领域的持续拓展以及应用场景的不断细化,衍生出了非常多且复杂的AI芯片及硬件产品线,同一任务同一场景下的硬件选择也变得更为丰富。但对于深度学习开发者而言,众多的硬件产品形态无疑也引入了更多的兼容性问题和不确定性因素,增加了算法研发和落地部署阶段的开发难度。


面对这样多元化的芯片和硬件市场,飞桨在支持多硬件的统一平台这一路线的探索上也一直走在行业前列。如今基于飞桨训练和推理部署框架,已完成多款芯片的适配,并在相应硬件上完成了多场景多模型下的验证工作。


从本期开始,飞桨将联合社区开发者推出洞见AI硬件 | 部署"桨"坛系列专栏,分享多款厂商硬件部署教程,帮助开发者们实现模型训练与推理的一体化开发和多硬件设备间的无缝切换。


接下来,请大家一起开启洞见 AI硬件 | 部署"桨"坛系列的第一期,本期将介绍飞桨针对昇腾310及相关硬件的部署方案。


昇腾310是一款采用华为自研的达芬奇架构的,面向边缘场景的高能效高集成度AI处理器。基于典型配置,八位整数精度(INT8)下的性能达到22TOPS,16位浮点数(FP16)下的性能达到11 TFLOPS,而其功耗仅为8W。


昇腾310在华为多款硬件设备中均有集成:

  • Atlas 200 AI / Atlas 200 DK:可以在端侧实现图像识别、图像分类等,广泛用于智能摄像机、机器人、无人机等端侧AI场景。

  • Atlas 300I 推理卡(型号:3000/3010):单卡算力88 TOPS INT8,支持80路高清视频实时分析,适用于智慧城市、智慧交通、智慧金融等场景。

  • Atlas 500智能小站(型号:3000):面向边缘应用的产品,满足在安防、交通、社区、园区、商场、超市等复杂环境区域的应用需求。






本教程将介绍如何将飞桨训练出的深度学习模型,通过飞桨轻量化推理引擎Paddle Lite部署到华为Atlas 200 DK上。开发者可参考下文中的详细步骤进行体验。


软件版本信息、适配原理及支持的模型




1.软件版本说明


  • 驱动和固件版本:Atlas 200 DK开发者套件(1.0.9.alpha)
  • 使用CANN版本:3.3.0
  • CANN下载链接: https://www.hiascend.com/software/cann/community-history
  • CANN版本套件版本对应关系: https://gitee.com/ascend/tools/blob/master/makesd/Version_Mapping_CN.md




2.适配原理


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


NNAdapter官方介绍:

https://paddle-lite.readthedocs.io/zh/release-v2.10_a/develop_guides/nnadapter.html




3.目前支持的开源模型


目前华为Atlas 200 DK支持的开源模型列表详见以下链接(“支持平台”中的ARM和HuaweiAscendNPU):

https://paddle-lite.readthedocs.io/zh/release-v2.10_a/quick_start/support_model_list.html




部署步骤






硬件环境准备


搭建华为Atlas 200 DK运行环境和开发环境的详细步骤请参见华为官方教程,链接请见下方。按照环境部署教程,安装步骤执行到完成 “安装后处理”步骤(即下图箭头所示位置),即结束了硬件环境部署工作,就可开始部署模型了。



华为板卡官方教程:

https://support.huaweicloud.com/environment-deployment-Atlas200DK202/atlased_04_0001.html


在环境搭建过程中可能会遇到的问题:

(1)ssh无法连接开发板的问题:

将制作好的SD卡插入华为 Atlas 200 DK开发板,开机后可能存在ping 192.168.1.2能ping通,但ssh HwHiAiUser@192.168.1.2连接不上。原因可能是IP地址冲突。

解决办法:可尝试断掉主机的网络、断掉开发板网络(即拔掉网线),再次尝试即可ssh登陆。

(2)开发板环境部署空间问题:

在root下部署环境可能存在root下内存空间不够的情况。烧制作好的SD卡,华为教程默认root和home不在一个分区,root分区空间较小;本教程作者尝试过使用32G SD卡,在root下安装环境到最后提示空不足的情况。

解决办法:在HwHiAiUser用户下部署环境即可。





使用官方Demo模型进行验证


按照第一步准备好开发板环境后,便可以运行Paddle Lite模型了。参考以下操作,运行官方Demo,感受Paddle Lite模型在Atlas 200 DK上运行效果。

  1. 下载示例程序PaddleLite-generic-demo.tar.gz并解压。(解压后的文件夹及代码清单参考下方链接,其中Demo的测试图像如下图所示,这是一个图像分类任务的示例图片,本教程所有示例均使用下图测试。)


PaddleLite-generic-demo.tar.gz示例程序下载链接:

https://paddlelite-demo.bj.bcebos.com/devices/generic/PaddleLite-generic-demo_v2_10_0.tar.gz


参考链接:

https://paddle-lite.readthedocs.io/zh/release-v2.10_a/demo_guides/huawei_ascend_npu.html


  1. 打开开发板终端,进入PaddleLite-generic-demo/image_classification_demo/shell/路径,修改编译库路径。


$:cd PaddleLite-generic-demo/image_classification_demo/shell/
# 修改.run.sh第85行HUAWEI_ASCEND_TOOLKIT_HOME为自己环境安装的ascend-toolkit路径,# 本教程作者修改前信息如下:
HUAWEI_ASCEND_TOOLKIT_HOME="/usr/local/Ascend/ascend-toolkit/latest"
# 修改后信息如下:
HUAWEI_ASCEND_TOOLKIT_HOME="/home/HwHiAiUser/Ascend/ascend-toolkit/latest"


  1. 在开发板终端执行以下命令,实现在Atlas 200 DK上运行mobilenet_v1_fp32_224模型,对测试图像类别推理,终端界面可打印出板卡运行的性能和结果。


# CPU环境运行推理
$: ./run.sh mobilenet_v1_fp32_224 linux arm64
# 模型输出:
warmup: 1 repeat5, average: 181.428799 ms, max181.477997 ms, min181.356003 ms
results: 3
Top0  tabby, tabby cat - 0.529131
Top1  Egyptian cat - 0.419681
Top2  tiger cat - 0.045173
Preprocess time1.835000 ms
Prediction time181.428799 ms
Postprocess time0.304000 ms


# NPU环境运行推理
$:./run.sh mobilenet_v1_fp32_224 linux arm64 huawei_ascend_npu
# 模型输出:
warmup: 1 repeat5, average: 1.487600 ms, max1.732000 ms, min1.3845000 ms
results: 3
Top0  tabby, tabby cat - 0.529785
Top1  Egyptian cat - 0.418945
Top2  tiger cat - 0.045227
Preprocess time1.826000 ms
Prediction time1.487000 ms
Postprocess time0.291000 ms


  1. 如果想更换预设Demo中的测试模型或者测试图像,可以参考官方教程来尝试。


官方教程链接:

https://paddle-lite.readthedocs.io/zh/release-v2.10_a/demo_guides/huawei_ascend_npu.html




部署飞桨模型


目前Paddle Lite支持两种部署方式:第一种方式是使用飞桨模型部署,第二种方式是利用opt工具将飞桨模型转换成Paddle Lite支持的模型格式(native_buffer格式)部署。


  • 方式一 :使用飞桨模型部署

第二步中的示例demo中默认采用了此种方式部署推理。开发者只需要更换需要推理的飞桨模型(需确认该模型已支持,参考“一”中“3.目前支持的开源模型”)即可。


飞桨模型分成Non-combined和Combined两种形式的模型文件, Non-combined 形式的模型由一个网络拓扑结构文件 model 和一系列以变量名命名的参数文件组成,Combined形式的模型由一个网络拓扑结构文件model和一个合并后的参数文件params组成,其中网络拓扑结构文件是基于Protocol Buffers 格式以 Paddle proto 文件规则序列化后的文件。


如果飞桨模型格式为Combined形式的模型文件,需要将飞桨模型文件夹的xxx.pdmodel重命名为model,xxx.pdiparams参数文件重命名为params。更换模型具体步骤参照“二”中“2.使用官方Demo模型进行验证”中的第4步。


示例:

本教程以MobileNetV2模型为例,官方下载模型文件夹后,将xxx.pdmodel重命名为model,xxx.pdiparams参数文件重命名为params,将模型文件夹上传到demo中的assets/models目录。


# 执行如下命令执行推理:
$: ./run.sh MobileNetV2 linux arm64 huawei_ascend_npu
# 执行结果:
warmup: 1 repeat5, average: 1.796400 ms, max2.172000 ms, min1.653000 ms
results: 3
Top0 tabby, tabby cat - 0.547852
Top1 Egyptian cat - 0.334961
Top2 tiger cat - 0.100586
Preprocess time1.710000 ms
Prediction time1.796400 ms
Postprocess time0.334000 ms


  • 方式二:利用opt工具转换后的模型部署

opt 工具可以将模型格式转化为Paddle Lite支持的模型格式,期间执行的操作包括:
  1. 将protobuf格式的模型文件转换为naive_buffer格式的模型文件,有效降低模型体积 。

  2. 执行“量化、子图融合、混合调度、Kernel优选”等图优化操作,提升其在 Paddle Lite上的运行速度、内存占用等效果。


安装opt工具命令:

$: pip install paddlelite== 2.10rc0


模型优化工具opt教程:

https://paddle-lite.readthedocs.io/zh/release-v2.10_a/user_guides/model_optimize_tool.html


部署前需要确认如下环境信息:

  1. 检查opt工具和Paddle Lite预测库版本是否匹配。opt工具以及Paddle Lite预测库需使用v2.10版本(v2.10版本开始正式支持华为昇腾NPU),示例Demo中的预测库默认为v2.10版本(如果需要源码编译Paddle Lite + 昇腾NPU 预测库,可参考文档 https://paddle-lite.readthedocs.io/zh/release-v2.10_a/demo_guides/huawei_ascend_npu.html 中 “更新支持华为昇腾 NPU 的 Paddle Lite库”小节)
  2. 准备待转换的飞桨模型。可以选择从飞桨官方套件和模型库下载模型,或者用自己训练好的模型。(请开发者注意,使用前需要去官方文档中确认已在NPU上支持的模型和算子;不在模型列表中的模型没有进行过官方验证,但可通过算子支持情况通过huawei_ascend_npu字样进行筛选判断)。


昇腾NPU算子支持:

https://github.com/PaddlePaddle/Paddle-Lite/blob/release/v2.10/lite/kernels/nnadapter/converter/all.h


昇腾NPU模型支持:

https://paddle-lite.readthedocs.io/zh/release-v2.10_a/demo_guides/huawei_ascend_npu.html


整个模型转换到运行流程包括以下几步:

  1. 模型转换。通过Paddle Lite提供的OPT优化工具,可以完成包括量化、子图融合、混合调度、Kernel优选等模型优化步骤,并生成优化后的模型文件用于推理。opt工具的安装与使用请参考官方文档链接。


注:

如果要在华为NPU上执行模型,需要在opt工具转换的时候将如下选项设置成valid_targets=arm,huawei_ascend_npu。如果只是在CPU上执行,需要设置如下选项valid_targets=arm

  1. 模型上传。将转换后的模型通过scp从本机上传到开发板demo中的assets/models目录下
  2. 重新编译示例程序。修改demo中shell/build.sh脚本中USE_FULL_API=FALSE,执行./build.sh linux arm64命令重新编译程序
  3. 执行模型。./run.sh ${model_name} linux arm64 或 ./run.sh ${model_name} linux arm64 huawei_ascend_npu


下面以MobileNetV2模型为例:


  1. 模型转换。执行如下命令生成优化后的MobileNetV2.nb模型文件。
$: paddle_lite_opt --model_file=./MobileNetV2/inference.pdmodel --param_file=./MobileNetV2/inference.pdiparams --valid_targets=arm,huawei_ascend_npu --optimize_out=./MobileNetV2/MobileNetV2
  1. 利用scp将模型拷贝到Atlas 200 DK开发板的如下位置(即第二步下载的官方Paddle Lite模型对应路径):PaddleLite-generic-demo/ image_classification_demo/assets/models
  2. 在开发板上编译示例程序。
# 注意将build.sh中的USE_FULL_API设置成FALSE后再执行如下命令。
$: ./build.sh linux arm64 
  1. 执行如下命令即可利用转换的MobileNetV2模型来推理。
$: ./run.sh MobileNetV2 linux arm64 huawei_ascend_npu
# 执行结果:
warmup: 1 repeat5, average: 1.796400 ms, max2.172000 ms, min1.653000 ms
results: 3
Top0 tabby, tabby cat - 0.547852
Top1 Egyptian cat - 0.334961
Top2 tiger cat - 0.100586
Preprocess time1.710000 ms
Prediction time1.796400 ms
Postprocess time0.334000 ms


至此,从飞桨模型到在华为Atlas 200 DK开发板上运行已全部跑通。开发者也可以根据自己的应用需求,训练模型进行部署。


本篇介绍了基于Paddle Lite在Atlas 200 DK部署飞桨模型的方案,在本期的次条和三条将继续介绍《通过Paddle2ONNX在Atlas 200 DK上部署模型》、《基于EasyDL的全流程模型开发和Atlas 200 DK部署的部署方案》,感兴趣的朋友欢迎继续阅读~


为了向大家提供更易用、更好用的AI推理部署工具,我们诚邀您参与调研,分享您使用推理部署工具时的需求和期待!

问卷地址(点击阅读原文即可跳转)

https://iwenjuan.baidu.com/?code=323o1l


如有相关AI硬件部署的技术问题,欢迎加入飞桨硬件部署交流群提问交流:609865659(QQ群)




长按下方二维码立即

Star

更多信息:

  1. 飞桨官方QQ群:793866180

  2. 飞桨官网网址:

    www.paddlepaddle.org.cn/

  3. 飞桨开源框架项目地址:

    GitHub:

    github.com/PaddlePaddle/Paddle 
    Gitee:

    gitee.com/paddlepaddle/Paddle

  4. 欢迎在飞桨论坛讨论交流~~

    http://discuss.paddlepaddle.org.cn