华为Atlas200DK开发从零开始3.目标检测模型CANN部署——以YOLOX、YOLOv5和Nanodet为例(2)CANN模型的转换,ATC转换工具

前言

上一篇关于Atlas200DK博客CANN接口调用记录了CANN python接口的调用。

这一篇讲一讲怎么把模型转换为CANN框架的om模型,以及ATC模型转换工具。

注意! 本文默认已经在Atlas200DK上搭建好了CANN工具套件和运行环境。

深度学习模型在AI芯片上部署的一般流程

首先回顾一下上篇博客中的AI芯片部署流程。

ATC工具对应的就是Converter模型转换器部分。
在这里插入图片描述

通过ATC工具进行模型转换

ATC工具使用流程

ATC工具
上图是华为官方给出的CANN ATC运行流程,与openvino、tensorrt等其它模型转换平台有一个明显的不同是,ATC可以选择配置AIPP(Artificial Intelligence Pre-Processing)进行图像预处理提升效率。当然也可以省去该步骤,直接用CPU完成。

模型转换步骤

由于已经搭建好了CANN环境,因此可以直接准备模型。

atc工具目前支持caffe的.caffemodel,tensorflow的.pb,onnx的.onnx,mindspore四种类型的模型,我个人推荐采用onnx模型进行转换,因为绝大部分框架都能转为onnx,而onnx相对容易进行结构修改和优化。

1.其他框架转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
)

2. onnx模型修改与优化

部分模型使用了CANN不支持的算子(比如一些激活函数,Swish,SiLU等),此时需要将onnx模型中的不支持换成近似的算子(最常用的Relu)。

至于如何修改onnx的结构,过几天我会更新一个onnx专题。

3.使用ATC转换

下面这个是基础命令,这样输出的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模型部署代码了

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值