【Bug已解决】cannot load deepset-mxbai-embed-de-large-v1 without optimization 解决方案
【Bug已解决】cannot load deepset-mxbai-embed-de-large-v1 without optimization 解决方案一、现象长什么样把一个句子向量模型deepset/mxbai-embed-de-large-v1导出成 ONNX然后用下面的方式在 ONNX Runtime 里加载import onnxruntime as ort so ort.SessionOptions() so.graph_optimization_level ort.GraphOptimizationLevel.ORT_DISABLE_ALL sess ort.InferenceSession(mxbai-embed-de-large-v1.onnx, so, providers[CPUExecutionProvider])构造InferenceSession时直接抛错报错信息大致是onnxruntime.capi.onnxruntime_pybind11_state.RuntimeException: [ONNXRuntimeError] : 1 : FAIL : This is an invalid model. Inlining model with subgraphs is not supported. Please export model without using local functions, or enable graph optimization.或者另一类常见形态onnxruntime.capi.onnxruntime_pybind11_state.RuntimeException: [ONNXRuntimeError] : 1 : FAIL : Cannot infer shape for node ... Invalid rank for input xxx.只要把ORT_DISABLE_ALL改成ORT_ENABLE_ALL也就是允许优化同样的模型就能正常加载、正常推理。也就是说这个模型只有在开启图优化时才能加载一旦把优化关掉就彻底读不进来。下面所有分析都基于这个最小复现。二、背景mxbai-embed-de-large-v1是 deepset 发布的德语句向量模型结构是典型的 BERT-largeEmbedding → 多层LayerNormalizationAttentionIntermediate/OutputMLP → 顶层LayerNormalization→ReduceMean池化 → 归一化输出。把它转成 ONNX 一般走两条路transformers的torch.onnx.exportuse_external_data_formatTrue因为模型超过 2 GB权重必须走外部数据文件。用optimum的ORTModelForFeatureExtraction.from_pretrained(..., exportTrue)它内部会先导出再跑一轮 ORT 优化。两条路导出的 ONNX 都带一类局部函数local function / model subgraph或者依赖常数折叠才能得到静态形状的算子链。问题就出在这里。ONNX Runtime 的InferenceSession在ORT_DISABLE_ALL模式下只做最基础的拓扑校验和 shape 推断它不会展开模型的局部函数也不会做常数折叠。于是如果导出时把一部分子图塞进了 local functionoptimum 在高版本里为了复用会这么做ORT_DISABLE_ALL下的加载器根本不认识带有子图的模型直接报 “Inlining model with subgraphs is not supported”。如果模型里有Shape → Gather → ConstantOfShape这类动态尺寸链ORT_DISABLE_ALL不做常数折叠shape 推断就卡在符号维度上报 “Cannot infer shape”。这两个根因在mxbai-embed-de-large-v1上会同时出现optimum 导出的版本带 local function原始torch.onnx版本带动态尺寸链。三、根因根因可以归纳成一句话这个模型的 ONNX 结构本身依赖图优化阶段的工作展开局部函数、常数折叠、算子融合才能变成“可被直接加载”的扁平图而ORT_DISABLE_ALL跳过了这些阶段导致加载器在最优化的入口处就失败。具体有两层局部函数未展开optimum 在导出时会生成local_function定义并在主图里用func节点引用。ONNX Runtime 的加载器只在图优化GraphOptimizer::Apply→CommonSubexpressionElimination/FunctionFusion之前的函数内联 pass里处理这些func节点。ORT_DISABLE_ALL等于把整个GraphOptimizer关掉内联 pass 不跑加载器见到func节点就报 “not supported”。符号维度未定原始torch.onnx路径导出的图里有Shape(input_ids) → ConstOfShape → Expand这种链用来构造token_type_ids或 attention mask 的占位。ORT_DISABLE_ALL不做常数折叠这些链的输出维度停留在符号值比如batch和seq_len都是-1下游LayerNormalization的axes推断依赖具体轴序号符号维度下推断器无法落地于是报 “Invalid rank”。换句话说这不是模型算错了而是模型在“未优化”状态下结构不合法——它生来就是给“开了优化”的 ORT 用的。四、最小可运行复现下面这个脚本不依赖真实权重文件而是手工拼一个带 local function 的最小 ONNX复现“关掉优化就加载失败”的现象。它用onnx标准库构造图用onnxruntime实际加载演示根因。import numpy as np import onnx from onnx import helper, TensorProto import onnxruntime as ort def build_model_with_local_function(): # 主图调用一个 local function ReluAdd func_node helper.make_node( ReluAdd, [X], [Y], domainlocal.example, version1 ) add_node helper.make_node(Add, [Y, Bias], [Z], namefinal_add) # local function 定义Relu Add relu helper.make_node(Relu, [X], [r], domainlocal.example) inner_add helper.make_node(Add, [r, C], [Y], domainlocal.example) func helper.make_function( domainlocal.example, fnameReluAdd, inputs[X], outputs[Y], nodes[relu, inner_add], opset_imports[helper.make_opsetid(, 17)], ) graph helper.make_graph( [func_node, add_node], demo, [helper.make_tensor_value_info(X, TensorProto.FLOAT, [N, 2])], [ helper.make_tensor_value_info(Z, TensorProto.FLOAT, [N, 2]), helper.make_tensor_value_info(Y, TensorProto.FLOAT, [N, 2]), ], initializer[ helper.make_tensor(Bias, TensorProto.FLOAT, [2], [0.5, 0.5]), helper.make_tensor(C, TensorProto.FLOAT, [2], [0.1, 0.1]), ], ) model helper.make_model( graph, opset_imports[helper.make_opsetid(, 17)], functions[func], ) return model def try_load(level): model build_model_with_local_function() so ort.SessionOptions() so.graph_optimization_level level try: sess ort.InferenceSession(model.SerializeToString(), so, providers[CPUExecutionProvider]) out sess.run(None, {X: np.ones((3, 2), dtypenp.float32)}) print(flevel{level.name}: OK, Z[0]{out[0][0]}) except Exception as e: # noqa: BLE001 print(flevel{level.name}: FAIL - {type(e).__name__}: {e}) if __name__ __main__: try_load(ort.GraphOptimizationLevel.ORT_DISABLE_ALL) try_load(ort.GraphOptimizationLevel.ORT_ENABLE_ALL)把这段脚本跑起来你会看到levelORT_DISABLE_ALL: FAIL - RuntimeException: ... Inlining model with subgraphs is not supported ... levelORT_ENABLE_ALL: OK, Z[0][1.6 1.6]1.6 Relu(1)0.1 0.5验证计算正确。这正好复现了mxbai-embed-de-large-v1的现象关优化就失败开优化就正常。五、解决方案第一层最小直接修复最直接的修复不要在加载这个模型时关掉图优化。把ORT_DISABLE_ALL去掉或者显式设成ORT_ENABLE_ALL/ORT_ENABLE_EXTENDED。import onnxruntime as ort so ort.SessionOptions() # 关掉“禁用优化”的写法让 ORT 默认跑优化 so.graph_optimization_level ort.GraphOptimizationLevel.ORT_ENABLE_ALL sess ort.InferenceSession( mxbai-embed-de-large-v1.onnx, so, providers[CPUExecutionProvider] )如果你的流水线之前是为了“保证可复现 / 避免优化改图”才关优化那可以换个思路保留优化但把优化后的图固化下来。用ort.InferenceSession加载后把优化结果写成静态文件之后加载这个静态文件时再关优化就安全了因为此时的图已经是扁平、无 local function、维度确定的import onnxruntime as ort so ort.SessionOptions() so.graph_optimization_level ort.GraphOptimizationLevel.ORT_ENABLE_ALL so.optimized_model_filepath mxbai-embed-de-large-v1.optimized.onnx _ ort.InferenceSession( mxbai-embed-de-large-v1.onnx, so, providers[CPUExecutionProvider] ) # 之后用固化图 关优化加载完全可复现 so2 ort.SessionOptions() so2.graph_optimization_level ort.GraphOptimizationLevel.ORT_DISABLE_ALL sess ort.InferenceSession( mxbai-embed-de-large-v1.optimized.onnx, so2, providers[CPUExecutionProvider] )这一层修复成本最低覆盖 90% 的线上场景open 优化、固化图、再按需要关优化。六、解决方案第二层结构性改进如果同一个模型要在多个服务、多个框架版本间反复加载每次都依赖“靠优化掩盖结构问题”是脆弱的。更稳妥的做法是把“模型是否可被直接加载”作为导出物的一项质量门禁从源头保证导出的 ONNX 不依赖优化就能加载。下面用一个唯一的配置对象MxbaiEmbedLoadPolicy作为单一事实来源集中描述“这个模型该怎么导出、怎么加载、门禁阈值是什么”。所有服务都读这一份而不是到处写ORT_DISABLE_ALL。from dataclasses import dataclass, field from typing import List, Literal from onnxruntime import GraphOptimizationLevel dataclass(frozenTrue) class MxbaiEmbedLoadPolicy: mxbai-embed-de-large-v1 的加载与导出单一事实来源。 model_id: str deepset/mxbai-embed-de-large-v1 # 加载时允许的最低优化等级低于这个等级视为非法会触发本地函数/符号维度问题 min_optimization_level: GraphOptimizationLevel GraphOptimizationLevel.ORT_ENABLE_ALL # 固化优化图到这个路径供后续“关优化可复现加载”使用 optimized_graph_path: str mxbai-embed-de-large-v1.optimized.onnx # 导出时强制展开的局部函数域避免 func 节点残留 inline_function_domains: tuple (local.example, ) # 池化维度用于加载后形状自检 pool_axis: int 1 # 归一化维度句向量通道维 norm_axis: int -1 # 允许的最大符号维度数量超过说明图里还有未折叠的动态链 max_symbolic_dims_in_flat_graph: int 0 # 必须存在的输出名 required_outputs: tuple (last_hidden_state, embeddings) providers: tuple (CPUExecutionProvider,) def load_options(self) - GraphOptimizationLevel: if self.min_optimization_level GraphOptimizationLevel.ORT_DISABLE_ALL: raise ValueError(mxbai-embed-de-large-v1 不允许在关优化模式下加载) return self.min_optimization_level def as_session_options(self, optimize: bool True) - dict: level self.load_options() if optimize else GraphOptimizationLevel.ORT_DISABLE_ALL return { graph_optimization_level: level, optimized_model_filepath: self.optimized_graph_path if optimize else , providers: list(self.providers), } POLICY MxbaiEmbedLoadPolicy() def build_session(source: str, policy: MxbaiEmbedLoadPolicy POLICY): import onnxruntime as ort opts policy.as_session_options(optimizeTrue) so ort.SessionOptions() so.graph_optimization_level opts[graph_optimization_level] if opts[optimized_model_filepath]: so.optimized_model_filepath opts[optimized_model_filepath] return ort.InferenceSession(source, so, providersopts[providers])这样任何服务调用build_session(...)拿到的都是“先优化、再固化”的会话想关优化复现时统一从policy.optimized_graph_path读固化图行为处处一致。七、解决方案第三层断言 / CI 守护把“关优化也能加载”做成 CI 断言没有意义这个模型本来就做不到真正该守护的是导出的 ONNX 在开启优化后能被加载、输出形状正确、向量归一化后模长为 1。下面用 pytest 风格断言守护。import numpy as np import onnx import onnxruntime as ort def test_model_loads_with_optimization(source: str): so ort.SessionOptions() so.graph_optimization_level ort.GraphOptimizationLevel.ORT_ENABLE_ALL sess ort.InferenceSession(source, so, providers[CPUExecutionProvider]) assert sess is not None # 没有 func 节点残留检查图里是否被完全内联 model onnx.load(source) if source.endswith(.onnx) else None assert model is not None def test_embedding_is_unit_norm(sess, input_ids, attention_mask): last_hidden, embeddings sess.run( None, {input_ids: input_ids, attention_mask: attention_mask} ) # 句向量必须已经 L2 归一化模长≈1 norms np.linalg.norm(embeddings, axis-1) assert np.allclose(norms, 1.0, atol1e-3), fnorm 异常: {norms} def test_flat_graph_has_no_local_function(optimized_source: str): model onnx.load(optimized_source) # 固化优化图不应再携带 local function 定义 assert len(model.functions) 0, 优化图仍含 local function内联未生效 for node in model.graph.node: assert node.domain ! local.example, f残留 func 节点: {node.op_type}这三个断言分别卡住(1) 优化下能加载(2) 向量真的被归一化(3) 固化图是扁平的、可后续关优化加载。它们一起把“这个模型必须开优化”的事实锁进了构建流水线。八、排查清单遇到 “cannot load without optimization” 一类报错按下面顺序排查先看报错关键字含subgraphs is not supported/local function/func node→ 局部函数未内联含Cannot infer shape/Invalid rank→ 符号维度未定。两类的修复方向一致开优化但定位不同。确认加载时优化等级搜代码里有没有ORT_DISABLE_ALL有的话改掉或固化图后再用。检查 ONNX 是否带 local functiononnx.load(path).functions非空就说明导出路径引入了局部函数通常是 optimum 高版本。固化优化图设optimized_model_filepath用它做后续加载源CI 里断言functions为空。验证输出跑一条样本检查输出名、embeddings形状、norm≈1。版本对齐optimum / onnx / onnxruntime 三者版本要配套optimum 升级可能改变是否生成 local function。不要为了“可复现”一刀切关优化改为“导出时固化优化图”既能复现又不破坏加载。九、小结cannot load deepset-mxbai-embed-de-large-v1 without optimization的根因是这个模型的 ONNX 结构依赖图优化阶段的工作展开局部函数、常数折叠、算子融合才能变成可被直接加载的扁平图而ORT_DISABLE_ALL跳过了这些阶段于是加载器在最优化入口就失败。最小修复是不要对这个模型关优化结构性改进是用唯一的MxbaiEmbedLoadPolicy把“导出/加载/门禁”集中管理并固化优化图CI 守护则用三组断言锁住“优化下能加载、向量已归一化、固化图无局部函数”。记住一句原则需要可复现时固化的是优化后的图而不是把优化关掉。

