Токены в секунду зависят не только от числа параметров. На результат влияют формат весов, инструкции процессора, пропускная способность RAM, длина контекста и сборка рантайма. Публичный тест поможет оценить диапазон до развёртывания, но запуск 7B-модели на CPU нужно проверить на типичном для сервиса запросе.
Сколько токенов в секунду выдаёт 7B-модель на CPU?
В опубликованном в 2024 году тесте Llama 2 7B на 12-ядерном Snapdragon X Elite без GPU генерация достигла 20,72 токена/с в Q4_0 и 12,65 в Q8_0 при сборке llama.cpp cddae48. Конечно, это лишь ориентир: другая модель, память, контекст или сборка изменят результат.
Зафиксировать модель, формат и железо до первого замера
Одинаковое число параметров не означает одинаковую скорость. У Llama 2 7B, Mistral 7B и Qwen2.5 7B различаются число слоёв и KV-голов, размер скрытого состояния и токенизатор. Перед тестом запишите точное имя GGUF-файла, его SHA-256, тип квантования и коммит llama.cpp. Для запуска 7B-модели на CPU добавьте к отчёту параметры доступного железа.
Зафиксируйте модель CPU, число доступных процессоров, инструкции и объём RAM. На собственном сервере добавьте физические ядра, SMT, каналы памяти и NUMA-топологию. В VPS lscpu, numactl и dmidecode показывают только топологию, открытую гипервизором, а физические ядра и каналы RAM хоста по ней определить нельзя. Также запишите ОС и версию ядра.
./llama-cli --version
sha256sum ./models/llama-2-7b.Q4_0.gguf
lscpu
numactl -H
sudo dmidecode --type 17
В публикуемом результате укажите дату. Коммит будет важнее номера релиза: оптимизации CPU и схемы квантования меняются между сборками. Для готового комплекта бинарных файлов сохраните вывод llama-cli --version. На собственном сервере запишите режим масштабирования частоты, в VPS он обычно недоступен для управления.
Развести обработку промпта и генерацию токенов
llama-bench измеряет две разные фазы. pp512 показывает обработку входа из 512 токенов. Здесь вычисления идут пакетами, поэтому сильнее влияют векторные инструкции, число ядер и размер batch. tg128 измеряет последовательную генерацию 128 токенов. На каждом шаге рантайм снова читает веса, и ограничением часто становится пропускная способность памяти.
Поэтому скорость инференса 7B на процессоре нельзя сводить к одному числу. Короткий вопрос может быстро пройти prefill, а затем медленно выводить ответ. В RAG-сервисе с большим найденным контекстом, наоборот, время до первого токена определяет обработка промпта.
Результаты нужно записывать раздельно: длина входа и pp в tokens/s; длина ответа и tg в tokens/s. Среднее двух фаз ничего не говорит ни о задержке первого токена, ни о темпе выдачи. Для заполненного KV-кэша укажите его глубину. В официальной документации к llama-bench уточняется, что тест не учитывает токенизацию и сэмплирование, поэтому его вывод не равен задержке HTTP-запроса.
Проверить, помещаются ли веса и KV-кэш без swap
Оценка памяти начинается с фактического размера GGUF. В публичном наборе Llama 2 7B файл Q4_0 занимает 3,56 ГиБ, Q8_0 – 6,67 ГиБ, F16 – 12,55 ГиБ. К весам добавляются KV-кэш, вычислительные буферы, отображённые страницы и память процесса сервера.
KV-кэш растёт вместе с контекстом и числом слотов, также объём зависит и от числа KV-голов. Поэтому единого требования к RAM для всех 7B-моделей нет. 8 ГиБ хватит не каждой Q4-сборке. Для одной Q4- или Q8-модели с умеренным контекстом обычно выбирают 16 ГиБ, для длинного контекста или нескольких слотов – 32 ГиБ.
Как квантование и пропускная способность RAM влияют на скорость?
Квантование уменьшает вес файла и объём чтения из памяти, поэтому генерация часто ускоряется. При декодировании предел задаёт не заявленная частота CPU, а доступная пропускная способность RAM и эффективность ядра квантования. Меньший файл не гарантирует прирост, если для его формата нет подходящей оптимизации.
В llama.cpp токены в секунду сопоставимы только между прогонами без swap. Во время теста проверяйте RSS и si/so в vmstat. Часть RAM оставьте ОС и процессу, который обслуживает запросы.
Получить повторяемый CPU-бенчмарк вместо одного удачного запуска
Закройте фоновые задачи и прогрейте модель. На сервере не нужно менять режим управления частотой и лимит мощности. В VPS записывайте частоту и %steal. Используйте один список CPU. Задайте -ngl 0, чтобы исключить GPU.
lscpu -e=CPU,CORE,SOCKET,NODE,ONLINE
# Пример: по одному CPU на ядро; замените список по выводу lscpu
CPU_LIST=0,2,4,6,8,10,12,14,16,18,20,22
vmstat 1 > vmstat-2026-08-11.log &
VMSTAT_PID=$!
/usr/bin/time -v taskset -c "$CPU_LIST" ./llama-bench \
-m ./models/llama-2-7b.Q4_0.gguf \
-ngl 0 -p 512 -n 128 -t 4,8,12 \
-r 10 -o json > llama-bench-2026-08-11.json \
2> llama-bench-resource-2026-08-11.txt
kill "$VMSTAT_PID"
Команда строит матрицу для трёх значений -t: каждый вариант повторяется десять раз. JSON хранит среднее, разброс и samples_ts. В отчёте приведите медиану и диапазон, а исходный файл сохраните. Для p95 требуется больше повторов. На сервере с известной топологией сначала оставьте по одному CPU на ядро, затем добавьте SMT-потоки. В VPS сравнивайте наборы vCPU: сколько за ними физических ядер, изнутри не видно.
Не начинайте следующую серию сразу после троттлинга. Записывайте температуру, частоту, загрузку соседних процессов и время теста, а в VPS добавьте %steal. Производительность 7B Q4 на перегретом устройстве и на сервере с тем же числом ядер может заметно различаться.
Сравнить компромисс размера, скорости и качества
Сравнивайте квантования одной модели, собранные из одного исходного чекпойнта. В опубликованном CPU-тесте Llama 2 7B использовался Surface Laptop 7 с 12-ядерным Snapdragon X Elite. Платформа поддерживает восемь каналов LPDDR5x-8448 с заявленной пропускной способностью 135 ГБ/с.
Фрагмент исходного вывода:
model size backend threads test t/s
llama 7B Q8_0 6.67 GiB CPU 12 pp512 63.51 ± 4.94
llama 7B Q8_0 6.67 GiB CPU 12 tg128 12.65 ± 0.41
llama 7B Q4_0 3.56 GiB CPU 12 pp512 66.63 ± 3.90
llama 7B Q4_0 3.56 GiB CPU 12 tg128 20.72 ± 0.54
build: cddae48 (3646)
Результат опубликовал Andreas Kunar в 2024 году. Стенд: 15-дюймовый Surface Laptop 7, Snapdragon X Elite, 12 ядер без SMT, llama.cpp cddae48 (3646). Дата прогона, объём RAM и отдельные повторы не указаны. На этом стенде Q4 почти вдвое уменьшил файл и ускорил генерацию, но мало изменил обработку промпта.
Бенчмарк LLM на CPU не измеряет качество ответов. Q4 нельзя считать лучше Q8 только по скорости: допустимые потери определяет прикладная проверка.
Найти насыщение физических ядер и памяти
На сервере с известной топологией увеличивайте -t от половины физических ядер до их полного числа, а SMT проверяйте отдельной серией. В VPS используйте ступени до числа доступных vCPU. На x86 с P- и E-ядрами или несколькими NUMA-узлами перечислите выбранные CPU и не смешивайте разные наборы в одной серии.
Какие настройки нужны для сопоставимого бенчмарка?
1. Зафиксируйте GGUF-файл, коммит рантайма, CPU, RAM, ОС и режим питания.
2. Не меняйте число слоёв на GPU, длину промпта и генерации, размер контекста, batch, число повторов и привязку CPU.
3. Проведите прогрев, сохраните JSON каждого прогона и сопоставляйте медиану с разбросом.
После добавления потоков pp может расти, когда tg уже упёрся в память. Логические процессоры не удваивают пропускную способность и могут усилить конкуренцию за кэш. По RSS определите, сколько RAM нужно модели 7B при выбранном контексте и числе слотов. Здесь нужно ориентироваться на фазу, важную для сервиса.
Проверить контекст, шаблон чата и режим выдачи
Синтетические pp512 и tg128 удобны для сравнения железа, но далеки от реального диалога. Возьмите типичный системный промпт и запрос, задайте характерную длину ответа. Зафиксируйте шаблон чата из GGUF, число слотов, batch, размер контекста и параметры сэмплирования. Записывайте фактическое число входных и выходных токенов.
Влияние заполненного контекста проверяйте через -d: параметр предварительно заполняет KV-кэш перед pp/tg. Серия -d 0,2048,8192 покажет, как глубина истории влияет на генерацию. Для сервера отдельно измерьте TTFT, межтокенную задержку и полное время запроса.
./llama-bench -m ./models/model-Q4_K_M.gguf \
-ngl 0 -p 512 -n 128 -d 0,2048,8192 \
-t 12 -r 10 -o json > context-depth.json
Использовать нужно тот же бинарный файл. На x86 сборка может задействовать AVX2, AVX-512 или AMX, на ARM – NEON и I8MM. Флаг в lscpu не подтверждает, что инструкция задействована. Не меняйте temperature, top_p и seed. Фиксируйте состояние кэша общего префикса: он сокращает повторный prefill.
Перевести результаты в диапазон и критерий пригодности
Скорость генерации оценивайте вместе с TTFT. Для интерактивного помощника одному пользователю обычно хватает 15–25 токенов/с, но длинный prefill задержит первый токен. В пакетной задаче важнее общая пропускная способность. В офлайн-обработке допустимы и единицы токенов/с, если соблюдены бюджет и срок.
До теста задайте критерии. Например, медиана tg не ниже 15 токенов/с, p95 TTFT не выше 3 секунд при промпте на 1000 токенов. Свопинга нет, одновременно обрабатывается один запрос. Результаты другого стенда даже с той же версией llama.cpp подойдут только для предварительного выбора CPU и RAM.
Если pp растёт с потоками, а tg почти остановился, ограничением, скорее всего, стала память. Если обе фазы проседают с частотой, проверьте питание и температуру. В VPS записывайте %steal: его колебания объясняют часть разброса.
Решение о развёртывании принимайте по замерам на своей модели и типичном запросе: отдельно для prefill, генерации и времени до первого токена. Для сервиса проверьте параллельные запросы: однопользовательский тест не покажет суммарную пропускную способность. Сохраните команду, параметры стенда и JSON, чтобы повторить сравнение после обновления рантайма. У формулировки 7B-модель на CPU: токены в секунду нет универсального ответа: значение имеет смысл только вместе с диапазоном, условиями теста и ограничениями.
Реклама. ООО «Аеза Групп», ИНН: 7813654490. erid: 2Ranym7Qwwy