Запуск больших LLM на CPU: гайд по инференсу на старом серверном железе | AiManual
AiManual Logo Ai / Manual.
29 Дек 2025 Гайд

Как запустить огромные LLM на старом серверном железе: гайд по CPU+RAM инференсу

Подробное руководство по запуску больших языковых моделей на старых серверах с Xeon и большим объемом RAM. CPU инференс, оптимизация, экономия.

Проблема: Дорогие GPU и пылящееся железо

В мире, где каждый второй гайд начинается со слов "возьмите RTX 4090", у многих инженеров и энтузиастов на руках остаются мощные, но устаревшие серверы. Двухпроцессорные системы на Xeon v3/v4, 256-512 ГБ оперативной памяти — такие машины часто списывают или продают за копейки, считая их бесполезными для современных задач ИИ. А между тем, именно они могут стать идеальной платформой для запуска больших языковых моделей (LLM) в режиме CPU-инференса.

Миф: Для работы с LLM обязательно нужны современные GPU. Реальность: Для обучения — да. Для инференса (вывода) — часто нет. Многие модели отлично работают на CPU, особенно если у вас много ядер и огромный объем RAM.

Почему CPU-инференс имеет право на жизнь?

Прежде чем перейти к инструкциям, давайте разберемся, в каких сценариях запуск на CPU не просто возможен, а экономически оправдан:

  • Эксперименты и прототипирование: Не нужно покупать дорогую видеокарту, чтобы понять, подходит ли вам модель.
  • Сервисы с низкой или средней нагрузкой: Внутренние чат-боты, классификация документов, суммаризация — задачи, где задержка в 2-5 секунд приемлема.
  • Полная конфиденциальность: Данные никогда не покидают ваш сервер. Это критично для юриспруденции, медицины, финансов.
  • Использование уже имеющихся ресурсов: Вы amortизуете стоимость старого железа, экономя тысячи долларов на аренде облачных GPU.
💡
Сравните: аренда A100 на 1 месяц ≈ $3000-5000. Старый сервер с Xeon и 256 ГБ RAM можно купить за $500-1000. Разница в производительности для инференса часто не 10x, а 2-5x, что для многих задач вполне допустимо.

Решение: Правильный софт и оптимизации

Ключ к успеху — не просто запустить модель, а сделать это эффективно. Современные фреймворки для CPU-инференса используют:

  1. Квантование: Сокращение точности весов модели с FP16/32 до INT8, INT4 или даже IQ3. Это уменьшает размер модели в 2-4 раза и ускоряет вычисления.
  2. Оптимизации под CPU: Использование инструкций AVX2, AVX-512 (если есть), эффективное распараллеливание на все ядра.
  3. Эффективное управление памятью: Загрузка не всей модели в RAM сразу, а слоев по мере необходимости.

Основные игроки на поле: llama.cpp (лидер), Ollama (удобная обертка), MLC LLM (от TVM). Мы сфокусируемся на llama.cpp как на самом зрелом и производительном решении.

1Подготовка сервера и выбор модели

Начнем с аудита вашего железа. Вам нужно знать:

# Проверяем процессор и ядра
grep -c ^processor /proc/cpuinfo
lscpu | grep -E "(Model name|CPU max MHz|Flags)"

# Проверяем оперативную память
free -h

# Проверяем дисковое пространство (модели весят 4-40 ГБ)
df -h /

Идеальный кандидат: 2x Xeon E5-2690 v4 (28 ядер/56 потоков), 256+ ГБ DDR4, SSD NVMe для хранения моделей.

Выбор модели: Не все модели одинаково хорошо квантуются. Лучше всего подходят:

Модель (размер)Рекомендуемая квант.Примерный RAMСкорость (токен/с)*
Llama 3.1 8BQ4_K_M~6 ГБ15-25
Qwen2.5 7BQ4_K_M~5 ГБ18-30
DeepSeek-V2.5 16B**Q4_K_M~10 ГБ8-15
Mistral Small 22BIQ3_XS~9 ГБ5-10

