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

llama.cpp получил fused-операцию для QSA-маски: что это даёт моделям со sparse attention

В ggml-org/llama.cpp открыт PR #30640 от am17an: fused-операция для QSA-маски. Разбираем, что такое QSA-маска, зачем объединять шаги в одно ядро, кому из пользо

Коротко

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

  1. 01

    Что произошло в llama.cpp: PR #30640 и fused-операция для QSA-маски

  2. 02

    Что такое QSA-маска и sparse attention: разбор без магии

  3. 03

    Зачем объединять шаги в fused-операцию

  4. 04

    Как это влияет на инференс локальных LLM в llama.cpp

В репозитории ggml-org/llama.cpp появился pull request #30640 авторства am17an. Изменение создаёт новую fused-операцию для QSA-маски (QSA mask). Обсуждение PR на r/LocalLLaMA подаёт это как «another speedup (sparse attention models)», то есть очередное ускорение для моделей с разреженным вниманием. Материал опубликован 21 октября 2026 года.

Практический вывод для пользователей локальных LLM: если ваша модель использует sparse attention и вы запускаете её через llama.cpp, обновление потенциально даёт выигрыш в скорости. Если модель работает на полном внимании, конкретно этот PR по этой линии ничего не изменит.

Дальше важная оговорка. Это pull request, а не подтверждённый релиз. В доступных материалах нет даты создания, статуса (открыт или смержен), номера версии llama.cpp, списка затронутых моделей и замеров ускорения. Ниже разбираем, что такое QSA-маска, зачем нужна fused-операция и как проверить обновление на своём стенде, не полагаясь на обещания из заголовка.

Что произошло в llama.cpp: PR #30640 и fused-операция для QSA-маски

PR #30640 добавляет в llama.cpp новую fused-операцию для QSA-маски. Автор - am17an, площадка - ggml-org/llama.cpp. Слово fused в названии означает, что несколько шагов обработки маски выполняются как одна операция, а не как цепочка отдельных вызовов.

Коротко: что именно добавляет PR #30640

Что именно за шаги объединяются, в источниках не раскрыто. Нет и технического описания устройства QSA-маски: расшифровки аббревиатуры, формулы или схемы разреженности. Поэтому здесь не будет догадок вида «QSA значит то-то»: в заголовке PR термин указан как QSA mask, на этом проверяемая часть заканчивается.

Известно только назначение: новая операция нужна для работы с QSA-маской внутри llama.cpp. Всё, что касается реализации, количества объединённых шагов, поддержки конкретных бэкендов и совместимости с существующими графами ggml, требует чтения самого диффа. В переданных материалах этих деталей нет.

Почему это подаётся как ускорение для sparse attention

Формулировка из новости привязывает ускорение к sparse attention models. Логика простая: QSA-маска относится к механизму внимания, а модели с разреженным вниманием тратят заметную часть времени на подготовку и применение масок. Если эти шаги удаётся выполнить компактнее, накладные расходы вокруг самих матричных вычислений снижаются.

Размер выигрыша в источниках не указан. Ни процентов, ни секунд, ни условий замера. «Another speedup» - это заявление из описания новости, а не подтверждённый бенчмарк. Воспринимать его стоит как повод проверить обновление, а не как гарантию конкретного прироста.

Что такое QSA-маска и sparse attention: разбор без магии

Маска внимания - это правило, которое определяет, какие токены могут влиять друг на друга при вычислении attention. Разреженное внимание ограничивает число таких связей. QSA-маска попадает в эту же категорию, но её точное определение в источниках не раскрыто.

Маска внимания на пальцах

Attention отвечает на вопрос, какие токены влияют на данный токен. Маска задаёт правило: какие пары разрешены, какие игнорируются. В causal-моделях, которые генерируют текст слева направо, токен не должен видеть будущие токены. Маска обнуляет запрещённые связи до того, как считается softmax.

Без маски модель на позиции 10 могла бы подсмотреть токен с позиции 11. С маской вероятность такой связи равна нулю. Это не косметическая деталь: маска меняет результат вычисления, а не только скорость.

Чем sparse attention отличается от полного

Полное внимание строит матрицу связей размером n на n, где n - длина контекста. Для 4096 токенов это около 16,8 млн пар, для 32 768 - уже больше 1 млрд. Квадратичный рост бьёт по памяти и по вычислениям.

Разреженное внимание оставляет только часть связей. Вариантов много: локальное окно, фиксированные паттерны, выбранные позиции. Точная схема QSA-маски в источниках не описана, поэтому не будем приписывать ей конкретную формулу. Для понимания достаточно того, что это одна из разновидностей масок внимания, и PR создаёт для неё отдельную fused-операцию.

Пример: при локальном окне шириной 512 токен каждый токен смотрит только на 512 предыдущих соседей, а не на весь контекст. Число связей падает с n² до примерно n × 512. Экономия огромная, но качество зависит от того, насколько выбранный паттерн подходит задаче.

Зачем объединять шаги в fused-операцию

Kernel fusion - приём оптимизации, при котором несколько операций сливаются в одно ядро. Вместо «посчитать A, сохранить, прочитать, посчитать B, сохранить, прочитать, посчитать C» получается одна операция, которая держит промежуточные значения ближе к вычислителю.

В llama.cpp такие микрооптимизации - обычная часть работы над производительностью. Похожие приёмы применяются и в других местах: например, объединение shared experts в MMVQ тоже сокращает лишние шаги в вычислениях.

Меньше промежуточных тензоров - меньше давления на память

Каждый промежуточный тензор нужно записать в память и потом прочитать. На GPU это лишние обращения к VRAM, на CPU - к RAM и кэшам. Fused-операция сокращает этот трафик: данные реже покидают регистры или быстрый кэш.

