使用MindStudio进行CenterNet模型ONNX推理

一、 介绍

本文基于CANN架构和MindStudio平台实现开源模型CenterNet的离线推理。华为推出的CANN是AI场景的异构计算架构,具有易开发、易调试、广支持等优势。MindStudio是一套全流程开发工具链平台,其为所有开发者提供了一套简单上手的开发工具,提供了各种功能应用,诸如如算子开发、模型训练/推理、应用开发和部署。优势是无需切换工具,显著降低开发门槛。尤其是其中的模型转换功能,直接通过可视化界面操作即可,简洁高效。
本图文案例中,使用的环境为本地Windows 10安装的MindStudio和远程昇腾AI运行环境。使用的MindStudio版本为5.0.RC1,Ascend-cann-toolkit版本为远程环境下的5.1.RC1。

1. 1任务介绍

(1)任务场景:Pytorch ONNX模型(推理)。
(2)任务描述:首先,在昇腾Ascend310上复现CenterNet模型的推理流程;再在Ascend310P上完成CenterNet模型的推理。
(3)任务目标:在Ascend310P上的推理精度不低于基准精度的99%,性能是Ascend310上的1.2倍,是t4上的1.6倍。

1. 2模型简介

  CenterNet 是在 2019 年提出的用于目标检测的模型,相比传统依靠 anchors的检测网络,CenterNet 是一种 anchor-free 的目标检测网络,其输出主要为heatmap,获取该热力图分布的中心点即作为目标的中心点。而目标的其他输出,如尺寸和偏移量等则通过在特征图中通过回归得到,这种方法原理简单,兼容性强,在速度和精度上都比较有优势。网络的具体实现细节可参见论文,PyTorch版本的开源代码见此处。

二、 环境配置

  本次任务中,所使用的环境为Windows下安装的MindStudio + 远程昇腾AI运行环境,本案例使用的MindStudio版本为5.0.RC1。

2. 1MindStudio环境搭建

  MindStudio是一个跨平台、跨框架代码迁移的管理运维工具,可以在应用、算法、算子三个层级上,同时也提供了一站式AI开发环境,支持Python,Java和C语言的开发,并提供了众多性能调优工具。MindStudio安装详见官方安装指南。
(1)进入网站后如果你跟我一样是Windows环境,就选择下方对应环境的安装教程进行安装即可。
使用MindStudio进行CenterNet模型ONNX推理_第1张图片
(2)安装完成后,如果是首次登录MindStudio,则直接点击 ”New Project” 创建新的项目,进入创建工程界面。选择Ascend App项目类别,然后就是常规的命名和路径修改,在CANN Version处点击change配置远程连接和远程CANN地址。
使用MindStudio进行CenterNet模型ONNX推理_第2张图片
(3)当点击CANN Version的Change后进入下界面进行相关配置,点击远程连接配置的最右侧添加按钮。
使用MindStudio进行CenterNet模型ONNX推理_第3张图片
(4)进入SSH Configurations后,可进行如下图所示的连接配置,相关信息工作人员会提供。在MindStudio的远程服务中,定义了SSH 配置,其使得用户可以保存多个远程服务器的连接配置。
使用MindStudio进行CenterNet模型ONNX推理_第4张图片
(5)返回Remote CANN Setting界面,继续配置CANN location。加载完后再点击Finish即可完成远程环境配置。
使用MindStudio进行CenterNet模型ONNX推理_第5张图片
(6)完成远程连接设置后,点击next会进到模板选择界面,由于我们是推理任务,此时我们选择MindX SDK Project(Python),再点击Finish。MindX SDK(昇腾行业SDK),提供面向不同行业使能的开发套件,简化了使用昇腾芯片推理业务开发的过程。SDK提供了以昇腾硬件功能为基础的功能插件,用户可以通过拼接功能插件,快速构建推理业务,也可以开发自定义功能插件。
使用MindStudio进行CenterNet模型ONNX推理_第6张图片
(7)如果非首次登陆,我们可以直接选择菜单栏的File->New->Project创建新项目,或是File->Open打开已存在的工程。
使用MindStudio进行CenterNet模型ONNX推理_第7张图片
注:直接打开的项目,需转成一个Ascend Project

