【Bug已解决】[Web] DB-style detection model returns all-zero output on Apple M-series above ~2048px inpu…
【Bug已解决】[Web] DB-style detection model returns all-zero output on Apple M-series above ~2048px input - likely fp16 overflow in ReduceMean 解决方案一、现象长什么样一个 DB 风格Differentiable Binarization文字检测的 ORT 模型在 Apple M 系列芯片上通过 WebGPU / CoreML EP 跑推理。输入图片小的时候比如 1024x1024输出正常但一旦边长超过约 2048px输出整体变成全零概率图、阈值图全 0检测彻底失效// Web 端ONNX Runtime Web加载 const session await ort.InferenceSession.create(db_detect.onnx, { executionProviders: [webgpu], // Apple M 系列走 Metal }); const out await session.run(feed); // input 2048x2048 - out 全 0input 1024x1024 - 正常最小复现信号输入边长 2048px : 输出正常有非零概率 输入边长 2048px : 输出全 0 阈值恰好在 2048 附近像“数值溢出后归零”注意模型能跑、不报错只是大图时数值溢出导致结果归零。这不是逻辑错是数值精度问题。二、背景DB 检测模型的头部有一个概率图生成步骤对特征图做ReduceMean或ReduceSum/Softmax前的求和把通道维聚合成单通道概率。整个过程在 Apple M 系列上走的是 fp16半精度路径 - WebGPU/Metal 的f16是原生类型ORT 在 Apple 上为了性能默认用 fp16 执行。fp16 的表示范围大约是 /-65504相对精度约 3 位十进制。问题在于ReduceMean的实现如果它在 fp16 下逐个元素累加再除以个数大图2048x2048 的特征图像素数约 4M累加时部分和会远超 65504 然后上溢成 infinf 参与后续Sigmoid/exp运算变成 nan / 0最终概率图被钳到 0表现为全零输出。而 1024x1024约 1M 像素时累加和还没超 65504所以正常。阈值约 2048px 恰好对应累加和突破 fp16 上限的临界点。这就是 “likely fp16 overflow in ReduceMean”。三、根因根因是 Apple M 系列 fp16 路径下的ReduceMean用 fp16 累加大图特征部分和溢出 fp16 上限/-65504变成 inf/nan 后结果归零fp16 累加溢出ReduceMean在 fp16 精度下逐元素求和特征图元素多2048 的平方量级时部分和轻松破 65504直接 inf。溢出传染inf 进Sigmoid/exp变成 nan 或 0再经Clip/Cast被钳成 0输出全零。只在 Applefp16 原生明显x86 上 ORT 可能用 fp32 跑、或 Metal 的 fp16 累加更易触发CPU fp32 路径完全不受影响所以小图正常、大图归零、只在 M 系列。不是模型结构错同样的 ONNX 在 CPU fp32 上大图也正常说明是 EP 的数值实现问题。所以这不是逻辑错而是 fp16 归约缺乏数值稳定性没用 fp32 累加器 / Kahan 补偿大图溢出归零。四、最小可运行复现下面用 NumPy 模拟 “fp16 ReduceMean 大图溢出归零”用float16累加复现import numpy as np def reduce_mean_fp16_naive(x): 有 bug 的实现在 fp16 下逐元素累加Apple M 的 fp16 路径。 acc np.float16(0.0) for v in x.flatten(): acc acc np.float16(v) # fp16 累加大数组溢出 return float(acc) / x.size def reduce_mean_fp32(x): 正确实现用 fp32 累加最后再转回。 return float(np.mean(x.astype(np.float32))) if __name__ __main__: # 模拟 2048x2048 特征图元素均值约 1.0如激活值 big np.ones(2048 * 2048, dtypenp.float32) naive reduce_mean_fp16_naive(big) correct reduce_mean_fp32(big) print(fp16 朴素累加:, naive, inf/nan 即为溢出) print(fp32 累加 :, correct) # 朴素 fp16 累加 4M 个 1.0 - 远超 65504 - inf assert (not np.isfinite(naive)) or naive ! correct print(复现大图 fp16 累加溢出 - 归约结果 inf - 输出归零)跑出来朴素 fp16 累加得到inf或不稳定值fp32 得到正确的1.0。这正好复现大图 fp16 ReduceMean 溢出归零的机制。五、解决方案第一层最小直接修复最小修复让ReduceMean及相关归约在 fp16 路径下用 fp32 累加器或干脆对这个模型用 fp32 执行。Web 侧可以这样// 方案 A对归约相关节点强制 fp32若 ORT Web 暴露该选项 const session await ort.InferenceSession.create(db_detect.onnx, { executionProviders: [{ name: webgpu }], graphOptimizationLevel: all, }); // 或在导出时把 ReduceMean 之后的头部数据类型固定为 fp32 // 方案 B导出时把特征图头部的 ReduceMean 输入限制在 fp32 精度 // 用 onnx 修改工具把对应节点的 dtype 标成 fp32对 ORT 仓库侧修复是改 Apple/Metal 的ReduceMean内核归约累加用 fp32或float2双缓冲做部分和最后再转 fp16 输出。这一层立刻让大图输出正常。六、解决方案第二层结构性改进把 “哪些算子在 fp16 路径下必须用 fp32 累加” 收口成唯一的配置对象OrtWebReduceMeanFp16PolicyWeb 加载与内核选择读它from dataclasses import dataclass, field from typing import Tuple dataclass(frozenTrue) class OrtWebReduceMeanFp16Policy: Apple M 系列 fp16 归约数值稳定的单一事实来源。 # 必须在 fp16 路径下用 fp32 累加的算子 fp32_accum_ops: Tuple[str, ...] (ReduceMean, ReduceSum, ReduceL2, Softmax) # 触发 fp32 累加的“大图阈值”特征图元素数超过此值必用 fp32 累加 overflow_pixel_threshold: int 2048 * 2048 # 是否全局强制这些算子 fp32 执行最稳略慢 force_fp32_for_these_ops: bool False # 平台限定Apple M 系列 Metal fp16 原生易溢出 affected_platforms: Tuple[str, ...] (apple, m-series, metal, webgpu) def needs_fp32_accum(self, op_type: str, num_pixels: int) - bool: if op_type not in self.fp32_accum_ops: return False if self.force_fp32_for_these_ops: return True return num_pixels self.overflow_pixel_threshold def describe(self) - str: return 大图 ReduceMean 等在 fp16 路径用 fp32 累加防溢出归零 POLICY OrtWebReduceMeanFp16Policy() def plan_reduce(op_type: str, num_pixels: int, policy: OrtWebReduceMeanFp16Policy POLICY) - str: return fp32_accum if policy.needs_fp32_accum(op_type, num_pixels) else fp16所有 Web 加载与内核选择读同一份POLICY大图归约自动用 fp32 累加避免溢出。七、解决方案第三层断言 / CI 守护把 “大图 ReduceMean 不溢出、数值稳定” 做成断言。下面用 pytest 风格守护复用第四节逻辑import numpy as np def test_large_image_mean_finite(): big np.ones(2048 * 2048, dtypenp.float32) assert np.isfinite(reduce_mean_fp32(big)) assert abs(reduce_mean_fp32(big) - 1.0) 1e-3 def test_fp32_accum_for_large_reduce(policy): assert policy.needs_fp32_accum(ReduceMean, 2048 * 2048 1) is True assert policy.needs_fp32_accum(ReduceMean, 1024 * 1024) is False def test_affected_platform_covers_apple(policy): assert apple in policy.affected_platforms def test_reduce_ops_listed(policy): assert ReduceMean in policy.fp32_accum_ops这四组断言锁住(1) 大图均值有限且正确(2) 大图 ReduceMean 触发 fp32 累加、小图不触发(3) 平台覆盖 Apple(4) 归约算子已列入名单。CI 跑通即代表大图不会溢出归零。八、排查清单遇到 Apple M 系列上大图 DB 检测输出全零先换 EP / 精度验证用 CPU fp32 跑大图若正常 - 锁定 fp16 数值问题。看阈值是否在 2048px 附近是的话高度怀疑 fp16 累加溢出。查 ReduceMean 内核Apple/Metal 的 fp16 归约是不是用 fp16 累加应改 fp32 累加。临时规避对该模型强制 fp32 执行或导出时把归约头部标 fp32。根本修复改 Metal ReduceMean 内核用 fp32 部分和最后转 fp16。统一策略对象用OrtWebReduceMeanFp16Policy固化大图阈值与算子名单。CI 守护断言大图 ReduceMean 数值有限、触发 fp32 累加。九、小结[Web] DB-style detection model returns all-zero output on Apple M-series above ~2048px input - likely fp16 overflow in ReduceMean的根因是Apple M 系列 fp16 路径下的ReduceMean在 fp16 精度下逐元素累加大图特征部分和超过 fp16 上限 /-65504 后变成 inf/nan经 Sigmoid/exp 传染后概率图被钳成 0表现为大图2048px输出全零小图累加和未超上限所以正常CPU fp32 路径不受影响。最小修复是让 ReduceMean 在 fp16 路径用 fp32 累加器或对该模型强制 fp32结构性改进是用唯一的OrtWebReduceMeanFp16Policy固化“大图阈值 必须用 fp32 累加的算子名单”CI 用四组断言守护“大图均值有限、触发 fp32 累加、平台覆盖 Apple、算子已列入”。记住fp16 归约一定要用 fp32 累加器大图累加必溢出否则结果悄悄归零。

