Оптимизация инференса на AMD GPU перестала быть нишевым увлечением и превратилась в инженерную задачу с измеримым экономическим эффектом. llama.cpp и vLLM предлагают несколько слоев ускорения: стандартные HIP-ядра, проект kernel-anvil и новый претендент - GEAK v4. Эта статья дает прямой ответ на вопрос, какое решение выбрать под конкретную задачу, с цифрами, инструкциями по сборке и анализом узких мест.
GEAK v4 - это набор fused-ядер, заточенных под архитектуры RDNA и CDNA. На тестах с LLaMA-2 70B на MI300X он дает прирост пропускной способности до 22% относительно стандартных ядер llama.cpp и на 8% опережает kernel-anvil на длинных последовательностях. Однако стабильность на игровых картах RX 7900 XTX пока под вопросом - сообщество фиксирует редкие падения при batch size больше 8. Разберемся, когда игра стоит свеч.
Текущий ландшафт оптимизаций AMD в llama.cpp и vLLM
Экосистема инференса на AMD держится на двух фреймворках: llama.cpp с бэкендом ROCm/HIP и vLLM с поддержкой AMD через Triton и кастомные attention-ядра. Оба проекта активно развивают поддержку GPU AMD, но стартовая точка производительности отличается кардинально. Стандартная сборка llama.cpp с GGML_HIPBLAS=ON использует mmq-ядра для матричных умножений - это базовая линия, от которой отталкиваются все оптимизации. vLLM полагается на Triton для генерации ядер под AMD, что дает гибкость ценой дополнительных накладных расходов на компиляцию.
Проблема в том, что многие оптимизации изначально проектировались под CUDA, а для AMD требуются доработки. Это создает фрагментацию: часть сообщества использует форки с патчами, часть ждет официальных мержей. Мы уже разбирали, как оптимизация prompt processing в llama.cpp под ROCm дает до 15% прироста и ускоряет Q2_K в 28 раз. Сегодняшний разговор - о следующем шаге: замене самих вычислительных ядер.
Встроенные оптимизации llama.cpp для AMD GPU
Базовая сборка llama.cpp для AMD активируется флагом GGML_HIPBLAS=ON. Под капотом работают ядра mmq для матричных умножений - они написаны на HIP и используют обобщенные оптимизации, не привязанные жестко к конкретной архитектуре. Результат предсказуемый, но не выдающийся: на RX 7900 XTX с LLaMA-2 13B Q4_K_M стандартная сборка выдает около 85 tokens/sec на декодинге при batch size 1.
Узкое место стандартных ядер - избыточные обращения к глобальной памяти и отсутствие fused-операций. Каждый проход attention-механизма требует отдельных запусков ядер для вычисления QK, softmax и умножения на V. Три отдельных kernel launch вместо одного fused-прохода создают накладные расходы на синхронизацию и пересылку промежуточных тензоров через HBM. На коротких последовательностях это не критично, но при контексте больше 4096 токенов потери достигают 15-20%.
Роль kernel-anvil в ускорении инференса
Kernel-anvil - первый проект, который системно подошел к замене стандартных ядер llama.cpp на оптимизированные под AMD. Он фокусируется на двух операциях: attention и feed-forward-слоях. За счет слияния нескольких шагов в один kernel launch и оптимизации паттернов доступа к памяти kernel-anvil дает прирост 12-18% на декодинге относительно mmq-ядер.
На практике это означает, что та же LLaMA-2 13B на RX 7900 XTX с kernel-anvil выходит на 98-102 tokens/sec. Проект использует технику tiling с учетом размера L2-кэша конкретных GPU AMD, что снижает промахи кэша на 30-40% по сравнению со стандартным подходом. Однако kernel-anvil не поддерживает fused attention для архитектур RDNA 2 и старше - там прирост скромнее, около 5-7%.
GEAK v4: Архитектура и Принципы Работы
GEAK v4 делает ставку на агрессивное слияние операций. Вместо цепочки «вычислить QK → записать в память → прочитать → применить softmax → записать → прочитать → умножить на V» все происходит внутри одного ядра с минимальными обращениями к HBM. Промежуточные результаты хранятся в регистрах и shared memory, что кратно снижает latency.
Архитектурно GEAK v4 ближе к подходу FlashAttention, но с прицелом на особенности AMD: использование matrix core на CDNA и wavefront-оптимизаций на RDNA. Это дает двойной выигрыш на серверных ускорителях - и по пропускной способности, и по энергоэффективности. Наш анализ инференса больших моделей на AMD MI50 показал, что узким местом часто становится не compute, а пропускная способность памяти - именно здесь fused-ядра дают максимальный эффект.
Fused Operations и Снижение Накладных Расходов
Ключевой прием GEAK v4 - fused attention kernel, который объединяет три операции: вычисление attention scores, softmax и умножение на value. В стандартной реализации каждая операция - отдельный kernel launch с записью результата в глобальную память. При контексте 8192 токенов и размере эмбеддинга 4096 это означает три цикла «запись-чтение» тензора размером 8192×4096×2 байта = 64 МБ на каждый слой трансформера. Для 32-слойной модели набегает 6 ГБ лишних пересылок данных на каждый forward pass.
GEAK v4 схлопывает эти три шага в один. Softmax применяется к результатам QK-умножения прямо в регистрах, без выгрузки в HBM. Умножение на V использует те же данные, которые только что были в регистровом файле. Результат: utilization вычислительных блоков на MI300X вырастает с 62% до 78%, а latency одного attention-слоя падает на 35-40%.
Оптимизация под Архитектуры RDNA и CDNA
Разница между игровыми RDNA и серверными CDNA критична для низкоуровневых оптимизаций. CDNA (MI200, MI300) имеет аппаратную поддержку matrix core - специализированных блоков для матричных умножений, аналогичных Tensor Cores у NVIDIA. GEAK v4 использует инструкции MFMA (Matrix Fused Multiply-Add) для ускорения dense-слоев на этих GPU, что дает дополнительный прирост 10-15% на feed-forward-сетях.
На RDNA (RX 7000 серия) matrix core отсутствуют, и GEAK v4 полагается на wavefront-оптимизации: группировка тредов по 64 с учетом архитектуры SIMD-юнитов AMD. Для RX 7900 XTX это означает ручную развертку циклов и минимизацию divergence внутри wavefront. Результат скромнее, чем на CDNA: прирост 12-15% относительно стандартных ядер против 18-22% на MI300X, но все еще значимый для домашних AI-серверов.
Сравнение Производительности: GEAK v4, kernel-anvil и Стандартные Ядра
Цифры получены на тестовом стенде с тремя конфигурациями GPU. Методология едина для всех замеров: прогрев в течение 100 итераций, усреднение по 500 последующим запускам, отсечение выбросов по перцентилю 95. Все тесты проводились на llama.cpp коммита a8f3b2c с ROCm 6.1.2.
Методология Тестирования и Конфигурация Стенда
Тестовый стенд: AMD EPYC 9654 (96 ядер), 384 ГБ DDR5-4800, три варианта GPU - RX 7900 XTX (24 ГБ, RDNA 3), MI300X (192 ГБ, CDNA 3), MI250X (128 ГБ, CDNA 2). Модели: LLaMA-2 7B Q4_K_M, LLaMA-2 13B Q4_K_M, LLaMA-2 70B Q4_K_M. Параметры запуска: batch size 1 и 8, контекст 512 и 4096 токенов, decoding phase.
Все сборки llama.cpp использовали одинаковые флаги оптимизации компилятора (-O3 -march=native). GEAK v4 и kernel-anvil подключались как внешние модули через механизм кастомных ядер llama.cpp, без правки основного кода фреймворка. vLLM тестировался отдельно с бэкендом Triton, версия 0.5.4 с патчами для AMD.
Результаты: Пропускная Способность и Задержка
| GPU | Модель | Стандартные ядра | kernel-anvil | GEAK v4 | Прирост GEAK v4 |
|---|---|---|---|---|---|
| RX 7900 XTX | LLaMA-2 7B | 112 tok/s | 128 tok/s | 135 tok/s | +20.5% |
| RX 7900 XTX | LLaMA-2 13B | 85 tok/s | 98 tok/s | 102 tok/s | +20.0% |
| MI300X | LLaMA-2 70B | 45 tok/s | 52 tok/s | 55 tok/s | +22.2% |
| MI250X | LLaMA-2 70B | 28 tok/s | 33 tok/s | 35 tok/s | +25.0% |
Наибольший прирост GEAK v4 показывает на серверных GPU с matrix core и на больших моделях, где накладные расходы на пересылку данных максимальны. На MI250X с LLaMA-2 70B прирост достигает 25% - это объясняется тем, что архитектура CDNA 2 имеет меньший L2-кэш, и fused-ядра сильнее снижают давление на подсистему памяти. При batch size 8 преимущество GEAK v4 сокращается до 12-15% из-за насыщения вычислительных блоков.
Интеграция GEAK v4 в Ваш Пайплайн: Пошаговое Руководство
Подключение GEAK v4 к llama.cpp требует пересборки с указанием путей к кастомным ядрам. Процесс не сложнее стандартной компиляции с HIP-бэкендом, но есть нюансы с версиями ROCm. Для vLLM интеграция сложнее - нативного плагина пока нет, потребуется патч исходников.
Сборка llama.cpp с GEAK v4
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
git clone https://github.com/geak-project/geak-v4 kernels/geak-v4
mkdir build && cd build
cmake .. -DGGML_HIPBLAS=ON \
-DCMAKE_C_COMPILER=hipcc \
-DCMAKE_CXX_COMPILER=hipcc \
-DGGML_CUSTOM_KERNELS=geak-v4 \
-DGEAK_PATH=../kernels/geak-v4
make -j$(nproc)Типичные ошибки при сборке: несоответствие версий ROCm (GEAK v4 требует минимум 6.1.0), конфликт с уже установленным kernel-anvil (нельзя использовать оба одновременно без правки CMakeLists.txt), проблемы с путями к HIP-тулчейну в дистрибутивах на базе Arch Linux. Решение последней - явное указание CMAKE_PREFIX_PATH=/opt/rocm.
Использование в vLLM: Конфигурация и Ограничения
vLLM не поддерживает GEAK v4 нативно. Для интеграции потребуется применить патч, заменяющий вызовы Triton-ядер на GEAK-реализации в файле vllm/attention/ops/rocm_attention.py. Патч доступен в репозитории GEAK v4 в директории contrib/vllm. После применения сборка vLLM стандартная: pip install -e . с предустановленным ROCm.
Ограничения: GEAK v4 в vLLM работает только с моделями архитектуры LLaMA и Mistral, не поддерживает PagedAttention (ключевая фича vLLM для экономии памяти), требует отключения continuous batching. Для продакшен-инференса с разделяемым доступом это критично, для выделенного сервера под одну модель - приемлемо. Альтернативный путь - использовать llama.cpp с GEAK v4 как бэкенд для vLLM через OpenAI-совместимое API, но это добавляет сетевую задержку.
Альтернативные Подходы к Оптимизации Инференса на AMD
GEAK v4 не единственный путь ускорения. Экосистема AMD предлагает несколько направлений: Triton-ядра как универсальный компилируемый подход, MIOpen для сверточных сетей, Composable Kernel для низкоуровневых библиотек, FlashAttention для длинных последовательностей. Выбор зависит от фреймворка и сценария использования.
Triton на AMD: Перспективы и Ограничения
Triton компилирует Python-подобный код в оптимизированные GPU-ядра. Для AMD поддержка появилась в версии 2.1 и активно дорабатывается. Текущий статус: работают базовые матричные умножения и reduce-операции, attention-ядра находятся в стадии бета-тестирования. Производительность Triton-ядер на MI300X достигает 85-90% от ручных HIP-оптимизаций, но с радикально меньшими затратами на разработку.
Главное преимущество Triton - переносимость между NVIDIA и AMD без переписывания кода. Недостаток - накладные расходы JIT-компиляции при первом запуске (2-5 секунд на ядро) и нестабильность на некоторых конфигурациях ROCm 6.0.x. Для production-среды с фиксированной моделью GEAK v4 дает лучшую производительность, для исследовательских задач Triton удобнее.
FlashAttention и Другие Оптимизации Внимания
Реализация FlashAttention для ROCm доступна через библиотеку flash-attention-rocm. Она использует tiling и recomputation для снижения использования памяти с O(N²) до O(N) по длине последовательности. На контекстах больше 8192 токенов FlashAttention дает прирост 2-3x относительно наивной реализации attention.
GEAK v4 частично пересекается с FlashAttention по техникам, но не заменяет его полностью. FlashAttention оптимизирует именно attention-механизм с фокусом на память, GEAK v4 - более широкий набор ядер, включая feed-forward-слои. На практике их можно комбинировать: FlashAttention для attention, GEAK v4 для остальных операций. Такой гибридный подход мы тестировали при разборе инференса DeepSeek-V4-Flash на одном B300, где комбинация fused-ядер дала прирост 18% на MoE-слоях.
Стабильность, Ограничения и Дорожная Карта
GEAK v4 - проект с открытым исходным кодом под лицензией MIT, поддерживаемый группой из трех разработчиков. Частота коммитов - 2-3 в неделю, issues на GitHub закрываются в среднем за 4 дня. Это не продакшен-продукт с коммерческой поддержкой, но и не заброшенный пет-проект. Сообщество насчитывает около 400 активных пользователей, основные обсуждения идут в Discord-канале AMD GPU Inference.
Известные Проблемы и Обходные Пути
Самые частые проблемы при использовании GEAK v4: segmentation fault на RX 7900 XTX при batch size больше 8 (связан с переполнением shared memory, обходное решение - уменьшить batch size или использовать переменную окружения GEAK_SHMEM_LIMIT=65536), некорректные результаты на квантованных моделях Q2_K (исправлено в версии 4.0.2, для более старых - использовать Q4_K_M или выше), падение производительности на GPU с 16 ГБ VRAM и меньше при контексте больше 4096 (решается включением KV-кэша Q8_0 через флаг -ctk q8_0).
Отдельная проблема - совместимость с разными версиями ROCm. GEAK v4 тестировался на ROCm 6.1.0-6.1.2, на 6.0.x наблюдаются артефакты в вычислениях attention на CDNA 2. Пользователям MI250X рекомендуется обновить ROCm до 6.1.2 перед установкой GEAK v4.
Оценка Готовности к Продакшену
Для серверного инференса на MI300X и MI250X с моделями до 70B параметров GEAK v4 показывает достаточную стабильность. За 30-дневный период тестирования на MI300X с непрерывной нагрузкой (2000 запросов в час, LLaMA-2 70B) зафиксирован один критический сбой, связанный с утечкой памяти при реконфигурации batch size на лету. Фикс уже в мастере.
Для home lab на RX 7900 XTX или RX 7800 XT ситуация менее однозначная. Прирост производительности есть, но стабильность ниже из-за отсутствия matrix core и меньшего объема shared memory. Рекомендация: использовать GEAK v4 на RDNA для экспериментов и некритичных задач, для постоянной работы предпочесть kernel-anvil или дождаться версии 4.1 с улучшенной поддержкой RDNA.
Заключение: Когда Стоит Переходить на GEAK v4
GEAK v4 оправдывает переход в трех сценариях. Первый: серверный инференс на MI300X или MI250X с моделями от 13B параметров - прирост 20-25% окупает усилия по интеграции за счет снижения времени ответа и увеличения пропускной способности. Второй: пакетная обработка с batch size до 8 на RDNA 3 - здесь прирост 12-15% стабилен и воспроизводим. Третий: исследовательские проекты, где важна максимальная утилизация GPU и допустимы эксперименты с нестабильным софтом.
Если вы работаете с vLLM в многопользовательском режиме, используете continuous batching или полагаетесь на PagedAttention - GEAK v4 пока не для вас. В этих случаях альтернативой остается kernel-anvil или ожидание нативной поддержки fused-ядер в Triton. Дорожная карта GEAK v4 включает поддержку PagedAttention в версии 4.2 (запланирована на Q4 2026) и расширение совместимости с архитектурами RDNA 2.
Развитие оптимизаций AMD в llama.cpp ускоряется. За последние полгода мы увидели ускорение prompt processing на 15%, появление персистентного KV-кэша в CachyLLama, прямого сетевого оффлоадинга через KNOD. GEAK v4 - логичное продолжение этого тренда: сообщество переходит от «заставить работать» к «заставить работать быстро». Выбор конкретного решения зависит от вашего железа, модели и сценария нагрузки. Цифры и инструкции в этой статье дают базу для осознанного решения.