(8)创建好项目后,我们还需要配置本地和远程的项目的路径,通过选择界面菜单栏的File->Settings,找到其中Tools下的Deployment可配置本地项目路径和对应远程路径的映射。Deployment管理远程开发时的本地文件与远程文件的同步。
使用MindStudio进行CenterNet模型ONNX推理_第8张图片
(9)除了Mappings的设置完,还有Excluded Paths设置,该选项是可以排开相应的路径不进行上传和下载,比如说我们可以警用中间的二进制数据文件,避免在运行时长时间的等待。
使用MindStudio进行CenterNet模型ONNX推理_第9张图片
(10)远程环境配置完后,我们需要添加python解释器,在这我建议是直接选择远程环境下我们创建好的推理虚拟环境(环境创建下节会讲)下的解释器。
使用MindStudio进行CenterNet模型ONNX推理_第10张图片
使用MindStudio进行CenterNet模型ONNX推理_第11张图片
添加好我们环境所需的解释器后,我们需要在Project和Modules下给项目配置
使用MindStudio进行CenterNet模型ONNX推理_第12张图片

2. 2模型推理环境配置

(1)在MindStudio上配置好了SSH Configurations和Deployment后,我们需要创建推理环境所需的环境。其中CenterNet推理的相关源码包来源于Ascend ModelZoo(地址见此处),代码目录如下(下载好的项目可直接在MindStudio中点击File->Open选择打开)。
使用MindStudio进行CenterNet模型ONNX推理_第13张图片
除了来自于Ascend ModelZoo的代码外,我们还需安装开源仓代码,直接在终端使用git获取源码。

(2)在310芯片上的环境安装按照此处步骤进行,点击快速上手,即可有详细的安装步骤,照着安装基本不会有问题。
使用MindStudio进行CenterNet模型ONNX推理_第14张图片
另外,在710芯片上需pytroch1.8环境,所以在源码包中的requirements.txt作如下修改:
使用MindStudio进行CenterNet模型ONNX推理_第15张图片
就此,我们在远端创建好我们的推理环境并且也用MindStudio进行了配置连接,接下来就需要在MindStudio上进行数据处理、模型转换和推理的工作了。

三、 数据处理

(1)获取COCO数据集:coco2017,数据集文件目录结构如下,该数据集不需要放入我们的工程目录,在远端环境目录下/opt/npu/coco/有
使用MindStudio进行CenterNet模型ONNX推理_第16张图片
数据集确定了后,需将原始数据集转换为模型输入的数据,即bin文件,处理文件为CenterNet_preprocess.py脚本文件。在运行该文件的时候先需进行运行环境配置,需要选择我们之前配置的远程环境下的python解释器。
(2)点击Run->Edit Configurations进入配置界面
使用MindStudio进行CenterNet模型ONNX推理_第17张图片
(3)配置脚本运行环境
使用MindStudio进行CenterNet模型ONNX推理_第18张图片
(4)配置好后,直接点击绿色运行箭头
使用MindStudio进行CenterNet模型ONNX推理_第19张图片
(5)配置好运行环境后,点击运行,即可看到相关运行输出信息。另外,在File Transfer会显示运行时本地文件和远端文件的上传和下载情况,且可以在Deployment配置Excluded Path来控制某些路径不进行上传和下载操作,详细见此处。比如我把数据文件禁用,只输出在远端即可,不用下载到本地,节约时间。
使用MindStudio进行CenterNet模型ONNX推理_第20张图片
使用MindStudio进行CenterNet模型ONNX推理_第21张图片
等待bin文件全部生成后,由于使用benchmark推理需要输入图片数据集的info文件,用于获取数据集,所以继而执行get_info.py脚本,输入已经获得的bin文件,输出生成图片数据集的info文件。同理,在运行该脚本之前修改对应的运行参数。
使用MindStudio进行CenterNet模型ONNX推理_第22张图片
运行配置设置好后,即可运行该脚本,运行结果如下。

运行结束后会在项目中生成prep_bin.info文件,里面是数据读取路径和尺寸。

四、 模型转换

(1)我们的任务时是通过.om格式的权重文件进行推理并验证结果,所以我们需要先将工程中的.pth权重文件转为.onnx格式。通过CenterNet_pth2onnx.py执行。
使用MindStudio进行CenterNet模型ONNX推理_第23张图片
另外,需注册添加NPU自定义算子后需要手动屏蔽掉“torch.onnx”中的model_check相关代码,否则导出onnx过程中无法识别自定义算子会导致报错。找到xxx/lib/python3.7/site-packages/torch/onnx/utils.py文件,搜索_check_onnx_proto(proto)并注释代码,添加pass代码,后保存并退出。
使用MindStudio进行CenterNet模型ONNX推理_第24张图片
(2)如果运行后仍旧遇到下图错误,原因大概率是有些地方仍存在cuda语句,查询报错所在的位置进行修改(本地修改后需要上传覆盖到远程或直接修改远程对应的文件,如果在Deployment中没有配置报错文件所在的Excluded Paths的话,则本地修改了直接会更新远程)。
使用MindStudio进行CenterNet模型ONNX推理_第25张图片
进入
删除下图中的红框部分:
使用MindStudio进行CenterNet模型ONNX推理_第26张图片
(3)修改完后再执行,看到下界面基本上成功输出.onnx模型了。
使用MindStudio进行CenterNet模型ONNX推理_第27张图片
(4)可选择将输出的.onnx模型放到本地与远端同步。然后可以选择菜单栏Ascend->Model Converter转换为.om格式

