Посчитать, во сколько обходится генерация одного токена в LLM, можно буквально «на салфетке» — если знать характеристики GPU и архитектуру модели. Автор разбирает математику шаг за шагом.
Любое матричное умножение (matmul) — это пара уравнений: количество обращений к памяти и число операций с плавающей точкой. Для произведения матриц (A_{N \times d}) и (B_{d \times M}) оба значения равны (2NMd). С оптимизацией tiling число чтений памяти падает примерно до (d(N+M)).
Дальше — attention. На каждом слое модели хранятся матрицы (W_Q, W_K, W_V): вход (X) умножается на них, затем считаются (Q \cdot K^T), применяется softmax, результат умножается на (V). Когда модель обрабатывает длинные диалоги (до 200k токенов), без трюков нагрузка бешеная: на один токен уходит 26 трлн операций и 1,7 млрд чтений памяти. Это в десятки тысяч раз больше вычислений, чем загрузок — GPU простаивает.
Спасает KV Cache. LMM авторегрессионны: каждый новый токен начинается с пересчёта всей истории. Если кешировать пары (K) и (V) для каждого слоя, то на каждом шаге обрабатывается только последний токен. Математика резко меняется: на один токен — 52,4 млн операций и 26,2 млн чтений памяти. Всего два вычисления на байт.
Автор берёт эталон — NVIDIA B200. Его характеристики: пропускная способность памяти 8 TB/s, вычислительная мощность 4500 TFLOP/s. Чип может делать 562 операции на каждый загруженный байт. Чтобы нагрузить его полностью, нужно (\text{2B} = 562), то есть (B = 331) пользователь одновременно. Это теоретический потолок.
На практике всё упирается в VRAM. 32B-модель весит 32 GB. Для контекста в 200k токенов, 64 слоёв и размерности (d=8192) KV Cache занял бы 210 GB. Оптимизация Grouped-Query-Attention сжимает его в 8 раз — до ~26 GB на один диалог. После вычета весов остаётся 160 GB: всего 6 параллельных контекстов. Это удручающе мало.
Здесь в игру вступает PagedAttention — техника, которую использует движок vLLM. Она разбивает KV Cache на блоки и выделяет их по мере роста длины диалога. «Холодные» сессии выгружаются. С учётом реальной длины разговоров (4–40k токенов) один B200 обслуживает 40–60 пользователей. Но люди в чатах часто читают, а не генерируют — duty cycle GPU падает до 20%. Это даёт уже 300–800 пользователей на чип в комфортном режиме.
Скорость генерации: один проход двигает 190 GB данных из VRAM в регистры за 23,75 мс и вычисляет за 0,5 мс. За секунду выходит ~40 токенов на пользователя — больше скорости чтения. Стоимость: при покупке B200 ($40 000) lifetime cost на пользователя — от $6k при полной утилизации до $133 при 300 пользователях. Аренда — $4/час, или $0,013 в час на пользователя, то есть примерно $9,36 в месяц.
Оценка консервативная: не учтены агентные циклы с высоким duty cycle. Для моделей на нескольких GPU логика та же, но на салфетке считать уже не стоит.