昇腾实践丨ATC模型转换动态shape问题案例
本文分享自华为云社区《ATC模型转换动态shape问题案例》,作者:昇腾CANN。
ATC(Ascend Tensor Compiler)是异构计算架构CANN体系下的模型转换工具:它可以将开源框架的网络模型(如TensorFlow等)以及Ascend IR定义的单算子描述文件转换为昇腾AI处理器支持的离线模型;模型转换过程中,ATC会进行算子调度优化、权重数据重排、内存使用优化等具体操作,对原始的深度学习模型进行进一步的调优,从而满足部署场景下的高性能需求,使其能够高效执行在昇腾AI处理器上。
本期就分享几个关于ATC模型转换动态shape相关问题的典型案例,并给出原因分析及解决方法:
- 原始网络模型shape中存在不固定的维度值,模型转换未设置shape信息
- 动态BatchSize/动态分辨率/动态维度场景,只设置一个档位,模型转换失败
- 使用动态batchsize参数转模型时,其他档位设置了-1,模型转换失败
- 使用动态分辨率参数转模型时,其他档位设置了-1,模型转换失败
01 原始网络模型shape中存在不固定的维度值,模型转换未设置shape信息
问题现象描述
获取原始网络模型,执行如下命令进行模型转换:
atc --model=./resnet_shape.pb --framework=3 --output=./out/resnet_shape --soc_version=Ascend310
报错信息如下:
ATC run failed, Please check the detail log, Try 'atc --help' for more information E10001: Value [-1] for parameter [Inputs] is invalid. Reason: maybe you should set input_shape to specify its shape Solution: Try again with a valid argument.
原因分析
原始模型的shape存在不固定的维度值“-1”,模型输入样例如下,模型转换时,并未给不固定的维度值赋值。

