viable/strict/1789509051: [MPS] fix rand and uniform_ upper-bound rounding (#197081)
PyTorch 发布 viable/strict/1789509051 版本变更,标题为 [MPS] fix rand and uniform_ upper-bound rounding (#197081)。该修复针对 issue #197079:模仿 CPU 行为,将采样值四舍五入到被排除的上界时回绕到下界。作者说明把类型转换放在 host 侧而非 device 侧,原因是 Metal 编译器 bug。证据中给出的复现使用 torch.mps.compile_shader 编写 Metal kernel,对 bfloat 值做 bounds.x + (bounds.y - bounds.x) * samples[i] 计算,并在 value == bfloat(bounds.y) 时回退为 bfloat(bounds.x)。
发展脉络
- 首次出现viable/strict/1789509051: [MPS] fix rand and uniform_ upper-bound rounding (#197081)PyTorch Core
- 行业反馈viable/strict/1789552248: [MPS] fix rand and uniform_ upper-bound rounding (#197081)PyTorch Core
- 行业反馈trunk/5038832e12e07068a5231c3e9e6c9700fcc98ca8: [MPS] fix rand and uniform_ upper-bound rounding (#197081)PyTorch Core
- 当前判断这属于 PyTorch MPS(Apple 设备)后端的持续维护,反映 Apple 硬件路径在数值精度与编译器成熟度上仍需逐项补齐。对生态的影响取决于此类修复是否稳定进入发布版本,而非单次提交本身。Agent Pulse · 分析
PyTorch 仓库出现一条 MPS 后端修复提交(#197081,对应 issue #197079),主题是 rand 与 uniform_ 的上界舍入问题。修复思路是模仿 CPU 行为:当采样结果被舍入到本应被排除的上界时,将其回绕到下界。提交说明指出,类型转换被放在 host 侧而不是 device 侧,原因是 Metal 编译器存在 bug。证据同时给出一段可复现的 Metal shader 代码,用 bfloat 计算 bounds.x + (bounds.y - bounds.x) * samples[i],并在结果等于 bfloat(bounds.y) 时返回 bfloat(bounds.x),配合 torch.mps.compile_shader 与 mps 设备张量运行。
从证据看,这是一个边界条件正确性问题:浮点采样在 bfloat 精度下可能落到被排除的上界,需要在 host 侧做回绕处理以规避 Metal 编译器 bug。可验证的下一信号是:该提交是否进入正式 release notes,以及 MPS 上 rand/uniform_ 在 bfloat16 下的边界测试是否被加入 CI。
这属于 PyTorch MPS(Apple 设备)后端的持续维护,反映 Apple 硬件路径在数值精度与编译器成熟度上仍需逐项补齐。对生态的影响取决于此类修复是否稳定进入发布版本,而非单次提交本身。
对依赖 Apple 设备做本地训练或推理的团队,随机数边界正确性影响可复现性;建议在升级前用 bfloat16 边界用例自测,并关注该修复进入哪个稳定版本。
若后续版本持续出现 MPS 数值边界修复,说明该后端仍在收敛期;可观察下一信号是同类 issue 的关闭速度与是否出现回归测试。