Дисклеймер: я держу сервис аренды маков, поэтому у меня под рукой флот одинаковых машин и повод их гонять. Цифры ниже с этих машин, методика описана полностью, данные открыты под CC BY. Ссылок на сервис в статье нет.
Зачем очередной бенчмарк
Запросов «сколько тянет мак» в чатах много, ответов тоже, но почти все без методики: неизвестно квантование, неизвестна версия Ollama, один прогон вместо серии, непонятно, что происходило на машине в этот момент. Такие числа нельзя ни перепроверить, ни сравнить между собой.
Я замерил шесть моделей на одной конфигурации и описываю всё, что может повлиять на результат.
Методика
Железо: Mac mini M4, 16 ГБ unified memory, пропускная способность 120 ГБ/с. Машина в остальном простаивала только системные демоны.
Софт: Ollama 0.31.2, macOS 15.3.1 (Sequoia).
Квантование: Q4_K_M у всех моделей.
Промпт: одинаковый для всех просьба объяснить механизм внимания в трансформерах на 300 слов для джуна, с одной конкретной аналогией.
num_predict = 512,temperature = 0.7.Прогоны: 3 на модель, плюс один прогревочный (отбрасывается). Разброс между прогонами до 0.5%.
Прогрев важнее, чем кажется: первый запуск включает загрузку весов в память, и если его не отбросить, картина смещается на десятки процентов.
Результаты
Модель |
Параметров |
Генерация, ток/с |
Обработка промпта, ток/с |
|---|---|---|---|
Llama 3.2 3B |
3B |
46.7 |
1720 |
Mistral 7B |
7B |
22.8 |
645 |
Qwen 2.5 7B |
7B |
22.3 |
1130 |
Llama 3.1 8B |
8B |
21.2 |
587 |
DeepSeek R1 8B |
8B |
20.0 |
531 |
Qwen 2.5 14B |
14B |
11.7 |
606 |
Разброс между тремя прогонами каждой модели 0.5%, то есть цифры устойчивые.
Отдельно любопытна разница в обработке промпта у Mistral 7B (645) и Qwen 2.5 7B (1130) при почти одинаковой скорости генерации: модели одного размера, но по разному устроен токенизатор и внимание, и на префилле это видно, а на генерации нет.
Что из этого следует
Генерация упирается в память, а не в вычисления. Скорость почти линейно следует за пропускной способностью памяти и обратно за размером модели. Отсюда практическое правило: прикинуть скорость можно, поделив полосу на размер весов. Для 8B в Q4 (~4.7 ГБ) при 120 ГБ/с получается около 25 ток/с измеренные 21 попадают в ожидание с поправкой на накладные расходы.
Поэтому на M4 Pro (273 ГБ/с) и M4 Max (546 ГБ/с) прирост будет примерно кратен полосе, а не числу ядер. Своих замеров на них у меня пока нет, поэтому конкретных чисел не даю как появятся, добавлю в таблицу.
Комфортный потолок 16 ГБ - 8B. До 8B модели выдают 20+ ток/с, это быстрее, чем читает человек: ассистент по коду, разбор документов, локальный RAG работают нормально. 14B формально запускается, но 11.7 ток/с это уже ожидание, и на длинных ответах оно раздражает. Для 14B и выше нужны 24-32 ГБ и другая полоса.
Длинный контекст не проблема. Обработка промпта идёт от 530 до 1720 ток/с в зависимости от модели, то есть на порядок два быстрее генерации. Закинуть в контекст большой документ дёшево; дорого потом это генерировать.
Чего в замерах нет
Честно про ограничения: одна конфигурация, одно квантование, один тип задачи (генерация связного текста). На кодовых задачах с длинными выводами картина может отличаться, батчинг я не мерил вовсе это отдельная история, и на 16 ГБ он упирается в KV-кэш быстрее, чем в скорость.
Данные и методика: https://macyou.co/benchmarks лицензия CC BY, можно брать и перепроверять.
Если у вас есть машины на M1/M2/M3 или на 24-64 ГБ присылайте свои замеры по этой же методике, соберу сводную таблицу. Разрозненных цифр по интернету много, воспроизводимых почти нет.
adkomarov
Во вторую версию бенчмарка стоит внести спекулятивный декодинг если задача состоит в том, чтобы измерить скорость генерации за заданное количество озу. Запускать на чистой llama.cpp с вынесением слоев в интегрированную насколько возможно. Запуск на чистой системе если возможно с отключением графики если вопрос сколько реально можно выдать из системы против вопроса для комфортной работы с параллельным запуском модели.