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安装流程,如下图:

mind编程入门教程书(基于MindStudio的)(1)

安装教程网址:https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/progressiveknowledge/index.html

(1)Anaconda官方网站下载安装到 Windows 本地。

Anaconda下载地址:https://www.anaconda.com/

在开始菜单搜索“环境变量”,在“环境变量 > 用户变量(U)”弹框中选中 Path 变量后单击“编辑”,如下图所示:

这里我们要将 Anaconda安装环境下的路径添加到 Path 里,最后点击确认,完成环境变量设置。

mind编程入门教程书(基于MindStudio的)(2)

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命令查看是否安装成功,如下图所示:

mind编程入门教程书(基于MindStudio的)(3)

(3)安装 Java 依赖

要求 Java 版本为 11,下载地址。

我们将 java 安装包路径下的 bin 添加到 Path 里,接下来验证是否安装成功,如下图所示。

mind编程入门教程书(基于MindStudio的)(4)

(4)安装 Cmake 依赖

Cmake 可以到官网下载 msi 文件进行安装,打开安装包后选择自己要安装的路径,进入“Install Options”界面,选择“Add CMake to the system PATH for all users”,单击“Next”。如下图所示:

mind编程入门教程书(基于MindStudio的)(5)

(5)安装 MindStudio

我们选择 exe 安装方式,下完成安装包后,我们选择安装路径后,进入如下界面,这里我们选择 64bit launcher 和 add launcher dir to Path。

mind编程入门教程书(基于MindStudio的)(6)

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、当前目录结构。

mind编程入门教程书(基于MindStudio的)(7)

3、配置conda环境、安装依赖包。

mind编程入门教程书(基于MindStudio的)(8)

4、获取原始数据集。

该模型使用cityscapes数据集的500张验证集进行测试。用户自行获取数据集cityscapes,解压并上传到modelzoo源码包根目录下。

  1. 推理实践。

1、安装和配置环境

按照MindStudio用户手册中的安装指南—>安装操作来安装MindStudio(参照前面MindStudio安装教程)。

推理环境在远端服务器上已经配置完成。

2、创建工程。

新建Python工程。由于我们的模型是基于Pytorch,所以需要新建非昇腾工程,然后进行工程转换。

mind编程入门教程书(基于MindStudio的)(9)

mind编程入门教程书(基于MindStudio的)(10)

mind编程入门教程书(基于MindStudio的)(11)

  1. ssh连接。

·参见配置入口进入SSH连接配置界面。

在菜单栏依次选择File > Settings... > Tools > SSH Configurations进入SSH连接配置

mind编程入门教程书(基于MindStudio的)(12)

mind编程入门教程书(基于MindStudio的)(13)

·单击界面左侧导航栏上方按钮

·根据参数及图标说明配置参数后,单击“OK”或“Apply”

· 在菜单栏选择Tools > Start SSH session...。弹出“Select Host to Connect”弹窗。

·单击需要开启Remote Terminal窗口的SSH连接。在MindStudio IDE界面下方显示远端窗口信息,可直接进行命令行操作。

mind编程入门教程书(基于MindStudio的)(14)

  1. Deployment

通过Deployment功能可以将指定的文件、文件夹同步到远程指定机器的指定目录。

·在菜单栏选择File > Settings…。

在左边的导航栏选择“Tools > Deployment”,进入下图。

mind编程入门教程书(基于MindStudio的)(15)

参数及图标说明

mind编程入门教程书(基于MindStudio的)(16)

·配置远程服务器连接

参数及图标说明

mind编程入门教程书(基于MindStudio的)(17)

·配置映射路径关系

mind编程入门教程书(基于MindStudio的)(18)

参数及图标说明

mind编程入门教程书(基于MindStudio的)(19)

·单击“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界面。

mind编程入门教程书(基于MindStudio的)(20)

参数说明如下:

mind编程入门教程书(基于MindStudio的)(21)

6、工程转换。

MindStudio支持非昇腾工程转换为昇腾工程的功能。

  1. 导入工程文件。

·首次登录MindStudio:在MindStudio欢迎界面中单击“Open”,选择需要导入的工程,单击“OK”确认导入。

·进入工程创建页面,在顶部菜单栏中选择“File > Open...”,选择现有工程打开。

mind编程入门教程书(基于MindStudio的)(22)

mind编程入门教程书(基于MindStudio的)(23)

  1. 若工作窗口已打开其他工程,会出现下图所示提示。

·选择“This Window”,则直接在当前工作窗口打开新创建的工程。

·选择“New Window”,则新建一个工作窗口打开新创建的工程

mind编程入门教程书(基于MindStudio的)(24)

  1. 单击菜单栏 “Ascend > Convert To Ascend Project”,如下图所示。

mind编程入门教程书(基于MindStudio的)(25)

  1. 弹出如下窗口。

这里针对icnet网络,Project Type选择Ascend App,Sub Type选择

Ascend Python ACL App。如下图。

mind编程入门教程书(基于MindStudio的)(26)

对窗口参数介绍如下,用户请根据实际场景选择:

·Project Type:可选择三种工程类型,分别为Ascend Operator、Ascend Training和Ascend App。

·Framework:可选择框架如图所示。

mind编程入门教程书(基于MindStudio的)(27)

  1. 单击“OK”,工程目录以树状呈现。此时成功创建带有.project文件的昇腾工程,请以实际创建结果为准。
  2. 在MindStudio工程界面,依次选择“Run > Edit Configurations...”,进入运行配置页面。

mind编程入门教程书(基于MindStudio的)(28)

应用工程运行配置参数说明

mind编程入门教程书(基于MindStudio的)(29)

配置完成后,单击“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

mind编程入门教程书(基于MindStudio的)(30)

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

mind编程入门教程书(基于MindStudio的)(31)

mind编程入门教程书(基于MindStudio的)(32)

注意有可能回报如下错误,查看一下文件路径是否写错就可以。

mind编程入门教程书(基于MindStudio的)(33)

  1. 执行ICNet_pth2onnx.py脚本,生成onnx模型文件,执行如下命令在当前目录生成ICNet.onnx模型文件。

命令如下:

python3.7 ICNet_pth2onnx.py rankid0_icnet_resnet50_192_0.687_best_model.pth ICNet.onnx

mind编程入门教程书(基于MindStudio的)(34)

  1. 使用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”,菜单栏下方会出现一行工具栏,选择

mind编程入门教程书(基于MindStudio的)(35)

mind编程入门教程书(基于MindStudio的)(36)

配置模型信息(Windows系统示例)

mind编程入门教程书(基于MindStudio的)(37)

参数

说明

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”选择相应路径下的配置文件,则相应的配置信息会自动填

充,用户自行决定是否沿用上次配置还是修改配置后重新进行模型转换。

mind编程入门教程书(基于MindStudio的)(38)

mind编程入门教程书(基于MindStudio的)(39)

  1. 开始推理验证。

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

mind编程入门教程书(基于MindStudio的)(40)

  1. 精度验证。

调用evaluate.py脚本推理,结果保存在icnet_bsx.log中。

命令如下:

python3.7 -u evaluate.py ./cityscapes ./result/dumpOutput_device0 ./out >icnet_bs1.log

mind编程入门教程书(基于MindStudio的)(41)

最终输出结果如下:

bs1

mind编程入门教程书(基于MindStudio的)(42)

bs4

mind编程入门教程书(基于MindStudio的)(43)

310执行完毕,经该模型迁移至310P3,将上述流程在Ascend310P3上在执行一遍精度和性能均达标。但是310P3跟T4相比性能还差一些,最终经过排查发现是Avgpool算子的问题,还在调优。

,