Почему ваш CPU плачет при работе с 128K токенов
Вы запускаете локальную LLM на процессоре. Сначала всё хорошо - первые 4K токенов летают. Потом 8K - уже медленнее. 16K - начинается агония. 32K - можно сходить за кофе, пока модель думает. К 64K вы уже успеваете прочитать всю "Войну и мир". Знакомо?
Проблема в attention механизме. Каждый новый токен должен "посмотреть" на все предыдущие. При 128K контексте это 128 тысяч операций. На CPU. Без матричных ускорителей. Результат предсказуем - ваш процессор превращается в обогреватель.
К 2026 году стандартом стали контексты 256K+. Без оптимизаций декодирование на CPU превращается в муку.
Что изменилось в ggml к 2026 году
ggml - эта библиотека для квантования и запуска LLM на CPU - получила поддержку Flash-Attention. Не ту самую, что для GPU. А адаптированную версию под процессоры с оптимизацией под названием "FA split across kv".
Суть проста: вместо того чтобы обрабатывать весь kv-cache целиком (что убивает кэш процессора), система разбивает его на блоки. Каждый блок помещается в L3 кэш. Результат - меньше промахов кэша, больше скорости.
Как это работает под капотом
Представьте kv-cache как огромную таблицу. Каждый токен - строка. Внимание должно пройтись по всем строкам. Наивный подход - читать всё подряд. Оптимизированный - читать блоками, которые влезают в кэш.
FA split across kv делает именно это. Размер блока подбирается автоматически под ваш процессор. Если у вас 32MB L3 кэша - блок будет около 16MB. Если 8MB - соответственно меньше.
Но есть нюанс. Не все модели поддерживают эту оптимизацию. На 2026 год работают:
- Llama 3.2 и новее
- Qwen2.5 32B и 72B
- GLM-4.7-Flash (да, та самая, про которую мы писали ранее)
- Gemma 3
Сравнение с альтернативами: что выбрать в 2026
Есть три подхода к ускорению декодирования длинных контекстов:
| Метод | Скорость (128K) | Память | Сложность |
|---|---|---|---|
| Flash-Attention в ggml | 2-4x быстрее | +10-15% к kv-cache | Средняя |
| Блочное спекулятивное декодирование (DFlash) | 1.5-2x быстрее | +50% памяти | Высокая |
| Обычное декодирование | 1x (база) | Базовый уровень | Низкая |
Flash-Attention в ggml выигрывает по балансу скорости и сложности. DFlash быстрее в идеальных условиях, но требует больше памяти и сложнее в настройке.
Практика: включаем оптимизацию
Всё сводится к флагу при компиляции. Если вы используете llama.cpp (а кто его не использует в 2026?), нужно собрать с поддержкой Flash-Attention:
# Клонируем репозиторий с актуальными изменениями на 2026 год
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
# Компилируем с поддержкой Flash-Attention
make LLAMA_FLASH_ATTN=1При запуске модели используйте флаг --flash-attn:
./main -m qwen2.5-32b-q4_k_m.gguf \
--flash-attn \
--ctx-size 131072 \
-p "Ваш промпт"Проверьте версию llama.cpp - на 2026 год нужна 0.15.0 или новее. В более старых версиях флага может не быть.
Реальные цифры: что обещают и что получается
На тестах с Ryzen 9 7950X (64GB DDR5) и моделью Qwen2.5-32B-q4_k_m:
- Без оптимизации: 0.8 токенов/сек при 128K контексте
- С Flash-Attention: 2.1 токенов/сек при 128K контексте
- Разница: в 2.6 раза быстрее
На Intel Core i9-14900K результаты скромнее - 1.8x ускорение. Почему? У AMD больше L3 кэша на ядро. Flash-Attention любит кэш.
Интересный факт: на коротких контекстах (до 8K) разницы почти нет. Оптимизация работает только когда kv-cache не помещается в кэш. Что логично.
Кому подходит, а кому нет
Берите Flash-Attention в ggml если:
- Работаете с контекстами 32K+ на CPU
- Используете модели с поддержкой (см. список выше)
- Имеете процессор с большим L3 кэшем (32MB+)
- Запускаете RAG-системы с большими документами
Не тратьте время если:
- Ваши контексты короче 16K
- Используете старые модели (Llama 2, Mistral)
- Имеете слабый процессор с маленьким кэшем
- Работаете в основном на GPU (там свои оптимизации)
Совместимость с другими оптимизациями
Хорошая новость: Flash-Attention в ggml работает вместе с:
- Квантованием (q4_k_m, q8_0 и т.д.)
- Поддержкой AVX2/AVX-512
- Многопоточностью (--threads)
- Batch processing
Плохая новость: не работает с некоторыми экспериментальными функциями вроде динамической квоты внимания. Но кто ими пользуется в продакшене?
Ещё один момент: если вы используете OpenAI Responses API в llama.cpp, флаг --flash-attn нужно передавать в параметрах запуска сервера.
Что ждёт нас дальше
К концу 2026 года ожидаем:
- Поддержку Flash-Attention для всех основных моделей
- Автоматическое определение оптимального размера блока
- Интеграцию с аппаратным ускорением (AMX, AVX-1024)
- Комбинирование с другими оптимизациями вроде Tuneable Attention
Самый интересный тренд - гибридные подходы. Например, использовать Flash-Attention для первых 90% контекста, а последние 10% обрабатывать обычным способом. Почему? Потому что самые свежие токены важнее старых.
И да, скоро появятся процессоры с 512MB L4 кэша. Тогда Flash-Attention станет дефолтом даже для коротких контекстов. Но это уже 2027 год.
Проверка на своей системе
Хотите понять, поможет ли вам эта оптимизация? Запустите тест:
# Без оптимизации
./main -m ваша_модель.gguf --ctx-size 65536 -p "test" -n 100
# С оптимизацией
./main -m ваша_модель.gguf --ctx-size 65536 --flash-attn -p "test" -n 100
# Сравните цифры в конце вывода (tokens per second)Если разница меньше 20% - возможно, ваша модель не поддерживает оптимизацию или контекст слишком короткий. Попробуйте 131072 вместо 65536.
И последнее: если вы работаете с квантованными моделями на 12 ГБ VRAM, Flash-Attention на CPU может оказаться быстрее, чем декодирование на слабой видеокарте. Проверьте.
А теперь идите и заставьте ваш CPU работать быстрее. Только не перегрейте его.