Когда structured outputs встречается с continuous batching на Apple Silicon
В 2026 году structured outputs - это уже не опция, а стандарт де-факто. Но когда ты пытаешься запустить это на Mac с ограниченной памятью, начинаются настоящие проблемы. Особенно если тебе нужен не просто один запрос в минуту, а десятки параллельных, каждый из которых должен вернуть идеально структурированный JSON.
Почему MLX и зачем сейчас?
MLX на Apple Silicon в 2026 году показывает производительность, от которой плачут даже оптимизированные CUDA-версии. Мы говорим о 50% приросте скорости по сравнению с llama.cpp на том же железе. Но есть нюанс: все эти красивые цифры работают, пока ты не пытаешься добавить structured outputs.
Outlines: когда грамматика становится узким местом
Outlines в 2026 году - это уже версия 2.3 с поддержкой JSON Schema через рекурсивные типы. Звучит здорово, пока не попробуешь запустить параллельный inference.
Проблема в том, что грамматические ограничения в Outlines реализованы через маскирование токенов. Для каждого запроса создается своя маска, и когда у тебя 10 параллельных запросов с разными схемами, память начинает утекать как вода. Особенно если схемы сложные, с вложенными объектами и массивами.
Главная проблема Outlines в 2026: нет native поддержки continuous batching в MLX. Ты либо пишешь свой велосипед, либо миришься с последовательной обработкой.
Кстати, если тебе интересно, как устроены внутренние представления моделей вроде Llama-3.3 (актуальная версия на 2026 год), в нашей статье «Как «мыслят» Llama-3 и Qwen-2.5» есть подробный разбор.
vLLM-mlx: порт, который почти работал
vLLM-mlx - это попытка портировать легендарный continuous batching из оригинального vLLM на MLX. В теории это должно решить все проблемы. На практике...
Версия vLLM-mlx 1.2.5 (актуальная на январь 2026) все еще борется с bf16 kernel. Проблема в том, что оригинальный vLLM заточен под CUDA и tensor cores, а MLX работает с совершенно другой архитектурой.
Когда ты пытаешься добавить structured outputs через PagedAttention (а именно так это реализовано в vLLM), начинаются проблемы с alignment. Токены выстраиваются не так, как ожидает твоя схема JSON. Особенно если у тебя в схеме есть optional поля.
| Инструмент | Поддержка continuous batching | Structured outputs | Проблемы с bf16 |
|---|---|---|---|
| Outlines 2.3 | Нет (только последовательный) | JSON Schema + грамматики | Минимальные |
| vLLM-mlx 1.2.5 | Да (PagedAttention) | Через интеграцию с Outlines | Критические (kernel нестабилен) |
| PydanticAI + MLX | Частичная (custom batching) | Pydantic модели + валидация | Решены в версии 0.8.3 |
PydanticAI: неожиданный герой 2026 года
PydanticAI в версии 0.8.3 (вышла в декабре 2025) сделал то, что другие не смогли: нативная интеграция с MLX через кастомный batching. И это не просто обертка - это полная переработка пайплайна inference под structured outputs.
Как это работает? Вместо того чтобы пытаться адаптировать существующие механизмы batching, авторы PydanticAI пошли другим путем. Они создали систему, где:
- Схемы Pydantic компилируются в грамматики перед inference
- Batching происходит на уровне грамматик, а не отдельных запросов
- Валидация JSON происходит параллельно с генерацией
Результат? Ты получаешь structured outputs с валидацией в реальном времени, при этом скорость inference падает всего на 15-20% по сравнению с обычным текстом. Для сравнения: Outlines в параллельном режиме терял до 50% производительности.
Если тебе интересно узнать больше о structured outputs в целом, у нас есть отдельная статья «LLM Structured Outputs: Когда JSON — это не опция, а требование» с примерами и best practices.
Что выбрать в 2026 году?
Ответ зависит от того, что тебе важнее: чистая производительность или надежность structured outputs.
Если тебе нужен максимальный throughput и ты готов мириться с occasional hallucinations в JSON - vLLM-mlx (когда они починят bf16 kernel). Но будь готов к тому, что в 2026 году это все еще экспериментальная технология.
Если structured outputs - это must have, а параллельность нужна, но не критична - PydanticAI с их кастомным batching. Особенно если ты уже используешь Pydantic в своем проекте.
Outlines оставь для простых задач, где parallel inference не требуется. Или для прототипирования, пока не перейдешь на что-то более серьезное.
А что насчет обучения?
Кстати, если ты думаешь не только об inference, но и о дообучении моделей на своем Mac, посмотри статью «Unsloth-MLX: как прототипировать и дообучать LLM на Mac». Там разбираются современные (на 2026 год) подходы к эффективному обучению на Apple Silicon.
Самый неочевидный совет
Не пытайся заставить один инструмент делать все. В 2026 году лучший стек для parallel inference со structured outputs на MLX выглядит так:
- PydanticAI для определения схем и валидации
- Кастомный MLX batching с JIT-компиляцией под твои конкретные схемы
- Outlines только для грамматик сложных nested структур
- Свой monitoring layer для отслеживания качества structured outputs
Звучит сложно? Да, это сложно. Но альтернатива - ждать, пока vLLM-mlx починят. А судя по roadmap на 2026 год, стабильная версия с поддержкой bf16 и structured outputs появится не раньше конца года.
P.S. Если тебе интересно, какие фреймворки для локального запуска LLM вообще существуют в 2026 году, у нас есть полный обзор «Обзор фреймворков для локального запуска LLM в 2025» (актуален и для 2026, основные игроки не поменялись).