Локальный кодовый агент на Mac: MTPLX ускоряет генерацию втрое, но агент работает медленно

Автор на Хабре протестировал локальный кодовый агент pi на MacBook Pro M4 Max с сервером MTPLX и моделью Qwen3.8–27B. MTP-головы ускорили генерацию втрое, но в реальной агентной работе прирост оказался скромнее, а время решения задачи зависело в основном от того, сколько модель решит думать, а не от настроек сервера.

Главное
  • MTPLX ускорил генерацию с 21 до 63 токенов в секунду на коротком промпте за счёт встроенных MTP-голов Qwen3.8
  • В агентной работе скорость упала до 34,5 токена в секунду, а на сложной задаче время решения составило 10–16 минут
  • Все пять полных прогонов с размышлениями прошли 30 из 30 скрытых тестов, а режим без размышлений был оборван на 8,5 минуте
Ноутбук MacBook Pro с запущенным локальным кодовым агентом в терминале
Фото: Хабр: Машинное обучение

Автор на Хабре проверил, насколько быстро локальный кодовый агент может работать на ноутбуке без облака. Стенд: MacBook Pro на чипе M4 Max со 128 ГБ unified memory, сервер MTPLX 2.11.3, модель Youssofal/Qwen3.8–27B-MTPLX-Optimized-Speed в 4-битном квантовании (около 20,7 ГБ весов) и агент pi 0.87.1. Контекст — 262 144 токена.

Как работает MTPLX

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

Встроенный подбор глубины черновика показал на этом Mac рост с 21,1 токена в секунду без ускорения до 63,1 токена в секунду при глубине D3 — почти трёхкратный прирост.

Задача и методика

Для теста взяли задачу, которую нельзя решить с наскока, но можно проверить автоматически: с нуля написать пакет minicalc — интерпретатор выражений со спецификацией на страницу. Нужно было разбить код на модули (лексер, парсер, вычислитель, ошибки) и учесть приоритеты операций, правую ассоциативность, цепочки присваиваний, встроенные функции, позиции ошибок и атомарность.

Проверка состояла из 24 видимых тестов рядом с задачей и 30 скрытых, которых модель не видит. Все тесты сначала прогнали на эталонной реализации — 54 из 54. Каждый прогон запускался в чистой папке с одним и тем же промптом.

Результаты

Качество оказалось одинаковым во всех режимах с размышлениями: все пять полных прогонов прошли 30 из 30 скрытых тестов. Модель сама писала проверочные скрипты на пограничные случаи из спецификации.

Без размышлений модель не справилась. Режим off начал писать код через минуту — в шесть раз раньше, чем medium, — но дальше пошли пробы и ошибки: дважды переписанные парсер и вычислитель, семь неудачных вызовов инструментов. На 8,5 минуте код даже не импортировался из-за SyntaxError.

Режим low не дал экономии: 18 минут, самый медленный прогон, 30 вызовов инструментов и 4 ошибки. Режим xhigh дольше думает, но работает чисто — 9 минут до первого файла и ни одной ошибки инструментов.

Разброс между прогонами оказался важнее режима: три прогона medium дали 10, 14 и 16 минут. Уверенно можно говорить только о крайних случаях: off не работает, low не экономит.

Куда уходит время

По метрикам MTPLX на 22 запросах генерация заняла около 70% времени (678 секунд, 23,4 тыс. токенов, 34,5 токена в секунду), prefill новых токенов — около 30% (303 секунды, 45,5 тыс. токенов, примерно 150 токенов в секунду). Из кеша в RAM взято 340 тыс. токенов почти без затрат времени.

Для профиТехнические детали: архитектура, цифры, ссылки

Стенд: MacBook Pro, M4 Max, 128 ГБ unified memory; MTPLX 2.11.3; модель Youssofal/Qwen3.8–27B-MTPLX-Optimized-Speed, 4 бита, ~20,7 ГБ весов; контекст 262 144 токена; профиль turbo, глубина черновика D3; агент pi 0.87.1 без расширений.

Подключение: MTPLX отдаёт OpenAI- и Anthropic-совместимый API. В pi настраивается как провайдер в ~/.pi/agent/models.json с baseUrl http://127.0.0.1:8000/v1, api openai-completions, apiKey none, compat supportsDeveloperRole false и supportsReasoningEffort false.

Бенчмарк mtplx tune:

  • AR — 21,1 ток/с (1,00x)
  • D1 — 48,3 ток/с (2,29x)
  • D2 — 61,7 ток/с (2,93x)
  • D3 — 63,1 ток/с (2,99x, BEST)

Результаты прогонов:

  • medium (прогон 1) — 10,0 мин, 24/24 видимых, 30/30 скрытых, 18 вызовов / 2 ошибки, 17,8 тыс. токенов
  • medium (прогон 2) — 13,9 мин, 30/30 скрытых, 19 вызовов / 3 ошибки, 23,7 тыс. токенов
  • medium + SSD-кеш — 16,2 мин, 30/30 скрытых, 22 вызова / 4 ошибки, 23,3 тыс. токенов
  • xhigh — 14,5 мин, 30/30 скрытых, 13 вызовов / 0 ошибок, 27,1 тыс. токенов
  • low — 18,3 мин, 30/30 скрытых, 30 вызовов / 4 ошибки, 30,2 тыс. токенов
  • off — оборван на 8,5 мин, 0/24 видимых, 33 вызова / 7 ошибок, 14,2 тыс. токенов

Метрики MTPLX (/metrics), 22 запроса: генерация — 678 с (~70%), 23,4 тыс. токенов, 34,5 ток/с; prefill новых токенов — 303 с (~30%), 45,5 тыс. токенов, ~150 ток/с; из кеша в RAM — ~0 с, 340 тыс. токенов.

Вопросы и ответы

Насколько MTPLX ускоряет генерацию?
На коротком промпте — почти втрое: с 21,1 до 63,1 токена в секунду при глубине черновика D3. В реальной агентной работе скорость составила около 34,5 токена в секунду.
Можно ли отключить размышления модели, чтобы ускорить работу?
Нет. Режим off начал писать код через минуту, но на 8,5 минуте код не импортировался из-за SyntaxError. Режим low тоже не дал экономии — 18 минут, самый медленный прогон.
Какое железо нужно для такого агента?
В тесте использовался MacBook Pro на M4 Max со 128 ГБ unified memory. Модель Qwen3.8–27B в 4-битном квантовании занимает около 20,7 ГБ.