当前位置: 首页 > article >正文

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

问题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 类型

相关文章:

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

问题1&#xff1a;repeat_interleave 无法转译 具体报错为&#xff1a; TypeError: torch._C.Value object is not iterable (Occurred when translating repeat_interleave).原因是我的模型代码中有&#xff1a; batch_indices torch.repeat_interleave(torch.arange(can…...

利用prompt技术结合大模型对目标B/S架构软件系统进行测试

利用prompt技术结合大模型对目标B/S架构软件系统进行测试,可参考以下步骤和方法: 测试需求理解与prompt设计 明确测试点:梳理B/S架构软件系统的功能需求、非功能需求(如性能、安全性、兼容性等),确定具体的测试点,如用户登录功能、数据查询功能、系统响应时间要求等。设…...

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;培养华为产业链所…...

力扣-二叉树-257 二叉树的所有路径

思路 除去根节点&#xff0c;每一层添加->val&#xff0c;然后使用前序遍历的顺序 代码 class Solution { public:vector<string> res;void getTreePaths(string s, TreeNode* root){s "->";s to_string(root->val);if(root->left nullptr &…...

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

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

Vue.js 组件开发深入解析:Vue 2 vs Vue 3

Vue.js 是一个渐进式框架&#xff0c;旨在通过声明式渲染和组件化开发来提高开发效率和可维护性。组件是 Vue 应用的基本组成部分&#xff0c;几乎所有的功能都可以通过组件来实现。随着 Vue 3 的发布&#xff0c;Vue.js 引入了许多新的特性&#xff0c;使得组件的开发变得更加…...

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.…...

PHP 基础介绍

PHP 学习资料 PHP 学习资料 PHP 学习资料 PHP 是一种广泛使用的开源服务器端脚本语言&#xff0c;尤其适合 Web 开发&#xff0c;能轻松嵌入 HTML 中&#xff0c;生成动态网页内容。接下来&#xff0c;让我们一起了解 PHP 的基础内容。 一、PHP 的安装与配置 在开始编写 PH…...

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

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

package.json 文件配置

创建 Node.js 的配置文件 package.json npm init -y package.json 文件配置说明 配置说明示例name指定项目的名称&#xff0c;必须是小写字母&#xff0c;可以包含字母、数字、连字符&#xff08;-&#xff09;或下划线&#xff08;_&#xff09;&#xff0c;不能有特殊字符…...

Managed Lustre 和 WEKA:高性能文件系统的对比与应用

Managed Lustre 和 WEKA&#xff1a;高性能文件系统的对比与应用 1. 什么是 Managed Lustre&#xff1f;主要特点&#xff1a;适用场景&#xff1a; 2. 什么是 WEKA&#xff1f;主要特点&#xff1a;适用场景&#xff1a; 3. Managed Lustre 和 WEKA 的对比4. 如何选择 Managed…...

【matlab】大小键盘对应的Kbname

matlab中可以通过Kbname来识别键盘上的键。在写范式的时候&#xff0c;遇到一个问题&#xff0c;我想用大键盘上排成一行的数字按键评分&#xff0c;比如 Kbname(1) 表示键盘上的数字1&#xff0c;但是这种写法只能识别小键盘上的数字&#xff0c;无法达到我的目的&#xff0c;…...

Python实现从SMS-Activate平台,自动获取手机号和验证码(进阶版2.0)

前言 本文是该专栏的第52篇,后面会持续分享python的各种干货知识,值得关注。 在本专栏之前,笔者在文章《Python实现SMS-Activate接口调用,获取手机号和验证码》中,有详细介绍基于SMS-Activate平台,通过python来实现自动获取目标国家的手机号以及对应的手机号验证码。 而…...

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;它们在程序的运行、调试和分析过程…...

C#的DataTable类精简汇总

目录 一、DataTable概述 1.创建 DataTable 2.添加行 3.修改行 4.删除行 5.查询行 6.排序行 7.合并 DataTable 8.克隆 DataTable 9.复制 DataTable 10.使用 DataView 过滤和排序 11.使用 DataTable 的事件 12.使用 DataTable 的约束 13.使用 DataTable 的表达式列 …...

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…...

linux 板子的wifi模块连上路由器后,用udhcpc给板子wifi分配ip,udhcpc获取到ip,但没有写入wlan0网卡上

linux 板子的wifi模块连上路由器后&#xff0c;用udhcpc给板子wifi分配ip&#xff0c;udhcpc获取到ip,但没有写入wlan0网卡上 这里的问题是 /usr/share/udhcpc/default.script脚本有问题 用下面正确脚本&#xff0c;即可写进去 #!/bin/sh# udhcpc script for busybox # Copyr…...

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

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

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

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

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

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

如何使用CSS画一个三角形,原理是什么?

如何用 CSS 画一个三角形&#xff1f;原理和实战指南 一、核心原理 CSS 画三角形的本质是利用边框&#xff08;border&#xff09;的叠加特性。当一个元素的宽高为 0 时&#xff0c;其边框会以对角线形式相交&#xff0c;形成四个独立的三角形区域。通过控制某一边的边框颜色为…...

调用DeepSeek API接口:实现智能数据挖掘与分析

在当今数据驱动的时代&#xff0c;企业和开发者越来越依赖高效的数据挖掘与分析工具来获取有价值的洞察。DeepSeek作为一款先进的智能数据挖掘平台&#xff0c;提供了强大的API接口&#xff0c;帮助用户轻松集成其功能到自己的应用中。本文将详细介绍如何调用DeepSeek API接口&…...