Второй источник выигрыша - накладные расходы на запуск ядер. У каждого отдельного вызова есть стоимость планирования. Когда шагов меньше, меньше и накладных расходов. Величина эффекта зависит от бэкенда, размера батча, длины контекста и конкретной реализации, поэтому общие рассуждения не заменяют замер на своём железе.

Почему это особенно важно для разреженного внимания

В разреженном внимании сама матрица связей меньше, а доля служебной работы вокруг неё растёт. Подготовка маски, её применение, обработка индексов и последующие операции начинают занимать заметную часть времени. Fused-операция целится именно в эту служебную обвязку.

Это объяснение механики, а не измеренный результат PR #30640. Конкретный вклад новой операции в общую скорость генерации в источниках не приводится. Он может оказаться заметным на длинных контекстах и почти незаметным на коротких, где накладные расходы масок малы.

Как это влияет на инференс локальных LLM в llama.cpp

llama.cpp - один из основных инструментов локального запуска LLM. Изменения в нём напрямую касаются тех, кто держит модель на своём железе. Микрооптимизации редко дают драматический скачок по всем сценариям, зато складываются: сегодня fused-маска, завтра CUDA graph, послезавтра более быстрый MMVQ.

Вот свежие примеры из той же линии: разреженный Flash Attention для Qwen4 на CUDA и CUDA graph для MTP draft. Оба PR касаются скорости инференса, оба требуют проверки на конкретной модели и конфигурации.

Кому обновление релевантно

Ориентир такой:

  • Вы запускаете модель со sparse attention через llama.cpp и хотите ускорить генерацию. Обновление потенциально полезно.
  • Ваши модели используют полный attention. Конкретно этот PR по этой линии ничего не даст.
  • Вы работаете на CPU-only или на слабой GPU. Эффект может быть скромным, потому что узкое место смещается в другую часть вычислений.
  • Вы используете сборку из репозитория. Проверьте, влит ли PR в вашу ветку.

Списка затронутых моделей в источниках нет. Проверять нужно по документации своей модели и её конфигурации: есть ли в ней разреженные маски внимания и как они реализованы в llama.cpp.

Почему на разных железках эффект будет разным

У инференса разные узкие места. На GPU с достаточной VRAM часто доминирует пропускная способность памяти, на CPU - скорость вычислений и кэш. Fused-операции обычно целятся в трафик памяти и накладные расходы, поэтому прирост будет неравномерным.

Длина контекста тоже меняет картину. На коротких промптах служебные шаги вокруг маски мало что решают. На длинных контекстах их доля растёт. focus-llama показывает, насколько чувствительна эта область к работе с KV-кэшем и маскированием, хотя это отдельный экспериментальный форк, а не часть PR #30640.

Стоит ли обновляться: практический чек-лист

Порядок действий простой, но каждый шаг важен: без проверки статуса PR легко обновиться впустую или, наоборот, пропустить нужное изменение.

Как проверить, что PR уже доступен

Откройте сводку по PR #30640 и сам pull request в ggml-org/llama.cpp. Смотрите, влит ли он, в какую ветку и есть ли упоминание в релизе. Номера версий и даты в источниках не указаны, поэтому ориентироваться на сторонние пересказы нельзя.

Как обновить llama.cpp без сюрпризов

  1. Зафиксируйте текущую версию или коммит, чтобы была возможность откатиться.
  2. Проверьте, использует ли ваша модель sparse attention или QSA-маску. Смотрите документацию модели и конфигурацию.
  3. Уточните статус PR #30640: если он ещё не влит, соберите из соответствующей ветки или дождитесь релиза. Утверждать, что изменение уже в стабильной сборке, нельзя.
  4. Обновитесь штатным способом: сборка из исходников, пакет или готовый бинарник, в зависимости от того, как вы ставили llama.cpp.
  5. Сравните скорость до и после на своей типовой нагрузке. Публичных замеров по этому PR нет, поэтому только собственный прогон покажет, есть ли выигрыш.

Чего мы пока не знаем: ограничения и открытые вопросы

Границы знания стоит обозначить прямо, иначе новость легко прочитать как готовый релиз с гарантированным ускорением.

  • Нет технического описания QSA-маски: расшифровки, формулы и схемы разреженности.
  • Нет перечня шагов, которые объединяет fused-операция.
  • Нет замеров ускорения: ни процентов, ни условий тестирования.
  • Нет списка затронутых моделей и архитектур.
  • Не указаны дата создания PR, его статус и версия llama.cpp, куда войдёт изменение.

Утверждение об ускорении взято из краткого описания новости, а не из подтверждённых измерений. Для свежего pull request это нормальная ситуация: детали обычно уточняются в обсуждении, диффе и последующих коммитах. Пока их нет, любые цифры были бы выдумкой.

Что это значит в более широком контексте llama.cpp

llama.cpp развивается через множество небольших PR. Fused-операции - типичный класс оптимизаций инференса: они не меняют модель, а меняют то, как движок считает её слои. Следить стоит за pull requests и релизами в ggml-org/llama.cpp, иначе значимые изменения легко пропустить в потоке.

Для практики вывод короткий. Обновиться стоит тем, кто работает со sparse attention моделями: у них есть шанс получить ускорение без смены железа. Всем остальным спешить некуда. Конкретный выигрыш нужно проверять на своей модели, своём бэкенде и своей длине контекста, потому что замеров в источниках нет.

llama.cpp для локального запуска LLM ценен именно такими накопленными улучшениями. Отдельный PR редко переворачивает картину, но в связке с другими оптимизациями он влияет на производительность моделей и итоговую скорость генерации. Оптимизация инференса в llama.cpp идёт мелкими шагами, и fused-операция для QSA-маски - один из них.

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