* На 28 ядрах Xeon v4. ** DeepSeek-V2.5 имеет MoE-архитектуру, что делает её очень эффективной для CPU.

2Установка и сборка llama.cpp с оптимизациями

Не устанавливайте готовые пакеты! Сборка под ваш конкретный CPU даст прирост 20-40%.

# Устанавливаем зависимости
sudo apt update && sudo apt install -y build-essential cmake git

# Клонируем репозиторий (используем последнюю версию)
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp

# Собираем с максимальными оптимизациями
mkdir build && cd build
# Определяем флаги для вашего CPU. Если есть AVX-512:
cmake .. -DCMAKE_BUILD_TYPE=Release -DLLAMA_NATIVE=ON -DLLAMA_AVX512=ON
# Если нет AVX-512, но есть AVX2:
# cmake .. -DCMAKE_BUILD_TYPE=Release -DLLAMA_NATIVE=ON -DLLAMA_AVX2=ON

make -j$(nproc)  # Используем все ядра для сборки

# Проверяем, что бинарник работает
./bin/llama-cli --help

Важно: Флаг -DLLAMA_NATIVE=ON позволяет компилятору использовать все инструкции вашего конкретного процессора. Это критично для старых Xeon, где поддержка инструкций может отличаться даже внутри одного поколения.

3Загрузка и квантование модели

Скачиваем исходную модель (например, с Hugging Face) и конвертируем в формат GGUF с нужным квантованием.

# Устанавливаем Python зависимости (если нужно конвертировать самим)
pip install huggingface-hub

# Скачиваем модель Qwen2.5-7B-Instruct (пример)
python -m huggingface_hub.cli download Qwen/Qwen2.5-7B-Instruct-GGUF --local-dir ./models --include "*.gguf"

# ИЛИ проще: используем готовые GGUF-файлы
# Часто они уже есть в репозиториях типа TheBloke на HF
# Тогда просто качаем нужный файл, например:
# wget https://huggingface.co/TheBloke/Qwen2.5-7B-Instruct-GGUF/resolve/main/qwen2.5-7b-instruct.Q4_K_M.gguf

# Если нужного квантования нет, конвертируем сами (требуется много RAM):
# python ../convert.py ../models/Qwen2.5-7B-Instruct --outtype q4_k_m
# Это создаст файл qwen2.5-7b-instruct-q4_k_m.gguf

Разместите GGUF-файл в удобной директории, например ~/models/.

4Запуск и тонкая настройка параметров

Теперь самое важное — запуск с правильными параметрами. От них зависит и скорость, и качество генерации.

# Базовый запуск интерактивного чата
./bin/llama-cli -m ~/models/qwen2.5-7b-instruct.Q4_K_M.gguf \
  -n 512 \                # Максимальное количество генерируемых токенов
  -t 28 \                 # Количество потоков (обычно = количество физических ядер)
  -c 4096 \               # Размер контекста
  -b 512 \                # Размер batch для prompt processing
  --mlock \               # Закрепить модель в RAM (не выгружать в swap)
  --no-mmap \             # Не использовать mmap (может быть медленнее, но стабильнее)
  -ngl 0 \                # 0 слоев на GPU (полностью CPU)
  --temp 0.7 \            # Температура (креативность)
  --repeat-penalty 1.1    # Штраф за повторения

# Для запуска как сервер (REST API):
./bin/llama-server -m ~/models/qwen2.5-7b-instruct.Q4_K_M.gguf \
  -t 28 -c 4096 --host 0.0.0.0 --port 8080

После запуска сервера API будет доступен на http://ваш-сервер:8080, что позволяет легко интегрировать модель в ваши приложения. Например, вы можете подключить её к IDE и CLI-инструментам для локальной разработки с AI-ассистентом.

5Мониторинг и оптимизация производительности

Запустив модель, проверьте, как она использует ресурсы:

# Смотрим утилизацию CPU (должна быть близка к 100% по всем ядрам во время генерации)
htop

# Смотрим использование памяти
watch -n 1 "free -h"

