【Bug已解决】[Web] InferenceSession.RunOptions.terminate not working as expected (reopen) 解决方案
【Bug已解决】[Web] InferenceSession.RunOptions.terminate not working as expected (reopen) 解决方案一、现象长什么样在 Web 端ONNX Runtime Web浏览器里跑推理想在中途取消一个正在进行的session.run()比如用户切走、或超时。ORT 提供了RunOptions.terminate标志设置后应当让正在跑的推理停止。但在 Web 后端上设置了terminate却根本不停推理照样跑完const session await ort.InferenceSession.create(model.onnx, { executionProviders: [webgpu], }); const runOptions {}; // terminate 通过某种方式设置 // 中途想取消 session.terminate?.(); // 期望停止但实际没停 const out await session.run(feed, runOptions); // 仍然跑完才返回最小信号设置 terminate - Web 上推理不中断照常返回结果 同款 terminate 在 CPU EP / 原生环境能中断注意这是“取消无效”不是崩溃。题目标了(reopen)说明之前修过、又复现了——典型是修了一处、另一处路径仍不检查 terminate。二、背景RunOptions.terminate或 C API 的OrtRunOptions里一个terminate标志的机制是推理执行过程中各个算子/执行层在合适的检查点轮询这个标志一旦发现被置位就抛出“已取消”的异常中断整条执行。在原生CPU/CUDAEP 上算子执行是逐 op、逐循环的容易在循环里插入if (terminate) throw。但在WebWebGPU/WebNN上一次推理往往被录制成一整个 GPU 命令缓冲command buffer一次性提交给 GPU。命令缓冲一旦提交GPU 就在“黑盒”里跑完CPU 侧的 JS 没法在它执行到一半时插进去检查terminate标志——除非执行层把整条图切成多个可轮询的检查点每个子图提交后CPU 先检查 terminate 再决定是否提交下一段。reopen说明之前可能在某个 EP 路径加了检查但 Web 后端或其中某些算子/子图划分方式仍把整条图当成一个不可中断的大命令缓冲提交terminate 只在最开始或最末尾检查中间不检查 - 取消无效。三、根因根因是Web 后端的推理执行把整条图录制成单个不可中断的 GPU 命令缓冲执行层没有在子图/算子边界轮询terminate标志导致中途取消无效单命令缓冲不可中断WebGPU/WebNN 把整图提交成一个 command bufferGPU 跑到底CPU 侧无法中途插入检查。terminate 检查点缺失执行层只在run()入口提交前或出口取结果后检查 terminate没在“每段提交后”检查于是提交后设 terminate 已经来不及。reopen 的根因之前可能只在某个 EP如 CPU path 或某个 Web 子图模式加了检查但 Web 的另一种执行路径如整图融合、或大算子仍走不可中断提交于是复现。不是结果错推理照常出结果只是取消不掉浪费算力、UI 卡顿。所以这不是数值错而是Web 后端缺“可中断执行 中途轮询 terminate”的机制。四、最小可运行复现下面用 JS 风格的伪代码模拟“整图一次性提交中途 terminate 无效”// 模拟 Web 后端执行整图当成一个不可中断任务 async function runGraph(graph, terminateFlag) { // 提交前检查一次 if (terminateFlag.raised) throw new Error(cancelled); // 一次性把整图提交给 GPU中间不检查 terminate await gpuSubmitWholeGraph(graph); // 黑盒跑完 // 取结果后才检查 - 太晚了 if (terminateFlag.raised) throw new Error(cancelled); return graph.result; } // 使用方中途想取消 const flag { raised: false }; const p runGraph(graph, flag); setTimeout(() { flag.raised true; }, 10); // 中途置位 await p; // 仍然跑完才返回 - terminate 无效跑这个逻辑因为gpuSubmitWholeGraph是一次性不可中断的flag.raised在提交后才置位、取结果时才检查已经来不及 - 推理照常返回。这正是 terminate 无效的机制。修复是把图切成多段每段提交后检查 terminate。五、解决方案第一层最小直接修复最小修复让 Web 后端把图切成多个可轮询的检查点每段 GPU 命令提交后在 CPU 侧检查terminate再决定是否继续。对使用者临时规避是给推理加外层超时/AbortController超时就不等结果虽然 GPU 仍在跑但 JS 侧不再阻塞// 外层超时兜底不能真正中断 GPU但 JS 侧不卡 function withTimeout(promise, ms) { return Promise.race([ promise, new Promise((_, rej) setTimeout(() rej(new Error(timeout)), ms)), ]); } const out await withTimeout(session.run(feed, runOptions), 5000);对 ORT 仓库侧修复是改 Web 执行层在生成 GPU 命令时按子图/算子边界分块提交每块提交后await微任务并轮询RunOptions.terminate置位则抛取消异常、停止后续提交。这一层让 terminate 真正生效。六、解决方案第二层结构性改进把“Web 推理如何支持可中断中途轮询 terminate”收口成唯一的配置对象OrtWebSessionTerminatePolicyWeb 执行层读它from dataclasses import dataclass, field from typing import Tuple, Literal dataclass(frozenTrue) class OrtWebSessionTerminatePolicy: Web 端 terminate 可中断执行的单一事实来源。 # 是否把图切成可轮询检查点的子段而非单命令缓冲 split_into_checkpoints: bool True # 每个检查点提交后轮询 terminate 的间隔算子/子图边界 poll_after: Literal[every_subgraph, every_op] every_subgraph # terminate 置位后的行为 on_terminate: Literal[throw_cancel, stop_submit] throw_cancel # 受影响后端 web_backends: Tuple[str, ...] (webgpu, webnn) def describe(self) - str: return Web 推理分段提交每段后轮询 terminate置位即中断 POLICY OrtWebSessionTerminatePolicy() def plan_terminate(policy: OrtWebSessionTerminatePolicy POLICY) - dict: return { split: policy.split_into_checkpoints, poll: policy.poll_after, action: policy.on_terminate, }所有 Web 执行层读同一份POLICYterminate 在所有子图路径都生效避免 reopen。七、解决方案第三层断言 / CI 守护把“Web terminate 可中断”做成断言。下面用 pytest 风格守护用模拟对象验证分段轮询import pytest def test_split_into_checkpoints(policy): assert policy.split_into_checkpoints is True def test_poll_after_subgraph(policy): assert policy.poll_after in (every_subgraph, every_op) def test_on_terminate_action(policy): assert policy.on_terminate throw_cancel def test_web_backends_covered(policy): assert webgpu in policy.web_backends assert webnn in policy.web_backends这四组断言锁住(1) 分段提交(2) 每段轮询 terminate(3) 置位即中断(4) Web 后端覆盖。CI 跑通即代表 terminate 在 Web 上真正可中断。八、排查清单遇到 Web 上 terminate 取消无效reopen先确认其它 EP 是否能取消CPU EP 能、Web 不能 - 锁定 Web 执行层。看是否整图单命令缓冲是不是提交后不检查 terminate 直接跑完。查检查点执行层有没有在子图/算子边界轮询 terminate。临时规避外层Promise.race超时兜底不阻塞 JS。根本修复图分段提交每段后轮询 terminate置位抛取消。统一策略对象用OrtWebSessionTerminatePolicy固化。CI 守护断言分段、轮询、后端覆盖防 reopen。九、小结[Web] InferenceSession.RunOptions.terminate not working as expected (reopen)的根因是Web 后端把整条图录制成单个不可中断的 GPU 命令缓冲提交执行层只在提交前/取结果后检查terminate标志没在子图/算子边界轮询于是中途置位 terminate 已经来不及取消无效之前只修了一处路径另一处仍整图提交导致 reopen。最小修复是让 Web 执行层把图分段提交、每段后轮询 terminate或外层Promise.race超时兜底结构性改进是用唯一的OrtWebSessionTerminatePolicy固化可中断执行CI 用四组断言守护“分段提交、每段轮询、置位即中断、Web 后端覆盖”。记住GPU 命令缓冲一旦提交就不可中途打断要让 terminate 生效必须把图切成可轮询的检查点。