相关新闻

【Bug已解决】QMoE per-channel quantization produces garbage results on CUDA EP, correct on CPU EP 解决方案

【Bug已解决】QMoE per-channel quantization produces garbage results on CUDA EP, correct on CPU EP 解决方案

【Bug已解决】QMoE per-channel quantization produces garbage results on CUDA EP, correct on CPU EP 解决方案 一、现象长什么样 用 ONNX Runtime 的 QMoE(量化 MoE)跑一个做了 per-channel 量化 的专家权重模型。同一个 ONNX,CPUExecuti…

2026/8/13 22:09:01 阅读更多 →
3步搞定M3U8视频下载:告别命令行恐惧的图形化解决方案

3步搞定M3U8视频下载:告别命令行恐惧的图形化解决方案

3步搞定M3U8视频下载:告别命令行恐惧的图形化解决方案 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 你是否曾遇到心仪的网络视频却无法保存的困扰?&…

2026/8/13 22:08:00 阅读更多 →
Python键盘监听与自动化脚本:从pynput入门到热键管理器实战

Python键盘监听与自动化脚本:从pynput入门到热键管理器实战

1. 从一次重复性操作说起:为什么我们需要键盘监听如果你和我一样,每天的工作都离不开电脑,那你一定遇到过这样的场景:需要反复执行某个固定的操作序列,比如在某个软件里点击一连串的菜单项,或者在不同的窗口…

