下载
中文
注册

使用ATC命令转换模型

本节介绍如何通过ATC工具将模型转换成支持在开发者套件上推理的离线om模型。

准备模型

  1. 获取网络模型。
    • ONNX:单击Link或使用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或使用wget命令下载该文件。
        wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/resnet50/resnet50.prototxt
      • 权重文件(*.caffemodel):单击Link或使用wget命令下载该文件。
        wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/resnet50/resnet50.caffemodel
  2. (可选)如果是直接将模型文件下载到Ubuntu系统,则可以直接进行模型转换操作;如果是将模型文件下载到PC Windows系统,需要参考配置SSH文件传输将模型上传到Ubuntu系统。
  3. 在下载的代码文件存放目录右键单击空白处,选择“Open in Terminal”打开命令行窗口。
    图1 打开终端
  4. 以下载ONNX模型为例,执行命令进入解压后模型文件存放目录。
    cd unetplusplus_sdk_python_sample/model

模型转换基础示例

以下介绍模型转换必须使用的参数。

  1. 以ONNX模型为例,执行如下命令生成离线模型(如下命令中使用的目录以及文件均为样例),模型转换必须使用的参数介绍如表1所示。
    atc --model=model.onnx --framework=5 --output=model --soc_version=Ascend310B4 
    表1 参数说明

    参数名

    参数说明

    --model

    原始模型文件,填写模型文件时需要带上格式,如.onnx。

    --weight

    原始模型权重,该参数在转换Caffe模型场景下使用,其他框架不使用。

    --framework

    原始框架类型,各框架对应的数值如下:

    0:Caffe; 1:MindSpore; 3:Tensorflow; 5:ONNX

    --output

    保存转换后的om离线推理模型文件路径。

    --soc_version

    昇腾AI处理器型号。

  2. 若提示如下信息,则说明模型转换成功,若模型转换失败,则请参见错误码参考进行定位。
    ATC run success

    成功执行命令后,在--output参数指定的路径下,可查看离线模型(如:model.om)。

    模型编译时,若遇到AI CPU算子不支持某种数据类型导致编译失败的场景,可通过启用Cast算子自动插入特性快速将输入转换为算子支持的数据类型,从而实现网络的快速打通,详细流程请参见开启AI CPU Cast算子自动插入特性

其他常用转换参数说明

模型转换基础示例介绍了模型转换必须使用的参数,接下来以YoloV5模型和SVTR模型为例介绍其他常用参数的使用方法。更多模型转换参数说明请参见使用ATC工具转换模型中“参数说明”章节。

单击链接或使用wget命令下载YoloV5模型代码包,在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模型代码包,在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