# Можно использовать perf для глубокого анализа
sudo perf top -p $(pgrep llama-cli)

Ключевые метрики:

  • Tokens/s: Основной показатель скорости. Для 7B модели на 28 ядрах ожидайте 15-30 токенов/с.
  • Memory usage: Должна быть стабильной, без активного использования swap.
  • Time to first token (TTFT): Может быть высоким на CPU (1-3 секунды). Это нормально.

Распространенные ошибки и их решения

ОшибкаПричинаРешение
«Illegal instruction» при запускеБинарник скомпилирован с инструкциями, которых нет на вашем CPUПересобрать llama.cpp без AVX-512 или с -DLLAMA_NATIVE=OFF
Скорость 1-2 токен/сМодель работает в режиме совместимости или используется 1 потокПроверить флаг -t, убедиться что OMP_NUM_THREADS не установлен в 1
Система начинает свопироватьМодель не помещается в RAMВзять более агрессивное квантование (Q3_K_S вместо Q4_K_M) или модель меньше
Качество ответов резко упалоСлишком агрессивное квантованиеПопробовать Q4_K_M или Q5_K_M, проверить prompt template

Продвинутые техники

Когда базовый запуск освоен, можно перейти к оптимизациям:

  1. Использование NUMA: На двухпроцессорных системах привязка процессов к своим банкам памяти может дать +10-15% скорости. Используйте numactl --cpunodebind=0 --membind=0 для тестов.
  2. Смешанный режим (CPU+GPU): Если есть старая видеокарта (даже GTX 1080), можно часть слоев выгрузить на неё: -ngl 20 (20 слоев на GPU).
  3. Оптимизация под конкретную задачу: Для агентных workflow можно уменьшить контекст (-c 2048) и температуру (--temp 0.3) для большей предсказуемости.
  4. Пайплайнинг запросов: llama.cpp поддерживает параллельную обработку нескольких запросов, что увеличивает общую пропускную способность.
💡
Для сложных reasoning-задач, где важна не скорость, а качество рассуждений, CPU-инференс может быть даже предпочтительнее, так как позволяет запускать более крупные модели (например, 32B вместо 7B на том же бюджете). Это перекликается с темой прокачки reasoning у LLM без миллионных бюджетов.

FAQ: Ответы на частые вопросы

❓ Какая максимальная модель поместится в 256 ГБ RAM?

Теоретически, до 70B в квантовании Q4_K_M (~40 ГБ). Практически — лучше остановиться на 32B-40B, оставив память под систему и контекст. Для 128 ГБ — максимум 20B-22B модели.

❓ Можно ли использовать этот подход для генерации изображений (как Stable Diffusion)?

Для диффузионных моделей CPU-инференс менее эффективен, но возможен. Рекомендую посмотреть отдельный гайд по запуску Stable Diffusion на слабом железе, где разбираются похожие принципы экономии ресурсов.

❓ Почему модель иногда «глючит» и выдает бессмыслицу?

Помимо проблем с квантованием, это может быть связано с архитектурными особенностями LLM, которые не всегда четко следуют инструкциям. Попробуйте улучшить prompt engineering.

❓ Есть ли готовые дистрибутивы для Docker?

Да, образы ghcr.io/ggerganov/llama.cpp:server и ollama/ollama. Но для максимальной производительности сборка из исходников предпочтительнее.

Заключение: Экономия vs. Производительность

Запуск LLM на старом серверном железе — это не компромисс, а стратегический выбор. Вы жертвуете скоростью (в 2-5 раз медленнее, чем на современном GPU), но получаете:

  • Экономию в тысячи долларов на оборудовании или облачных сервисах
  • Полный контроль над инфраструктурой и данными
  • Возможность запускать более крупные модели за счет дешевой оперативной памяти
  • Экологичность — повторное использование существующего железа

Начните с 7B-8B модели, отточите пайплайн, поймите реальные потребности в скорости и качестве. Затем, если нужно, масштабируйтесь на более крупные модели. Ваш старый сервер может оказаться золотой жилой для локального ИИ.