使用ATC工具将主流开源框架模型转换为昇腾模型

2024-01-05 12:20

本文主要是介绍使用ATC工具将主流开源框架模型转换为昇腾模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

01 什么是ATC,它能做什么?

昇腾张量编译器(Ascend Tensor Compiler,简称ATC)是昇腾CANN架构体系下的模型转换工具:什么是ATC,它能做什么?

  1. 它可以将开源框架的网络模型(例如TensorFlow、ONNX等)转换为昇腾AI处理器支持的模型文件(.om格式),用于后续的模型推理。

  1. 它可以将基于Ascend IR定义的单算子描述文件(*.json格式)转换为昇腾AI处理器支持的模型文件(.om格式),用于后续在整网中验证算子功能。

模型转换过程中,ATC会进行算子调度优化、权重数据重排、内存使用优化等操作,对开源框架的网络模型做进一步调优,使其高效地在昇腾AI处理器上执行。

02 ATC工具功能架构

  • 开源框架网络模型编译流程:

  1. 使用ATC工具转换模型时,开源框架网络模型经过Parser解析后,转换为昇腾的中间图IR Graph。

  1. 中间图IR Graph经过图准备,图拆分,图优化,图编译等一系列操作后,转成适配昇腾AI处理器的*.om模型文件。

  1. 后续用户可调用AscendCL提供的模型加载、执行等接口实现模型推理。

  • 单算子编译流程:

  1. 使用ATC工具转换单算子时,单算子经过编译后,转换成适配昇腾AI处理器的单算子*.om模型文件。

  1. 后续用户可调用AscendCL提供的单算子模型加载、执行等接口在整网中验证单算子功能。

03如何使用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。

04 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 ”决定。

05 更多介绍

关于ATC工具更多参数和特性说明,请登录昇腾社区查阅:

[1]昇腾文档中心

[2]昇腾社区在线课程

[3]昇腾论坛

这篇关于使用ATC工具将主流开源框架模型转换为昇腾模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/572847

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代