小模型在昇腾NPU上的推理部署:【onnx转om失败问题定位思路】
在昇腾NPU上进行模型推理部署时,通常需要将训练框架导出的ONNX模型转换为昇腾专用的OM模型格式。然而,在实际的模型转换过程中,开发者经常会遇到ATC(Ascend Tensor Compiler)工具报错导致转换失败的情况。本文基于实际项目经验,系统总结了ONNX转OM失败的常见问题及定位思路,为开发者提供实用的排查指南。基础排查:首先检查错误码,排除工具使用问题深度调试:生成DEBUG日志和
作者:昇腾实战派
小模型在NPU上的推理部署: 【知识地图】
背景概述
在昇腾NPU上进行模型推理部署时,通常需要将训练框架导出的ONNX模型转换为昇腾专用的OM模型格式。然而,在实际的模型转换过程中,开发者经常会遇到ATC(Ascend Tensor Compiler)工具报错导致转换失败的情况。本文基于实际项目经验,系统总结了ONNX转OM失败的常见问题及定位思路,为开发者提供实用的排查指南。
一、ATC报错定位方法
1. 基础排查步骤
首先根据返回值错误码查询ATC错误码参考资料,排除工具使用不当导致的报错。
2. 深度调试方法
如果错误码参考资料建议"联系华为工程师解决",按以下步骤操作:
生成DEBUG日志和GE图
#!/bin/bash
source /usr/local/Ascend/ascend-toolkit/set_env.sh
# 日志控制
export ASCEND_GLOBAL_LOG_LEVEL=0 #debug 0 -> info 1 -> warning 2 ->error 3
export ASCEND_SLOG_PRINT_TO_STDOUT=1 #1表示输出到屏幕,方便日志重定向
# GE pbtxt图控制
export DUMP_GE_GRAPH=2 #不建议修改成其它级别
export DUMP_GRAPH_LEVEL=2 #推荐配置,动态shape场景下设为1可得到更多子图
atc --model=./onnx_model.onnx \
--framework=5 \
--output=./om_model \
--log=debug \
--soc_version=Ascend310P3 \
2>&1 | tee atc_debug.log
3. 问题上报
准备好相关日志和调试信息后,联系华为技术支持人员。
二、ATC模型转换常见问题汇总
1. GetInputConstData报错:node[%s]'s input[%s]'s peer node is not const
问题描述:算子只支持const输入,但模型实际给的是tensor。
常见原因:算子一般在infershape阶段或fusion pass代码里调用GetInputConstData接口。
解决方案:
- 联系华为工程师进一步定位确认
- 尝试通过onnxsim简化模型,将tensor转换为const
2. E19010错误:Check op[Op_Name]'s type[ai.onnx::version::Op_Name] failed, the type is unsupported.
常见原因:
- atc和opp两个run包版本不匹配,导致so加载失败
- 输入模型中存在自定义算子,但该自定义算子未实现plugin
解决方案:
确认版本匹配后检查so中是否包含该plugin:
cd ${path_to_run_package}/opp/framework/built-in/onnx
strings libops_all_onnx_plugin.so |grep Op_Name
# 返回结果包括ParseParams或ai.onnx::11::Op_Name类似的字样则已实现该算子
如果是自定义算子,参考sample仓示例代码编写自定义插件。
3. 指定out_nodes参数报错:Can not find src node (%s) in graph.
问题现象:ONNX算子使用GE一对多功能适配实现,模型中的OP(如Concat_572)在GE里会改名(如PartitionedCall_ConcatD_28)。
解决方案:
- 去掉
out_nodes并设置export DUMP_GE_GRAPH=2重新执行atc - 在原始onnx模型中找到对应的concat名字
- 在生成的GE图中找到对应位置的concat算子,使用新name作为
out_nodes入参
错误示例:
# 错误用法(经过GE改图后已不存在Concat_572节点)
atc --framework=5 --model=model.onnx --output=outname --out_nodes="Concat_572:0;Reshape_576:0;Sigmoid_604:0" --input_format=NCHW --input_shape="input:1,3,800,1216" --log=debug --soc_version=Ascend310
正确示例:
# 正确用法(使用新节点名)
atc --framework=5 --model=model.onnx --output=outname --out_nodes="PartitionedCall_ConcatD_28:0;Reshape_576:0;Sigmoid_604:0" --input_format=NCHW --input_shape="input:1,3,800,1216" --log=debug --soc_version=Ascend310
节点名映射示例:
4. E79999错误:[Resize_xxx] The input_size is error.
问题现象:
根本原因:输入ONNX模型的Resize算子低于V11版本。
- V11版本的Resize最多有4个输入
- 低版本Resize只有两个输入
版本对比图示:
解决方案:导出ONNX时设置opset_version=11。
5. 执行ATC命令后当前目录出现大量CCE文件
问题现象:
原因分析:之前问题定位时修改CANN包得到CCE文件,但忘记修改还原。
解决方案:重装CANN包,环境上有多个CANN包时,建议重装CANN包。
6. ATC转OM文件时报错:Multi-batch not support middle dynamic shape
问题现象:
根本原因:ATC不支持中间张量存在动态维度,某些复杂函数无法被ATC追踪以计算形状。
具体案例:以SAM模型为例,torch2.1.0及以上版本中的torch.repeat_interleave函数内部使用tile和onehot算子,输入动态形状时难以追踪。
解决方案:替换为等价操作(unsqueeze,expand等)后转OM成功。
总结
ATC模型转换过程中遇到问题时,建议按照以下系统化流程排查:
- 基础排查:首先检查错误码,排除工具使用问题
- 深度调试:生成DEBUG日志和GE图进行详细分析
- 常见问题对照:参考上述常见问题及解决方案
- 技术支援:如问题仍无法解决,及时收集相关日志联系华为技术支持
更多推荐



所有评论(0)