解决措施
- 设置固定shape。
模型转换时,给不确定的维度值设置固定取值,示例如下:
atc --model=./resnet_shape.pb --framework=3 --output=./out/resnet_shape --soc_version=Ascend310 --input_shape="Inputs:1,224,224,3"
- 设置shape分档。
与动态BatchSize参数配合使用,使转换后的模型进行推理时,可以每次处理多种数量的图片,示例如下:
atc --model=./resnet_shape.pb --framework=3 --output=./out/resnet_shape --soc_version=Ascend310 --input_shape="Inputs:-1,224,224,3" --dynamic_batch_size="1,2,4,8"
这样转换后的离线模型,可以支持每次处理1、2、4、8张图片,而不用再进行4次模型转换。
- 设置shape范围。
模型转换时,将对应维度的值设置成一个范围,示例如下:
atc --model=./resnet_shape.pb --framework=3 --output=./out/resnet_shape --soc_version=Ascend910 --input_shape="Inputs:1~10,224,224,3"
这样转换后的离线模型,可以支持每次处理1~10张范围内的图片。
02 动态BatchSize/动态分辨率/动态维度场景,只设置一个档位,模型转换失败
问题现象描述
此类问题我们以--dynamic_batch_size参数为例进行说明。
使用ATC工具进行模型转换时,使用--dynamic_batch_size参数转换支持多个BatchSize的模型,转换命令样例如下:
atc --model=./resnet50_tensorflow_1.7.pb --input_shape="Placeholder:-1,224,224,3" --dynamic_batch_size="2" --soc_version=Ascend310 --output=./out/test --framework=3
报错信息如下:
ATC run failed, Please check the detail log, Try 'atc --help' for more information E10035: [--dynamic_batch_size], [--dynamic_image_size], or [--dynamic_dims] has [1] profiles, which is less than the minimum ([2]). Solution: Ensure that the number of profiles configured in [--dynamic_batch_size], [--dynamic_image_size], or [--dynamic_dims] is at least the minimum. TraceBack (most recent call last): [GraphOpt][Prepare] Failed to run multi-dims-process for graph[test].[FUNC:OptimizeAfterGraphNormalization][FILE:fe_graph_optimizer.cc][LINE:639] Call OptimizeAfterGraphNormalization failed, engine_name:AIcoreEngine, graph_name:test[FUNC:OptimizeAfterGraphNormalization][FILE:graph_optimize.cc][LINE:224] build graph failed, graph id:0, ret:1343225857[FUNC:BuildModelWithGraphId][FILE:ge_generator.cc][LINE:1656]
原因分析
使用ATC工具进行模型转换,如果使用了--dynamic_batch_size或--dynamic_image_size或--dynamic_dims动态shape参数时,请确保设置的档位数取值范围为(1,100],既必须设置至少2个档位,最多支持100档配置。
上述模型转换命令,只设置了一个档位,不符合参数设置要求。
解决措施
重新设置模型转换时的档位信息,至少设置2个档位,档位之间使用英文逗号分隔。改后样例如下:
atc --model=./resnet50_tensorflow_1.7.pb --input_shape="Placeholder:-1,224,224,3" --dynamic_batch_size="2,4" --soc_version=Ascend310 --output=./out/test --framework=3
03 使用动态batchsize参数转模型时,其他档位设置了-1,模型转换失败
问题现象描述
使用ATC工具进行模型转换时,使用--dynamic_batch_size参数转换支持多个BatchSize的模型,转换命令样例如下:
atc --model=./resnet50_tensorflow_1.7.pb --input_shape="Placeholder:-1,-1,-1,3" --dynamic_batch_size="2,4,8" --soc_version=Ascend310 --output=./out/test --framework=3
报错信息如下:
ATC run failed, Please check the detail log, Try 'atc --help' for more information E10018: Value [-1] for shape [1] is invalid. When [--dynamic_batch_size] is included, only batch size N can be –1 in [--input_shape]. Possible Cause: When [--dynamic_batch_size] is included, only batch size N can be –1 in the shape. Solution: Try again with a valid [--input_shape] argument. Make sure that non-batch size axes are not –1. TraceBack (most recent call last): [--dynamic_batch_size] is included, but none of the nodes specified in [--input_shape] have a batch size equaling –1.
原因分析
使用ATC工具进行模型转换,如果使用了--dynamic_batch_size参数,shape中只有N支持设置为"-1",且只支持N在shape首位的场景,既shape的第一位设置为"-1"。如果N在非首位场景下,请使用--dynamic_dims参数进行设置。
上述模型转换命令,shape中N、H、W都设置了"-1",不符合参数设置要求。
解决措施
重新设置模型转换时的参数信息,只设置shape中的N为"-1"。改后样例如下:
atc --model=./resnet50_tensorflow_1.7.pb --input_shape="Placeholder:-1,224,224,3" --dynamic_batch_size="2,4,8" --soc_version=Ascend310 --output=./out/test --framework=3
04 使用动态分辨率参数转模型时,其他档位设置了-1,模型转换失败
问题现象描述
使用ATC工具进行模型转换时,使用--dynamic_image_size参数转换支持多个分辨率的模型,转换命令样例如下:
atc --model=./resnet50_tensorflow_1.7.pb --input_shape="Placeholder:-1,-1,-1,3" --dynamic_image_size="448,448;224,224" --soc_version=Ascend310 --output=./out/test --framework=3
报错信息如下:
ATC run failed, Please check the detail log, Try 'atc --help' for more information E10019: When [--dynamic_image_size] is included, only the height and width axes can be –1 in [--input_shape]. Possible Cause: When [--dynamic_image_size] is included, only the height and width axes can be –1 in the shape. Solution: Try again with a valid [--input_shape] argument. Make sure that axes other than height and width are not –1.
原因分析
使用ATC工具进行模型转换,如果使用了--dynamic_image_size参数,shape中只有H、W支持设置为"-1",且只支持format为NCHW、NHWC格式;其他format场景,设置分辨率请使用--dynamic_dims参数。上述模型转换命令,shape中N、H、W都设置了"-1",不符合参数设置要求。
解决措施
重新设置模型转换时的参数信息,只设置shape中的H,W为"-1"。改后样例如下:
atc --model=./resnet50_tensorflow_1.7.pb --input_shape="Placeholder:1,-1,-1,3" --dynamic_image_size="448,448;224,224" --soc_version=Ascend310 --output=./out/test --framework=3
05 更多介绍
[1]昇腾文档中心:https://www.hiascend.com/zh/document
[2]昇腾社区在线课程:https://www.hiascend.com/zh/edu/courses
[3]昇腾论坛:https://www.hiascend.com/forum
号外!

