Глава 11a. FlashAttention: когда прорыв — это не новая формула
Иногда архитектура уже правильная,
а узкое место — в том, как она трогает память.
Глава 11 вывела attention и честно выставила счёт O(N²).
Но на практике трансформеры часто упираются не в «арифметику FLOPs», а в пропускную способность памяти.
FlashAttention — идеальный кейс для книги:
математика attention почти та же, меняется реализация под иерархию памяти GPU.
11a.1. Две скорости, которые путают интуицию
На GPU есть быстрая память рядом с вычислениями (SRAM / регистры уровня ядра) и большая медленная (HBM).
Грубая картинка:
Если алгоритм делает мало FLOPs на каждый байт, привезённый из HBM, вы «считаете» медленно даже при скромной арифметике.
Это memory-bound режим.
Наивный attention часто именно такой.
11a.2. Почему наивный attention бьёт по HBM
Стандартный путь (учебниковый):
1) посчитать S = QKᵀ # матрица N×N
2) записать S в память
3) softmax(S) → A # ещё N×N
4) записать A
5) P = A V
Даже если потом всё перемножается быстро, материализация S и A гоняет огромные промежуточные тензоры через медленную память.
N = 4096, fp16
N×N ≈ 32M элементов ≈ 64 MB (только одна матрица)
И это ещё до батча, голов, слоёв, других активаций.
На обучении с backward цена памяти становится сюжетом №1.
Инженерный диагноз:
Узкое место не в том, что softmax «сложный».
Узкое место в том, что мы сохраняем то, что можно было бы
посчитать кусками и сразу потребить.
11a.3. Идея FlashAttention: tiling + online softmax
Смысл (без претензии на построчный разбор CUDA):
- Разбить Q/K/V на блоки, которые помещаются в быструю память.
- Считать attention по тайлам, не собирая полную
N×Nв HBM. - Использовать устойчивый online softmax: накопить знаменатели/максимумы так, чтобы результат совпал с обычным softmax, даже если шли кусками.
- На обучении хранить/пересчитывать то, что нужно для backward, экономя активации.
Математически вы хотите тот же attention.
Инженерно вы меняете маршрут данных.
Это рифмуется со всей книгой:
| Уровень | Обмен |
|---|---|
| Архитектура YOLO | выбросить лишнюю работу (proposals) |
| CSP | не гонять все каналы в тяжёлую ветку |
| FlashAttention | не гонять полную attn-матрицу в HBM |
Иногда «новая архитектура» не нужна. Нужна новая карта движения байтов.
11a.4. Что это меняет для архитектора модели
Практические следствия:
- более длинный контекст становится реалистичнее на том же железе;
- можно поднять batch / длину / число голов, упираясь позже;
- бенчмарки «FLOPs модели» ещё хуже предсказывают wall-clock — потому что выигрыш пришёл из IO;
- дальнейшие идеи (лучше tiling, разные attention-варианты) часто живут на стыке алгоритма и железа.
flowchart TD
A[Self-Attention] --> B[Математика: softmax QK V]
A --> C[Реализация: где живут промежуточные матрицы]
C --> D[Наивно: материализовать N×N в HBM]
C --> E[Flash: тайлы в SRAM + online softmax]
D --> F[Memory-bound, короче контекст]
E --> G[Тот же результат, выше tokens/s]
Важная оговорка честности:
FlashAttention не отменяет асимптотику
O(N²)вычислений.
Он делает константы и память практически терпимыми гораздо дольше.
Если вам нужен принципиально другой asymptotics — это уже линейные/оконные/SSM-ветки из главы 16.
Если нужно выжать текущий transformer — сначала спросите про IO.
11a.5. Урок шире, чем attention
После этого кейса полезно завести привычку читать статьи двумя колонками:
| Формула / блок | Где бьёт по железу |
|---|---|
| Новый слой | Активации, bandwidth |
| «Дешевле FLOPs» | Утилизация ядер / memory |
| Longer context | Что материализуется |
| Faster inference | Kernel fusion, quant, IO |
Research Engineer, который умеет только менять YAML слоёв, и инженер, который умеет менять место хранения промежуточных тензоров, видят разные потолки одной и той же модели.
Если бы вы были автором статьи…
-
Профилируйте naive attention vs fused/Flash на фиксированных
N ∈ {512, 2k, 8k}.
Где разрыв в ms, где в peak memory? -
Сформулируйте критерий: в каком режиме ваш новый блок memory-bound, а в каком compute-bound?
Какой эксперимент это доказывает? -
Придумайте “Flash” для своей боли вне NLP (например, большая cost-матрица в matching для DETR-подобных голов).
Что нельзя материализовать целиком?
В послесловии этот урок вернётся как co-design модели и рантайма: будущее часто прячется не в новой букве блока, а в новой реализации старого.