ATC:一个能将主流开源框架模型转换为昇腾模型的神奇工具
摘要:本文介绍了昇腾CANN提供的模型转换工具ATC,介绍了其功能、架构,并以具体样例介绍了该工具的基本使用方法以及常用设置。
本文分享自华为云社区《使用ATC工具将主流开源框架模型转换为昇腾模型》,作者: 昇腾CANN。
什么是ATC,它能做什么?
昇腾张量编译器(Ascend Tensor Compiler,简称ATC)是昇腾CANN架构体系下的模型转换工具:
- 它可以将开源框架的网络模型(例如TensorFlow、ONNX等)转换为昇腾AI处理器支持的模型文件(.om格式),用于后续的模型推理。
- 它可以将基于Ascend IR定义的单算子描述文件(*.json格式)转换为昇腾AI处理器支持的模型文件(.om格式),用于后续在整网中验证算子功能。
模型转换过程中,ATC会进行算子调度优化、权重数据重排、内存使用优化等操作,对开源框架的网络模型做进一步调优,使其高效地在昇腾AI处理器上执行。
ATC工具功能架构

开源框架网络模型编译流程:
- 使用ATC工具转换模型时,开源框架网络模型经过Parser解析后,转换为昇腾的中间图IR Graph。
- 中间图IR Graph经过图准备,图拆分,图优化,图编译等一系列操作后,转成适配昇腾AI处理器的*.om模型文件。
- 后续用户可调用AscendCL提供的模型加载、执行等接口实现模型推理。
单算子编译流程:
- 使用ATC工具转换单算子时,单算子经过编译后,转换成适配昇腾AI处理器的单算子*.om模型文件。
- 后续用户可调用AscendCL提供的单算子模型加载、执行等接口在整网中验证单算子功能。
如何使用ATC工具
下面以Caffe框架ResNet-50网络模型为例,介绍如何使用ATC工具转换模型。
1. 将Caffe框架ResNet-50网络模型的模型文件*.prototxt、权重文件*.caffemodel上传至ATC工具所在的Linux服务器。
2. 执行如下命令进行模型转换。
atc --framework=0 --soc_version=${soc_version}
--model=$HOME/mod/resnet50.prototxt
--weight=$HOME/mod/resnet50.caffemodel
--output=$HOME/module/out/caffe_resnet50
参数解释如下:
- --framework:原始网络模型框架类型,0表示Caffe框架。
- --soc_version:指定模型转换时昇腾AI处理器的版本,例如Ascend310。
- --model:原始网络模型文件路径,含文件名。
- --weight:原始网络模型权重文件路径,含文件名,仅当原始网络模型是Caffe时需要指定。
- --output:转换后的*.om模型文件路径,含文件名,转换成功后,模型文件名自动以.om后缀结尾。
3. 若提示ATC run success信息,则说明模型转换成功。
在--output参数指定的路径下,可查看转换后的模型文件,例如caffe_resnet50.om。
ATC工具支持更多特性
上述只给出了ATC工具进行模型转换最基本的命令,本章节给出ATC工具支持的更多特性,方便用户进一步了解。
- ATC工具支持将原始模型文件或昇腾*.om模型文件转换成json格式:
- 原始模型文件—>json文件
atc --mode=1 --framework=0 --om=$HOME/mod/resnet50.prototxt
--json=$HOME/mod/out/caffe_resnet50.json
- 昇腾*.om模型文件—>json文件
atc --mode=1 --om=$HOME/mod/out/caffe_resnet50.om
--json=$HOME/mod/out/caffe_resnet50.json
- ATC工具支持自定义*.om模型的输入输出数据类型:
模型转换时支持指定网络模型的输入或输出节点的数据类型、Format,支持设置精度等。
此处的示例命令场景:针对Caffe框架ResNet50网络模型,转换后的模型输入为FP16类型,指定Pooling算子作为输出,并且该输出节点为FP16类型。
atc --framework=0 --soc_version=${soc_version}
--model=$HOME/mod/resnet50.prototxt
--weight=$HOME/mod/resnet50.caffemodel
--output=$HOME/mod/out/caffe_resnet50 --input_fp16_nodes="data"
--out_nodes="pool1:0" --output_type="pool1:0:FP16"
- ATC工具支持设置动态BatchSize/动态分辨率:
某些推理场景,如检测出目标后再执行目标识别网络,由于目标个数不固定导致目标识别网络输入BatchSize不固定;如果每次推理都按照最大的BatchSize或最大分辨率进行计算,会造成计算资源浪费,因此,模型转换需要支持动态BatchSize和动态分辨率的设置,实际推理时,通过AscendCL接口设置本次推理所需的BatchSize和动态分辨率。
- 动态BatchSize
atc --framework=0 --soc_version=${soc_version}
--model=$HOME/mod/resnet50.prototxt
--weight=$HOME/mod/resnet50.caffemodel
--output=$HOME/mod/out/caffe_resnet50
--input_shape="data:-1,3,224,224" --dynamic_batch_size="1,2,4,8"
其中,“--input_shape ”中的“-1”表示设置动态BatchSize,具体支持哪些BatchSize由“--dynamic_batch_size”决定。
- 动态分辨率
atc --framework=0 --soc_version=${soc_version}
--model=$HOME/mod/resnet50.prototxt
--weight=$HOME/mod/resnet50.caffemodel
--output=$HOME/mod/out/caffe_resnet50
--input_shape="data:1,3,-1,-1" --dynamic_image_size="224,224;448,448"
其中,“--input_shape ”中的“-1,-1”表示设置动态分辨率,具体支持哪些分辨率由“--dynamic_image_size ”决定。
更多介绍
关于ATC工具更多参数和特性说明,请登录昇腾社区查阅:
[1]昇腾文档中心
[2]昇腾社区在线课程
[2]昇腾论坛
ATC:一个能将主流开源框架模型转换为昇腾模型的神奇工具的更多相关文章
- Git8.3k星,十万字Android主流开源框架源码解析,必须盘
为什么读源码 很多人一定和我一样的感受:源码在工作中有用吗?用处大吗?很长一段时间内我也有这样的疑问,认为哪些有事没事扯源码的人就是在装,只是为了提高他们的逼格而已. 那为什么我还要读源码呢?一刚开始 ...
- tensorflow :ckpt模型转换为pytorch : hdf5模型
参考链接:https://github.com/bermanmaxim/jaccardSegment/blob/master/ckpt_to_dd.py import tensorflow as tf ...
- 转】机器学习开源框架Mahout配置与入门研究
原博文出自于:http://www.ha97.com/5803.html 感谢! PS:机器学习这两年特别火,ATB使劲开百万到几百万年薪招美国牛校的机器学习方向博士,作为一个技术控,也得折腾下 ...
- .Net开源框架列表
API 框架 NancyFx:轻量.用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台.官网 ASP.NET WebAPI:快捷创建 HTTP 服务 ...
- 主流PHP框架性能评测 (引用)
主要涉及到的框架有 CodeIgniter 老品牌易用性框架yaf 鸟哥用c写的php扩展,高性能框架yii 自动生成代码(gii)laravel 号称最优雅的框架swoole framework 支 ...
- Delphi下IOCP开源框架:DIOCP 成功应用案例分享
首先说明,该项目不是本人的项目,本文转自盒子. 该项目使用的DIOCP版本为1.0,目前diocp为3.5 以下是盒子的原文 ------------------------------------- ...
- Web前端开发必不可少的9个开源框架
大多数人想到Web开发时,通常会想到HTML或JavaScript,往往忽略了CSS,根据Wikipedia的说法,CSS既是网页中最重要也是最常被遗忘的部分之一,尽管它是万维网的三大基础技术之一. ...
- 25类Android常用开源框架
1.图片加载,缓存,处理 框架名称 功能描述 Android Universal Image Loader 一个强大的加载,缓存,展示图片的库,已过时 Picasso 一个强大的图片下载与缓存的库 F ...
- 标准盒模型与IE盒模型之间的转换
首先上图,这两张很明显可以看出IE盒模型和标准盒模型之间的差别. 当然今天不是去细细追究两种模型具体是怎么去计算布局的,那个很多文章已经已经有过了,不再重复.以前刚开始学习盒模型的时候,就学到的是IE ...
- [深度学习] Pytorch模型转换为onnx模型笔记
本文主要介绍将pytorch模型准确导出为可用的onnx模型.以方便OpenCV Dnn,NCNN,MNN,TensorRT等框架调用.所有代码见:Python-Study-Notes 文章目录 1 ...
随机推荐
- LeetCode HOT 100:在排序数组中查找元素的第一个和最后一个位置
题目:34. 在排序数组中查找元素的第一个和最后一个位置 题目描述: 给你一个递增数组,和一个目标值target,最终返回数组中第一次出现target和最后一次出现target的下标.如果该数组中没有 ...
- Nmap扫描参数
执行Nmap/nmap --help查看帮助文档,将显示Namp的用法及其功能Nmap的相关参数的含义与用法:扫描目标时用到的参数:-iL:从文件中导入目标主机或目标网段-iR:随意选择目标主机--e ...
- python 中变量的命名规则与注释
变量命名规则 1.变量名必须是大小写英文字母.数字或下划线 _ 的组合,不能用数字开头,并且对大小写敏感 2.关键字不能用于命名变量,关键字一共有35个,以下为关键字的获取 注释 代码注释提高了代码的 ...
- java Jdbc 简单方法
1.注册驱动(第一种方法) Class.forName(com.mysql.jdbc.Driver"); 2.获得连接DriverManager.getConnection(url,user ...
- (已转)Linux基础第六章 信号
6.1 前言 本章简单描述信号.信号是Linux系统中,内核和进程通信的一种方式.如果内核希望打断进程的顺序执行,那么内核会在进程的PCB中记录信号.而当这个进程被分配到CPU,进入执行状态时,首先会 ...
- CH32V307以太网(芯片内部10M)-针对新固件的Lib库
沁恒的CH32V307网络库在前段时间做了一个更新,相对于以前的Lib,主要的功能没有什么特别大的变化,但是底层的一些操作仔细看的话,还是不少的区别的. 首先,官方提供的例程,工程结构以及头文件优一些 ...
- [C++]C++11:Function与Bind
std::function 它是函数.函数对象.函数指针.和成员函数的包装器,可以容纳任何类型的函数对象,函数指针,引用函数,成员函数的指针. 以统一的方式处理函数.函数对象.函数指针.和成员函数. ...
- CodeForces 构造题专项解题报告
CodeForces 构造题专项解题报告 \(\newcommand \m \mathbf\)\(\newcommand \oper \operatorname\) \(\text{By DaiRui ...
- SOFAJRaft模块启动过程
本篇文章旨在分析SOFAJRaft中jraft-example模块的启动过程,由于SOFAJRaft在持续开源的过程中,所以无法保证示例代码永远是最新的,要是源代码有较大的变动,亦或出现纰漏.错误的地 ...
- 上古神兵,先天至宝,Win11平台安装和配置NeoVim0.8.2编辑器搭建Python3开发环境(2023最新攻略)
毫无疑问,我们生活在编辑器的最好年代,Vim是仅在Vi之下的神级编辑器,而脱胎于Vim的NeoVim则是这个时代最好的编辑器,没有之一.异步支持.更好的内存管理.更快的渲染速度.更多的编辑命令,是大神 ...