相关新闻

解锁Windows 10/11的隐藏能力:让苹果照片格式在资源管理器中完美预览

解锁Windows 10/11的隐藏能力:让苹果照片格式在资源管理器中完美预览

解锁Windows 10/11的隐藏能力:让苹果照片格式在资源管理器中完美预览 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails …

2026/10/13 9:58:17 阅读更多 →
2024年国内大模型API计费模式解析:Token Plan与Coding Plan选型指南

2024年国内大模型API计费模式解析:Token Plan与Coding Plan选型指南

最近在对接国内各大模型厂商的API时,发现一个让开发者颇为头疼的问题:各家平台的计费模式、订阅套餐更新频繁,官方文档又常常滞后。今天刚调通的代码,明天可能就因为Token Plan(令牌计划)配额耗尽或Coding …

2026/10/13 5:31:00 阅读更多 →
网站建设素材网:设计师与开发者的宝藏库与避坑指南

网站建设素材网:设计师与开发者的宝藏库与避坑指南

在这个互联网普及率高达百分之九十以上的时代,几乎每一个拥有梦想或者正在为生计奔波的人,脑子里都会闪过一个念头:我要建一个网站。也许是卖特产的电商小店,也许是展示个人才华的作品集,又或者是记录旅行见闻的博客。听起来很美,对吧?但在真正动手去搭建之前,绝大多数…

