Prefill Decode Asymmetry

Выходные токены стоят в 4–6 раз дороже входных не из-за ценовой политики провайдеров, а из-за физики GPU: обработка промпта параллельна и утилизирует тензорные ядра, а генерация ответа последовательна и упирается в пропускную способность памяти.

Содержит быстро устаревающие данные (прайс $/1M токенов, поколения GPU) — status/volatile. Соотношение input/output устойчиво, абсолютные цифры нет.

Суть

Инференс распадается на две фазы с принципиально разным профилем нагрузки.

Prefill (обработка входа). Весь массив входных токенов загружается в тензорные ядра одновременно. Это матричные умножения с высокой утилизацией вычислительных блоков — быстро и дёшево. При включённом кэшировании префикса фаза может почти полностью пропускаться (см. Prompt Caching).

Decode (генерация выхода). Авторегрессия: токен за токеном, строго последовательно. Для каждого нового токена веса модели заново прогоняются через шину памяти. Узкое место — не вычисления, а пропускная способность памяти (memory-bandwidth bound). Распараллелить нечего: следующий токен не существует, пока не готов предыдущий.

Отсюда и разрыв в прайсе:

Провайдер Input, $/1M Output, $/1M
OpenAI ~0.8 ~3.5
Anthropic ~1.1 ~3.4
Google ~0.6 ~3.0

Цифры со слайда условные и устаревают — эта таблица даёт ×3–4,4 и относится к более раннему поколению моделей.

Актуальный разброс (сверка 2026-08-23). Соотношение устойчиво держится в диапазоне ×4–6: у актуальных флагманов ×5–6 (семейство Claude ровно ×5, линейка GPT-5.4 — ×6–6,25), у лёгких и длинноконтекстных моделей оно опускается до ×3,75–4 (Gemini 1.5 Flash ×4, Claude Opus Long Context ×3,75). Устойчиво само соотношение, а не конкретное число: причина в физике, а не в прайс-листе.

Зачем это знать

Понимание причины меняет приоритеты оптимизации. Интуиция подсказывает бороться с длиной промпта — но именно промпт обрабатывается дёшево и хорошо кэшируется. Деньги уходят в длину ответа, и там же живёт латентность.

Практические следствия:

  • max_tokens — финансовый параметр, а не защита от переполнения. Безлимит вместе с многословным «объясни детально» даёт экспоненциальный рост затрат на decode. Минимально необходимый лимит плюс строгая JSON-схема дают предсказуемую стоимость (см. Structured Output).
  • Просьба «рассуждай подробно» оплачивается по самому дорогому тарифу. Развёрнутый chain-of-thought в ответе — это decode-токены (см. Chain of Thought, Reasoning Effort).
  • Сжимать стоит вывод, а не только ввод. Формат ответа, в котором нет вежливых преамбул и пересказа вопроса, экономит буквально деньги.

Оговорка про поколения GPU

Ограничение относится к массовым поколениям ускорителей — Ampere и Hopper; снять его должны только новейшие Blackwell-поколения. Утверждение стоит перепроверять: это как раз тот класс фактов, который живёт год-два.

Пример

Один и тот же запрос при разной постановке задачи:

# Дорогой вариант: длинный свободный ответ — весь decode по полной ставке
{"max_tokens": 2000, "messages": [{"role": "user", "content": "Разбери подробно этот тикет и объясни решение"}]}

# Дешёвый вариант: та же работа, но выход ограничен схемой
{"max_tokens": 150, "response_format": {"type": "json_schema", "json_schema": TICKET_VERDICT}}

Входная часть у обоих одинаковая и кэшируется; разница в счёте создаётся правой стороной.

Как это выглядит на своём железе

Локально валюта другая — время GPU, — но асимметрия никуда не девается, потому что её причина в самой механике генерации. Prefill обрабатывает весь промпт параллельно и упирается в вычислительную мощность: длинный вход считается быстро относительно своего объёма. Decode выдаёт по одному токену за проход и упирается в пропускную способность памяти, а не в вычисления, — каждый следующий токен требует прочитать веса заново.

Практическое следствие для локального запуска противоположно облачному по форме, но то же по сути: удлинение промпта обходится дёшево, удлинение ответа — дорого, и именно длина генерации определяет, сколько запросов в секунду выдержит машина. Отсюда же выигрыш батчирования в vLLM (Local LLM Deployment): пока decode ждёт память, можно считать другие запросы, и на конкурентной нагрузке это даёт кратный рост пропускной способности при неизменном железе.

Что показали замеры на Blackwell

Сверка 2026-08. Публичные замеры есть, и они отвечают неожиданно: новое поколение снижает стоимость обеих фаз, но асимметрию не убирает — скорее закрепляет.

Цифры по абсолютной стоимости впечатляют: в MLPerf Inference v6.0 (апрель 2026) B200 выдаёт около 17 500 токенов/с на Llama 2 70B против примерно 3 000 у H100, а стоимость падает примерно с $0.14 до $0.02 за миллион токенов — семикратно, несмотря на вдвое более дорогую аренду часа. По on-demand-ценам июля 2026 ($9.36/час против $3.94) инференс в FP4 выходит примерно на 42% дешевле за токен.

Но соотношение input/output это не выравнивает, и причина архитектурная. Prefill загружает вычислительные блоки и напрямую выигрывает от FP4 — это фаза, где считают. Decode большую часть времени ждёт чтения из памяти, оставляя вычислительные блоки простаивать, и от выигрыша FP4 не получает почти ничего: он упирается в пропускную способность HBM, а не в FLOPs. Рост памяти до 8 ТБ/с помогает decode, но это другой множитель, меньший.

Практический вывод: смена поколения GPU удешевляет всё, не меняя того, что выходные токены дороже входных. Планировать экономику по-прежнему нужно от длины генерации, а не от длины промпта — и это верно и для облачных цен, и для собственного железа.

Связано с

  • Inference Optimization — три рычага, которыми serving-движок обходит это ограничение
  • LLM Sizing — как асимметрия превращается в бюджет видеопамяти
  • KV Cache — механика, за счёт которой decode вообще не начинается с нуля на каждом токене
  • Prompt Caching — как дополнительно удешевить prefill-фазу
  • Unit Economics AI — куда эта асимметрия попадает в расчёте стоимости запроса
  • Sampling Parameters — max_tokens и его влияние на счёт
  • Reasoning Effort — рассуждения оплачиваются как выходные токены