Квантизация
Это снижение точности весов модели. Вместо FP16 (Float Point 16 - формат с плавающей точкой, 2 байта на параметр, стандарт для обучения и инференса) используются INT8 (Integer 8 - целочисленный формат, 1 байт) или INT4 (Integer 4 - 0.5 байта). Это уменьшает потребление памяти в 2–4 раза, позволяя запускать модели на более скромном железе. Но методы квантизации отличаются, и выбор влияет на результат.
GPTQ (Generative Pre-trained Transformer Quantization)
Классический метод пост-тренинг квантизации. Веса сжимаются после обучения, без дообучения. Хорош для GPU-инференса (vLLM - virtual + LLM Model, HuggingFace), но на моделях 70B+ может давать заметную потерю качества (3–5%). AWQ (Activation-aware Weight Quantization) умнее: он защищает «важные» веса, оставляя их в высокой точности. Качество падает меньше (1–3%), особенно на сложных рассуждениях. GGUF (GGML Universal Format) - формат, оптимизированный для CPU и периферии (llama.cpp). Название происходит от GGML (Georgi Gerganov Machine Learning) - библиотеки, которая положила начало этому формату. Жертвует скоростью (считает медленнее GPU), но позволяет запускать модели 8–30B на обычных ноутбуках и даже телефонах.
Для инженера правило простое: если у вас есть GPU и нужна скорость - берите GPTQ или AWQ под vLLM. Если железо слабое или нужно развернуть на CPU - GGUF. Потеря качества в 1–5% на большинстве бизнес-задач незаметна, а экономия памяти (и денег) - колоссальна.
Краткий итог по методам квантизации

Квантизация меняет веса, но оставляет неизменной структуру внимания.
А что, если не трогать веса, а переписать само вычисление внимания так, чтобы оно работало быстрее и жрало меньше памяти без потери качества?
Это уже не компромисс, а чистая победа - FlashAttention.
Его секрет не в разрежении или сжатии, а в умной работе с памятью GPU: вместо того чтобы хранить огромную матрицу внимания в медленной HBM, он вычисляет её блоками прямо на быстрой SRAM.
В результате - ускорение в 2–4 раза и возможность обрабатывать контексты до миллиона токенов на одном GPU. Посмотрим, как это устроено под капотом.
FlashAttention - не новая архитектура, а алгоритмическая оптимизация вычисления внимания.
В классическом трансформере внимание требует чтения и записи матрицы внимания размером [seq_len, seq_len] в HBM (медленная память). FlashAttention пересчитывает внимание блоками прямо на быстрой SRAM, не сохраняя промежуточные матрицы.
Ключевое отличие FlashAttention от обычного внимания - он не хранит матрицу внимания целиком, а вычисляет softmax по частям с пересчётом нормализующих коэффициентов, что математически строго эквивалентно полному вниманию, а не приближённо.
Что даёт
· Ускорение в 2–4 раза на длинных контекстах (10K+ токенов).
· Снижение потребления памяти с O(n²) до O(n) - можно обрабатывать контексты до 1M токенов на одном GPU.
Снижает пиковое потребление памяти за счёт блочного вычисления без материализации полной матрицы внимания. Алгоритмическая сложность внимания остаётся O(n²), но за счёт recomputing на быстрой SRAM пиковая память падает до ~O(n).
FlashAttention также уменьшает задержки от операций ввода-вывода (I/O-bound), потому что современные GPU тратят больше времени на пересылку данных между HBM и SRAM, чем на сами вычисления - и FlashAttention минимизирует эти пересылки. FlashAttention даёт наибольший выигрыш именно на длинных контекстах - при длине 512 токенов ускорение незаметно, но при 64K токенов разница между "память закончилась" и "работает за 3 секунды".
Где используется
FlashAttention 2 (2023) и FlashAttention 3 (2024) встроены в vLLM, HuggingFace Transformers, PyTorch 2.0+. Если вы разворачиваете LLM, она почти наверняка уже использует FlashAttention под капотом.
Инженерный вывод
Не нужно выбирать между FlashAttention и Sliding Window - они работают вместе. FlashAttention ускоряет вычисления, Sliding Window уменьшает объём. Главное ограничение FlashAttention: он работает только на GPU с достаточно большой SRAM (A100/H100 - отличный выигрыш, на T4 или старых картах эффект в разы скромнее) и не переносится на CPU или TPU без серьёзной переработки.
KV Cache сохраняет вычисленные ключи и значения для предыдущих токенов; снижает сложность генерации с O(n²) до O(n).
GQA (Grouped Query Attention) - компромисс между MHA (дорого) и MQA (потеря качества); группирует запросы, сокращая память в 4–8 раз при потере качества всего 2%.
MLA (Multi-head Latent Attention) сжимает K и V в латентный вектор малой размерности; экономит память в 16× (16 GB → 1 GB для 1M токенов).
MTP (Multi-Token Prediction) учит модель предсказывать сразу несколько следующих токенов; ускоряет генерацию на 30–40%.
Sliding Window Attention ограничивает видимость каждого токена локальным окном (например, 4096 токенов); снижает сложность с O(n²) до O(n×w) - в 250 раз для 1M токенов.
Sparse Attention вычисляет внимание только на выбранных подмножествах (локальные, случайные, глобальные токены); сложность падает с O(n²) до O(n log n) или O(n√n).
MHA (Multi-Head Attention) - базовый вариант, где каждая голова имеет свои ключи и значения; максимальное качество, но максимальная память.
MQA (Multi-Query Attention) - все головы используют общие ключи и значения; память минимальна, но качество падает (теряется diversity).
Все оптимизации - это компромиссы: GQA - память vs качество, Sliding Window - дальние связи vs скорость, MTP - скорость vs сложность обучения.
Без этих оптимизаций невозможна работа с длинными контекстами (1M+ токенов) и большими моделями в продакшене.
FlashAttention - алгоритмическая оптимизация, а не архитектура. Пересчитывает внимание блоками на быстрой SRAM, не сохраняя промежуточные матрицы. Ускорение в 2–4 раза на длинных контекстах, снижение памяти с O(n²) до O(n). Встроена в vLLM, PyTorch 2.0+, HuggingFace - вы уже её используете, даже если не знаете.
Практический пример
Как KV Cache выглядит в коде? Упрощенная реализация на псевдокоде с пояснением, как работает PagedAttention в vLLM, - в Приложении 5.1.