Перейти к содержанию
Новое AiManual теперь в MAX Подписаться
Публикация AiManual

AMD Kernel Optimizations в llama.cpp: Обзор GEAK v4 и Альтернатив для Ускорения Инференса

Сравнение GEAK v4, kernel-anvil и стандартных ядер llama.cpp на AMD GPU: тесты на RX 7900 XTX и MI300X, пошаговая интеграция, цифры прироста до 25%. Выберите оп

Коротко

Что будет в материале

  1. 01

    Текущий ландшафт оптимизаций AMD в llama.cpp и vLLM

  2. 02

    GEAK v4: Архитектура и Принципы Работы

  3. 03

    Сравнение Производительности: GEAK v4, kernel-anvil и Стандартные Ядра

  4. 04

    Интеграция GEAK v4 в Ваш Пайплайн: Пошаговое Руководство

Оптимизация инференса на 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-anvilGEAK v4Прирост GEAK v4
RX 7900 XTXLLaMA-2 7B112 tok/s128 tok/s135 tok/s+20.5%
RX 7900 XTXLLaMA-2 13B85 tok/s98 tok/s102 tok/s+20.0%
MI300XLLaMA-2 70B45 tok/s52 tok/s55 tok/s+22.2%
MI250XLLaMA-2 70B28 tok/s33 tok/s35 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 - логичное продолжение этого тренда: сообщество переходит от «заставить работать» к «заставить работать быстро». Выбор конкретного решения зависит от вашего железа, модели и сценария нагрузки. Цифры и инструкции в этой статье дают базу для осознанного решения.

Подписаться на канал