← 返回实验室

各种内存 Mac 的 MPS backend out of memory:“max allowed”是多少

pytorchapple-siliconmemoryguide

Mac 上的 PyTorch 错误里有一个大家会搜索的数字。这条来自一台 16 GB Mac(AudioLDM2 #20):

RuntimeError: MPS backend out of memory (MPS allocated: 18.02 GB, other allocations: 107.10 MB, max allowed: 18.13 GB). Tried to allocate 4.50 MB on private pool.

在上一篇笔记中,我测量了它在我的 48 GB Mac 上是怎么来的。max allowed 是 PYTORCH_MPS_HIGH_WATERMARK_RATIO,默认值为 1.7,乘以 macOS 建议给 GPU 的工作集,也就是 torch.mps.recommended_max_memory() 的返回值。一台机器无法告诉你其他机器上的这个数字,所以我从其他人的错误里读出来。

数字从哪里来

十月 24 日,我在 GitHub 搜索了引用该错误及其 max allowed 值的 issue。找到 250 个 issue 和 pull request,其中 167 个在文本中带有数字。大多数值落在几个组里;报告者注明 Mac 内存时,这些组与内存大小吻合。每个值除以 1.7,就得到 macOS 在那台机器上给 GPU 的工作集。

Mac 内存max allowed,GiBGPU 工作集,GiB内存占比报告数发现时间
8 GB9.075.3367 %272023 – 2026
16 GB18.1310.6767 %182023 – 2026
24 GB27.2016.0067 %9Jan 2025 – Jan 2026
24 GB30.1917.7674 %3Dec 2025 – Sep 2026
32 GB36.2721.3367 %62024 – 2025
36 GB45.9027.0075 %32024 – 2026
48 GB63.6537.4478 %4,加上我的Sep – Oct 2026
64 GB81.6048.0075 %7Dec 2023 – Apr 2025
64 GB88.1351.8481 %6Mar – Oct 2026
128 GB163.2096.0075 %42024 – 2025
128 GB182.78107.5284 %2Dec 2025 – Jan 2026

按 Mac 内存大小看 macOS 给 GPU 的内存占比:截至 2025 年末的报告中,32 GB 以下为三分之二,以上为四分之三;自 2025 年末起的报告中,24、48、64 和 128 GB Mac 分别为 74、78、81 和 84 %

较旧的 PyTorch 版本将这些数字标为 GB,较新的标为 GiB。两者都是二进制单位:1.7 × 三分之二 × 16 GiB 正好等于 18.13。

改变了什么

到 2025 年末之前,规律看起来很简单。macOS 给 32 GB 以下 Mac 的 GPU 三分之二内存,以上则给四分之三。2025 年末以来的报告显示,24、64 和 128 GB Mac 的占比更高。三份注明系统的 64 GB 报告都写的是 macOS 26。8 和 16 GB 的数值没有变。我的 48 GB Mac 运行 macOS 26.5.2,返回 37.44 GiB,即 78 %。

这里有两个限制:每个较新的行只基于两到六份报告,我也无法据此判断差异来自 macOS 还是芯片。

看到这个错误意味着什么

在默认比例下,表中每一行的上限都高于物理内存:1.7 × 三分之二为内存的 113 %,而 1.7 × 84 % 为 143 %。任务到达 max allowed 时,早已交换了一段时间。这与我的测量一致:在我的 Mac 上,内存占用量介于 33.5 和 36 GB 时便开始交换,远低于 63.65 GiB 的上限。错误结尾建议的比例 0.0 会移除上限,因此任务可以继续交换。

如果你宁愿得到干净的错误,而不是一台正在交换的 Mac,就把上限设在内存以下,例如比例设为 1.0,也就是工作集本身。同时设置 low 比例:在 PyTorch 2.14 中,单独将 high 比例设在 1.4 以下会因 “invalid low watermark ratio 1.4” 而失败。

PYTORCH_MPS_HIGH_WATERMARK_RATIO=1.0 PYTORCH_MPS_LOW_WATERMARK_RATIO=0.8 python your_script.py

查看你自己的 Mac 工作集:

import torch
print(torch.mps.recommended_max_memory() / 2**30, "GiB")

不符合的数字

约三分之一的报告显示其他上限,例如 1.70、3.40、6.77 或 3.00 GiB。它们不是 Mac 的默认值。应用或用户设置了自己的比例或上限:有一个视频工具即使在 128 GB Mac 上也将 MPS 限制为 3 GiB。另有 20 份报告为 7.93,我无法把这个值和某一种 Mac 内存大小联系起来。如果你的数字远低于表格,先检查工具设置,再怪 Mac。

来源

每行两份报告。完整的 167 份列表在数据文件中。