2026_MAC
PYTORCH_MPS_
CV_METAL_
MLX_REMOTE.

// Боль: тензоры на mps, но шаги как на CPU; операторы падают в fallback; loss расходится с CUDA; унифицированная память растёт между эпохами без empty_cache. Вывод: матрица, пять шагов, три порога делают MPS проверяемым; далее критерии для MLX или выделенного удалённого Apple Silicon. Ссылки: MetalRT/MLX/llama.cpp, Ollama+MLX, Docker Colima, SSH/VNC, тарифы.

PyTorch и Apple Silicon инженерия

1. Разбор ограничений

x86 Python под Rosetta часто отключает MPS. Малый batch недогружает Metal; большой — бьёт по унифицированной памяти и swap. Редукции и dtype дают численный дрейф относительно CUDA. В ноутбуках после эпохи вызывайте gc.collect() и torch.mps.empty_cache(), иначе кривая памяти вводит в заблуждение.

2. Матрица решений

ОсьCPUMPSMLXУдалённый
Силасовместимостьtorch-активыApple-путьизоляция SLO
Рискпотолокоператоры/числадвойной стекэксплуатация

3. Пять шагов

  1. Зафиксировать arm64 и сборку torch.
  2. Залогировать is_built/is_available и тестовый matmul.
  3. Просканировать batch, сохранить throughput и пик памяти.
  4. После эпохи — gc и empty_cache.
  5. Сравнить ускорение с CPU; задокументировать горячие операторы и ветвить на MLX/удалённый узел.
import torch, platform print(platform.machine(), torch.backends.mps.is_available())

4. Три порога (заменить измерениями)

  • Если выигрыш шага < 22% к CPU и GPU-время < 18% — сначала data plane.
  • Если за 10 эпох память > 26% к базе — утечки ссылок и выделенный хост.
  • Bitwise CUDA-loss — перенос обучения или только препроцессинг на MPS.

5. Таблица симптомов

СимптомГипотезаДействие
Быстро, потом обрывкэшbatch, сброс
Один слой медленныйдыра ядраprofiler

6. Когда MLX или пул

Доминирует LLM-инференс — сначала статья Ollama+MLX. Ноутбук делит память с видеозвонками — перенос на удалённый Mac по гайду SSH/VNC. Операторы не сходятся за две недели — разделяйте архитектуру.

7. FAQ

MPS против MLX зависит от модели. Для SLO — стабильный torch. Docker+MPS — читать Colima про стоимость VM и I/O.

8. Углубление: MPS как налог на совместимость

MPS — мост исследовательского torch к Metal, не клон CUDA. Пропускная способность Metal и накладные на малый batch, плюс плюсы унифицированной памяти, должны быть на одном графике с p95. Фиксируйте пятёрку: версия torch, commit, batch, пик памяти, флаги fallback. Сравнение движков задаёт контракт; статья про Docker изолирует потерю видимости GPU. Аренда удалённого Mac снижает привычку превращать ноутбук в ночной сервер.

9. Наблюдаемость

СигналСначалаСмягчение
Ускорение ~1xdevice/syncprofiler
OOMдинамический графempty_cache

10. Закрытие

Ноутбук — для итераций; общий узел — для обязательств. MACGPU даёт публичные тарифы без логина для пробы удалённого Apple Silicon. Перед внешними SLA приложите arm64-доказательство и кривые.

11. DataLoader и синхронизация: пустая шкала GPU ≠ выключенный MPS

Частая ошибка — смотреть только на столбец GPU в мониторинге и объявлять MPS «мёртвым». На практике CPU держит декодирование JPEG/WebP, агрессивные аугментации, колляцию и синхронные логи; каждый loss.item() на шаге тянет согласование и оставляет Metal в коротких простоях. Решение — профилировать узкое окно после прогрева и отдельно снять «только данные» и «только forward». Поднятие num_workers увеличивает резидентную память каждого воркера на той же унифицированной шине; на 16 ГБ четыре голодных воркера плюс браузер могут съесть выигрыш. Фиксируйте тройку: число воркеров, batch, p95.

pin_memory из CUDA-руководств переносите как гипотезу: сначала profiler, потом правки, иначе вы лечите не ту систему.

12. Как читать torch.profiler без мистики

Возьмите пятьдесят шагов после разогрева, включите CPU и MPS, смотрите на очереди: малый self-time при большом ожидании намекает на синхронизацию или fallback. Для зрения снимите отдельный трейс только на resize/normalize/collate, чтобы не списывать на свёртки задержки диска. При multiprocessing опишите seed и worker_init_fn в README — иначе «не воспроизводится» станет религией.

13. Численная согласованность с CUDA и границы честности

NCCL и распределённый CUDA-тренинг здесь не помощники: мульти-GPU MPS не является заменой. Требовать побитовое совпадение loss между кластером и Mac чаще вредно; лучше зафиксировать метрики валидации с допусками и таблицу dtype-политик. Жёсткая репликация — на одной платформе или через утверждённую таблицу отклонений.

14. Микросценарий: ViT-tiny и пакет на 16 ГБ

Батч с A100 может мгновенно ударить по swap. Идите ступенями, записывайте пары «пик памяти — throughput», затем повторите на удалённом узле с 64 ГБ. Если оптимум сдвинулся, объясните это I/O и тепловым бюджетом, а не лозунгом «железо лучше».

15. Мультипроцессинг и дескрипторы на macOS

Fork-семантика отличается от Linux. При зависаниях вернитесь к одному процессу загрузки, воспроизведите, добавляйте воркеров по одному. Если параллельно крутится другой инференс, сверьтесь со статьёй про конкуренцию за унифицированную память.

16. Чекпойнты, AMP и накопление градиентов

AMP на MPS не копирует CUDA один в один. При микробатчах перепроверьте масштабирование и шаг оптимизатора. Включённый gradient checkpointing меняет профиль — укажите стратегию рядом с каждым опубликованным числом.

17. Поля журнала, которые экономят недели

Контрольная сумма шарда данных, список фоновых приложений, блок питания, режим энергосбережения, тип монтирования кэша, после переноса на удалённый хост — RTT до артефакт-хранилища. Скучно, пока не выяснится, что −12% были троттлингом на батарее. Такие строки закрывают постмортемы быстрее, чем очередной «супер-бенчмарк».