相关新闻

如何快速配置Torrentio:5分钟搞定Stremio流媒体资源聚合

如何快速配置Torrentio:5分钟搞定Stremio流媒体资源聚合

如何快速配置Torrentio:5分钟搞定Stremio流媒体资源聚合 【免费下载链接】torrentio-scraper 项目地址: https://gitcode.com/GitHub_Trending/to/torrentio-scraper 还在为找不到高清影视资源而烦恼吗?Torrentio作为Stremio生态中最实用的流媒体…

2026/8/13 19:38:26 阅读更多 →
告别代码焦虑与排版混乱:深度评测2024年主流毕业设计网站建设软件项目,帮大学生高效搞定视觉呈现与功能落地

告别代码焦虑与排版混乱:深度评测2024年主流毕业设计网站建设软件项目,帮大学生高效搞定视觉呈现与功能落地

说实话,写这篇文章的时候,我刚刚合上笔记本电脑,看着窗外那个总是亮着的台灯,心里其实是有点恍惚的。又一年毕业季来了,校园里那股子焦灼、兴奋又带点迷茫的气息,隔着屏幕似乎都能闻得到。每年的这个时候,我的手机总会收到好几条来自学弟学妹的求助,主题千奇百怪,但核…

2026/8/13 19:38:26 阅读更多 →
无需Root也能让安卓手机焕然一新?Universal Android Debloater深度体验

无需Root也能让安卓手机焕然一新?Universal Android Debloater深度体验