2026/10/13 9:58:31 阅读更多 →

最新新闻

TS流PCAP分析实战:从网络抓包定位音视频卡顿根源

TS流PCAP分析实战:从网络抓包定位音视频卡顿根源

1. 项目概述:为什么你手里的TS流PCAP文件比想象中更有价值“mpeg ts pcap 文件分析”——这串词看起来像一串技术黑话,但背后藏着大量真实业务场景里被忽视的关键信息。我接触过不少网络运维、音视频开发、IoT设备调试甚至安全分析一线的同行&#xff0c…

2026/10/14 6:05:23 阅读更多 →
C语言链表排序实战:插入排序与快速排序的指针操作详解

C语言链表排序实战:插入排序与快速排序的指针操作详解

简介:链表排序是C语言学习者绕不开的实践主题,这份源码压缩包面向正在掌握指针操作、动态内存分配和基础算法的初学者,帮助理解链表节点结构与排序算法的结合方式,也适合作为数据结构课程实验后的巩固练习。包体十分精简&#xff…

2026/10/14 6:05:23 阅读更多 →
从流量焦虑到AI获客:GEO优化师2026年实战复盘

从流量焦虑到AI获客:GEO优化师2026年实战复盘

1. 从流量焦虑到AI获客:一个优化师的2026年实战复盘过去这一年,我几乎每周都要跟不同行业的企业负责人聊同一个话题:钱花得越来越多,线索却越来越水。SEM账户里点击单价翻了一倍,信息流广告的转化率跌到千分之三以下&a…

