使用ATC命令转换模型
本节介绍如何通过ATC工具将模型转换成支持在开发者套件上推理的离线om模型。
准备模型
-
获取网络模型。
-
ONNX:单击[Link](https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Atlas 200I DK A2/DevKit/models/sdk_cal_samples/unetplusplus_sdk_python_sample.zip)或使用wget命令,解压压缩包,从“model”文件夹中获取*.onnx格式模型文件。
wget https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Atlas%20200I%20DK%20A2/DevKit/models/sdk_cal_samples/unetplusplus_sdk_python_sample.zip -
TensorFlow:单击Link或使用wget命令,获取*.pb格式模型文件。
wget https://ascend-repo-modelzoo.obs.cn-east-2.myhuaweicloud.com/c-version/ResNet50_for_TensorFlow/zh/1.7/m/ResNet50_for_TensorFlow_1.7_model.zip -
MindSpore:单击Link或使用wget命令,获取*.air格式模型文件。
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com:443/cannInfo/model/resnet50_export.air -
Caffe:Caffe模型转换需要模型文件和权重文件。
-
模型文件(*.prototxt):单击[Link](https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC Model/resnet50/resnet50.prototxt)或使用wget命令下载该文件。
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/resnet50/resnet50.prototxt -
权重文件(*.caffemodel):单击[Link](https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC Model/resnet50/resnet50.caffemodel)或使用wget命令下载该文件。
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/resnet50/resnet50.caffemodel
-
-
-
(可选)如果是直接将模型文件下载到Ubuntu系统,则可以直接进行模型转换操作;如果是将模型文件下载到PC Windows系统,需要参考[配置SSH文件传输](https://www.hiascend.com/doc_center/source/zh/Atlas200IDKA2DeveloperKit/23.0.RC2/Application Development Guide/tmuacop/tmuacop_0007.html)将模型上传到Ubuntu系统。
-
在下载的代码文件存放目录右键单击空白处,选择“Open in Terminal”打开命令行窗口。
图1 打开终端

-
以下载ONNX模型为例,执行命令进入解压后模型文件存放目录。
cd unetplusplus_sdk_python_sample/model
模型转换基础示例
以下介绍模型转换必须使用的参数。
-
以ONNX模型为例,执行如下命令生成离线模型(如下命令中使用的目录以及文件均为样例),模型转换必须使用的参数介绍如表1所示。
atc --model=model.onnx --framework=5 --output=model --soc_version=Ascend310B4- 若用户在执行模型转换命令前关闭了配置环境变量的终端窗口,需参考3与5,在新终端窗口再次配置Python以及CANN的环境变量。
- 转换模型失败,可参见应用进程占用内存超出限制导致系统异常终止解决。
表1 参数说明
参数名 参数说明 --model 原始模型文件,填写模型文件时需要带上格式,如.onnx。 --weight 原始模型权重,该参数在转换Caffe模型场景下使用,其他框架不使用。 --framework 原始框架类型,各框架对应的数值如下: 0:Caffe; 1:MindSpore; 3:Tensorflow; 5:ONNX --output 保存转换后的om离线推理模型文件路径。 --soc_version 昇腾AI处理器型号。 -
若提示如下信息,则说明模型转换成功,若模型转换失败,则请参见错误码参考进行定位。
ATC run success成功执行命令后,在--output参数指定的路径下,可查看离线模型(如:model.om)。
模型编译时,若遇到AI CPU算子不支持某种数据类型导致编译失败的场景,可通过启用Cast算子自动插入特性快速将输入转换为算子支持的数据类型,从而实现网络的快速打通,详细流程请参见开启AI CPU Cast算子自动插入特性。
其他常用转换参数说明
模型转换基础示例介绍了模型转换必须使用的参数,接下来以YoloV5模型和SVTR模型为例介绍其他常用参数的使用方法。更多模型转换参数说明请参见《ATC模型转换》中“参数说明”章节。
单击链接或使用wget命令下载[YoloV5模型](https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Atlas 200I DK A2/DevKit/models/sdk_cal_samples/yolo_sdk_python_sample.zip)代码包,在model目录中获取onnx模型文件。
wget https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Atlas%20200I%20DK%20A2/DevKit/models/sdk_cal_samples/yolo_sdk_python_sample.zip
YoloV5模型转换命令如下:
atc --model=yolov5s.onnx --framework=5 --output=yolov5s_bs1 --input_format=NCHW --soc_version=Ascend310B4 --input_fp16_nodes="images"
单击链接或使用wget命令下载[SVTR模型](https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Atlas 200I DK A2/DevKit/models/sdk_cal_samples/ocr_acl_sample.zip)代码包,在models目录中获取onnx模型文件。
wget https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Atlas%20200I%20DK%20A2/DevKit/models/sdk_cal_samples/ocr_acl_sample.zip
SVTR模型转换命令如下:
atc --model=svtr.onnx --framework=5 --input_shape='x:1,3,48,1440' --input_format=NCHW --soc_version=Ascend310B4 --output=svtr
表2 参数说明
| 参数名 | 参数说明 |
|---|---|
| --input_format | 输入Tensor的内存排列方式,NCHW指代batch、channels、height、width。 - 当原始框架为Caffe时,支持NCHW、ND(表示支持任意维度格式,N<=4)两种格式,默认为NCHW。 - 当原始框架为ONNX时,支持NCHW、NCDHW、ND(表示支持任意维度格式,N<=4)三种格式,默认为NCHW。 - 当原始框架是TensorFlow时,支持NCHW、NHWC、ND、NCDHW、NDHWC五种输入格式,默认为NHWC。 - 如果TensorFlow模型是通过ONNX模型转换工具输出的,则该参数必填,且值为NCHW。 - 如果原始模型中含有带data_format入参的算子,则该参数必填,推荐取值为ND,模型转换过程中会根据data_format属性的算子,推导出具体的format。若用户无法确定输入数据格式,则推荐指定为ND。 - 当原始框架为MindSpore时,只支持配置为NCHW。 一般情况下不需要使用该参数,如果用户开发的应用代码前处理对内存排列有要求,可以使用该参数并填写所需的内存排列方式。 |
| --input_shape | 模型的输入节点名称和shape,shape的格式一般为[batch,channels,height,width]。 一般情况下不需要使用该参数,如果要转换的模型为动态shape的ONNX模型时,需要使用该参数并填写shape。 本文以将一个动态shape的SVTR模型转换为静态om模型为例。 |
| --input_fp16_nodes | 指定输入数据类型为FP16的输入节点名称。若不指定,则默认是float32数据类型。 此参数可根据用户需要选择是否指定,若为默认float32,则精度相对较高;若为float16,则性能相对较高,在精度无明显下降的情况下有利于性能的提升。 |
-
输入节点名称查看方法
使用Netron模型可视化工具打开(单击Open Model按钮)PC本地的模型文件,单击输入节点,查看输入节点名称。
图2 查看输入节点名称

-
输入节点shape查看方法和input_shape参数设置策略
使用Netron模型可视化工具打开模型,单击输入节点查看shape,可以看出输入节点x的shape为[p2o.DynamicDimension.0,3,48,p2o.DynamicDimension.1],这个模型的输入是NCHW格式。第一个输入和最后一个输入分别为batch_size和width,且都由一个string填充,这种情况该维度为动态参数值(有时batch_size和width值为-1,这种情况和由string填充等价)。此时如果将该动态shape模型转换为batch size为1,宽度为1440的静态om模型时,input_shape参数可以设置为[1,3,48,1440],1440为shape中的width,可以按需设置。
图3 查看shape
