localaiforum
Войти
Руководство › Запуск и обслуживание

Физика токенов в секунду

Скорость генерации токенов не загадочна: при декодировании каждый токен требует чтения из памяти практически всех активных весов один раз. Это делает декодирование ограниченным пропускной способностью памяти и означает, что вы можете предсказать свой tok/s делением. Всё, о чём спорят люди, — квантизация, MoE, оффлоад, батчинг — эта формула в разных шляпах.

Единственная формула

токенов/сек ≈ эффективная пропускная способность памяти ÷ байты весов, читаемых на токен

RTX 4090, 8B Q4_K_M:
  1008 GB/s ÷ 4.9 GB ≈ 205 tok/s теоретический потолок
  наблюдаемое: ~120–150 tok/s (накладные, внимание, чтение KV)

Таблица проверки для одного распространённого случая (8B в Q4_K_M, один поток — числа порядка величины, не спеки; мерьте свои):

Железо ~Пропускная способность Ожидаемое декодирование
RTX 4090 ~1,000 GB/s ~120–150 tok/s
RTX 3090 ~936 GB/s ~110–140 tok/s
RTX 4060 Ti 16GB ~288 GB/s ~35–45 tok/s
CPU DDR5 двухканальная ~60–90 GB/s ~8–14 tok/s
Mac класса M3/M4 Max ~300–400 GB/s (единая) ~40–60 tok/s

Почему разрыв между потолком и реальностью? Накладные запуска ядер, работа внимания, растущая с контекстом, и чтение KV-кэша поверх весов. Формула даёт потолок; обычно реализуется 60–75% его в один поток.

Одна карта, четыре модели

Формула также предсказывает, как размер модели торгуется со скоростью на фиксированном железе. Потолок на карте ~1,000 GB/s, затем 60–75% реализованных (иллюстративно):

Модель Размер в Q4_K_M Потолок Реалистично один поток
4B ~2.5 GB ~400 tok/s ~230–300 tok/s
8B ~4.9 GB ~205 tok/s ~120–150 tok/s
14B ~8.5 GB ~118 tok/s ~70–90 tok/s
32B ~19 GB ~53 tok/s ~30–40 tok/s

Два урока. Удвоение параметров примерно уполовинивает скорость на той же карте. И 32B на карте 24 GB всё ещё достаточно быстра для чата — ограничение памятью не безнадёжно. Эта пара — причина, по которой карты 24 GB и кванты 32B Q4 постоянно встречаются вместе (см. классы GPU).

Квантизация — фича скорости, не только сжатия

Та же формула, меньше байтов: модель 8B в fp16 читает ~16 GB на токен; в Q4_K_M — ~4.9 GB. На той же карте Q4 работает примерно втрое быстрее fp16 и влезает там, где fp16 нет. Вот почему кванты класса Q4 — рекомендация по умолчанию для локального использования (см. квантизация) — потеря качества мала, а выигрыш скорости структурный, не случайный.

Контекст замедляет

По мере роста разговора каждый новый токен должен также прочитать KV-кэш каждого предыдущего токена — эти чтения масштабируются с длиной контекста. У пустого контекста 8B Q4 может давать 140 tok/s на карте класса 4090; глубоко в сессии на 64k токенов тот же сетап может просесть до половины или трети. Ядра внимания также перестают помещаться в кэш-дружественные формы. Нагрузки с длинным контекстом — то место, где flash attention и квантизация KV окупаются (см. KV-кэш и параметры движка).

Частая путаница: «модель замедлилась по ходу чата» — обычно рост KV, а не деградация сервера (см. KV-кэш).

MoE: скорость ради компетентности

Модели mixture-of-experts активируют лишь несколько экспертных блоков на токен, поэтому байты чтения на токен следуют за активными параметрами, а не за общими. Модель 30B-всего/3B-активных в Q4 читает лишь пару гигабайт на токен — декодируется как маленькая, неся знания большой. В этом вся привлекательность семейств MoE для локального использования (см. семейства моделей): вы платите памятью за хранение экспертов, но пропускной способностью — только за тех, кого используете.

