【踩坑】pytorch模型导出部署onnx问题记录

news2025/2/15 23:05:59

问题1:repeat_interleave 无法转译

具体报错为:

TypeError: 'torch._C.Value' object is not iterable 
(Occurred when translating repeat_interleave).

原因是我的模型代码中有:

batch_indices = torch.repeat_interleave(torch.arange(cand_nums.shape[0]).to(device), cand_nums)
percep_feats_expanded = percep_feats[batch_indices]  # shape [ΣN_i, D_f, H', W']

这里cand_nums尺寸不固定,而在较低版本的 pytorch 中,onnx 静态图与 pytorch 动态张量操作不兼容,导致 repeat_interleave 操作无法转译。我这里cand_nums实际只在训练时可能有多个元素,推理时必定只有一个元素,加个if就解决了:

batch_size = cand_nums.shape[0]
if batch_size > 1:
    batch_indices = torch.repeat_interleave(torch.arange(cand_nums.shape[0]).to(device), cand_nums)
    percep_feats_expanded = percep_feats[batch_indices]  # shape [ΣN_i, D_f, H', W']
else:
    percep_feats_expanded = percep_feats.repeat(cand_nums[0], 1, 1, 1)  # shape [N, D_f, H', W']

后来发现高版本的 pytorch 已经兼容这种动态张量操作,但上面这样的if操作或许可以提升onnx的计算效率,毕竟推理时其实不需要动态大小

问题2:expected scalar type Long but found Float

报错的堆栈大致为:

