1. Разбор ограничений
x86 Python под Rosetta часто отключает MPS. Малый batch недогружает Metal; большой — бьёт по унифицированной памяти и swap. Редукции и dtype дают численный дрейф относительно CUDA. В ноутбуках после эпохи вызывайте gc.collect() и torch.mps.empty_cache(), иначе кривая памяти вводит в заблуждение.
2. Матрица решений
| Ось | CPU | MPS | MLX | Удалённый |
|---|---|---|---|---|
| Сила | совместимость | torch-активы | Apple-путь | изоляция SLO |
| Риск | потолок | операторы/числа | двойной стек | эксплуатация |
3. Пять шагов
- Зафиксировать arm64 и сборку torch.
- Залогировать is_built/is_available и тестовый matmul.
- Просканировать batch, сохранить throughput и пик памяти.
- После эпохи — gc и empty_cache.
- Сравнить ускорение с CPU; задокументировать горячие операторы и ветвить на MLX/удалённый узел.
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. Наблюдаемость
| Сигнал | Сначала | Смягчение |
|---|---|---|
| Ускорение ~1x | device/sync | profiler |
| 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% были троттлингом на батарее. Такие строки закрывают постмортемы быстрее, чем очередной «супер-бенчмарк».