Слогер Создать блог
AI

Сколько вычислений стоит один ответ нейросети: FLOPs на токен

Формула 2 × параметры × токены позволяет прикинуть стоимость генерации ещё до запуска модели. Разбираем, как она работает, где ошибается и почему не предсказывает скорость.

Одно правило закрывает почти всё: один проход через плотный трансформер стоит примерно две операции с плавающей точкой на параметр на токен. Это правило — 2 × N × T — превращает ответ нейросети в арифметику. А когда формула перестаёт работать, начинается самое интересное.

Откуда берётся двойка

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

Инференс: FLOPs ≈ 2 × N × T

Обучение: FLOPs ≈ 6 × N × T

Здесь N — число параметров, T — число обработанных токенов. В шестёрке для обучения двойка уходит на прямой проход, а четвёрка — на обратный, потому что градиенты считаются и по входам, и по весам, то есть работы примерно вдвое больше.

Обе формулы игнорируют нормализацию слоёв, активации, softmax и остаточные связи. Это поэлементные операции над активациями, а не над весами, и для модели приличного размера они теряются на фоне матричных умножений. А вот attention так просто отбросить нельзя.

Считаем конкретный ответ

Возьмём плотную модель на 70 млрд параметров. Промпт — 1000 токенов, ответ — 500 токенов. Каждый из 1500 токенов проходит через все веса один раз.

  • Prefill (промпт обрабатывается одним параллельным проходом): 2 × 70e9 × 1000 = 140 TFLOP
  • Decode (500 последовательных проходов, по одному токену): 2 × 70e9 × 500 = 70 TFLOP
  • Итого на ответ: 210 TFLOP

Это примерно столько арифметики, сколько за несколько секунд делает топовая потребительская видеокарта на пике. Сразу видно: инференс в масштабе — это проблема железа, а не софта.

Обратите внимание: входные и выходные токены стоят одинаковое число FLOPs, но не одинаковое время и деньги. Почему так — в разделе про память.

Чего не хватает в правиле: attention

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

FLOPs на токен ≈ 2 × N + 2 × n_layers × n_ctx × d_model

Интересно, когда второе слагаемое догоняет первое. Ниже этой точки attention можно игнорировать, выше — уже нет. Приравняем и решим:

n_ctx = N / (n_layers × d_model)

Для модели на 70B с 80 слоями и d_model = 8192 это даёт примерно 106 811 токенов. Проверим на краях:

КонтекстВклад attentionВывод
1 000 токенов0,9% от общего объёмаможно не учитывать
128 000 токеновбольше, чем 2 × Nattention доминирует

Для модели такой формы attention становится заметным где-то от ста тысяч токенов. Этим объясняется, почему длинный контекст стоит непропорционально дорого и почему миллионные окна контекста такие затратные. Конкретные числа зависят от архитектуры: подставьте значения из карточки модели. Главное — не само число 106 811, а формула кроссовера.

Сверяемся с GPU

FLOPs становятся осмысленными, когда их делишь на скорость. У H100 SXM паспортный пик — около 989 TFLOP/s для плотных вычислений BF16. Реальные нагрузки дают лишь долю пика, так называемую model FLOPs utilisation, обычно 35–50%. Возьмём 40%:

  • Эффективная скорость: 0,40 × 989e12 ≈ 3,96e14 FLOP/s
  • Время на наш ответ: 210 TFLOP / 3,96e14 ≈ 0,53 секунды чистой арифметики

Полсекунды вычислений. Провайдеры на этом и строят экономику: ускоритель заполняется множеством параллельных запросов, и работа, которая одному пользователю стоила бы полсекунды, выполняется одновременно для десятков.

Почему это не предсказывает задержку

Полсекунды — это время вычислений. Пользователь ждёт гораздо дольше. При генерации каждого токена модель должна прочитать веса из памяти, и при batch size = 1 ускоритель почти всё время ждёт память, а не считает. Ограничение — не FLOPs, а пропускная способность памяти.

70 млрд параметров × 2 байта = 140 ГБ на токен

3,35 ТБ/с у H100 SXM → 0,042 с на токен → ≈ 24 токена/с

500 токенов ответа — около 21 секунды реального времени против 0,53 секунды вычислений. Арифметические блоки простаивают примерно 97% времени.

Вот почему существует батчинг: добавить второй параллельный запрос почти ничего не стоит, потому что веса уже читаются. Пропускная способность растёт с размером батча, пока узким местом не станет арифметика.

Когда правило ошибается

  • Mixture-of-experts. Считайте активные параметры, а не все. У модели с 400B параметров и 40B активных на токен уходит 2 × 40e9 × T, а памяти нужно на все 400B. Применение правила к громкому числу завышает арифметику в десять раз.
  • Reasoning-модели. Правило считает токены, а такие модели генерируют скрытые токены рассуждений. Ответ в 200 видимых токенов может стоить 4000 скрытых — итоговые FLOPs на видимый токен отличаются на порядок.
  • Кэш префикса. При попадании в кэш prefill для кэшированной части не выполняется: FLOPs не уменьшаются, их просто не совершают.
  • Квантизация. Число операций от неё не меняется — INT4 делает ту же работу на более дешёвых блоках. Меняются байты и скорость операций, но не их количество.
  • Спекулятивное декодирование. Черновик предлагает несколько токенов, большая модель проверяет их одним проходом — понятия «токенов выпущено» и «полных проходов» перестают совпадать.

В этих границах 2 × N × T — самое полезное уравнение в прикладном машинном обучении. Им можно прикидывать железо, оценивать бюджет, объяснять прайсинг. И, в отличие от многих цифр в этой теме, оно не устаревает.

По материалам: ai. Текст переработан редакцией Слогера.

← На главную

Рекламное место — Конец поста
Реклама · Слогер

Комментарии (0)

Войдите, чтобы комментировать.

Пока нет комментариев. Будьте первым.