上一篇关于Atlas200DK博客CANN接口调用记录了CANN python接口的调用。
这一篇讲一讲怎么把模型转换为CANN框架的om模型,以及ATC模型转换工具。
注意! 本文默认已经在Atlas200DK上搭建好了CANN工具套件和运行环境。
首先回顾一下上篇博客中的AI芯片部署流程。
上图是华为官方给出的CANN ATC运行流程,与openvino、tensorrt等其它模型转换平台有一个明显的不同是,ATC可以选择配置AIPP(Artificial Intelligence Pre-Processing)进行图像预处理提升效率。当然也可以省去该步骤,直接用CPU完成。
由于已经搭建好了CANN环境,因此可以直接准备模型。
atc工具目前支持caffe的.caffemodel,tensorflow的.pb,onnx的.onnx,mindspore四种类型的模型,我个人推荐采用onnx模型进行转换,因为绝大部分框架都能转为onnx,而onnx相对容易进行结构修改和优化。
onnx官方提供了多数常用框架的模型转换脚本,pytorch、paddle也内置了onnx转换接口。例如将pytorch yolox转换为onnx:
# model是已经加载了结构和权重的yolox_s模型
dummy_input = torch.randn(1, 3, 640, 640)
torch.onnx._export(
model,
dummy_input,
'yolox_s.onnx',
opset_version=args.opset
)
部分模型使用了CANN不支持的算子(比如一些激活函数,Swish,SiLU等),此时需要将onnx模型中的不支持换成近似的算子(最常用的Relu)。
至于如何修改onnx的结构,过几天我会更新一个onnx专题。
下面这个是基础命令,这样输出的om模型与原模型输入输出结构完全一致:
atc --model=model/yolox_s.onnx --framework=5 --output=model/yolox_s --soc_version=Ascend310
需要调整输入格式或者输入shape:
atc --model=model/yolox_s.onnx --framework=5 --output=model/yolox_s --soc_version=Ascend310 --input_format=NCHW --input_shape="image:1,3,640,640;"
需要调整输入格式或者输入shape,并配置AIPP:
atc --model=model/yolox_s.onnx --framework=5 --output=model/yolox_s --soc_version=Ascend310 --input_format=NCHW --input_shape="image:1,3,640,640;" --insert_op_conf='model/insert_op.cfg'
需要调整输入格式或者输入shape,并配置AIPP,并且将精度设置为fp16:
atc --model=model/yolox_s.onnx --framework=5 --output=model/yolox_s --soc_version=Ascend310 --input_format=NCHW --input_shape="image:1,3,640,640;" --insert_op_conf='model/insert_op.cfg' --precision_mode=force_fp16
# 如果要保持原图精度则 --precision_mode=allow_fp32_to_fp16
需要调整输入格式或者输入shape,并配置AIPP,并且将精度设置为fp16,并指定输出节点:
atc --model=model/yolox_s.onnx --framework=5 --output=model/yolox_s --soc_version=Ascend310 --input_format=NCHW --input_shape="image:1,3,640,640;" --insert_op_conf='model/insert_op.cfg' --precision_mode=force_fp16--out_nodes="out_name1:0;out_name1:0;out_name2:0"
这些基本上就包括了所有常用的转换指令。
接下来就是CANN模型部署代码了