Инференс: авторегрессия токен за токеном

Обучение позади — теперь модель работает. Разберём, что буквально происходит на каждом шаге, когда ChatGPT печатает ответ.

Инференс (inference) — применение обученной модели для генерации: авторегрессивный цикл, где ответ строится по одному токену.

Цикл генерации

Генерация ответа — это повторение одного и того же шага:

  1. Подать текущую последовательность токенов (промпт + уже сгенерированное) в модель.
  2. Получить распределение вероятностей следующего токена.
  3. Выбрать один токен (greedy или сэмплированием — следующий урок).
  4. Добавить его к последовательности.
  5. Вернуться к шагу 1, пока не появится токен конца или не достигнут лимит.

Именно поэтому в интерфейсе ответ «печатается» по словам: вы видите токены ровно в тот момент, когда модель их порождает. Это не анимация ради красоты — это и есть реальный темп авторегрессии.

Каждый токен — полный проход модели

Ключевая мысль: чтобы выдать один токен, модель прогоняет всю текущую последовательность через все свои слои. Для следующего токена — снова полный проход с уже более длинной последовательностью. Отсюда два важных следствия:

  • Длинный ответ генерируется дольше — токенов больше, проходов больше.
  • Генерация по своей природе последовательна: следующий токен нельзя посчитать, не получив предыдущий. Это фундаментально отличает инференс от обучения, где весь текст обрабатывается параллельно.

KV-кэш: чтобы не считать заново

Наивно при каждом новом токене пришлось бы пересчитывать внимание для всей последовательности с нуля — расточительно. На помощь приходит KV-кэш: ключи и значения (key/value) уже обработанных токенов сохраняют и переиспользуют. Для нового токена считают только его собственные Q/K/V, а K/V прошлых токенов берут из кэша. Это резко ускоряет генерацию, но требует памяти, растущей с длиной контекста, — ещё одна причина, почему длинные диалоги «тяжелее».

Префилл и декодирование

Инференс делят на две фазы:

ФазаЧто происходит
Префилл (prefill)весь промпт обрабатывается разом, заполняется KV-кэш
Декодирование (decode)ответ генерируется по одному токену, опираясь на кэш

Префилл быстрый (всё параллельно), а вот декодирование — последовательное и обычно определяет, сколько вы ждёте длинный ответ.

Почему генерация дороже, чем кажется

Каждый токен ответа — это работа всей многомиллиардной сети. Поэтому стоимость и скорость инференса считают в токенах, длинные ответы дороже коротких, а оптимизация скорости генерации (KV-кэш, квантизация и пр.) — большая инженерная тема.

Итог

  • Инференс — авторегрессивный цикл: предсказать токен, добавить, повторить.
  • Каждый токен требует полного прохода модели, поэтому генерация последовательна и длинные ответы медленнее.
  • KV-кэш переиспользует ключи/значения прошлых токенов, ускоряя генерацию ценой памяти.
  • Инференс делится на быстрый префилл промпта и последовательное декодирование ответа.
Проверьте себя
1. Почему ответ модели «печатается» по словам?
AЭто анимация для красоты
BТокены показывают в момент их порождения — авторегрессия генерирует их по одному
CТак работает токенизатор
DИз-за медленного интернета
2. Почему генерация принципиально последовательна?
AИз-за ограничений экрана
BСледующий токен нельзя посчитать, не получив предыдущий — он входит в контекст
CТак требует softmax
DЭто ограничение словаря
3. Зачем нужен KV-кэш?
AЧтобы хранить пароли пользователя
BЧтобы переиспользовать ключи и значения прошлых токенов и не пересчитывать внимание с нуля
CЧтобы увеличить словарь
DЧтобы перевести текст
Поддержать проект