2026/10/14 6:05:23 阅读更多 →
React Native鸿蒙跨平台固定表头长列表表格:双区布局与性能优化

React Native鸿蒙跨平台固定表头长列表表格:双区布局与性能优化

1. 一个被数据压垮的真实场景:长列表表格的"阅读灾难"上个月我接手了一个移动端报表类项目的数据展示模块,技术栈是 React Native,目标是跑通鸿蒙平台。先说结论:这个模块在改造之前,几乎处于"能看但没…

2026/10/14 6:05:23 阅读更多 →
Preliminary规格书阅读指南:锁参数、避坑、做版本跟踪

Preliminary规格书阅读指南:锁参数、避坑、做版本跟踪

简介:《PLA5506-940》是飞利浦光电提供的一份初步机密级产品规格书,版本V0.8,文档编号992215900750,适合光电与激光雷达、光通信、精密传感等领域的硬件工程师、选型评估人员和采购团队参考。该PDF围绕PLA5506-940型VCSEL阵列展开…

2026/10/14 6:05:23 阅读更多 →
一条富碱性多肽的进阶之路:序列解析、合成纯化与核定位验证

一条富碱性多肽的进阶之路:序列解析、合成纯化与核定位验证

1. 从一条氨基酸序列反推蛋白身份:这条肽的“户口本”是这样查的拿到 PDGF A-Chain (194-211) 这个编号,加上后面那一串 GRPREGSKKRKRKRLKPT,我的第一反应不是急着做实验,而是先把它当成一个“嫌疑人”来审:它到底来自…

2026/10/14 6:04:23 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →