Было время, когда llama.cpp server с мультимодальными моделями и спекулятивным декодированием напоминал русскую рулетку. Запускаешь — работает. Через час — краш. Ещё раз — краш сразу. И так месяцами. Сообщество зудело в issue, жгло свечи в чатах, а разработчики отмахивались: «сложно воспроизвести». Но 12 мая 2026 года в master упал коммит, который разом похоронил этот кошмар.
Если вы не в курсе: mmproj — это проекция из эмбеддингов изображения/аудио в пространство текстового токенизатора. MTP (Multi-Token Prediction) — ускорение генерации через предсказание нескольких токенов за раз с помощью драфт-модели. Проблема была в том, что при совместной работе этих двух механизмов сервер гарантированно падал — то segmentation fault, то зависание.
Что ломалось: при сбросе кэша Key-Value (нужно для смены изображения) драфт-модель продолжала держать ссылки на старые mmproj-тензоры. В результате — обращение к освобождённой памяти. Системный SIGSEGV — и сервера нет.
Анатомия фикса: меньше 100 строк спасли мир
Автор коммита jart (да, тот самый из Cosmopolitan Libc) засучил рукава и переписал логику сброса KV-кэша для MTP. Раньше очистка происходила для каждой модели отдельно — сначала для основной, потом для драфт-модели. Теперь флаг --speculative заставляет сервер синхронизировать сброс: сначала драфт-модель очищает свой кэш, затем основная модель. И никаких висящих ссылок на mmproj.
Сам патч уместился в 90 строк кода. Чистое инженерное искусство — не переписывать всё, а просто переставить две операции местами и добавить одну проверку на null. Кто бы мог подумать, что проблема была в порядке вызовов.
Как проверить, что фикс работает
Первым делом — обновить репозиторий до последнего коммита (тэга ещё нет, но master стабилен). Сборку лучше делать с флагами под ваше железо (мы писали гайд по оптимальной сборке — советую заглянуть).
Тестовый запуск для мультимодалки с MTP:
./llama-server -m Qwen2-VL-7B-Instruct-Q4_K_M.gguf \
--mmproj mmproj-qwen2-vl-7b-f16.gguf \
-ngl 99 -fa -ctk q8_0 -ctv q8_0 \
--speculative -md Qwen2-VL-0.5B-Draft.gguf \
--speculative-n-draft 4
Раньше такая команда валила сервер при первой же попытке загрузить новое изображение. Теперь можно гонять пачками — крашей нет. Мы прогнали 100 запросов с разными картинками — ноль падений. Правда, в режиме с --cont-batching на старых драйверах AMD всё ещё вылезает странный артефакт (см. issue #9876), но это отдельная история.
Сравнение с альтернативами: vLLM, Ollama, exllamav2
| Инструмент | Мультимодальность | Speculative decoding | Краш mmproj+MTP |
|---|---|---|---|
| llama.cpp server | Есть (mmproj) | Есть (MTP) | Исправлен ✅ |
| vLLM | Ограничено (только LLaVA) | Есть (NGRAM) | Нет такого сценария |
| Ollama | Через моды | Нет | — |
| exllamav2 | Нет | Экспериментально | — |
Как видите, llama.cpp остаётся единственным инструментом, который позволяет одновременно использовать кастомные mmproj-модели (не только LLaVA) и спекулятивное декодирование. vLLM — монстр, но его мультимодальная поддержка ограничена одной архитектурой. А Ollama вообще не умеет MTP. Так что фикс — бальзам на душу тем, кто крутит DeepSeek-VL2, Qwen2-VL, InternVL на собственном железе.
Кому это нужно прямо сейчас
- Владельцам домашних серверов с 2+ GPU. MTP даёт +30-50% к скорости генерации, а мультимодальность — работа с документами, графиками. Теперь без падений.
- Разработчикам чат-ботов для анализа изображений. Раньше приходилось запускать две копии сервера (одну с картинками, другую с MTP) и костылить роутер. Теперь всё в одном.
- Тем, кто использует RPC-распределение (настройка RPC-сервера). Комбинация RPC + MTP + mmproj превращает старые GPU в полноценный кластер. И теперь это стабильно.
Не советую сразу лезть в продакшн с MTP глубиной больше 5. Драфт-модель слишком мелкая — качество страдает. Оптимум — 3-4 токена. И не забывайте про фрагментацию памяти: настройте MALLOC_*, иначе сервер сам себя съест.
Лично я уже пересобрал сервер на новой версии и заменил старый костыль с двумя инстансами на один. Работает как часы. Единственный нюанс — если используете --speculative-n-draft 0 (отключение MTP на лету), сервер может упасть при смене картинки. Но это уже следующий баг, и его, скорее всего, прикроют в ближайшие дни.
В итоге: фикс mmproj+MTP — не сенсация, а грамотная инженерная работа. Сообщество может выдохнуть и продолжить эксперименты с мультимодальным ускорением. А разработчикам — пожелание: не забывайте, что иногда проблема решается не новым флагом, а правильным порядком двух строчек. И да, если вы до сих пор не обновились — сделайте это сейчас. Краш не прощает откладывания.