使用MindStudio进行CenterNet模型ONNX推理_第28张图片
注:转换模型的时候之前,要导入atc的环境,在终端输入source env.sh添加环境变量,其内容就是/usr/local/Ascend/ascend-toolkit/set_env.sh的内容。
使用MindStudio进行CenterNet模型ONNX推理_第29张图片
使用MindStudio进行CenterNet模型ONNX推理_第30张图片
(5)模型转换时需将shape的batch改为需要推理的batchsize大小,因为CenterNet输出节点为heatmap、offset和size我们需要选择对应输出节点,所以最后点击Select,进入模型可视化界面。
使用MindStudio进行CenterNet模型ONNX推理_第31张图片
(6)下拉找到最后的三个对应节点,鼠标右键点击结点选择Select代表选中,选完三个结点后点击OK
(7)继续点击Next进行相关配置
使用MindStudio进行CenterNet模型ONNX推理_第32张图片
Data Pre-Processing步骤中,由于我们的模型不支持AIPP所以忽略,点击Next进入到下一步。
(8)继续点击Next进行相关配置,进入到下一个界面,通过Command Preview我们也能看见对应的指令形式,以备检测是否有错误。
使用MindStudio进行CenterNet模型ONNX推理_第33张图片
确认后点击Finish即可等待.om模型转出,显示如下界面结果便表示.pth成功转为. om。
使用MindStudio进行CenterNet模型ONNX推理_第34张图片

五、 模型推理

先在MindStudio中打开远程终端,模型的推理使用benchmark指令在远端进行推理。
在MindStudio中打开远程终端,操作如下
使用MindStudio进行CenterNet模型ONNX推理_第35张图片
在终端输入benchmark执行指令,即可进行模型推理

成功执行后,推理的中间过程会输出到终端,如下所示
使用MindStudio进行CenterNet模型ONNX推理_第36张图片

六、 推理结果分析

(1)最后当整个推理过程结束后,会在项目中生成结果文件夹,./result/会生成一个包含性能的txt文档。
使用MindStudio进行CenterNet模型ONNX推理_第37张图片
(2)对./result/dumpOutput_device0/输出进行后处理即可精度验证,后处理脚本文件为CenterNet_postprocess.py,配置好运行参数后即可执行脚本
使用MindStudio进行CenterNet模型ONNX推理_第38张图片
命令执行成功后会在output看到输出的过程信息
使用MindStudio进行CenterNet模型ONNX推理_第39张图片
等待脚本执行结束会得到评估结果。其余bs值的推理流程同理,在此就不再重复给出流程。
使用MindStudio进行CenterNet模型ONNX推理_第40张图片

七、 FAQ

1.模型由.pth转为.onnx的相关问题

在导出onnx模型时,注意修改相关包含cuda的内容,诸如:CenterNet_pth2onnx.py和pose_dla_dcn.py中
使用MindStudio进行CenterNet模型ONNX推理_第41张图片
使用MindStudio进行CenterNet模型ONNX推理_第42张图片

2.模型由.onnx转为.om的相关问题

CenterNet在终端进行由ATC工具进行.om格式转换时,会要求给出输出节点参数:
--out_nodes="Conv_949:0;Conv_952:0;Conv_955:0"
由于导出的onnx模型可能和之前Ascend modalzoo原始给出的onnx各个算子编号不一致,所以需要将onnx模型可视化确定编号,但在MindStudio中的模型导出功能不存在这种问题,整个流程通过一系列可视化操作即可完成。

3.MindStudio的Deployment->Excluded Paths配置

当在项目中进行数据处理和输出时,由于会生成大量数据,建议通过Excluded Paths添加相关路径,不然运行时进行下载和上传很耗时,数据只需在远程保留一份即可。

你可能感兴趣的:(算法,计算机视觉,深度学习,人工智能)