本文分享自华为云社区《ATC模型转换动态shape问题案例》,作者:昇腾CANN。

ATC(Ascend Tensor Compiler)是异构计算架构CANN体系下的模型转换工具:它可以将开源框架的网络模型(如TensorFlow等)以及Ascend IR定义的单算子描述文件转换为昇腾AI处理器支持的离线模型;模型转换过程中,ATC会进行算子调度优化、权重数据重排、内存使用优化等具体操作,对原始的深度学习模型进行进一步的调优,从而满足部署场景下的高性能需求,使其能够高效执行在昇腾AI处理器上。

本期就分享几个关于ATC模型转换动态shape相关问题的典型案例,并给出原因分析及解决方法:

  1. 原始网络模型shape中存在不固定的维度值,模型转换未设置shape信息
  2. 动态BatchSize/动态分辨率/动态维度场景,只设置一个档位,模型转换失败
  3. 使用动态batchsize参数转模型时,其他档位设置了-1,模型转换失败
  4. 使用动态分辨率参数转模型时,其他档位设置了-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问题案例的更多相关文章

  1. 开发实践丨昇腾CANN的推理应用开发体验

    摘要:这是关于一次 Ascend 在线实验的记录,主要内容是通过网络模型加载.推理.结果输出的部署全流程展示,从而快速熟悉并掌握 ACL(Ascend Computing Language)基本开发流 ...

  2. 前端MVVM框架avalon - 模型转换1

    轻量级前端MVVM框架avalon - 模型转换(一) 接上一章 ViewModel modelFactory工厂是如何加工用户定义的VM? 附源码 洋洋洒洒100多行内部是魔幻般的实现 1: fun ...

  3. 将List 中的ConvertAll的使用:List 中的元素转换,List模型转换, list模型转数组

    一,直接入代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using S ...

  4. Verification of Model Transformations A Survey of the State-of-the-Art 模型转换的验证 对现状的调查

    模型驱动工程范式认为软件开发生命周期由工件(需求规范.分析和设计文档.测试套件.源代码)支持,这些工件是表示要构建的系统不同视图的模型.存在一个由模型转换驱动的(半)自动构造过程,从系统的抽象模型开始 ...

  5. 一种基于RBAC模型的动态访问控制改进方法

    本发明涉及一种基于RBAC模型的动态访问控制改进方法,属于访问控制领域.对原有RBAC模型进行了权限的改进和约束条件的改进,具体为将权限分为静态权限和动态权限,其中静态权限是非工作流的权限,动态权限是 ...

  6. 【tensorflow-v2.0】如何将模型转换成tflite模型

    前言 TensorFlow Lite 提供了转换 TensorFlow 模型,并在移动端(mobile).嵌入式(embeded)和物联网(IoT)设备上运行 TensorFlow 模型所需的所有工具 ...

  7. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

  8. SSAS Tabular表格模型实现动态权限管理

    最近忽然对SSAS产生了浓厚兴趣,我看博客园上也米有写关于SSAS 2016下表格模型实现动态权限管理的文章,最近鼓捣了一下微软的样例,鼓捣好了,把过程中遇到的一些问题写出来,抛砖引玉,也算给自己一个 ...

  9. 【机器学习】使用CNN神经网络实现对图片分类识别及模型转换

    仅做记录,后面慢慢整理 训练函数: from skimage import io, transform # skimage模块下的io transform(图像的形变与缩放)模块 import glo ...

  10. Bitter.Core系列六:Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore ORM 之 示例 DataTable 模型转换

    当我们查询之前,我们先构造一个查询对象的输出DTO.如下图代码: public class TScoreSearchDto { /// <summary> /// 分数 /// </ ...

随机推荐

  1. 一些对dp突然的理解

    突然想到了一些理解,感觉有些模糊,怕忘记,就赶紧记下来就是对于状态的设计 用01背包举例子吧,我们设计状态的时候一定是要保证所有可能在最后优秀的子状态在前面的时候是能够保留下来的也就是我们的状态设计要 ...

  2. 文心一言 VS 讯飞星火 VS chatgpt (113)-- 算法导论10.2 5题

    五.用go语言,使用单向循环链表实现字典操作 INSERT.DELETE 和 SEARCH,并给出所写过程的运行时间. 文心一言: 在Go语言中,我们首先需要定义一个Node结构体来表示单向循环链表的 ...

  3. Util应用框架基础(五) - 异常处理

    本节介绍Util应用框架如何处理系统错误. 概述 系统在运行过程中可能发生错误. 系统错误可以简单分为两类: 系统异常 系统本身出现的错误. 业务异常 不满足业务规则出现的错误. 如何处理系统异常 如 ...

  4. 【MISC】[MoeCTF 2022]cccrrc --crc32爆破

    附件下载下来为压缩包,需要密码,查看该压缩包的内容 此处发现里面四个txt文件均已被加密,但是每个txt的内容都只有四个字节,符合crc32爆破条件,直接上脚本: import binascii im ...

  5. TortoiseGit 使用 OpenSSH Key

    中文互联网上没一个说这个东西的,还得是 stackoverflow,原文在这. 方法很简单,修改 TortoiseGit 默认 SSH Client: 修改为 Windows 系统默认 OpenSSH ...

  6. 一篇学会cron表达式

    1.定义 Cron表达式是一种用于定义定时任务的格式化字符串.它被广泛用于Unix.Linux和类Unix系统中,用于在指定的时间执行预定的任务.Cron表达式由6个字段组成,每个字段通过空格分隔开. ...

  7. 【Javaweb】Servlet* | 请求重定向【🖤🖤】

    请求重定向的含义 请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说.我给你一些地址,你去新地址访问,叫请求重定向(因为之前的地址可能已经废弃). 请求重定向的实现代码 请求重定向的第一种方 ...

  8. 洛谷P2579 [ZJOI2005]沼泽鳄鱼(矩阵快速幂,周期)

    例题:现在豆豆已经选好了两座石墩Start和End,他想从Start出发,经过K个单位时间后恰好站在石墩End上.假设石墩可以重复经过(包括Start和End),他想请你帮忙算算,这样的路线共有多少种 ...

  9. 三分钟使用github的技巧

    一.GitHub搜索技巧--找开发者 搜索条件 备注 location: location:china,匹配用户填写的地址在china language: language:javascript,匹配 ...

  10. 使用CompletableFuture实现多个异步任务并行完成后合并结果

    业务场景 需要同时从多个副本数据库中查询数据,并对查询结果进行合并去重处理后返回前端. 实现过程涉及多数据源切换,这里不作过多讨论. 编码实现 实现过程: 1.定义异步查询数据方法: 2.通过Comp ...