作者:昇腾实战派

小模型在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)。

解决方案

  1. 去掉out_nodes并设置export DUMP_GE_GRAPH=2重新执行atc
  2. 在原始onnx模型中找到对应的concat名字
  3. 在生成的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版本。

版本对比图示
在这里插入图片描述

解决方案:导出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模型转换过程中遇到问题时,建议按照以下系统化流程排查:

  1. 基础排查:首先检查错误码,排除工具使用问题
  2. 深度调试:生成DEBUG日志和GE图进行详细分析
  3. 常见问题对照:参考上述常见问题及解决方案
  4. 技术支援:如问题仍无法解决,及时收集相关日志联系华为技术支持
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