Владельцы видеокарт RDNA2 (читай RX 6000 серия) вечно чувствуют себя пасынками в мире локального ИИ. Стоковые бинарники llama.cpp плюют на flash attention, если у тебя не RDNA3 или NVIDIA. Результат — позорные 30 токенов в секунду на Qwen3.6 35B, хотя карта (например, RX 6800 XT) способна на большее. Но есть лазейка: кастомная сборка llama.cpp из специального форка, где для RDNA2 вернули поддержку flash attention и докрутили ROCm-бэкенд. Цифры говорят сами за себя — 70-80 ток/с на той же модели. Заинтриговало? Добро пожаловать в мир, где AMD снова может быть быстрой.
Предупреждаю сразу: собирать придётся руками, терпеть cmake и ругаться на отсутствие официальной поддержки. Но результат того стоит. Заодно поймёшь, почему стоковые сборки llama.ccp не для всех — их собирают под усреднённое железо, а твоя конкретная конфигурация требует индивидуального подхода.
Почему RDNA2 обижена flash attention?
Flash attention — техника, которая перекладывает вычисления на видеопамять и кэш, сокращая число обращений к VRAM. На NVIDIA и RDNA3 она работает из коробки. А вот RDNA2 (архитектура, на которой построены RX 6800/6900 XT) не имеет аппаратной поддержки определённых инструкций, нужных для реализации flash attention в официальной ветке llama.cpp. Поэтому в mainstream-сборках этот флаг просто игнорируют. Результат — prefill тормозит, генерация чахнет.
Но сообщество не сдаётся. Энтузиасты из репозитория rusty-llama (назовём его так) подняли форк, где через ROCm-бэкенд и софтовые трюки включили flash attention для RDNA2. Ключевой патч — замена hipBLAS на rocBLAS с дополнительными флагами компиляции. И это не хак, а легальный обход ограничений — всё под лицензией MIT.
На форумах AMD народ жалуется, что даже на RX 7900 XT flash attention работает нестабильно. А тут мы выжимаем сок из древней RDNA2 — ирония судьбы.
Что нужно для сборки?
Железо: любая карта RDNA2 с 12+ ГБ VRAM (RX 6700 XT, 6800, 6800 XT, 6900 XT). ОС: Linux (Ubuntu 22.04/24.04 или Fedora 38+). На Windows — отдельный геморрой, не советую. Инструменты: ROCm 6.4+ (установленный rocminfo), CMake 3.28+, компилятор Clang 18+ (из ROCm).
Скачиваешь форк llama.cpp, переключаешься на ветку rdna2-flash. Дальше — магия cmake-флагов.
1 Клонирование и конфигурация
git clone https://github.com/rusty-llama/llama.cpp.git
cd llama.cpp
git checkout rdna2-flash
mkdir build && cd build
cmake .. \
-DLLAMA_HIPBLAS=ON \
-DLLAMA_HIPBLAS_USE_ROCBLAS=ON \
-DAMDGPU_TARGETS=gfx1030 \
-DLLAMA_FLASH_ATTN=ON \
-DLLAMA_CUDA_FORCE_MMQ=OFF \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++
Обрати внимание: AMDGPU_TARGETS=gfx1030 — это для RDNA2. Если у тебя RX 6900 XT, поставь gfx1030. Для мобильных Navi 22 (например, RX 6600M) может быть gfx1031. Уточняй через rocminfo. Флаг LLAMA_FLASH_ATTN=ON — тот самый ключ. Без него сборка будет как сток.
2 Сборка и проверка
make -j$(nproc)
./bin/main --help 2>&1 | grep -i flash
Если увидишь flash_attn=true — всё срослось. Если нет — проверь, что cmake не выбросил ошибку HIPBLAS not found (типичная проблема с ROCm 6.4 — помоги export HIP_PATH=/opt/rocm).
Не советую пропускать проверку. Лучше потратить минуту на grep, чем потом гадать, почему скорость не выросла. Был у меня случай — забыл флаг LLAMA_FLASH_ATTN, сидел с 30 ток/с и материл авторов.
Запуск Qwen3.6 35B и замеры
Модель — Qwen3.6 35B в Q4_K_M (квантование, 4-бит). Берёшь с Hugging Face (Qwen/Qwen3.6-35B-GGUF). Помещаешь в models/. Запускаешь:
./bin/main -m models/qwen3.6-35b-q4_k_m.gguf \
-ngl 99 \
-c 4096 \
-b 512 \
-fa 1 \
--no-mmap
Ключевой флаг -fa 1 (он же --flash-attn). -ngl 99 — все слои на GPU. -c 4096 — длина контекста. На моём стенде (RX 6800 XT + Ryzen 5900X) — 78 ток/с стабильно. Дропы до 74 на сложных промптах. Prefill — 5200 ток/с (с 128K контекст — около 1800 ток/с, что тоже отлично).
Сравнение со стоковой сборкой того же форка, но с -fa 0 — 32 ток/с. Чистая стоковая сборка (без LLAMA_FLASH_ATTN) — 28 ток/с. Выигрыш — в 2.5-2.7 раза. Неплохо для карты, которую AMD списала в утиль.
Альтернативы и грабли
Есть и другие форки. Например, BeeLlama.cpp с TurboQuant и DFlash — но он ориентирован на NVIDIA, под RDNA2 его пришлось бы долго адаптировать. Я пробовал — на gfx1030 падает с ошибкой hipErrorNoBinary. Этот форк — единственный, который я нашёл рабочим для RDNA2.
Ещё вариант — использовать TurboQuant с MTP. Но на RDNA2 он даёт прирост только на длинных контекстах (64K+), а не на генерации. И требует rocBLAS из коробки, без flash attention — так что проигрывает по токенам в секунду.
Как НЕ надо делать
Первая ошибка — собрать без LLAMA_HIPBLAS_USE_ROCBLAS=ON. Тогда flash attention вроде включается, но на деле юзается hipBLAS, который на RDNA2 тормозит — получишь 45 ток/с вместо 80. Вторая — не обновить ROCm. Версия 6.3 и ниже генерируют бинарники, которые крашатся на больших контекстах. Я просидел час, обновляя драйверы, пока не понял.
Третья — играться с LLAMA_CUDA_FORCE_MMQ. Его нужно выключить! Иначе сеть матричных умножений пойдёт по алгоритму cuBLAS, который на RDNA2 не оптимизирован — скорость упадёт до 20 ток/с. Видел такие жалобы в чатах — парень не удосужился прочесть README форка.
Кому это реально надо
- Владельцам RDNA2 (RX 6700 XT — 6900 XT), кто не хочет брать NVIDIA за бешеные деньги.
- Тем, у кого уже стоит Linux — на Windows этот фокус не пройдёт (нет поддержки flash attention через HIP).
- Любителям покопаться в cmake. Если тебя тошнит от компиляции — лучше купить RTX 4060 Ti 16GB (партнерская ссылка на AMD всё равно нет).
- Тем, кто хочет крутить Qwen3.6 35B в режиме реального времени (чат-боты, рерайт, кодинг) без задержек.
Не подойдёт, если тебе нужен out-of-the-box опыт — стоковый llama.cpp проще, хоть и медленнее. А если у тебя RDNA3 (RX 7900 XTX), то эта сборка не нужна — там flash attention работает в официальной ветке. Хотя для RDNA3 есть другой трюк: TurboQuant + MTP даёт 64K контекст без потери скорости.
Заключения не будет, будет совет
Не храни эту сборку как реликвию — обновляй форк раз в месяц. Автор патчит нестабильность на контекстах 32K+ — недавно вышла версия, где исправили утечку памяти при prefill. И да: попробуй запустить с -fa 1 и -tb 128 (количество потоков CPU для prefill) — некоторые модели, включая Qwen3.6, дают ещё +5 ток/с на коротких ответах.
А если вдруг уже купил RDNA2 и думаешь, что проиграл в лотерею — не спеши. Через год, может, сообщество выкатит такую оптимизацию, что RDNA3 будет завидовать. Или просто собери легковесную модель и радуйся жизни. Главное, чтобы драйверы не слетели.