[W shape_type_inference.cpp:419] Warning: Constant folding in symbolic shape inference fails: expected scalar type Long but found Float
Exception raised from data_ptr<long int> at /pytorch/build/aten/src/ATen/core/TensorMethods.cpp:5759 (most recent call first):
frame #0: c10::Error::Error(c10::SourceLocation, std::string) + 0x42 (0x7efd098d3a22 in /home/abc/anaconda3/envs/pmapnet/lib/python3.8/site-packages/torch/lib/libc10.so)
frame #1: c10::detail::torchCheckFail(char const*, char const*, unsigned int, std::string const&) + 0x5b (0x7efd098d03db in /home/abc/anaconda3/envs/pmapnet/lib/python3.8/site-packages/torch/lib/libc10.so)
frame #2: long* at::Tensor::data_ptr<long>() const + 0xde (0x7efd0ba1683e in /home/abc/anaconda3/envs/pmapnet/lib/python3.8/site-packages/torch/lib/libtorch_cpu.so)
frame #3: torch::jit::onnx_constant_fold::runTorchSlice_opset10(torch::jit::Node const*, std::vector<at::Tensor, std::allocator<at::Tensor> >&) + 0x47e (0x7efdae76068e in /home/abc/anaconda3/envs/pmapnet/lib/python3.8/site-packages/torch/lib/libtorch_python.so)
frame #4: torch::jit::onnx_constant_fold::runTorchBackendForOnnx(torch::jit::Node const*, std::vector<at::Tensor, std::allocator<at::Tensor> >&, int) + 0x1c5 (0x7efdae761985 in /home/abc/anaconda3/envs/pmapnet/lib/python3.8/site-packages/torch/lib/libtorch_python.so)
frame #5: <unknown function> + 0xaed38e (0x7efdae7a038e in /home/abc/anaconda3/envs/pmapnet/lib/python3.8/site-packages/torch/lib/libtorch_python.so)
frame #6: torch::jit::ONNXShapeTypeInference(torch::jit::Node*, std::map<std::string, c10::IValue, std::less<std::string>, std::allocator<std::pair<std::string const, c10::IValue> > > const&, int) + 0x906 (0x7efdae7a5146 in /home/abc/anaconda3/envs/pmapnet/lib/python3.8/site-packages/torch/lib/libtorch_python.so)
frame #7: <unknown function> + 0xaf4df4 (0x7efdae7a7df4 in /home/abc/anaconda3/envs/pmapnet/lib/python3.8/site-packages/torch/lib/libtorch_python.so)
frame #8: <unknown function> + 0xa71010 (0x7efdae724010 in /home/abc/anaconda3/envs/pmapnet/lib/python3.8/site-packages/torch/lib/libtorch_python.so)
frame #9: <unknown function> + 0x5015fe (0x7efdae1b45fe in /home/abc/anaconda3/envs/pmapnet/lib/python3.8/site-packages/torch/lib/libtorch_python.so)
frame #10: PyCFunction_Call + 0x52 (0x4f5572 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #11: _PyObject_MakeTpCall + 0x3bb (0x4e0e1b in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #12: _PyEval_EvalFrameDefault + 0x4dfc (0x4dcf0c in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #13: _PyEval_EvalCodeWithName + 0x2f1 (0x4d70d1 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #14: _PyFunction_Vectorcall + 0x19c (0x4e823c in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #15: _PyEval_EvalFrameDefault + 0x1153 (0x4d9263 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #16: _PyEval_EvalCodeWithName + 0x2f1 (0x4d70d1 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #17: _PyFunction_Vectorcall + 0x19c (0x4e823c in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #18: _PyEval_EvalFrameDefault + 0x1153 (0x4d9263 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #19: _PyEval_EvalCodeWithName + 0x2f1 (0x4d70d1 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #20: _PyFunction_Vectorcall + 0x19c (0x4e823c in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #21: _PyEval_EvalFrameDefault + 0x1153 (0x4d9263 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #22: _PyEval_EvalCodeWithName + 0x2f1 (0x4d70d1 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #23: _PyFunction_Vectorcall + 0x19c (0x4e823c in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #24: _PyEval_EvalFrameDefault + 0x49b1 (0x4dcac1 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #25: _PyEval_EvalCodeWithName + 0x2f1 (0x4d70d1 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #26: _PyFunction_Vectorcall + 0x19c (0x4e823c in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #27: _PyEval_EvalFrameDefault + 0x1153 (0x4d9263 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #28: _PyFunction_Vectorcall + 0x106 (0x4e81a6 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #29: _PyEval_EvalFrameDefault + 0x399 (0x4d84a9 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #30: _PyEval_EvalCodeWithName + 0x2f1 (0x4d70d1 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #31: PyEval_EvalCodeEx + 0x39 (0x585e29 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #32: PyEval_EvalCode + 0x1b (0x585deb in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #33: /home/abc/anaconda3/envs/pmapnet/bin/python() [0x5a5bd1]
frame #34: /home/abc/anaconda3/envs/pmapnet/bin/python() [0x5a4bdf]
frame #35: /home/abc/anaconda3/envs/pmapnet/bin/python() [0x45c538]
frame #36: PyRun_SimpleFileExFlags + 0x340 (0x45c0d9 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #37: /home/abc/anaconda3/envs/pmapnet/bin/python() [0x44fe8f]
frame #38: Py_BytesMain + 0x39 (0x579e89 in /home/abc/anaconda3/envs/pmapnet/bin/python)
frame #39: __libc_start_main + 0xf3 (0x7efdd0895083 in /lib/x86_64-linux-gnu/libc.so.6)
frame #40: /home/abc/anaconda3/envs/pmapnet/bin/python() [0x579d3d]
(function ComputeConstantFolding)
...
Traceback (most recent call last):
File "/home/abc/Sources/MyModel/utils/export.py", line 26, in <module>
export_onnx(model, 'path_matcher.onnx')
File "/home/abc/Sources/MyModel/utils/export.py", line 17, in export_onnx
torch.onnx.export(model, (sdmap_labels, cand_nums, percep_labels, percep_weights), output_path, verbose=True,
File "/home/abc/anaconda3/envs/pmapnet/lib/python3.8/site-packages/torch/onnx/__init__.py", line 275, in export
return utils.export(model, args, f, export_params, verbose, training,
File "/home/abc/anaconda3/envs/pmapnet/lib/python3.8/site-packages/torch/onnx/utils.py", line 88, in export
_export(model, args, f, export_params, verbose, training, input_names, output_names,
File "/home/abc/anaconda3/envs/pmapnet/lib/python3.8/site-packages/torch/onnx/utils.py", line 689, in _export
_model_to_graph(model, args, verbose, input_names,
File "/home/abc/anaconda3/envs/pmapnet/lib/python3.8/site-packages/torch/onnx/utils.py", line 501, in _model_to_graph
params_dict = torch._C._jit_pass_onnx_constant_fold(graph, params_dict,
RuntimeError: expected scalar type Long but found Float

错误信息看起来是类型不一致,但没有指出具体代码位置。
参考 #66623,疑似是 MultiheadAttention 在 pytorch v1.9 中导出的问题,升级到 v1.10 可解,其它帖子也有印证这一说法。我把 pytorch 升级到 2.6.0 这个问题确实没了

问题3:C++工程加载onnx模型时报Concat类型不匹配

C++代码中加载模型时抛出异常:

terminate called after throwing an instance of 'Ort::Exception'
  what():  Load model from my_model.onnx failed:Type Error: Type parameter (T) of Optype (Concat) bound to different types (tensor(int32) and tensor(int64) in node (/Concat_1).

错误信息给出了出错的位置,就比较好排查了,用 netron 打开 onnx 文件,搜索定位到 Concat_1 这个操作的位置:
netron
显然对应于代码中的这一行:

percep_feats_expanded = percep_feats.repeat(cand_nums[0], 1, 1, 1)

这里repeat操作的后三个参数就是图中 Concat1 的后面三个 Constant_output,它们都被当成了 int64 类型,而cand_nums[0]是 int32 类型的 tensor 元素,所以导致了 Concat 类型不匹配的问题。python 中因为隐式类型转换而不报错,onnx 转换后在 C++ 中对类型有严格要求,就会报错。解决办法是把cand_nums改成 int64 类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2298961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DeepSeek vs ChatGPT:AI对决中的赢家是……人类吗?

DeepSeek vs ChatGPT&#xff1a;AI对决中的赢家是……人类吗&#xff1f; 文章目录 DeepSeek vs ChatGPT&#xff1a;AI对决中的赢家是……人类吗&#xff1f;一、引言1. 背景2. 问题 二、DeepSeek vs ChatGPT&#xff1a;谁更胜一筹&#xff1f;2.1 语言生成能力评测对比场景…

基于ollama搭建本地deepseek大模型服务

基于ollama搭建本地deepseek大模型服务 简介准备工作系统要求ollama的安装ollama 模型ollama 安装流程ollama 如何运行大模型前端部署注意事项简介 本指南旨在帮助初学者在本地环境中设置和运行DeepSeek大模型服务。本文将使用Ollama平台来简化这一过程,确保即使是新手也能顺…

elementUI rules 判断 el-cascader控件修改值未生效

今天修改一个前端项目&#xff0c;增加一个多选字段&#xff0c;使用的是el-cascader控件&#xff0c;因页面是通过引用子页面组件形式使用&#xff0c;出现一个点选后再勾选原有值&#xff0c;输入框内不展示或取消后的也未正常隐藏&#xff0c;如果勾选的值是全新的则其他已选…

讯方·智汇云校华为授权培训机构的介绍

官方授权 华为授权培训服务伙伴&#xff08;Huawei Authorized Learning Partner&#xff0c;简称HALP&#xff09;是获得华为授权&#xff0c;面向公众&#xff08;主要为华为企业业务的伙伴/客户&#xff09;提供与华为产品和技术相关的培训服务&#xff0c;培养华为产业链所…

DeepSeek4j 已开源,支持思维链,自定义参数,Spring Boot Starter 轻松集成,快速入门!建议收藏

DeepSeek4j Spring Boot Starter 快速入门 简介 DeepSeek4j 是一个专为 Spring Boot 设计的 AI 能力集成启动器&#xff0c;可快速接入 DeepSeek 大模型服务。通过简洁的配置和易用的 API&#xff0c;开发者可轻松实现对话交互功能。 环境要求 JDK 8Spring Boot 2.7Maven/Gr…

MySQL数据库误删恢复_mysql 数据 误删

2、BigLog日志相关 2.1、检查biglog状态是否开启 声明: 当前为mysql版本5.7 当前为mysql版本5.7****当前为mysql版本5.7 2.1.1、Navicat工具执行 SHOW VARIABLES LIKE LOG_BIN%;OFF 是未开启状态&#xff0c;如果不是ON 开启状态需要开启为ON。{默认情况下就是关闭状态} 2.…

避雷,Ubuntu通过ollama本地化部署deepseek,open-webui前端显示

0.如题&#xff0c;预期在Ubuntu上本地化部署DeepSeek&#xff0c;通过浏览器访问达到chatgpt的对话效果。 1.裸机&#xff0c;安装Ubuntu。 原有的系统盘采用大白菜&#xff0c;下载24.04.1的镜像&#xff0c;插到电脑上&#xff0c;无法识别&#xff0c;重新查到笔记本&…

HCIA项目实践--静态路由的拓展配置

7.7 静态路由的拓展配置 网络中的两个重要思想&#xff1a; &#xff08;1&#xff09; 实的不行来虚的&#xff1b; &#xff08;2&#xff09; 范围太大&#xff0c;划分范围。&#xff08;分治&#xff09; 7.7.1 负载均衡 &#xff08;1&#xff09;定义 负载均衡是一种网…

缓存三大问题及其解决方案

缓存三大问题及其解决方案 1. 前言 ​ 在现代系统架构中&#xff0c;缓存与数据库的结合使用是一种经典的设计模式。为了确保缓存中的数据与数据库中的数据保持一致&#xff0c;通常会给缓存数据设置一个过期时间。当系统接收到用户请求时&#xff0c;首先会访问缓存。如果缓…

Unity崩溃后信息结合符号表来查看问题

目录 SO文件符号表对调试和分析的重要性调试方面分析方面 错误数据安装Logcat解释符号表设置符号文件路径生成解析 相关参考 SO文件 so 文件&#xff08;Shared Object File&#xff0c;共享目标文件&#xff09;和符号表紧密相关&#xff0c;它们在程序的运行、调试和分析过程…

DeepSeek官方发布R1模型推荐设置

今年以来&#xff0c;DeepSeek便在AI领域独占鳌头&#xff0c;热度一骑绝尘。其官方App更是创造了惊人纪录&#xff0c;成为史上最快突破3000万日活的应用&#xff0c;这一成绩无疑彰显了它在大众中的超高人气与强大吸引力。一时间&#xff0c;各大AI及云服务厂商纷纷投身其中&…

STM32 ADC介绍(硬件原理篇)

目录 背景 AD转换器 采样与保持 量化 编码 AD转换器转换原理 DA转换原理 AD转换原理 1.逐次逼近型AD转换器 2.并联比较型AD转换器 编码器 同步D触发器和边沿D触发器 基本RS触发器 同步RS触发器 同步D触发器 边沿型D触发器&#xff08;维持-阻塞D触发器&#xff…

pytest测试专题 - 1.2 如何获得美观的测试报告

<< 返回目录 1 pytest测试专题 - 1.2 如何获得美观的测试报告 1.1 背景 虽然pytest命令的报文很详细&#xff0c;用例在执行调试时还算比较方便阅读和提取失败信息&#xff0c; 但对于大量测试用例运行时&#xff0c;可能会存在以下不足 报文被冲掉测试日志没法归档 …

Bash 中的运算方式

目录 概述&#xff1a; 1. (()) 运算符 2. let 命令 3. expr 命令 4. $[] 直接运算 5. bc&#xff08;计算器&#xff0c;支持浮点数&#xff09; 6. awk&#xff08;强大的文本处理工具&#xff0c;也可计算&#xff09; 概述&#xff1a; Bash 本身只支持整数运算&am…

超纯水设备的智能化控制系统为用户带来安全简便的操作体验

随着信息技术的发展&#xff0c;智能化已经成为工业装备的重要发展方向之一。超纯水设备在这方面也走在了前列&#xff0c;配备了高性能的PLC控制系统及人机交互界面&#xff0c;实现了全方位的智能监控和自动化操作。本文将重点介绍该设备的智能化控制系统&#xff0c;探讨它如…

性格测评小程序03搭建用户管理

目录 1 创建数据源2 搭建后台3 开通权限4 搭建启用禁用功能最终效果总结 性格测评小程序我们期望是用户先进行注册&#xff0c;注册之后使用测评功能。这样方便留存用户的联系信息&#xff0c;日后还可以推送对应的相关活动促进应用的活跃。实现这个功能我们要先创建数据源&…

Linux-C/C++《七、字符串处理》(字符串输入/输出、C 库中提供的字符串处理函数、正则表达式等)

字符串处理在几乎所有的编程语言中都是一个绕不开的话题&#xff0c;在一些高级语言当中&#xff0c;对字符串的处理支 持度更是完善&#xff0c;譬如 C、 C# 、 Python 等。若在 C 语言中想要对字符串进行相关的处理&#xff0c;譬如将两个字符串进行拼接、字符串查找、两个…

基于若依开发的工程项目管系统开源免费,用于工程项目投标、进度及成本管理的OA 办公开源系统,非常出色!

一、简介 今天给大家推荐一个基于 RuoYi-Flowable-Plus 框架二次开发的开源工程项目管理系统&#xff0c;专为工程项目的投标管理、项目进度控制、成本管理以及 OA 办公需求设计。 该项目结合了 Spring Boot、Mybatis、Vue 和 ElementUI 等技术栈&#xff0c;提供了丰富的功能…

uni-app 学习(一)

一、环境搭建和运行 &#xff08;一&#xff09;创建项目 直接进行创建 &#xff08;二&#xff09;项目结构理解 pages 是页面 静态资源 打包文件&#xff0c;看我们想输出成什么格式 app.vue 页面的入口文件 main.js 是项目的入口文件 存放对打包文件的配置 pages 存放整…

【git-hub项目:YOLOs-CPP】本地实现03:跑自己的实例分割模型

本节博客,我们继续讲解,如何在cpu+windows上,跑通自己的实例分割模型。 目录 模型 类别名称 量化 导出模型 拉取最新代码 进入官网ultralytics 模型 该项目包括存储在 models 和 quantized_models 目录中的各种预训练标准 YOLO 模型: 模型类型模型名称标准模型yolo5…