Как работает инференс: от запроса до ответа
Разбираем путь запроса к LLM: фазы prefill и decode, KV-кэш, speculative decoding и оптимизации, которые делают ответ быстрым.
Вы вводите запрос в ChatGPT, Claude или Gemini — и через долю секунды на экране начинают появляться слова. За этой кажущейся простотой скрывается сложнейший конвейер: токенизация, матричные вычисления на миллиардах параметров, управление памятью GPU и десятки оптимизаций, отточенных годами исследований. Этот конвейер называется инференс (inference) — процесс получения ответа от обученной модели.
В этой статье разберём каждый этап пути от текстового запроса до сгенерированного ответа и объясним, какие инженерные решения позволяют получать ответы за сотни миллисекунд.
Что такое инференс и почему он важен
Жизненный цикл любой нейросети состоит из двух фаз: обучение (training) и инференс (inference). Обучение — это долгие недели на кластерах из тысяч GPU, когда модель учится на данных. Инференс — это применение обученной модели для генерации ответов в реальном времени.
Когда пользователь отправляет запрос к LLM через API, происходит следующая цепочка:
graph LR
A["Текст запроса"] --> B["Токенизация"]
B --> C["Prefill-фаза"]
C --> D["KV-кэш"]
D --> E["Decode-фаза"]
E --> F["Детокенизация"]
F --> G["Текст ответа"]
style C fill:#4a9eff,color:#fff
style E fill:#ff6b6b,color:#fff
Два ключевых этапа — prefill и decode — принципиально различаются по характеру вычислений, и именно понимание этого различия открывает путь к оптимизациям.
Две фазы инференса: prefill и decode
Prefill: обработка входного контекста
Когда запрос поступает на сервер, весь текст промпта сначала разбивается на токены (подслова). Затем начинается prefill-фаза: модель обрабатывает все входные токены одновременно через параллельные матричные операции в слоях attention.
Это тяжёлая вычислительная работа — compute-bound операция, которая загружает GPU практически на 100%. Чем длиннее промпт, тем дольше фаза prefill. Для промпта в 1000 токенов на модели с 70B параметрами это может занять 200–500 мс.
Побочный продукт этой фазы — KV-кэш (Key-Value cache): внутренние представления каждого входного токена, которые сохраняются в памяти GPU для использования на следующем этапе.
Время до первого токена (TTFT — Time to First Token) — это по сути и есть длительность prefill-фазы. Именно этот показатель определяет, как быстро пользователь увидит начало ответа.
Decode: генерация по одному токену
После завершения prefill модель переходит в decode-фазу — автоматическую генерацию ответа токен за токеном. На каждом шаге модель:
- Берёт последний сгенерированный токен
- Прогоняет его через все слои трансформера
- Использует KV-кэш для вычисления attention (не пересчитывая предыдущие токены)
- Выбирает следующий токен из распределения вероятностей
- Повторяет до стоп-сигнала
Decode-фаза принципиально отличается от prefill: здесь обрабатывается только один токен за раз, поэтому GPU недозагружен вычислениями. Узкое место — не вычислительная мощность, а скорость чтения из памяти (memory-bound). Веса модели, ключи и значения из KV-кэша нужно загрузить из HBM-памяти GPU для каждого токена.
Современные решения вроде DistServe разделяют эти фазы на разные GPU: одни отвечают за prefill, другие — за decode. Это позволяет масштабировать каждую фазу независимо.
| Характеристика | Prefill | Decode |
|---|---|---|
| Обрабатывает | Все входные токены сразу | По одному токену |
| Узкое место | Вычисления (compute-bound) | Память (memory-bound) |
| Загрузка GPU | ~100% | 10–30% |
| Определяет | TTFT (время до первого токена) | Скорость генерации (tok/s) |
| Можно ускорить | Более мощный GPU | Более быстрая память (HBM) |
KV-кэш: память, которая всё меняет
KV-кэш — это, пожалуй, самый важный компонент инференса после самой модели. Без него на каждом шаге генерации пришлось бы пересчитывать attention для всех предыдущих токенов заново, что сделало бы инференс квадратично медленнее.
Проблема в том, что KV-кэш занимает огромный объём памяти. Для модели с 70B параметрами и контекстным окном в 200K токенов KV-кэш может потребовать 40–80 ГБ видеопамяти — почти весь объём NVIDIA H100 (80 ГБ), не оставляя места для весов модели.
Как оптимизируют KV-кэш
PagedAttention (vLLM). Прорывная техника, предложенная командой vLLM: управление памятью KV-кэша по аналогии с виртуальной памятью в операционных системах. Память выделяется небольшими блоками (страницами) по мере необходимости и освобождается, когда генерация завершена. Результат — увеличение размера батча в 2–4 раза на том же GPU.
Квантование кэша. Вместо хранения KV-кэша в FP16 (16-бит) его сжимают до FP4 (4-бит) с потерей точности менее 1%. NVIDIA H100 и H200 поддерживают FP4-квантование аппаратно, что вдвое сокращает потребление памяти.
RadixAttention (SGLang). Если несколько запросов начинаются с одинакового системного промпта (что типично для чат-ботов), KV-кэш общей части хранится один раз и переиспользуется. Это особенно эффективно для RAG-пайплайнов и многошаговых диалогов.
# Пример: инференс с vLLM и PagedAttention
from vllm import LLM, SamplingParams
llm = LLM(
model="meta-llama/Llama-3.1-70B-Instruct",
tensor_parallel_size=4, # 4 GPU
gpu_memory_utilization=0.90, # 90% памяти под KV-кэш
max_model_len=32768,
quantization="fp8", # FP8 квантование весов
)
params = SamplingParams(temperature=0.7, max_tokens=1024)
outputs = llm.generate(["Объясни, как работает инференс LLM"], params)
print(outputs[0].outputs[0].text)
Оптимизации, которые ускоряют инференс в разы
Continuous batching (непрерывная батчевая обработка)
Наивный подход — собрать N запросов в батч и ждать, пока все завершатся. Это неэффективно: короткие ответы простаивают, пока генерируются длинные.
Continuous batching (in-flight batching) решает это элегантно: как только один запрос завершается, на его место немедленно подставляется новый — прямо в процессе генерации остальных. Утилизация GPU возрастает в 2–5 раз.
graph TD
subgraph "Static Batching"
A1["Запрос 1 ████████░░░░ ожидание"]
A2["Запрос 2 ████████████████████"]
A3["Запрос 3 ████░░░░░░░░ ожидание"]
end
subgraph "Continuous Batching"
B1["Запрос 1 ████████ Запрос 4 ████████"]
B2["Запрос 2 ████████████████████"]
B3["Запрос 3 ████ Запрос 5 ██ Запрос 6 ██████"]
end
Speculative decoding (спекулятивное декодирование)
Одна из самых интересных оптимизаций последних лет. Идея: вместо того чтобы генерировать по одному токену большой моделью, маленькая модель-черновик (1–7B параметров) быстро генерирует 3–12 токенов-кандидатов, а основная модель проверяет их все за один проход.
Если кандидаты совпадают с тем, что сгенерировала бы основная модель — мы получаем несколько токенов за время одного шага. Если нет — отбрасываем неверные и продолжаем с последнего правильного.
Квантование модели
Снижение точности весов модели — с FP16 (16-бит) до INT8 или FP4 — уменьшает объём памяти и ускоряет чтение весов. Для decode-фазы, ограниченной пропускной способностью памяти, это даёт прямой прирост скорости.
| Формат | Размер 70B модели | Потеря качества | Поддержка GPU |
|---|---|---|---|
| FP16 | ~140 ГБ | Базовый уровень | Все |
| FP8 | ~70 ГБ | < 0.5% | H100, H200, B200 |
| INT4/FP4 | ~35 ГБ | 1–3% | H100, H200, B200 |
| GPTQ/AWQ 4-bit | ~35 ГБ | 1–2% | Все (программно) |
Железо и фреймворки: что стоит за скоростью
GPU для инференса в 2026
Три поколения NVIDIA GPU сосуществуют на рынке инференса:
H100 (Hopper) — рабочая лошадка. 80 ГБ HBM3, 3.35 ТБ/с пропускной способности памяти. Основная платформа для большинства облачных провайдеров.
H200 — эволюция Hopper. 141 ГБ HBM3e, 4.8 ТБ/с. На 9–10% быстрее H100 по пропускной способности инференса, а главное — вмещает большие модели без тензорного параллелизма.
B200 (Blackwell) — новое поколение. 192 ГБ HBM3e, 6.0 ТБ/с, NVLink 5. Самая низкая латентность — до 2.40 мс при конфигурации из 8 GPU. В FP4-режиме обеспечивает примерно 3× меньшую стоимость за токен по сравнению с H200.
Фреймворки для серверного инференса
| Фреймворк | Сильная сторона | Tok/s на H100 | Когда выбирать |
|---|---|---|---|
| SGLang | RadixAttention, чат-сценарии | ~16 200 | Чат-боты, RAG, многошаговые диалоги |
| vLLM | PagedAttention, гибкость | ~12 500 | Быстрый старт, частая смена моделей |
| TensorRT-LLM | Аппаратная оптимизация NVIDIA | Максимальный | Стабильная модель в долгосрочном продакшене |
| LMDeploy | Скорость, простота | ~16 200 | Высокая пропускная способность |
По бенчмаркам 2026 года, SGLang и LMDeploy лидируют по скорости генерации — около 16 200 токенов в секунду на H100 — опережая vLLM на 29%.
Латентность на практике: что видит пользователь
Все оптимизации сходятся в двух метриках, которые определяют пользовательский опыт:
- TTFT (Time to First Token) — через сколько миллисекунд пользователь увидит начало ответа
- TPS (Tokens per Second) — скорость «печати» ответа
По данным бенчмарков API за апрель 2026 года:
| Модель | TTFT (медиана) | Скорость генерации |
|---|---|---|
| Claude Haiku 4.5 | ~600 мс | ~79 tok/s |
| GPT-5.2 | ~600 мс | — |
| Gemini 2.5 Flash | — | ~147 tok/s |
| Claude 4.5 Sonnet | ~2 000 мс | — |
Заключение
Инференс LLM — это не просто «прогнать текст через нейросеть». Это тонко выстроенный конвейер, где каждый этап оптимизирован под свои ограничения: prefill — под вычислительную мощность, decode — под пропускную способность памяти, а KV-кэш — под доступный объём GPU.
Ключевые выводы:
Две фазы — два узких места. Prefill ограничен вычислениями, decode — памятью. Оптимизировать их нужно по-разному, а в идеале — запускать на разных GPU.
KV-кэш — главный потребитель памяти. Без техник вроде PagedAttention и FP4-квантования обслуживать длинные контексты (100K+ токенов) было бы нерентабельно.
Speculative decoding вышел в продакшен. В 2026 году он встроен во все основные фреймворки и даёт 2–3× ускорение при малых батчах.
Железо продолжает ускоряться. Переход от H100 к B200 даёт 3× снижение стоимости за токен в FP4, а 192 ГБ памяти позволяют держать большие модели без разбиения.
Барьер в 200 мс TTFT пока не пройден. Это следующий рубеж, после которого взаимодействие с LLM станет неотличимо от обычного софта.
Понимание этих механизмов помогает принимать осознанные решения: какой фреймворк выбрать, какое железо арендовать, где квантование допустимо, а где критична точность. Инференс — это уже не чёрный ящик, а инженерная дисциплина с чёткими компромиссами.
Источники
- LLM Inference: Prefill, Decode, KV Cache & Cost Guide (2026)
- Mastering LLM Techniques: Inference Optimization — NVIDIA
- Speculative Decoding: 2-3x Faster LLM Inference (2026)
- Best GPUs for LLM Inference in 2026 — Yotta Labs
- Best LLM Inference Engines in 2026 — Yotta Labs
- LLM API Latency Benchmarks 2026
- How does LLM inference work? — BentoML