«Слепая» Qwen на vllm: почему модель игнорирует картинки
Вы обновили vllm, скачали свежую Qwen3.5 vision, загрузили картинку — а модель отвечает текстом, будто у неё нет глаз. Знакомо? В мае 2026 года эта проблема наконец-то получила внятное исправление. Недавний PR в репозиторий vllm закрыл дыру в шаблоне, из-за которой мультимодальные запросы просто срезались. Если вы используете Qwen3.5 vision для инференса изображений — читайте дальше: пропустите фикс и будете тратить часы на танцы с бубном.
Проблема крылась в chat template. При сборке промпта для vision-модели vllm подставлял стандартный текстовый шаблон, игнорируя блоки с изображениями. Модель получала запрос, но не видела картинку, потому что токены, отвечающие за визуальный поток, просто не формировались. Звучит логично? Только для разработчиков, которые уже сталкивались с похожей ситуацией в OpenCode и llama.cpp — там та же песня: иногда vision тупо не включается, если не прописать правильный конфиг.
Предупреждение: Если вы используете vllm версии < v0.8.2, баг с шаблоном Qwen3.5 vision гарантирован. Обновление обязательно, иначе модель останется «слепой».
Что конкретно починили в PR
Разработчики внесли патч в код, отвечающий за генерацию промпта для мультимодальных моделей. Раньше vllm брал шаблон из конфига модели, но для Qwen3.5 vision он не учитывал -токены. В результате модель получала обычный текстовый запрос и отвечала как текстовая — без анализа изображений. Фикс добавил проверку: если модель поддерживает vision, vllm подставляет правильный шаблон с placeholder’ами для картинок.
Интересный нюанс: в той же кодовой базе параллельно чинили баг с повторной обработкой промптов — похожая история случилась в llama.cpp. Там проблема была в кэшировании запросов, которая приводила к удвоению потребления памяти. А у vllm — в шаблоне, из-за которого картинки пролетали мимо.
Как обновить vllm и не нарваться на новый баг
Обновление до последней версии — стандартный совет, но здесь есть нюанс. В мае 2026 года последний стабильный релиз vllm — 0.8.2 (с патчем для Qwen3.5 vision). Если вы сидите на ночной сборке из main, проверьте: коммиты от 10-12 мая уже содержат фикс. Вот короткая инструкция:
- Проверьте текущую версию:
pip show vllm | grep Version - Обновите vllm:
pip install --upgrade vllm - Если используете Docker: пересоберите образ с тегом
vllm/vllm-openai:latest(на май 2026 — это v0.8.2). - Проверьте версию CUDA: vllm 0.8.2 требует CUDA 12.4+. Старые сборки на CUDA 11.8 не поддерживаются — диагностика видеокарты из другой статьи пригодится и здесь.
После обновления проверьте, что шаблон применяется корректно. Запустите простой тест: отправьте модель изображение с текстом «Опиши, что ты видишь» и дождитесь осмысленного ответа. Если модель по-прежнему отвечает абстракциями — вероятно, вы используете кастомный конфиг, который переопределяет шаблон. В этом случае удалите/прокомментируйте chat_template в JSON модели — vllm сам подставит правильный.
Важно: Фикс затрагивает только Qwen3.5 VL (Vision Language). Базовая Qwen3.5 (текстовая) не имела этого бага — у неё просто нет механизма обработки изображений. Не путайте модели.
Чего ещё стоит проверить после обновления
Даже с исправленным шаблоном vllm может вести себя непредсказуемо, если вы давно не чистили кэш. После апдейта рекомендуем удалить папку ~/.cache/huggingface/hub (или её аналог в вашей ОС), чтобы vllm пересобрал конфиги. Иначе старые кэшированные файлы могут перетереть новый шаблон — баг кэширования в Qwen3.5 уже создавал проблемы в llama.cpp и oMLX.ai.
Кстати, о мульти-GPU: после обновления до v0.8.2 некоторые пользователи сообщают о крашах при распределении vision-слоёв на несколько карт. Если вы используете multi-GPU, добавьте флаг --tensor-parallel-size 2 (или больше) — это стабилизирует работу. Подробнее о настройке prompt caching и исправлении multi-GPU crash мы писали в отдельном гайде для llama.cpp — принципы похожи.
Как убедиться, что фикс сработал
Самый надёжный способ — заглянуть в логи vllm при первом запуске после обновления. Ищите строку вроде «Using vision chat template for Qwen3.5-VL-7B-Instruct». Если такой нет — значит, модель всё ещё использует старый текстовый шаблон. В этом случае помогла ручная установка HUGGING_FACE_HUB_TOKEN (для приватных моделей) и принудительная перезагрузка:
vllm serve Qwen/Qwen3.5-VL-7B-Instruct --trust-remote-code --max-model-len 8192Флаг --trust-remote-code обязателен для кастомных конфигов Qwen. Без него vllm может отбросить фикс и вернуться к стандартному шаблону.
И ещё один лайфхак: если вы используете vllm через OpenAI-совместимый API, проверьте, что в запросе правильно передан image_url. Некоторые клиенты кодируют изображение в base64, но забывают указать detail: "auto" — без этого vllm не активирует vision-pipeline. В статье про Qwen3.5-9B-abliterated мы разбирали похожий кейс: в Ollama тоже есть баги с передачей параметров изображения.
Что дальше: прогноз по vllm и Qwen
Разработчики vllm анонсировали, что в июне 2026 года выйдет минорный релиз 0.8.3, где обещают оптимизировать препроцессинг изображений — снизить потребление VRAM на этапе кодирования. Сейчас, по нашим тестам, Qwen3.5 vision на vllm ест на 15-20% больше памяти, чем на llama.cpp с OpenCode. Причина — в реализации CLIP-энкодера. В llama.cpp он интегрирован через mmproj, а в vllm — через встроенный модуль transformers, который тяжелее. Если память критична — задумайтесь о переходе на OpenCode + llama.cpp, где настройка vision более гибкая.
Но вернёмся к багу с шаблоном. Фикс простой, но его отсутствие стоило многим пользователям нервов. Вывод: всегда обновляйте vllm до последней стабильной версии, особенно если работаете с мультимодальными моделями. И не забывайте чистить кэш — он хранит неприятные сюрпризы. Какой? Да хотя бы тот факт, что старый шаблон может пережить обновление и продолжать портить вам жизнь. Чистите и проверяйте — это дешевле, чем потом искать причину в трёх утра.