2026/8/13 22:08:00 阅读更多 →

最新新闻

边云协同视频分析性能优化指南:多站点部署下的参数配置与排查清单(边缘推理+云端管理)

边云协同视频分析性能优化指南:多站点部署下的参数配置与排查清单(边缘推理+云端管理)

1. 环境假设在参考本文的参数与优化步骤前,请确认您的系统环境符合以下基础假设:部署拓扑: 1 个中心云端管理平台(部署于公网或私有云 VM) N 个边缘站点节点(部署于各站点局域网的边缘 AI 盒子/工控机&…

2026/8/14 2:16:14 阅读更多 →
从ZeroClaw与OpenClaw内存对比,解析技术选型与性能评估方法论

从ZeroClaw与OpenClaw内存对比,解析技术选型与性能评估方法论

1. 从一张图引发的技术讨论最近在技术社区里,一张对比图传得挺火,标题大概是“ZeroClaw vs OpenClaw:内存占用 -99%”。这张图通常是一个简单的柱状图或折线图,左边是OpenClaw运行时内存占用的一个高耸的柱子,右边是Ze…

2026/8/14 2:16:14 阅读更多 →
从CCTV《360度》片头拆解视频包装:仪式感、信任契约与视听设计

从CCTV《360度》片头拆解视频包装:仪式感、信任契约与视听设计

那天晚上,我正为一个视频包装项目发愁。客户想要一种“有分量感”的新闻开场,要求既有权威性,又不失现代节奏。我翻遍了手头的素材库,从电影预告到纪录片片头,总觉得差那么点意思——要么太娱乐化,要么太沉…

2026/8/14 2:16:14 阅读更多 →
终极指南:如何在VSCode中秘密阅读小说而不被发现

终极指南:如何在VSCode中秘密阅读小说而不被发现

终极指南:如何在VSCode中秘密阅读小说而不被发现 【免费下载链接】Thief-Book-VSCode VScode 上一款真正的摸鱼插件 项目地址: https://gitcode.com/gh_mirrors/th/Thief-Book-VSCode Thief-Book-VSCode是一款专为程序员设计的创新插件,它巧妙地将…

2026/8/14 2:16:14 阅读更多 →
信号与系统考研强化:打通奥本海姆教材到真题解题的最后一公里

信号与系统考研强化:打通奥本海姆教材到真题解题的最后一公里

最近在整理考研资料时,发现一个挺有意思的现象:很多同学在复习信号与系统时,尤其是面对奥本海默(Alan V. Oppenheim)那本经典教材,常常陷入一种“知识点都懂,题目一做就懵”的困境。他们能背出卷…

2026/8/14 2:16:14 阅读更多 →
从零部署Hermes Agent:打通Terminal、飞书、持久记忆与技能自进化

从零部署Hermes Agent:打通Terminal、飞书、持久记忆与技能自进化

在 AI Agent 开发领域,如何让一个智能体不仅能理解指令,还能记住上下文、调用外部工具、并持续自我进化,是许多开发者和团队面临的挑战。Hermes Agent 作为一个新兴的 Agent 框架,以其独特的 Harness Engineering 理念和强大的 …

2026/8/14 2:15:14 阅读更多 →

日新闻

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

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

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

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 阅读更多 →