Конкретная форма на момент написания: класс Qwen3-30B-A3B читает на токен только ~3B активных параметров — знания большой модели на скорости маленькой за ~18 GB VRAM в Q4.

Спекулятивное декодирование

Пара из маленькой черновой модели и большой целевой: черновик дёшево предлагает k токенов, цель проверяет все k одним прямым проходом, принятые токены выходят в качестве цели. На около-жадных нагрузках — автокомплит кода, JSON, экстракция при низкой температуре — ждите ускорения декодирования в 2–3×. При высокой температуре черновик промахивается чаще, и выигрыш сжимается. llama.cpp открывает это через --model-draft и флаги draft-length; точные имена флагов дрейфуют между версиями, проверяйте --help.

Цены: черновик должен делить токенизатор цели, и обе модели сидят в памяти.

Параллелизм: реальность

Две GPU не дают вам 2× одного потока. Тензорный параллелизм (vLLM -tp 2) режет каждый слой между картами ради пропускной способности ценой трафика по интерконнекту; дефолтный сплит llama.cpp — пайплайн (по слоям), который помогает ёмкости больше, чем задержке одного потока. Реалистичное ожидание от хорошего двухкарточного разнесения: 1.2–1.6× одного потока, не 2×. Если кто-то обещает линейное масштабирование на GPU, он что-то продаёт.

Добавление карт всё же хорошо масштабирует ёмкость — это серверная история в параллелизме.

Обрыв CPU-оффлоада

Когда слои остаются на CPU, прямой проход каждого токена скачет по PCIe (~10–25 GB/s) в системную RAM и обратно. Цикл бежит со скоростью самого медленного резидентного куска: модель с 80% слоёв на GPU работает куда ближе к скорости CPU, чем к «80% скорости GPU». Если модель почти влезает, шагните на квант вниз вместо полу-оффлоада — см. параметры движка. Опознавательный знак случайного частичного оффлоада — 3–10 tok/s на железе класса GPU.

Префилл ограничен вычислениями: TTFT — другое измерение

Обработка промпта параллельна по токенам и ограничена вычислениями, не пропускной способностью — карта класса 4090 может префиллить 8B Q4 на несколько тысяч tok/s. Так что вставка на 12k токенов стоит ~3–5 с до первого выходного токена, хотя декодирование потом идёт на 140 tok/s. Время до первого токена и установившийся tok/s — разные числа, меряющие разные узкие места; читая бенчмарк, проверяйте, какое из них показывают.

Измерьте своё

Числа на страницах (включая эту) — потолки и диапазоны. Ваш сетап меряется за две минуты:

  1. Сгенерируйте ~200 токенов из короткого промпта; игнорируйте самый первый прогон (холодная загрузка).
  2. Возьмите установившееся декодирование: токенов сгенерировано ÷ секунды после первого токена.
  3. Отдельно отметьте время до первого токена на длинной вставке — это другое узкое место.

llama-server печатает prompt-eval и eval tok/s на каждый запрос; LM Studio показывает decode tok/s вживую; nvidia-smi подтверждает, что GPU реально занят во время теста.

Как ощущается скорость

tok/s Ощущение
5 Пригодно, но больно — длинных ответов будете бояться
10 Нормально для чата
20 Резво; разговор перестаёт казаться механическим
50+ Мгновенно; уровень кодинг-ассистента

Пороги удивительно низкие, потому что скорость чтения у людей всего ~5–10 tok/s — но ждать дополнение на 5 tok/s — мучение. Почувствуйте сами: симулятор рендерит один и тот же ответ на разных токен-рейтах, и минута там учит больше любой таблицы.

Ниже ~2–3 tok/s стриминговый UI ощущается сломанным, а не медленным — люди закрывают вкладку, поэтому считайте это жёстким полом для интерактивного использования.

Связанные разделы: обзор железа · математика VRAM · классы GPU · параметры движка