Qwen2.5-VL на AMD
Прошлый пост про Whisper + pyannote на AMD читают, но молчат) Ладно, продолжу.
У меня две свободные машины. На 4090 живёт DeepSeek-R1-32B с LoRA-адаптерами, весь VRAM его. На AMD RX 7900 XTX крутятся Whisper + pyannote — занимают ~5 GB из 24. Свободно 19 — решил добавить Qwen2.5-VL-7B для чтения изображений: фото документов, визитки, скриншоты. В bf16 модель весит ~14 GB, должна влезть.
Поставил, запустил оба systemd-сервиса — система зависла намертво. Две модели грузятся параллельно, каждая маппит safetensors в оперативку перед VRAM — а RAM всего 15 GB. OOM killer, рестарт, снова OOM, цикл. Грузился через GRUB в текстовый режим (параметр 3, но без nomodeset — иначе amdgpu не поднимется). Отключил GUI — framebuffer ещё 1-2 GB VRAM жрал. Swap до 16 GB, последовательный запуск. Заработало.
Отправил фото страницы A4 — инструкция кондиционера, русский, два столбца. Через 398 секунд получил одну строку и бесконечный loop: "Постановление Правительства!!!!!!"!!!!!!!#!!!!!!!$...". Шесть минут на мусор. На коротких описаниях картинок модель работала нормально — 35 секунд, осмысленный текст. Но OCR документов — полный провал.
Первая мысль — bottleneck в железе. У меня опыт с CUDA→HIP конвертером, 500+ проектов, уже приготовился конвертировать flash-attention под RDNA3. Но сначала бенчмарки: attention — работает (AOTriton 1.9ms), FFN — 1.73ms, text-only генерация — 6 tok/s. Железо в порядке, flash-attention конвертировать не нужно.
Виновник — repetition_penalty=1.15. Добавил для борьбы с loop’ами, стандартная практика. На ROCm этот параметр даёт 2.3x замедление. На NVIDIA дешёвый, на AMD дорогой. Нигде не документировано. Убрал, добавил early-stop через StoppingCriteria — каждые 24 токена проверяю хвост, если loop — прерываю. Итог: 398с → 13с.
Но из целой страницы модель вытащила полтора предложения — 114 символов из 2000+. Семёрка теряет фокус на длинных документах. Сделал ресёрч — для Qwen2.5-VL критично разрешение и количество vision-токенов. Пошёл путём препроцессинга: OpenCV pipeline перед моделью (выравнивание, контраст, резкость), увеличил max_pixels в processor. Главное — tiled OCR: режу фото на 3 полосы, каждую отдельно, склеиваю. Single-pass: 114 символов. Tiled: 3077 символов, 85% покрытия. Не идеал — есть повторы на стыках, двухколонные путают — но направление правильное.
Кстати, для общения с моделями использую SimpleX CLI. На сервере Python-bridge слушает WebSocket, маршрутизирует: голосовое → Whisper, фото → Qwen-VL. С телефона отправил — через минуту ответ в чате. Если интересно — расскажу подробнее.
Что важно, если ставите vision-модель на AMD: OOM при параллельном старте - swap + задержка между сервисами. GUI отключить если VRAM впритык. local_files_only=True при загрузке модели. И repetition_penalty на ROCm — заменить на early-stop, серьёзно.
Стек: AMD RX 7900 XTX 24GB, PyTorch 2.5.1+ROCm 6.2, Qwen2.5-VL-7B bf16, Whisper + pyannote — три модели на одной карте, Ubuntu 24.04 без GUI.