Человек с шестнадцатиядерным процессором и человек с шестиядерным запускают одну и ту же модель и получают почти одинаковую скорость. Первый уверен, что что-то настроил неправильно, и начинает крутить число потоков. Ничего не меняется.
Ничего и не изменится, потому что число ядер здесь почти ни при чём.
#Короткий ответ
Скорость генерации на процессоре ограничена пропускной способностью оперативной памяти. Чтобы выдать один токен, движок должен прочитать все веса модели. Модель на 4,7 ГБ при памяти, отдающей 51 ГБ/с, физически не может генерировать быстрее 11 токенов в секунду — сколько бы ядер ни считало.
Ядра при этом не бесполезны: они определяют скорость обработки запроса, то есть время до первого токена. Это вторая, независимая величина, и она ограничена вычислениями, а не памятью.
Отсюда правило: хотите быстрее генерацию — быстрее память. Хотите быстрее реакцию на длинный запрос — больше вычислительной мощности.
#Как это устроено
Генерация текста языковой моделью на процессоре — это две принципиально разные фазы.
Фаза первая: обработка промпта. Весь ваш запрос прогоняется через модель разом, токены обрабатываются параллельно. Это операции с матрицами, где на каждый прочитанный байт весов приходится много арифметики. Такая нагрузка упирается в вычисления, и здесь число ядер и наличие набора инструкций AVX2/AVX-512 действительно решают.
Фаза вторая: генерация. Токены выдаются по одному, и каждый требует полного прохода по всем весам. Арифметики на прочитанный байт мало — процессор большую часть времени ждёт данные из памяти. Это память-ограниченная задача, и добавление ядер не помогает: они простаивают одинаково.
Отсюда формула теоретического потолка:
потолок ток/с = пропускная способность памяти (ГБ/с) ÷ размер модели в памяти (ГБ)
Пропускная способность считается по формуле: частота (МТ/с) × 8 байт × число каналов.
| Конфигурация | Пропускная способность |
|---|---|
| DDR4-2666, один канал | ~21 ГБ/с |
| DDR4-3200, один канал | ~26 ГБ/с |
| DDR4-3200, два канала | ~51 ГБ/с |
| DDR5-4800, два канала | ~77 ГБ/с |
| DDR5-5600, два канала | ~90 ГБ/с |
| DDR5-6000, четыре канала | ~192 ГБ/с |
Реально достигается 40–60% от расчётного значения. Разрыв объясняется промахами кэша, накладными расходами и тем, что память обслуживает не только модель.
Проверить свою конфигурацию:
Get-CimInstance Win32_PhysicalMemory | Select-Object Capacity, Speed, BankLabel
На Linux:
sudo lshw -short -C memory
sudo dmidecode -t memory | grep -E "Speed|Locator|Size"
Смотреть надо на две вещи: частоту и число занятых слотов. Одна планка вместо двух — это ровно вдвое меньшая пропускная способность и ровно вдвое меньшая скорость генерации.
#Что из этого следует на практике
Двухканальный режим — самый дешёвый апгрейд. Если в системе одна планка, вторая такого же объёма удваивает скорость генерации. Никакая настройка софта такого эффекта не даст.
Число потоков подбирается, а не максимизируется. Оптимум обычно равен числу физических ядер. Гиперпоточность в память-ограниченной задаче чаще мешает: логические потоки конкурируют за одни и те же линии памяти. Проверьте оба варианта замером:
llama-bench -m models/qwen2.5-3b-instruct-q4_k_m.gguf -ngl 0 -t 4,6,8,12 -p 128 -n 128
Утилита прогонит все указанные значения -t и выдаст таблицу. Обычно кривая растёт до числа физических ядер и дальше идёт вниз.
Квантизация ускоряет пропорционально. Модель вдвое меньшего размера читается вдвое быстрее. Переход с Q8 на Q4 почти удваивает скорость на процессоре — это единственный случай, когда квантизация даёт выигрыш в скорости, сопоставимый с выигрышем в памяти.
Разгон памяти работает, разгон процессора почти нет. Повышение частоты памяти на 20% даёт около 20% скорости генерации. Повышение частоты процессора на те же 20% даёт единицы процентов.
Замерять надо обе фазы отдельно. llama-bench выдаёт pp (обработка промпта) и tg (генерация) раздельно именно поэтому. Сравнивать конфигурации по одному усреднённому числу бессмысленно. Методику разбирает материал о том, как измерить скорость локальной модели правильно.
#Где интуиция подводит
«Больше ядер — быстрее модель». Только для обработки запроса. Генерация от числа ядер почти не зависит, и после четырёх-шести ядер прирост становится статистической погрешностью. Серверный процессор на 64 ядра с двухканальной памятью проиграет настольному на 8 ядер с четырёхканальной.
«Процессор не загружен на 100%, значит есть запас». Наоборот: это признак того, что процессор ждёт память. Ровно так выглядит память-ограниченная задача. Увеличение числа потоков в такой ситуации ухудшает результат.
«На CPU можно запустить большую модель, просто медленнее». Формально да, практически — «медленнее» означает переход через порог применимости. Модель 14B на типичной домашней памяти даёт 2–3 токена в секунду, то есть ответ на полстраницы занимает несколько минут. Что реально работает на машине без видеокарты, разбирает материал о запуске LLM на ноутбуке без видеокарты.
«Частичная выгрузка на видеокарту решает проблему наполовину». Не наполовину. Если хотя бы часть слоёв осталась на процессоре, каждый токен всё равно ждёт их чтения из оперативной памяти. Зависимость нелинейная, и её разбирает статья о выгрузке слоёв в оперативную память.
«Медленно — значит, слабое железо». Не обязательно. Прежде чем менять компьютер, стоит пройти диагностику: часто дело в одноканальной памяти, слишком большом контексте или неудачном числе потоков. Порядок проверки — в материале о том, почему локальная модель тормозит.
#Частые вопросы
#Сколько потоков ставить для LLM на процессоре?
Начните с числа физических ядер, не логических. Затем прогоните замер с несколькими значениями и возьмите лучшее. На большинстве настольных процессоров оптимум лежит между четырьмя и восемью, дальше кривая идёт вниз.
#Имеет ли значение поколение процессора?
Имеет для обработки запроса: поддержка AVX2 обязательна для приемлемой скорости, AVX-512 даёт дополнительный выигрыш там, где он есть. На скорость генерации поколение влияет косвенно — через то, какую память процессор поддерживает.
#Что даст переход с DDR4 на DDR5?
Примерно 1,7–1,8 раза по скорости генерации при переходе с DDR4-3200 на DDR5-5600 в двухканальном режиме. Это самый крупный выигрыш, доступный без покупки видеокарты, — и он же требует смены платформы целиком.
#Почему сервер с большим числом ядер работает не быстрее ноутбука?
Потому что ограничение общее — пропускная способность памяти на канал. Многоядерные серверные платформы выигрывают, когда у них четыре, шесть или восемь каналов памяти; при двух каналах десятки ядер простаивают в ожидании данных.
#Стоит ли включать в BIOS профиль разгона памяти?
Для этой задачи — да, эффект прямой и предсказуемый: скорость генерации растёт примерно пропорционально частоте памяти. Ограничения обычные: стабильность системы нужно проверить, а на ноутбуках такой настройки чаще всего просто нет.
#Как понять, упёрся я в память или в вычисления?
По соотношению двух чисел из замера. Если скорость генерации близка к расчётному потолку из формулы, вы упёрлись в память, и настройками это не лечится. Если она заметно ниже потолка, дело в конфигурации — числе потоков, размере контекста или конкуренции за процессор. Что считать нормальной скоростью вообще — в материале о том, сколько токенов в секунду это нормально.