1.介绍
本文旨在帮助用户使用 CANN 架构和 MindStudio 平台进行 AI CPU 离线模型推理指导。
其中 CANN(Compute Architecture for Neural Networks)是华为公司针对 AI 场景推出的 异构计算架构,通过提供多层次的编程接口,支持用户快速构建基于昇腾平台的 AI 应用和 业务。CANN 框架下有众多软件包供用户使用,比如 Profiling 性能分析工具,AtuoML 工具, ATC 工具以及 Benchmark 工具等。在模型推理工作中,涉及到 ATC 和 Bechmark 工具。
AI 模型推理步骤涉及模型转换和推理以及精度测试过程。 MindStudio 提供您在 AICPU 上模型转换功能,由于 MindStudio 版本的升级,MindStudio 移除了模型推理所需的 Benchmark 菜单,所以我整体流程无法全部在 MindStudio 可视化界面完成。本文我将使用 MindStudio 可视化界面进行模型转换并且在 MindStudio 的 Remote 终端进行推理步骤。
ICNet主要研究具有挑战性的实时语义分割问题。它有许多实际应用,但在减少像素级标签推理的大量计算方面存在根本困难。为了应对这一挑战,我们提出了一种图像级联网络(ICNet),该网络在适当的标签指导下结合了多分辨率分支。我们对我们的框架进行了深入分析,并引入了级联特征融合单元来快速实现高质量的分割。我们的系统可以在单个GPU卡上进行实时推断,并在具有挑战性的数据集(如Cityscapes、CamVid和COCO Stuff)上评估出高质量的结果。
2.安装教程
2.1 CANN 软件包
CANN 下载链接:https://www.hiascend.com/software/cann/community
CANN 安装指南https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/51RC1alpha005/s
oftwareinstall/instg/atlasdeploy_03_0002.html
2.2 MindStudio 平台
MindStudio 下载地址:https://www.hiascend.com/software/mindstudio/download
2.2.1 环境依赖配置
由于我电脑是 Windows10,所以接下来的安装过程都是在 win10 系统下进行的。
MindStudio安装流程,如下图:
安装教程网址:https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/progressiveknowledge/index.html
(1)Anaconda官方网站下载安装到 Windows 本地。
Anaconda下载地址:https://www.anaconda.com/
在开始菜单搜索“环境变量”,在“环境变量 > 用户变量(U)”弹框中选中 Path 变量后单击“编辑”,如下图所示:
这里我们要将 Anaconda安装环境下的路径添加到 Path 里,最后点击确认,完成环境变量设置。
Anaconda安装完成后,创建虚拟环境,命令如下:
conda create -n name python=3.7.5
Python 安装完成后,需要安装 Python 依赖环境:
1. pip install xlrd==1.2.0
2. pip install absl-py
3. pip install numpy
4. pip install requests
(2)安装 MinGW 依赖
首先根据电脑配置,下载适合的(下载地址),例如 64 位可以选择 x86_64-posix-seh。
解压 MinGW 安装包到自定义路径。
接着跟上述配置环境变量方式相同,将安装 MinGW 路径下的 bin 文件夹添加到 Path 中。
最后我们打开电脑 CMD 终端,输入gcc -v命令查看是否安装成功,如下图所示:
(3)安装 Java 依赖
要求 Java 版本为 11,下载地址。
我们将 java 安装包路径下的 bin 添加到 Path 里,接下来验证是否安装成功,如下图所示。
(4)安装 Cmake 依赖
Cmake 可以到官网下载 msi 文件进行安装,打开安装包后选择自己要安装的路径,进入“Install Options”界面,选择“Add CMake to the system PATH for all users”,单击“Next”。如下图所示:
(5)安装 MindStudio
我们选择 exe 安装方式,下完成安装包后,我们选择安装路径后,进入如下界面,这里我们选择 64bit launcher 和 add launcher dir to Path。
1、Create Desktop Shortcut:创建桌面快捷方式,用户可根据系统配置选择“32-bit launcher”或者“64-bit launcher”。
2、Update PATH variable(restart needed):将MindStudio的启动文件路径加入环境变量PATH中,可从系统命令行直接启动MindStudio。如果勾选此项,MindStudio安装配置完成后会重启操作系统。
3、Update context menu:勾选“Add "Open Folder as Project"”后,右键单击文件夹,可以作为MindStudio工程打开。
4、Create Associations:默认不勾选。
(6)下载jbr压缩包。
推荐使用11_0_10b1341.35版本的jbr,进入链接:https://cache-redirector.jetbrains.com/intellij-jbr/jbr_dcevm-11_0_10-windows-x64-b1341.35.tar.gz下载压缩包。
下载 jbr,解压到 MindStudio 安装根目录,与 bin 目录同级。
3.服务器端推理环境准备
1、获取Pytorch onnx推理项目源代码仓。
地址如下:https://ascend-repo-modelzoo.obs.cn-east-2.myhuaweicloud.com/model/ATC ICNet(FP16) from Pytorch - Ascend310/zh/1.1/ATC ICNet(FP16) from Pytorch - Ascend310.zip
2、当前目录结构。
3、配置conda环境、安装依赖包。
4、获取原始数据集。
该模型使用cityscapes数据集的500张验证集进行测试。用户自行获取数据集cityscapes,解压并上传到modelzoo源码包根目录下。
- 推理实践。
1、安装和配置环境
按照MindStudio用户手册中的安装指南—>安装操作来安装MindStudio(参照前面MindStudio安装教程)。
推理环境在远端服务器上已经配置完成。2、创建工程。
新建Python工程。由于我们的模型是基于Pytorch,所以需要新建非昇腾工程,然后进行工程转换。
- ssh连接。
·参见配置入口进入SSH连接配置界面。
在菜单栏依次选择File > Settings... > Tools > SSH Configurations进入SSH连接配置
·单击界面左侧导航栏上方按钮
·根据参数及图标说明配置参数后,单击“OK”或“Apply”
· 在菜单栏选择Tools > Start SSH session...。弹出“Select Host to Connect”弹窗。
·单击需要开启Remote Terminal窗口的SSH连接。在MindStudio IDE界面下方显示远端窗口信息,可直接进行命令行操作。
- Deployment
通过Deployment功能可以将指定的文件、文件夹同步到远程指定机器的指定目录。
·在菜单栏选择File > Settings…。
在左边的导航栏选择“Tools > Deployment”,进入下图。
参数及图标说明
·配置远程服务器连接
参数及图标说明
·配置映射路径关系
参数及图标说明
·单击“Apply”,Deployment配置生效。
当在使用run/debug项目时,会触发Deployment同步功能。如果需要自动触发Deployment功能,可进行如下操作实现:
a.在菜单栏选择File > Settings… 。
在左边的导航栏选择“Tools > Deployment”进入Deployment界面,将指定远程服务器信息为默认远程服务器。
b.在菜单栏选择“Tools > Deployment > Automatic Upload”。
注意:
针对上传过程,deployment会将mapping中的“Local Path”完全映射于对应的“Deployment Path”,若本地有a、b和c文件,而远端“Deployment Path”中有d文件,上传的结果是远端对应目录下只有a、b和c文件,d文件会被删除。针对下载过程,不会使用完全映射过程,如远端有a、b、c文件,本地有d文件,下载的结果是本地对应目录存在a、b、c和d文件。
5、CANN配置。
CANN Manager为用户提供了在不重装MindStudio的前提下,切换以及更新Ascend-cann-toolkit开发套件包版本的功能。使用该功能之前,请确保已经完成MindStudio以及Ascend-cann-toolkit开发套件包的安装。
CANN管理入口:
·在MindStudio工程界面菜单栏依次选择“File > Settings... > Appearance&Behavior > System Settings > CANN”,弹出CANN Manager界面。
·在MindStudio工程界面菜单栏依次选择“Ascend > CANN Manager”,弹出CANN Manager界面。
参数说明如下:
6、工程转换。
MindStudio支持非昇腾工程转换为昇腾工程的功能。
- 导入工程文件。
·首次登录MindStudio:在MindStudio欢迎界面中单击“Open”,选择需要导入的工程,单击“OK”确认导入。
·进入工程创建页面,在顶部菜单栏中选择“File > Open...”,选择现有工程打开。
- 若工作窗口已打开其他工程,会出现下图所示提示。
·选择“This Window”,则直接在当前工作窗口打开新创建的工程。
·选择“New Window”,则新建一个工作窗口打开新创建的工程
- 单击菜单栏 “Ascend > Convert To Ascend Project”,如下图所示。
- 弹出如下窗口。
这里针对icnet网络,Project Type选择Ascend App,Sub Type选择
Ascend Python ACL App。如下图。
对窗口参数介绍如下,用户请根据实际场景选择:
·Project Type:可选择三种工程类型,分别为Ascend Operator、Ascend Training和Ascend App。
·Framework:可选择框架如图所示。
- 单击“OK”,工程目录以树状呈现。此时成功创建带有.project文件的昇腾工程,请以实际创建结果为准。
- 在MindStudio工程界面,依次选择“Run > Edit Configurations...”,进入运行配置页面。
应用工程运行配置参数说明
配置完成后,单击“Apply”保存运行配置,单击“OK”,关闭运行配置窗口。
在MindStudio工程界面,依次选择“Run > Run...”。
7、数据预处理。
将原始数据(.jpeg)转化为二进制文件(.bin)。执行预处理脚本,生成数据集预处理后的bin文件。命令如下:
python3.7 pre_dataset.py ./cityscapes/ ./pre_dataset_bin
cityscapes_path = sys.argv[1]
bin_path = sys.argv[2]
if os.path.exists(bin_path) is False:
os.mkdir(bin_path)
split = "val"
# "./Cityscapes/leftImg8bit/train" or "./Cityscapes/leftImg8bit/val"
img_folder = os.path.join(cityscapes_path, 'leftImg8bit/' split)
img_paths = get_img_path(img_folder)
for i in range(len(img_paths)):
filename = os.path.basename(img_paths[i])
image = Image.open(img_paths[i]).convert('RGB') # image shape: (W,H,3)
image = _img_transform(image) # image shape: (3,H,W) [0,1]
image = torch.unsqueeze(image, 0) # image shape: (1,3,H,W) [0,1]
#torch.save(image, os.path.join(bin_path, filename.split('.')[0] '.t')) # save tensor
image = np.array(image).astype(np.float32)
image.tofile(os.path.join(bin_path, filename.split('.')[0] '.bin')) # save bin
8、生成数据集info文件。
使用Benchmark推理需要输入二进制数据集的info文件,用于获取数据集。使用get_info.py脚本,输入已经得到的二进制文件,输出生成二进制数据集的info文件。运行get_info.py脚本。
命令如下:
python3.7 get_info.py bin ./pre_dataset_bin ./icnet_pre_bin_1024_2048.info 1024 2048
def get_path_pairs(img_folder, mask_folder):
img_paths = []
mask_paths = []
for root, _, files in os.walk(img_folder):
for filename in files:
if filename.endswith('.png'):
"""
Example:
root = "./Cityscapes/leftImg8bit/train/aachen"
filename = "aachen_xxx_leftImg8bit.png"
imgpath = "./Cityscapes/leftImg8bit/train/aachen/aachen_xxx_leftImg8bit.png"
foldername = "aachen"
maskname = "aachen_xxx_gtFine_labelIds.png"
maskpath = "./Cityscapes/gtFine/train/aachen/aachen_xxx_gtFine_labelIds"
"""
imgpath = os.path.join(root, filename)
foldername = os.path.basename(os.path.dirname(imgpath))
maskname = filename.replace('leftImg8bit', 'gtFine_labelIds')
maskpath = os.path.join(mask_folder, foldername, maskname)
if os.path.isfile(imgpath) and os.path.isfile(maskpath):
img_paths.append(imgpath)
mask_paths.append(maskpath)
else:
print('cannot find the mask or image:', imgpath, maskpath)
print('Found {} images in the folder {}'.format(len(img_paths), img_folder))
return img_paths, mask_paths
注意有可能回报如下错误,查看一下文件路径是否写错就可以。
- 执行ICNet_pth2onnx.py脚本,生成onnx模型文件,执行如下命令在当前目录生成ICNet.onnx模型文件。
命令如下:
python3.7 ICNet_pth2onnx.py rankid0_icnet_resnet50_192_0.687_best_model.pth ICNet.onnx
- 使用atc将onnx模型转换为om模型文件
命令如下:
atc --framework=5 --model=ICNet.onnx --output=ICNet_bs1 --out_nodes="Resize_317:0" --input_format=NCHW --input_shape="actual_input_1: 1,3,1024,2048" --log=debug --soc_version=Ascend310
模型转换入口:可以通过如下两种方式进入模型转换界面。
·在菜单栏选择“Ascend > Model Converter”。
·在菜单栏选择“View > Appearance > Toolbar”,菜单栏下方会出现一行工具栏,选择
。
配置模型信息(Windows系统示例)
参数 |
说明 |
CANN Machine ( 仅 Windows 系 统 支 持 此 参 数) |
Windows 系 统 支 持 此 参 数) 自 动 填 充 。 远 程 连 接 ADK 所 在 环 境 的 SSH 地 址 , 表 现 格 式 为 <username>@localhost:端口号。 |
Model File |
模型文件。必填。该模型文件需要取消其他用户写的权限。 有两种选择方式: 1. 单击右侧的文件夹图标,在后台服务器路径选择需要转化的模型文件 并上传。 2. 在参数后面的输入框中自行输入模型文件在后台服务器的路径,包括 模型文件名称 |
Weight File |
权重文件。当原始框架是 Caffe 时,该参数存在且必填:1. 如果模型文件和权重文件存在于后台服务器同一目录下,且名称和模 型文件名称相同,则选择模型文件后,权重文件会自动填充。 2. 如果模型文件和权重文件存在于后台服务器不同目录下,或者在同一 目录下,但名称和模型文件名称不相同。 |
Model Name |
模型文件名称,必填。选择模型文件后,该参数会自动填充,用户可以根 据需要自行修改名称,要求如下: 1. 只支持 a-z、A-Z、0-9、下划线以及短划线的组合,最多支持 64 个字符。 2. 如果模型转换的输出路径已经存在相同名称模型文件,单击“Next” 后会提示覆盖原有文件或重命名当前 Model Name 的信息,用户根据实际 情况选择。 |
Target SoC Version |
模型转换时指定芯片型号。请根据板端环境具体芯片形态进行选择。 |
Input Format |
输入数据格式。 1. 当原始框架是 Caffe 时,取值为 NCHW、ND(表示支持任意格式,N<=4), 默认为 NCHW。 2. 当原始框架是 MindSpore、ONNX 时,取值为 NCHW。 3. 当原始框架是 TensorFlow 时,取值为 NCHW、NHWC、ND、NCDHW、 NDHWC,默认为 NHWC。 |
Input Nodes |
模型输入节点信息。 1. 如果选择模型文件并且解析成功,则该参数下方会展示模型输入节点 的 shape 信息以及 Type 信息。 2. 如果选择模型文件后,无法解析“Input Nodes”,该场景下,需要用户 根据模型文件中的相关信息手动输入:单击该参数右侧的,在弹出界面中 输入模型输入节点的 Name、Shape 信息(只支持英文逗号,数字( -1 或 大于 0 的整数),不能以英文逗号开头,只能以数字结尾)和输入节点的 数据类型 Type。单击删除节点信息。 3. 如果模型有多个输入,解析成功后,“Input Nodes”参数下方会展示每 一个输入节点的 Shape 信息和 Type 信息。 |
Shape |
模型输入的 shape 信息,例如图 20 中的数值分别代表输入数据的 N(模 型一次处理的图片个数),C( Channel,例如彩色 RGB 图像的 Channel 数为 3),H(Height),W(Width)。若开启 AIPP 功能,则此处的 H,W 取值即为 AIPP 输出数据的高和宽。 |
Type |
Type:指定输入节点的数据类型。 1. 若原始框架类型为 Caffe、ONNX,支持的数据类型为 FP32、 FP16、UINT8。 2. 若原始框架类型为 MindSpore,支持的数据类型为 FP32、UINT8。 3. 若原始框架类型为 TensorFlow,支持的输入数据类型为 FP32、FP16、 UINT8、Int32、Int64、Bool。 |
Output Nodes |
指定输出节点信息。 单击“ Select”在弹出的网络拓扑结构中,选中某层节点,右击选择“ Select”, 该层变成蓝色,单击“OK”后,在“Output Nodes”参数下面会看到标记 层的算子,右击选择“Deselect”取消选中。 1. Op Name:标记层的算子名称。 2. Data Type:算子输出的数据类型,包括 FP32、UINT8、FP16,通过该 参数用户可以设置单个算子的输出数据类型。 “Output Nodes”参数下方“Select”层的算子,默认为全部选中,用户可以自 行选择将不需要输出的算子去勾选,只有选中的算子才会作为模型的输 出。本章节以选中所有算子为例进行说明。 某些情况下,用户想要查看某层算子参数是否合适,则需要将该层算子的 参数输出,即可以通过单击“Select”按钮,在弹出网络拓扑结构中将所需 层的算子标记为“Select”,然后在“Output Nodes”参数下方选中想要输出的 算子,模型转换后,在相应.om 模型文件可以看到该算子的输出直接作为 模型的输出。详细信息请参见模型可视化。 |
Load Configuration |
导入上次模型转换的配置文件。 如果用户之前转换过模型,无论成功与否,在$HOME/modelzoo/${Model Name}/device/路径都会生成${Model Name}_config.json 配置文件,该文件 记录用户模型转换时所选择的配置信息,包括所用模型路径、模型名称、输入输出配置,数据预处理配置等,下次重新转换模型时,通过单击“ Load Configuration”选择相应路径下的配置文件,则相应的配置信息会自动填 充,用户自行决定是否沿用上次配置还是修改配置后重新进行模型转换。 |
- 开始推理验证。
icnet_pre_bin_1024_2048.info为处理后的数据集信息。
执行./Benchmark.x86_64工具请选择与运行环境架构相同的命令。推理后的输出默认在当前目录result下。
命令如下:
./benchmark.x86_64 -model_type=vision -device_id=0 -batch_size=1 -om_path=./ICNet_bs1.om -input_text_path=./icnet_pre_bin_1024_2048.info -input_width=1024 -input_height=2048 -output_binary=True -useDvpp=False
- 精度验证。
调用evaluate.py脚本推理,结果保存在icnet_bsx.log中。
命令如下:
python3.7 -u evaluate.py ./cityscapes ./result/dumpOutput_device0 ./out >icnet_bs1.log
最终输出结果如下:
bs1
bs4
310执行完毕,经该模型迁移至310P3,将上述流程在Ascend310P3上在执行一遍精度和性能均达标。但是310P3跟T4相比性能还差一些,最终经过排查发现是Avgpool算子的问题,还在调优。
,