Журнал · Rit.work

FoldAttention ускоряет внимание фиксированным масштабом softmax

FoldAttention заранее задаёт масштаб softmax, сокращает чтение KV-кэша и делает обратный проход детерминированным без обычной потери скорости.

Rit.work
Студия разработки
30 сентября 2026 г.3 мин чтения

Материал подготовлен автоматически по первоисточникам: ссылки на них — в конце статьи.

FoldAttention ускоряет генерацию токенов с длинным контекстом и сохраняет воспроизводимый результат при обучении. В нерецензированном препринте, где все числа получил сам автор Sriman Achanta, полный шаг декодирования Qwen3-8B выполнялся до 1,46 раза быстрее. Подход может сократить задержку на Hopper без смены модели, но требует заменить ядро внимания и формат KV-кэша.

Как фиксированный масштаб убирает пересчёты

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

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

FoldAttention выбирает для каждой строки конечный опорный масштаб Z до чтения ключей. Вес сразу вычисляется как 2^(s-Z), где s — оценка связи запроса с ключом. Общий сдвиг всех оценок не меняет результат softmax: он одинаково умножает числитель и знаменатель, а затем сокращается при делении.

Полученные суммы можно складывать в любом порядке. Разные части KV-кэша, общий префикс нескольких запросов и отдельные блоки GPU возвращают пары из числителя и знаменателя, которые объединяются обычным сложением. Сравнивать локальные максимумы и повторно масштабировать готовые части не нужно.

Фиксированный масштаб также позволяет решить, какие данные загружать. Ключ хранится в двух INT8-плоскостях: первая даёт грубую оценку окончательного веса, после чего ядро при необходимости читает вторую плоскость и строку значения. Для малых весов значение можно пропустить, но сам вес остаётся в знаменателе; при BF16-значениях его вклад в числитель приближает модель блока.

Глубина отсечения задаётся при каждом вызове, а не при создании кэша. Один KV-кэш поэтому поддерживает как плотный режим, который читает все значения, так и более быстрые режимы с разным допустимым отклонением.

Декодирование ускорилось за счёт меньшего трафика

На H100 FoldAttention с выбранной глубиной отсечения выполнял операцию внимания в 1,36–2,30 раза быстрее самого быстрого BF16-ядра. В шести из семи запусков ошибка отличалась от минимальной ошибки BF16 не более чем на 1,5%.

Ускорение сохраняется за пределами отдельного ядра. Полный шаг декодирования Qwen3-8B стал до 1,46 раза быстрее, а правдоподобие текста, поиск информации в контексте и результаты LongBench совпали с BF16-ядрами. Это существеннее микротеста: служебные операции модели могли бы скрыть выигрыш более быстрого внимания.

Тот же принцип применили к обратному проходу. Частичные градиенты заранее округляются на общую целочисленную сетку, поэтому блоки GPU могут складывать их в любом порядке и получать те же биты. Такой обратный проход оказался до 1,84 раза быстрее детерминированных FlashAttention-3 и FlashAttention-4 и на 1,05 раза быстрее самого быстрого недетерминированного ядра.

Меняет ли FoldAttention планы команд

Работа относится прежде всего к системам, где длинный контекст уже сделал чтение KV-кэша заметной частью задержки. Если продукт использует стандартный сервер вывода и короткие запросы, менять архитектуру ради FoldAttention рано: выигрыш зависит от собственного ядра, нового формата кэша и возможности управлять глубиной отсечения.

Для команд с инфраструктурой на Hopper вывод практичнее. Можно оставить модель и семантику softmax, но заменить путь декодирования, чтобы загружать значения по окончательному весу. Аддитивные частичные результаты также упрощают разделение KV-кэша и повторное использование общего префикса несколькими запросами.

При обучении подход интересен там, где требуется побитовая воспроизводимость между запусками или разной упаковкой запросов. Обычно детерминированность заставляет фиксировать порядок сложения и ограничивает планировщик; целочисленная сетка FoldAttention снимает эту зависимость.

Проверки охватывают одну H100, модели Qwen3, gpt-oss и GLM, длинный контекст, обычное многоголовое внимание и внимание с группировкой запросов GQA. Ядро декодирования рассчитано на размер головы 64 или 128 и архитектуру Hopper; перенос раскладок на Blackwell оставлен как дальнейшая работа, а латентные кэши наподобие MLA не поддерживаются.

Поэтому FoldAttention пока не выглядит универсальной заменой FlashAttention. Он меняет планы команд, которые контролируют низкоуровневый стек вывода или платят за детерминированное обучение: фиксированный масштаб даёт им один механизм сразу для сокращения трафика, сложения частей KV-кэша и воспроизводимого обратного прохода.

Источники

Пауза в чтении

Похоже на вашу задачу?

Расскажите, что собираете. За полчаса разложим на этапы и назовём сроки — это бесплатно и ни к чему не обязывает.

Rit.work

Студия разработки

Собираем мобильные приложения и помогаем командам получать от AI реальную пользу. Основатель и команда, работаем удалённо — с клиентами в России и за рубежом.

← Ко всем материалам
Понравилось? Обсудим вашу задачу