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

目录

  • 前言
  • 深度学习模型在AI芯片上部署的一般流程
  • 通过ATC工具进行模型转换
    • ATC工具使用流程
    • 模型转换步骤
      • 1.其他框架转onnx
      • 2. onnx模型修改与优化
      • 3.使用ATC转换
  • 后记

前言

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

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

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

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

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

ATC工具对应的就是Converter模型转换器部分。
华为Atlas200DK开发从零开始3.目标检测模型CANN部署——以YOLOX、YOLOv5和Nanodet为例(2)CANN模型的转换,ATC转换工具_第1张图片

通过ATC工具进行模型转换

ATC工具使用流程

华为Atlas200DK开发从零开始3.目标检测模型CANN部署——以YOLOX、YOLOv5和Nanodet为例(2)CANN模型的转换,ATC转换工具_第2张图片
上图是华为官方给出的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模型部署代码了

你可能感兴趣的:(Atlas200dk算法部署,深度学习,python,人工智能)