Зачем это вообще нужно в 2026 году?
Ещё год назад запуск Llama 3 70B на CPU казался безумием. Сегодня это норма. Почему? Потому что модели стали эффективнее, а llama.cpp научился выжимать из оперативки всё до последнего байта. GPU теперь не обязательны - они просто быстрее. Но если скорость не критична, а бюджет ограничен, CPU-only инференс спасает ситуацию.
Представьте: у вас есть старый сервер Dell T7910 с 256GB RAM или просто ноутбук с 32GB оперативки. GPU нет или они слабые. Можно ли запустить Mistral-Nemo 12B? Qwen2.5-32B? DeepSeek Coder 33B? Да. И это будет работать. Медленно? Иногда. Но работать будет.
Важно: на февраль 2026 года llama.cpp достиг версии v4.0.0 с поддержкой AVX-512 VNNI и новых инструкций Intel APX. Если у вас процессор моложе 2024 года - вы в выигрыше.
Проблема: оперативка кончилась раньше, чем началось
Самая частая ошибка - пытаться запихнуть 32B модель в 16GB RAM. Не выйдет. Даже с квантованием Q4_K_M. Почему? Потому что кроме весов модели есть контекст, кэш, временные буферы. Формула простая:
| Модель | Параметры | Q4_K_M RAM | Q2_K RAM | Минимальный контекст |
|---|---|---|---|---|
| Qwen2.5-7B | 7B | ~5GB | ~3GB | 16GB |
| Mistral-Nemo 12B | 12B | ~8GB | ~5GB | 24GB |
| DeepSeek Coder 33B | 33B | ~22GB | ~14GB | 48GB |
| Llama 3.2 70B | 70B | ~45GB | ~28GB | 96GB |
"Минимальный контекст" - это RAM, которую система не отдаст под своп. Если у вас 32GB RAM и вы запускаете модель на 22GB, остаётся 10GB на ОС, кэш контекста и буферы. При контексте в 4096 токенов этого хватит. При 8192 - уже нет.
Решение: не железо, а настройки
Можно купить ещё оперативки. Но если нельзя - настраиваем то, что есть. Вся магия в трёх местах: квантование модели, настройка llama.cpp и оптимизация операционной системы.
1 Выбор модели и квантования
На февраль 2026 года актуальны следующие комбинации:
- Для 16GB RAM: Qwen2.5-7B IQ4_XS или Mistral 7B Q4_K_M. IQ4_XS - новый формат квантования в llama.cpp v4, даёт почти точность Q4_K_M при размере Q3_K_S.
- Для 32GB RAM: Qwen2.5-32B IQ3_XS или DeepSeek Coder 33B Q4_K_M. Здесь уже придётся выбирать между качеством кода (DeepSeek) и общими задачами (Qwen).
- Для 64GB+ RAM: Llama 3.2 70B Q4_K_M или новый Goliath 120B Q2_K. Да, 120B модель на CPU. Медленно? Очень. Но работает.
2 Сборка llama.cpp под ваше железо
Не берите готовые бинарники. Собирайте сами. Разница в скорости может достигать 40%.
# Клонируем репозиторий с актуальными изменениями на 10.02.2026
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
# Для современных Intel (12+ поколение) с AVX-512 VNNI
make LLAMA_AVX512VNNI=1 LLAMA_CUBLAS=0 -j$(nproc)
# Для AMD Zen 4/5 с AVX-512
make LLAMA_AVX512=1 LLAMA_F16C=1 -j$(nproc)
# Для старых CPU без AVX-512
make LLAMA_AVX2=1 LLAMA_FMA=1 -j$(nproc)
Ключевые флаги:
- LLAMA_AVX512VNNI - для Intel Ice Lake и новее. Ускоряет инференс на 15-25%.
- LLAMA_AVX512_BF16 - если ваш CPU поддерживает bfloat16 (Intel Sapphire Rapids, AMD Zen 4). Ещё +10%.
- LLAMA_BLAS=1 - включает OpenBLAS. Бесполезно для большинства, но на серверных процессорах с большим количеством ядер даёт прирост.
- LLAMA_CUBLAS=0 - ВЫКЛЮЧИТЬ CUDA. Важно: если вы собираете для CPU, CUDA только замедлит запуск.
3 Настройка параметров запуска
Вот команда, которую копируют все. И она почти всегда неоптимальна:
# КАК НЕ НАДО ДЕЛАТЬ
./main -m models/qwen2.5-32b-q4_k_m.gguf -p "Hello" -n 512 -t 16 -c 2048
Проблемы? -t 16 использует 16 потоков. На 8-ядерном процессоре это создаст contention. -c 2048 ограничивает контекст, но не оптимизирует память.
Правильная команда для 32B модели на 16-ядерном процессоре:
./main -m models/qwen2.5-32b-iq3_xs.gguf \
-p "Напиши код на Python для парсинга JSON" \
-n 1024 \
-t 12 \
-c 4096 \
--mlock \
--no-mmap \
--repeat-penalty 1.1 \
--top-k 40 \
--top-p 0.95 \
--temp 0.7 \
-ngl 0 \
--threads-batch 4
Что здесь важно:
- -t 12 на 16-ядерном процессоре: оставляем 4 ядра системе, избегаем гипертрединг contention.
- --mlock и --no-mmap: фиксируем модель в RAM, предотвращаем своппинг. Если RAM мало - не используйте, будет OOM.
- -ngl 0: ВСЕГДА 0 для CPU-only. Даже если у вас есть слабая GPU, не смешивайте.
- --threads-batch 4: количество потоков для обработки батча. Для больших моделей уменьшайте до 2-4.
Оптимизация операционной системы
Ubuntu 24.04 LTS или Fedora 40. Почему? Потому что ядра 6.8+ имеют оптимизации под большие непрерывные аллокации памяти. Windows? Можно. Но будет на 10-15% медленнее из-за overhead менеджера памяти.
Настройки sysctl для Linux (добавьте в /etc/sysctl.conf):
# Увеличиваем размер shm для больших моделей
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
# Уменьшаем swappiness - система реже будет уходить в своп
vm.swappiness = 1
# Увеличиваем лимиты памяти для процессов
vm.overcommit_memory = 1
vm.overcommit_ratio = 100
# Оптимизация для многоядерных систем
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
После изменений:
sudo sysctl -p
Реальные цифры: чего ожидать
Тесты на процессоре AMD Ryzen 9 7950X (16 ядер, 32 потока, 64GB DDR5-6000):
| Модель | Квантование | Потребление RAM | Скорость (токенов/с) | Контекст 4096 |
|---|---|---|---|---|
| Qwen2.5-7B | IQ4_XS | 4.8GB | 18-22 т/с | Да |
| Mistral-Nemo 12B | Q4_K_M | 8.2GB | 12-15 т/с | Да |
| DeepSeek Coder 33B | Q4_K_M | 22.5GB | 5-7 т/с | Ограниченно |
| Llama 3.2 70B | Q4_K_M | 45GB | 2-3 т/с | Нет |
"Контекст 4096" означает, что модель может работать с полным контекстом в 4096 токенов без своппинга. Для 70B модели на 64GB RAM это уже проблема - остаётся всего 19GB на кэш.
Типичные ошибки и как их избежать
Ошибка 1: Запуск с --mlock при недостатке RAM. Результат - OOM killer убивает процесс. Решение: сначала запустите без --mlock, посмотрите потребление, потом решайте.
Ошибка 2: Слишком много потоков. Если указать -t 32 на 16-ядерном процессоре, производительность упадёт на 20-30% из-за contention. Решение: используйте nproc чтобы узнать реальное количество ядер: -t $(( $(nproc) - 2 ))
Ошибка 3: Смешивание CPU и GPU. -ngl 1 на слабой GPU (например, GTX 1650) замедлит инференс, потому что данные будут постоянно копироваться между RAM и VRAM. Решение: или только CPU, или только GPU.
Когда CPU-only имеет смысл?
1. Серверное железо с кучей RAM. У вас есть старый сервер Dell PowerEdge с 256GB DDR4? Это идеально для CPU-only инференса. Процессоры Xeon могут не быть быстрыми, но у них много каналов памяти. Как в статье про Epyc 9175F для CPU-инференса - иногда CPU выигрывает у GPU просто объёмом RAM.
2. Ноутбук без дискретной графики. Современные Intel Core Ultra и AMD Ryzen 7040/8040 имеют мощные iGPU, но для LLM они бесполезны. Зато у них быстрая DDR5 память. Запускайте 7B-13B модели без проблем.
3. Разработка и тестирование. Не нужно разворачивать GPU ферму для проверки, работает ли ваша prompt engineering. Запустили на CPU, проверили, отправили на GPU кластер.
4. Бюджетные решения. Одна хорошая GPU стоит как целый сервер с 128GB RAM. Если скорость не критична, а обрабатывать нужно много запросов параллельно - CPU дешевле.
Что дальше? Будущее CPU инференса
На 2026 год уже видны тренды:
- Специализированные инструкции - Intel APX и AMD Zen 5 принесут новые оптимизации для 4-битных операций.
- Квантование IQ2_XXS - обещают 2-битное квантование с минимальной потерей качества. 70B модель в 16GB RAM? Возможно.
- Оптимизация под большие контексты - сейчас контекст в 128K токенов на CPU почти невозможен. В llama.cpp v5 обещают оптимизации sliding window для CPU.
- HBM память на CPU - Intel Xeon Max Series с HBM уже есть. 64GB быстрой памяти рядом с ядрами изменят правила игры.
Мой прогноз: к концу 2026 года мы увидим 13B модели, работающие на CPU со скоростью 30+ токенов в секунду при потреблении менее 10GB RAM. И это будет на среднебюджетном ноутбуке.
Чеклист для запуска
- Проверьте свободную RAM:
free -h. Нужно минимум на 30% больше, чем размер модели. - Выберите модель по размеру: для 16GB RAM - до 7B, для 32GB - до 32B, для 64GB - до 70B.
- Скачайте квантованную версию: предпочтительно IQ4_XS или Q4_K_M.
- Соберите llama.cpp с оптимизациями под ваш CPU.
- Настройте sysctl для уменьшения swappiness.
- Запустите с правильным количеством потоков:
-t $(( $(nproc) - 2 )) - Если RAM мало - не используйте --mlock.
- Для длинных ответов уменьшите --threads-batch до 2-4.
- Мониторьте потребление:
htopилиglances. - Если всё работает - попробуйте увеличить контекст (-c) и проверьте, не начинается ли своппинг.
И последнее: не гонитесь за размером модели. Часто 7B модель с хорошим prompting даёт результат лучше, чем 70B модель с плохим. Особенно если 70B работает на грани своппинга и выдает 1 токен в секунду.