← Назад в лабу

MPS backend out of memory: «max allowed» на Mac с любым объёмом памяти

pytorchapple-siliconmemoryguide

В ошибке PyTorch на Mac есть одно число, которое люди ищут. Вот оно с Mac на 16 GB (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.

В предыдущей заметке я разобрался, откуда оно берётся на моём Mac с 48 GB. «max allowed» — это PYTORCH_MPS_HIGH_WATERMARK_RATIO, по умолчанию 1.7, умноженный на рабочий набор GPU, который рекомендует macOS и который возвращает torch.mps.recommended_max_memory(). По одной машине нельзя понять, чему равно это число на других, поэтому я выписал его из чужих ошибок.

Откуда берутся числа

24 октября я искал на GitHub issues, где процитирована ошибка со значением «max allowed». Нашлось 250 issues и pull requests, в 167 из них в тексте есть число. Большинство значений складывается в несколько групп, и там, где автор сообщения указал объём памяти Mac, группы совпадают с ним. Если разделить каждое значение на 1.7, получится рабочий набор, который macOS выделила GPU на этой машине.

память Macmax allowed, GiBрабочий набор GPU, 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

Доля памяти, которую macOS выделяет GPU, по объёму памяти Mac: две трети до 32 GB и три четверти выше — в сообщениях до конца 2025 года; 74 %, 78 %, 81 % и 84 % на Mac с 24 GB, 48 GB, 64 GB и 128 GB — в сообщениях с конца 2025 года

Старые версии PyTorch называют эти числа «GB», а новые — «GiB». В обоих случаях это двоичная единица: 1.7 × две трети × 16 GiB точно равно 18.13.

Что изменилось

До конца 2025 года правило выглядит простым. macOS выделяла GPU две трети памяти на Mac до 32 GB и три четверти выше. В сообщениях с конца 2025 года видны большие доли на Mac с 24 GB, 64 GB и 128 GB. Во всех трёх сообщениях про 64 GB, где названа система, указана macOS 26. Значения для 8 и 16 GB не изменились. Мой Mac с 48 GB работает на macOS 26.5.2 и возвращает 37.44 GiB, 78 %.

У этих данных два ограничения: новые строки опираются всего на два — шесть сообщений каждая, и по ним нельзя сказать, macOS или чип создаёт разницу.

Что это значит, когда вы видите ошибку

При соотношении по умолчанию предел выше физической памяти в каждой строке таблицы: 1.7 × две трети — это 113 % памяти, а 1.7 × 84 % — 143 %. К моменту, когда задача достигает «max allowed», она уже некоторое время работает со свопом. Это совпадает с моим замером: на моём Mac своп начинался при footprint между 33.5 и 36 GB, намного ниже предела в 63.65 GiB. Совет в конце ошибки — соотношение 0.0 — снимает предел, так что задача может уйти в своп ещё дальше.

Если вы предпочитаете чистую ошибку вместо Mac, работающего со свопом, задайте предел ниже объёма памяти, например соотношение 1.0 — это сам рабочий набор. Вместе с ним задайте нижнее соотношение: в PyTorch 2.14 одно только верхнее соотношение ниже 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 GiB, 3.40 GiB, 6.77 GiB или 3.00 GiB. Это не стандартные значения Mac. Приложение или пользователь задал свой коэффициент или предел: один видеоредактор ограничивает MPS 3 GiB даже на Mac с 128 GB. Ещё 20 сообщений содержат 7.93, и я не смог связать это значение с одним объёмом памяти Mac. Если ваше число намного ниже таблицы, посмотрите настройки инструмента, прежде чем винить Mac.

Источники

По два сообщения для каждой строки. Полный список из 167 находится в файле данных.