Про Mac и локальные модели обычно говорят одну половину правды: «на макбуке с 64 гигабайтами запускается модель, которая не влезает в домашнюю видеокарту за те же деньги». Это верно. Вторая половина звучит реже: та же модель на том же макбуке будет заметно дольше «думать» перед началом ответа, чем на дискретной карте, — и на длинных запросах разница становится решающей.
Обе половины следуют из одной архитектурной особенности. Разберём, из какой именно, и что с этим делать.
#Что понадобится
- Mac на чипе Apple Silicon — M1 и новее. На процессорах Intel Metal-бэкенд работает существенно хуже, и тема этой статьи к ним почти не относится.
- Xcode Command Line Tools:
xcode-select --install. - Знание объёма памяти:
system_profiler SPHardwareDataType | grep -E "Chip|Memory".
#Шаг 1. Понять, что такое unified memory на практике
На обычном компьютере видеокарта имеет собственную быструю память, а процессор — свою. Данные между ними копируются. На Apple Silicon память одна: и процессор, и графическое ядро адресуют один пул.
Из этого следуют три практических вывода.
Вывод первый: «видеопамяти» у вас столько же, сколько оперативной. Mac с 64 ГБ способен держать в памяти модель на 40 ГБ — при том что домашних видеокарт такого объёма практически не существует. Это главное преимущество платформы.
Вывод второй: память не бесконечна и делится с системой. По умолчанию графическому ядру разрешено занимать не всю установленную память, а её часть. Оставшееся нужно системе и приложениям, и упереться в этот предел легко. Долю можно поднять — но точное значение по умолчанию и корректный способ его менять зависят от версии macOS, и это требует проверки в документации вашей версии; вслепую менять системные параметры не стоит.
Вывод третий: пропускная способность памяти становится главной характеристикой чипа. Она же определяет скорость генерации: каждый токен требует прочитать все веса модели.
#Шаг 2. Найти свой чип в таблице
Значения ниже — официальные спецификации Apple по пропускной способности памяти. Смотреть здесь надо не на абсолютные числа, а на разброс внутри одного поколения: разница между базовым чипом и вариантом Max — четырёх-пятикратная, и ровно во столько же раз различается скорость генерации на одной и той же модели.
| Чип | Пропускная способность | Чего ожидать |
|---|---|---|
| M1 / M2 / M3 (базовые) | ~68–100 ГБ/с | модели до 7–8B комфортно |
| M4 (базовый) | ~120 ГБ/с | модели до 8–14B |
| M1 Pro / M2 Pro | ~200 ГБ/с | 14B комфортно, 32B терпимо |
| M3 Pro | ~150 ГБ/с | ниже, чем у M2 Pro, — это не опечатка |
| M4 Pro | ~273 ГБ/с | 32B рабочий вариант |
| M1 Max / M2 Max | ~400 ГБ/с | 32B комфортно |
| M3 Max / M4 Max | ~300–546 ГБ/с | зависит от конфигурации ядер |
| M1 Ultra / M2 Ultra | ~800 ГБ/с | 70B при достаточном объёме |
Значения для старших чипов различаются между конфигурациями одного названия, поэтому свою цифру стоит сверить со спецификацией конкретной модели. Оценка скорости считается делением: пропускная способность, делённая на вес модели в гигабайтах, даёт теоретический потолок в токенах в секунду, реально достигается 50–70% от него.
Например, M2 Pro и модель 8B в Q4_K_M весом 4,9 ГБ: потолок около 41 токена в секунду, ожидаемо 20–29. Это хорошая скорость.
#Шаг 3. Понять асимметрию: prompt eval против generation
Здесь начинается то, о чём в обзорах обычно не пишут.
Работа модели делится на две фазы с разными узкими местами. Обработка промпта — ваш запрос прогоняется через модель целиком, токены считаются параллельно. Это вычислительная нагрузка, и она упирается в производительность графических ядер. Генерация — токены выдаются по одному, каждый требует полного чтения весов. Это нагрузка на память.
Apple Silicon устроен так, что второе у него сильная сторона, а первое — относительно слабая: пропускная способность памяти на уровне серьёзных дискретных карт, а вычислительная мощность заметно ниже. Отсюда наблюдаемая картина:
- короткий вопрос — ответ начинается почти сразу, идёт бодро;
- вопрос с приложенным документом на несколько тысяч токенов — ощутимая пауза перед первым словом, потом бодрая генерация.
На дискретной карте картина обратная по пропорциям: обработка длинного промпта проходит быстро, а генерация ограничена той же памятью.
Практический вывод: Mac хорош для диалога и плох для сценариев, где в модель постоянно заливают длинные тексты. Если ваш рабочий процесс — «вставить десять страниц и задать вопрос», ожидание будет заметным, и растёт оно с длиной документа. Разбор обеих величин и того, что считать нормой, — в материале о том, сколько токенов в секунду это нормально.
#Шаг 4. Запуск
Metal в llama.cpp включён по умолчанию, отдельный флаг не нужен:
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build
cmake --build build --config Release -j
./build/bin/llama-cli -m models/qwen2.5-14b-instruct-q4_k_m.gguf -ngl 99 -c 8192
Ollama на Apple Silicon использует Metal автоматически, никакой настройки не требуется.
Отдельная опция платформы — формат MLX, собственный вычислительный фреймворк Apple. Модели в нём иногда работают быстрее, чем те же в GGUF, но каталог заметно уже, а инструментов меньше. Проверять стоит на своей модели, а не принимать на веру.
#Проверка результата
Замерьте обе фазы раздельно — иначе асимметрию не увидеть:
./build/bin/llama-bench -m models/qwen2.5-14b-instruct-q4_k_m.gguf -ngl 99 -p 512,4096 -n 128
Два значения p покажут, как проседает обработка промпта при росте его длины. Именно эта строка — главный показатель для Mac. Методика воспроизводимого замера разобрана в материале о том, как измерить скорость локальной модели правильно.
Сверьте скорость генерации с расчётом. Если она заметно ниже 50% теоретического потолка, что-то не так: либо модель не полностью на графическом ядре, либо система вытесняет память на диск.
Проверьте давление на память. В «Мониторинге системы» вкладка «Память» показывает индикатор нагрузки. Жёлтый или красный при загруженной модели означает, что запас исчерпан и часть данных уходит в файл подкачки — скорость после этого падает на порядок.
#Что может пойти не так
Модель загрузилась, но система начала тормозить целиком. Вы заняли слишком большую долю общей памяти. На Mac это ощущается сильнее, чем на ПК: тормозит не только модель, а весь интерфейс. Возьмите модель на класс меньше или сократите контекст.
Скорость упала после подключения внешнего монитора. Графическое ядро обслуживает и вывод изображения, часть ресурсов уходит туда. На больших разрешениях эффект заметен.
Ноутбук на батарее работает медленнее. В режиме энергосбережения производительность урезается. Замеры имеет смысл делать в том режиме, в котором вы работаете.
Модель 70B «влезла», но пользоваться невозможно. Проверьте арифметику: 42 ГБ весов при 400 ГБ/с дают потолок около 9,5 токена в секунду, реально 5–7. Это медленнее, чем модель 14B на том же чипе, примерно впятеро. Объём памяти позволил запуск, но не сделал его удобным. Как считать этот баланс — в материале о том, сколько нужно VRAM для локальной LLM.
#Частые вопросы
#Сколько памяти брать в Mac под локальные модели?
16 ГБ хватает на модели до 7–8B с умеренным контекстом. 32 ГБ открывают класс 14B и комфортный контекст. 64 ГБ и больше нужны для 32B и выше — но помните, что скорость при этом определяется не объёмом, а пропускной способностью чипа.
#Mac быстрее или медленнее видеокарты?
По генерации старшие чипы сопоставимы с серьёзными дискретными картами. По обработке длинного промпта проигрывают заметно. По объёму доступной памяти выигрывают почти всегда. Что выбрать при сравнимом бюджете — в разборе того, какую видеокарту взять под локальные LLM.
#Базовый M-чип вообще подходит?
Подходит для моделей до 7–8B. При пропускной способности порядка 100 ГБ/с модель 8B в Q4_K_M даст порядка 10–14 токенов в секунду — это рабочая скорость. Модели 32B на базовом чипе запускаются, но пользоваться ими некомфортно.
#Нужно ли что-то настраивать для использования графического ядра?
Нет, Metal подхватывается автоматически и в llama.cpp, и в Ollama. Если скорость подозрительно низкая, проверьте, что все слои выгружены на графическое ядро — в логе запуска есть соответствующая строка.
#Почему на Mac нет параметра «сколько видеопамяти выделить»?
Потому что памяти одна на всех. Доля, доступная графическому ядру, регулируется системой, и её предел зависит от версии macOS. Менять этот предел вручную возможно, но это системная настройка со своими рисками — сверяйтесь с документацией своей версии.
#Разница между обработкой промпта и генерацией есть только на Mac?
Она есть везде, просто на Mac перекос заметнее из-за соотношения вычислительной мощности и пропускной способности памяти. Общая механика этих двух фаз одинакова для любой платформы и разобрана в материале о том, от чего зависит скорость LLM на процессоре.