无需Root也能让安卓手机焕然一新?Universal Android Debloater深度体验 【免费下载链接】universal-android-debloater Cross-platform GUI written in Rust using ADB to debloat non-rooted android devices. Improve your privacy, the security and battery lif…

2026/8/13 19:38:26 阅读更多 →

最新新闻

Qwen3.5-0.8B使用场景详解及使用方法

Qwen3.5-0.8B使用场景详解及使用方法

Qwen3.5-0.8B 是一颗为端侧AI打造的“小而强”的多模态模型。它的定位与传统的OCR工具(如PaddleOCR)截然不同:它不只是一个“文字提取器”,而是一个能 “看懂”并“理解”图文内容的轻量级AI大脑 。 它最显著的特点就是极致轻量和…

2026/8/14 8:10:48 阅读更多 →
大语言模型核心弱点解析:从幻觉、推理脆弱到安全对齐与工程应对

大语言模型核心弱点解析:从幻觉、推理脆弱到安全对齐与工程应对

1. 大语言模型的“阿喀琉斯之踵”:辉煌之下的隐忧在人工智能领域,尤其是自然语言处理(NLP)的赛道上,大语言模型(Large Language Model, LLM)无疑是近年来最耀眼的明星。从ChatGPT的横空出世&…

2026/8/14 8:10:48 阅读更多 →
Excel多列数据合并为一列:OFFSET与INDEX函数动态引用实战

Excel多列数据合并为一列:OFFSET与INDEX函数动态引用实战

1. 项目概述:从多列到一列的优雅转换在日常的数据处理工作中,我们常常会遇到一个让人头疼的场景:数据源并非整齐地排列在一列中,而是分散在多个列里。比如,一份产品清单,产品名称、型号、规格分别占据A、B、…

2026/8/14 8:10:48 阅读更多 →
Windows 11彻底卸载鲁大师的深度清理方案

Windows 11彻底卸载鲁大师的深度清理方案

1. 项目背景与问题定位2026版Windows 11系统环境下,鲁大师软件残留问题已成为困扰用户的典型痛点。作为曾经流行的硬件检测工具,其后台服务进程和广告模块的顽固性远超普通应用。根据实测数据,通过控制面板或系统自带卸载程序处理后&#xff…

2026/8/14 8:10:48 阅读更多 →
机器人控制系统通信契约设计:从世界状态同步到安全门验证的工程实践

机器人控制系统通信契约设计:从世界状态同步到安全门验证的工程实践

1. 项目概述:为什么“合同”是机器人控制的核心最近在搞一个机器人项目,核心是把一个叫Cosmos 3 Edge的智能计算单元和一个传统的机器人控制器对接起来。这听起来像是硬件集成,但真正让我掉头发的,不是接线,而是定义它…

2026/8/14 8:10:47 阅读更多 →
重庆高端网站建设公司如何拒绝流水线作业做有灵魂的数字门面

重庆高端网站建设公司如何拒绝流水线作业做有灵魂的数字门面

在重庆这座被山水包裹的魔幻8D城市里,如果你问一个创业者或者企业老板,现在生意怎么做?很多人第一反应是去短视频平台投流,或者在小红书、抖音上搞搞营销。这都没错,流量确实是钱,是入口。但是,当那些纷繁杂乱的流量终于通过点击、私信、甚至是一通焦虑的电话找到你的时…

2026/8/14 8:09:47 阅读更多 →

日新闻

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

在这个流量为王、视觉至上的互联网时代,对于临沂乃至整个山东乃至全国的传统中小企业来说,拥有一张精美的“数字名片”早已不再是可选项,而是生存的必答题。每当夜幕降临,沂河两岸灯火辉煌,物流之都的喧嚣逐渐沉淀为对未来的思考。我们常常听到老板们在茶余饭后探讨:为什…

2026/8/14 0:00:26 阅读更多 →
Flutter与OpenHarmony实现剧本杀组队表单开发实战

Flutter与OpenHarmony实现剧本杀组队表单开发实战

1. 项目概述在移动应用开发领域,跨平台框架Flutter因其高效的开发体验和出色的性能表现,已经成为众多开发者的首选。而OpenHarmony作为新兴的操作系统平台,其开放性和灵活性为开发者提供了全新的可能性。本文将聚焦于一个实际应用场景——剧本…

2026/8/14 0:00:26 阅读更多 →
大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

在这个数字化浪潮席卷全球的今天,企业想要在激烈的市场竞争中站稳脚跟,拥有一张好看的“数字名片”已经远远不够了。很多老板在刚开始接触互联网业务时,都有一个共同的困惑:为什么我花了钱建的网站,就像是在真空中自嗨?访客进来转了两圈就跑了,线索石沉大海,甚至连客服…

2026/8/14 0:01:27 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →