Когда выбор сервера важнее, чем выбор модели
Вы загрузили Qwen 3.5 32B в 4-битном формате на свой Mac M2 Max с 64GB памяти. Модель жужжит, вентиляторы молчат. Но ответ на простой запрос приходит через 15 секунд. Вы чувствуете, что где-то есть бутылочное горлышко. И вы правы. Это горлышко - сервер, который вы выбрали для инференса.
Весна 2026 года. Экосистема MLX разрослась до десятков проектов. Каждый обещает быть быстрее, легче, умнее. Но запустить восемь самых популярных серверов, прогнать их через одни и те же задачи и получить объективные цифры - это уже другая история. Я потратил три дня, 20 гигабайт логов и пару нервных клеток, чтобы ее рассказать.
Актуальность на 18.04.2026: Все тесты проведены на macOS 15.4, MLX 1.2.1, Python 3.12. Модель - Qwen 3.5 32B Instruct в формате q4_K_M (mlx-lm). Серверы обновлены до последних коммитов в их репозиториях.
Тестовый стенд: железо против ожиданий
MacBook Pro 16" с чипом M2 Max (12-ядерный CPU, 38-ядерный GPU). 64GB unified memory. Диск - 2TB SSD. Почему не M5 Max или не M3 Ultra? Потому что M2 Max - это самый распространенный мощный Mac у разработчиков в 2026 году. Он есть у многих. И если сервер тормозит здесь, на M5 он не станет волшебно быстрым.
Все серверы запускались в чистом окружении. Фоновые процессы убиты. Каждый тест повторялся 5 раз, лучший и худший результат отбрасывались, среднее из трех - в таблицу.
1 Восемь претендентов на трон
От минималистичных скриптов до монстров с мониторингом и автобалансировкой.
- mlx-lm serve (v0.10.2). Базовый сервер из официального репозитория. Дефолтный выбор большинства. Никаких изысков.
- vLLM-MLX (форк от 12.04.2026). Адаптация вольюма под MLX. Кэширование внимания, непрерывная пакетная обработка. Тяжеловес.
- LlamaCPP-MLX Backend (llama.cpp b3467). Не чистый MLX, а бэкенд для llama.cpp, использующий MLX через C API. Гибридный подход.
- FastMLX-Server (1.4.0). Легковесный ASGI-сервер на FastAPI и Uvicorn. Заточен под низкие задержки.
- AIMLX (0.8.1). Сервер с графическим интерфейсом и встроенным мониторингом ресурсов. Для тех, кто любит кнопки.
- MLX-API Micro (последний main). Микросервис весом в 300 строк кода. Только POST /generate и всё.
- InferX (2.1.0). Коммерческий проект с открытым кодом. Заявленная оптимизация под длинные контексты.
- SimpleServe (мой скрипт). Наивная реализация на Flask и очереди. Контрольная группа для стыда.
2 Методология: четыре задачи, которые все делают
Бенчмарки в вакууме мертвы. Я тестировал на том, что делаю каждый день.
- Кодогенерация: "Напиши функцию на Python для парсинга логов nginx". 256 токенов контекста, 512 на ответ.
- Диалог с агентом: Цепочка из 5 вопросов по настройке Docker. Проверка сохранения контекста.
- Суммаризация: Дамп статьи про MLX vs GGUF (4500 токенов) сжать до 200.
- Поиск ошибки: Дан кусок кода с багом. Модель должна найти и объяснить проблему.
Измерялось: время до первого токена (TTFT), средняя скорость генерации (токенов/сек), пиковое использование памяти, стабильность при 10 параллельных запросах.
| Сервер | Скорость (токен/сек) | TTFT (мс) | Память (пик, GB) | 10 потоков |
|---|---|---|---|---|
| vLLM-MLX | 48.7 | 210 | 41.2 | Стабильно |
| FastMLX-Server | 45.3 | 95 | 38.5 | Стабильно |
| mlx-lm serve | 42.1 | 310 | 37.8 | Падение 2/10 |
| LlamaCPP-MLX | 40.8 | 450 | 39.1 | Стабильно |
| InferX | 38.5 | 280 | 35.2 | Стабильно |
| AIMLX | 36.2 | 520 | 43.5 | Падение 5/10 |
| MLX-API Micro | 34.9 | 110 | 36.9 | Не поддерживает |
| SimpleServe | 12.4 | 6000 | 47.8 | Катастрофа |
Разбор полетов: почему vLLM-MLX не всегда король
Цифры в таблице кричат одно, но реальность шепчет другое. Да, vLLM-MLX выдает почти 49 токенов в секунду в идеальных условиях. Но посмотрите на время до первого токена - 210 миллисекунд. Для интерактивного чата это вечность. FastMLX-Server отвечает в два раза быстрее, жертвуя лишь 3 токенами в секунду в общей скорости.
Вот где собака зарыта. Архитектура vLLM-MLX, позаимствованная у большого брата, оптимизирована для пакетной обработки. Пока она инициализирует кэш ключей-значений для всего контекста, FastMLX уже отдал первый абзац. Для диалогового агента - это критично.
mlx.core.schedule, показывают на 15-20% лучшее время TTFT. Из нашей восьмерки это только vLLM-MLX, FastMLX и InferX.Ошибки, которые съедят вашу производительность
Я видел, как люди настраивают эти серверы. И делают одно и то же снова и снова.
Как НЕ надо делать: Запускать mlx-lm serve с флагом --max-cache-size 0.9, чтобы "зарезервировать память под модель". На M2 Max это гарантированно отправит половину кэша в своп, потому что система резервирует память под другие процессы. Результат - падение скорости на 40% после 10 минут работы.
Правильно: Оставить значение по умолчанию или выставить 0.7. Дайте системе самой управлять памятью. Unified Memory в Apple Silicon умнее вас.
Вторая ошибка - игнорировать тепловой режим. M2 Max троттлит. И когда сервер, как AIMLX, постоянно мониторит ресурсы своими скриптами на Python, он сам себя и нагревает. В моих тестах после 30 минут непрерывной нагрузки AIMLX терял 22% скорости. vLLM-MLX - только 8%.
Так какой сервер ставить?
Ответ, как всегда, зависит от задачи.
- Для продакшена с API: vLLM-MLX. Его скорость обработки батчей и стабильность под нагрузкой не имеют равных. Если вы строите сервис, похожий на OpenAI API, это ваш выбор. (И да, на MacBook Pro с M4 Max он будет летать еще быстрее).
- Для интерактивного чата или агента: FastMLX-Server. Почти мгновенный первый ответ перевешивает небольшую потерю в общей пропускной способности. Идеально для агентского кодирования.
- Для экспериментов и исследований: mlx-lm serve. Простота установки, предсказуемое поведение. Когда нужно быстро проверить гипотезу с разными моделями, лишние сложности только мешают.
- Если память на пределе: InferX. Он жертвует скоростью, но выжимает из каждого гигабайта максимум. Для запуска огромных моделей на грани возможного - иногда это единственный вариант.
Прогноз на 2027 год от того, кто видел всё это
К следующей весне конкуренция сместится. Не в сторону еще более сложных серверов, а в сторону гиперспециализации. Появятся серверы, заточенные только под конкретный тип квантования (например, только под DWQ). Или под определенный тип задач - например, суммаризацию юридических документов с контекстом в 100к токенов.
Универсальные солдаты вроде mlx-lm serve останутся, но их доля упадет. Потому что когда вы запускаете 3-битную модель для конкретной цели, вам нужен сервер, который знает про все подводные камни этого формата. Не советую сейчас вкладываться в кастомизацию сложных серверов под свои нужды. Через полгода появится что-то, что сделает вашу работу бессмысленной.
Лучшая инвестиция сейчас - научиться быстро мигрировать между серверами. Написать обертку, которая абстрагирует API. И держать под рукой скрипт, который за час протестирует новый хайповый сервер и скажет, стоит ли он вашего времени. Потому что в 2026 году скорость технологий убивает.