华为将于2023年9月20-22日,在上海世博展览馆和上海世博中心举办第八届华为全联接大会(HUAWEICONNECT 2023)。本次大会以“加速行业智能化”为主题,邀请思想领袖、商业精英、技术专家、合作伙伴、开发者等业界同仁,从商业、产业、生态等方面探讨如何加速行业智能化。
我们诚邀您莅临现场,分享智能化的机遇和挑战,共商智能化的关键举措,体验智能化技术的创新和应用。您可以:
- 在100+场主题演讲、峰会、论坛中,碰撞加速行业智能化的观点
- 参观17000平米展区,近距离感受智能化技术在行业中的创新和应用
- 与技术专家面对面交流,了解最新的解决方案、开发工具并动手实践
- 与客户和伙伴共寻商机
感谢您一如既往的支持和信赖,我们热忱期待与您在上海见面。
大会官网:https://www.huawei.com/cn/events/huaweiconnect
欢迎关注“华为云开发者联盟”公众号,获取大会议程、精彩活动和前沿干货。
昇腾实践丨ATC模型转换动态shape问题案例的更多相关文章
- 开发实践丨昇腾CANN的推理应用开发体验
摘要:这是关于一次 Ascend 在线实验的记录,主要内容是通过网络模型加载.推理.结果输出的部署全流程展示,从而快速熟悉并掌握 ACL(Ascend Computing Language)基本开发流 ...
- 前端MVVM框架avalon - 模型转换1
轻量级前端MVVM框架avalon - 模型转换(一) 接上一章 ViewModel modelFactory工厂是如何加工用户定义的VM? 附源码 洋洋洒洒100多行内部是魔幻般的实现 1: fun ...
- 将List 中的ConvertAll的使用:List 中的元素转换,List模型转换, list模型转数组
一,直接入代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using S ...
- Verification of Model Transformations A Survey of the State-of-the-Art 模型转换的验证 对现状的调查
模型驱动工程范式认为软件开发生命周期由工件(需求规范.分析和设计文档.测试套件.源代码)支持,这些工件是表示要构建的系统不同视图的模型.存在一个由模型转换驱动的(半)自动构造过程,从系统的抽象模型开始 ...
- 一种基于RBAC模型的动态访问控制改进方法
本发明涉及一种基于RBAC模型的动态访问控制改进方法,属于访问控制领域.对原有RBAC模型进行了权限的改进和约束条件的改进,具体为将权限分为静态权限和动态权限,其中静态权限是非工作流的权限,动态权限是 ...
- 【tensorflow-v2.0】如何将模型转换成tflite模型
前言 TensorFlow Lite 提供了转换 TensorFlow 模型,并在移动端(mobile).嵌入式(embeded)和物联网(IoT)设备上运行 TensorFlow 模型所需的所有工具 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- SSAS Tabular表格模型实现动态权限管理
最近忽然对SSAS产生了浓厚兴趣,我看博客园上也米有写关于SSAS 2016下表格模型实现动态权限管理的文章,最近鼓捣了一下微软的样例,鼓捣好了,把过程中遇到的一些问题写出来,抛砖引玉,也算给自己一个 ...
- 【机器学习】使用CNN神经网络实现对图片分类识别及模型转换
仅做记录,后面慢慢整理 训练函数: from skimage import io, transform # skimage模块下的io transform(图像的形变与缩放)模块 import glo ...
- Bitter.Core系列六:Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore ORM 之 示例 DataTable 模型转换
当我们查询之前,我们先构造一个查询对象的输出DTO.如下图代码: public class TScoreSearchDto { /// <summary> /// 分数 /// </ ...
随机推荐
- Sell Pigs 题解
Sell Pigs 双倍经验 题目大意 有 \(n\) 个顾客前来买猪,共有 \(m\) 个猪圈,每个顾客携带着某一些猪圈的钥匙,需要买一定数量的猪.在顾客买完后,我们可以将打开的猪圈中的猪随意移动, ...
- 高性能日志脱敏组件:已支持 log4j2 和 logback 插件
项目介绍 日志脱敏是常见的安全需求.普通的基于工具类方法的方式,对代码的入侵性太强,编写起来又特别麻烦. sensitive提供基于注解的方式,并且内置了常见的脱敏方式,便于开发. 同时支持 logb ...
- Unity 在Preferences或Project Setting窗口创建自定义配置
官方文档链接 https://docs.unity3d.com/2020.3/Documentation/ScriptReference/SettingsProvider.html 一直不习惯使用Un ...
- JS深入之内存详解,数据结构,存储方式
理解了本文,就知道深拷贝和浅拷贝的底层,了解赋值的底层原理. 可以结合另一篇文章一起食用:深拷贝与浅拷贝的区别,实现深拷贝的方法介绍. 以下是正文: 栈数据结构 栈的结构就是后进先出(LIFO),如果 ...
- [Python]对称日!
def check(year): if (year%4 == 0 and year%100 != 0) or year%400 == 0: return True else: return False ...
- 【scipy 基础】--线性代数
SciPy的linalg模块是SciPy库中的一个子模块,它提供了许多用于线性代数运算的函数和工具,如矩阵求逆.特征值.行列式.线性方程组求解等. 相比于NumPy的linalg模块,SciPy的li ...
- 【Javaweb】什么是Listener监听器?
1.Listener监听器它是Javaweb的三大组件之一.Javaweb的三大组件分别是:Servelt程序,Filter过滤器,Listener监听器. 2.Listener它是JavaEE的规范 ...
- 【JSOI2008】火星人 (哈希+Splay)
题目 这种含有修改操作的就难以用后缀数组实现了,求LCP这种区间相等的类型可以想到用hash判断,同时LCP的答案大小符合二分条件可以二分求出,如果只有修改可以用线段树维护,因为还有有插入操作所以想到 ...
- MySQL运维7-Mycat水平分表
一.水平分表场景 在业务系统中,有一张日志表,业务系统每天都会产生大量的日志数据,单台服务器的数据存储即处理能力是有限的,可以对数据库表进行拆分,这时候就可以使用水平分表的策略 说明1:水平分表,每个 ...
- HDU-3591 混合背包
The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...