QCNet部署

关于QCNet部署的部分问题整理
为适配华为MDC510pro基于昇腾 AI 处理器的硬件架构,需将 PyTorch 模型先导出为 ONNX 通用中间格式,再通过华为 ATC 工具将 ONNX 模型转换为 MDC510pro 原生支持的 OM 离线模型格式。具体操作是先利用 torch.onnx.export () 导出 ONNX 模型,再执行 ATC 工具命令完成 OM 格式转换,最终实现模型在MDC510pro上的高效部署。
常用技巧
1.导出onnx时保留日志,用于查看python代码与onnx算子间的对应关系。通过torch.onnx.export(..., verbose=True)指定
2.使用Netron可视化onnx、om计算图
3.使用ATC工具将onnx转为om时,设置 export ASCEND_GLOBAL_LOG_LEVEL=0; export ASCEND_SLOG_PRINT_TO_STDOUT=1 环境变量输出算子转换日志。重定向到文件,使用grep awk 查看
4.华为MDC510pro仅支持opset为11的onnx
5.可通过python中onnx库直接修改onnx文件中计算图
6.模型中部分操作可以放到数据预处理流程中
静态图与动态图
静态图(如 ONNX、OM 格式)是先编译后执行的计算图范式,需在模型部署前完整定义所有算子节点、张量形状及计算流程,结构固定且可提前做算子融合、内存规划等硬件级优化;动态图(如 PyTorch 原生模式)是边执行边构建的计算图范式,计算流程随数据和代码逻辑动态生成,支持灵活的动态形状张量、动态控制流(循环 / 条件语句),开发调试更便捷,但无法提前完成硬件适配优化。
转静态图需修改模型结构 / 算子的原因
1.动态特性不兼容:动态图的动态形状、Python 原生变量依赖、动态控制流等特性,无法被静态图的静态编译逻辑识别,需修改模型结构(如固定张量维度、替换动态控制流为静态分支)或算子(如替换 nonzero 等动态形状算子)以满足静态图的静态推导要求;
2.算子 / 硬件适配约束:PyTorch 动态图中的原生算子(如 GRU/LSTM)、自定义算子,可能无对应静态图(ONNX/OM)算子映射,且部署硬件(如华为 MDC)对数据类型(如不支持 int64)、张量布局(如 NHWC 而非 NCHW)有明确限制,需替换兼容算子、调整模型结构以适配硬件算力调用规范;
3.编译优化需求:静态图需通过修改结构(如固化 BN 层参数)、替换算子(如移除稀疏操作)消除不确定性,才能完成常量折叠、算子融合等编译优化,保障部署时的低延迟、高稳定性。
常见问题
1.车载芯片不支持稀疏操作动态形状算子
部署工作早期推进缓慢的核心原因。例如NoneZero算子在输入维度固定时输入维度不固定。这类算子在车载算力卡上不被支持。
QCNet模型基于动态形状算子使用稀疏格式计算,这种方式降低了计算量但不被MDC支持。通过修改模型的数据处理方式和计算方式,使模型使用稠密计算的方式计算数据,消除模型对edge_index索引的依赖
2.各种模型、工具的格式需要按文档要求保持一致
3.Pytorch模型中输入输出变量的命名不能相同,否则会导致转换失败或重命名
静态计算图仅支持张量数据和算子,例如python中元组、列表、字典等类型不支持导出
4.模型输入输出必须为一个或多个张量
5.导出静态模型时出现常量折叠
ONNX 导出器在解析 Python 原生变量(而非 Tensor 变量)时,会在导出阶段将这些静态数值直接替换为常量并嵌入模型结构,而非保留其作为可动态调整的变量节点。这是因为 ONNX 是基于计算图的静态图格式,无法识别 Python 运行时的动态变量,只能将导出时刻的数值 “固化”,最终导致模型中该数值变为不可修改的固定值。
导致控制流固化,包括循环展开和分支裁剪。第三方库中也可能存在此问题,需要修改第三方库源码。
具体表现为python代码运行正常,导出的静态模型运行期间出错,例如索引越界等。可以通过裁剪关键参数避免动态依赖。
6.不支持算子
(1)repeat_interveal
(2)torch.nn.GRU
(3)ai.onnx::11::NonZero
(4)torch.cumsum
(5)aten::logical_not
(6)aten::scatter_reduce
部分算子可以通过其他算子组合进行替代,如果算子层面不能替代,可考虑删除部分相关功能或调整算法结构。
7.不同算子支持的数据类型不同
在模型格式转换时一般会自动转换数据类型,如果出现相关错误可以通过python代码直接修改onnx计算图
8.注意张量布局
NCHW、NCDHW、ND等,尤其输入是图片时需注意。输入为动态维度时需指定为ND格式
9.输入为动态维度时,维度大小和档位有限制
转换时注意-1占位符、动态维度档位、张量布局都要指定,例如:
--input_shape="data:1,-1,-1" --dynamic_dims="1,2;3,4;5" --input_format=ND 
10.自定义 PyTorch 算子无对应的昇腾 TBE 算子适配,无法转换为 OM 格式
11.PyTorch 模型中的 in-place 操作(如 x.add_())可能导致 ONNX 导出图结构异常,ATC 转换失败
12.流式推理适配问题
并行编码模式不符合时序数据输入逻辑,流式推理速度慢。可通过采用逐帧编码+拼接前序结果的流式方案,复用历史编码减少重复计算。
参考
1.https://zhuanlan.zhihu.com/p/720119469
2.https://zhuanlan.zhihu.com/p/22378900355

posted @ 2026-01-10 23:12  某某人8265  阅读(8)  评论(0)    收藏  举报