A 10 year old Xeon is all you need

02.06.2026 · 5 мин

Как запустить современную нейросеть на сервере десятилетней давности

Запустить Gemma 4 (языковую модель от Google DeepMind с 26 миллиардами параметров) на процессоре Intel Xeon (серверный процессор) образца 2016 года? Звучит как безумная идея из разряда «зачем делать проще, если можно сделать сложнее». Но именно это произошло в блоге point.free — и у них получилось.

Главный результат: модель работает приемлемо для задач без GPU вообще.

Железо и софт: что использовали

Автор статьи взял сервер из техники на помойку современного датацентра:

КОНФИГУРАЦИЯ СЕРВЕРА ДЛЯ INFERENCE (ПРОЦЕССА ГЕНЕРАЦИИ ТЕКСТА)
─────────────────────────────────────────────────────────────────
Процессор    │ Intel Xeon E5-2620 v4 @2.10 ГГц │
             │ 8 ядер / 16 потоков (SMT ───     │
             │ Simultaneous Multithreading)     │
             │ AVX2 (без AVX-512/VNNI/BF16 ──── │
             │ наборы инструкций для ускорения) │
             ├──────────────────────────────────┤
Кэш          │ L3: 20 МБ | L2: ~2 МБ суммарно ──│
             │ быстрая промежуточная память CPU │
             ├──────────────────────────────────┤
Память       │ 128 ГБ DDR3 ─────────────────────│
             │ стандарт оперативной памяти      │
             │ пропускная способность ~50 ГБ/с  │
             ├──────────────────────────────────┤
Видеокарта   │ Нет                               │
             └──────────────────────────────────┘

Для справки: современный ноутбук обычно имеет DDR5 
с пропускной способностью ~300+ ГБ/с — в шесть раз быстрее.
Конфигурация сервера без GPU для запуска Gemma 4

Ключевой момент здесь — нет видеокарты. Ни дискретной, ни интегрированной.

Модель запускали через llama.cpp — библиотеку для эффективного выполнения языковых моделей на CPU и GPU без зависимостей.

Почему это вообще возможно: проблема памяти

Чтобы понять происходящее, нужно уяснить одну вещь о работе больших языковых моделей.

Во время генерации текста модель работает в режиме декодирования — она создаёт токены (слово или его часть — единица текста для модели) по одному за раз. На этом этапе производительность ограничена не вычислительной мощностью процессора, а пропускной способностью памяти.

Процессору приходится постоянно перемещать огромные объёмы весов модели из оперативной памяти в свой кэш для вычислений. Сами вычисления выполняются быстро — процессор большую часть времени просто ждёт данные.

Это называют «стеной памяти» (memory wall) — фундаментальное ограничение: CPU может вычислить всё мгновенно, но тратит время на ожидание данных из RAM.

Как заставить это работать: магия флагов llama.cpp

Наивный запуск через готовые инструменты вроде Ollama на таком железе будет катастрофически медленным — они оптимизированы под типичный сценарий с GPU и не используют все доступные оптимизации для CPU-only окружения.

Автор собрал команду llama-cli с десятками параметров:

llama-cli \
--model gemma-4-26B-A4B-it-Q8_0.gguf \
--model-draft gemma-4-drafter.gguf \
--spec-type mtp --draft-max 3 --draft-p-min 0.0 --spec-autotune \
-cnv --color --jinja --special \
-sm graph -smgs -sas -mea 256 \
--split-mode-f32 \
--temp 0.7 -t 8 --parallel 8 \
--cpu-moe --merge-up-gate-experts \
--flash-attn on --mla-use 3 \
--mlock --run-time-repack --no-kv-offload

Разберём ключевые элементы этой конфигурации.

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

Это одна из самых элегантных техник обхода memory wall в индустрии:

--spec-type mtp --draft-max 3 --draft-p-min 0.0 --spec-autotune

Идея простая: маленькая «черновая» модель (drafter) генерирует несколько токенов вперёд, а большая основная (verifier) проверяет их за один проход вместо генерации по одному токену за раз.

СПЕКУЛЯТИВНОЕ ДЕКОДИРОВАНИЕ vs ОБЫЧНОЕ ДЕКОДИРОВАНИЕ
─────────────────────────────────────────────────────────

ТРАДИЦИОННЫЙ ПОДХОД:
Модель → Токен → Модель → Токен → Модель → Токен...
          ↑ каждый вызов требует чтения всех весов (~26 ГБ)

СПЕКУЛЯТИВНОЕ:
Drafter(крошечный): [токен][токен][токен] ──┐  
                                             ▼  
Verifier(основной):    [проверка всех трёх за один проход]

Выигрыш: drafter целиком помещается в L3-кэш процессора,
а verifier читает веса лишь один раз вместо трёх.
Принцип работы спекулятивного декодирования

На CPU этот подход особенно эффективен потому что вычисления дешевы относительно стоимости перемещения данных по памяти.

MoE и маршрутизация для CPU

Gemma 4 использует архитектуру Mixture-of-Experts (смесь экспертов): из примерно ста двадцати восьми «экспертов» модель активирует только восемь для каждого токена — остальные параметры остаются «спящими».

Параметры модели Gemma-4-A4B:
├── Всего экспертов..........128  
├── Активируется.............8 на токен  
├── Активных параметров......~3.8 млрд  
└── Всего параметров.........~25 млрд  

На GPU это не проблема благодаря быстрой HBM (High-Bandwidth Memory). На CPU с DDR3 постоянное переключение между экспертами вызывает катастрофическое поведение кэша (cache thrashing) — процессор непрерывно выгружает данные и загружает новые из медленной оперативки.

Два флага решают эту проблему:

--cpu-moe               # умная маршрутизация под иерархию CPU-кэша  
--merge-up-gate-experts # объединение двух проекций матриц в одну операцию 

Второй флаг экономит лишние пересылки данных по шине памяти внутри каждого эксперта.

Планирование памяти под конкретное железо

--mlock              # закрепить все данные модели в RAM (никакого swap!)
--run-time-repack    # переупорядочить тензоры под layout кэша процессора 

Параметр `--mlock` предотвращает выгрузку модели на диск операционной системой при нехватке памяти — событие катастрофическое для inference: скорость упадёт до нуля при попытке прочитать обратно двадцать семь гигабайт с жёсткого диска.

Флаг `--run-time-repack` тратит несколько секунд при запуске на физическую реорганизацию матриц весов так, чтобы CPU мог потреблять их максимально эффективно через свой кэш.

При неправильной конфигурации системы можно увидеть ошибку:

warning: failed to mlock buffer (27 ГБ): Cannot allocate memory  
Try increasing RLIMIT_MEMLOCK ('ulimit -l' as root)

Это не проблема модели — просто системный лимит mlock слишком мал для такой памяти (по умолчанию обычно шестьдесят четыре мегабайта).

Ограничения и что можно улучшить

Даже с агрессивными оптимизациями железо остаётся узким местом:

Параметр Значение Проблема
пропускная способность RAM ~50 ГБ/с В шесть раз меньше DDR5
количество ядер всего восемь Не хватает для параллелизма
нет AVX-512/VNNI/BF16 старый набор инструкций Некоторые оптимизации недоступны

Автор отмечает что статья оборвалась на части про graph layout — судя по всему там были дополнительные оптимизации графа вычислений под конкретную архитектуру процессора без GPU Turbo Boost и других современных фичей энергосбережения.

Выводы

Запуск Gemma 4 (~27 ГБ) целиком в RAM без GPU звучит как демонстрация «делайте дома», но автор сделал это рабочим решением:

• Программные оптимизации часто важнее железа; правильная конфигурация софта компенсирует возраст оборудования.

• Спекулятивное декодирование особенно ценно именно когда memory bandwidth критична.

• Стандартные инструменты скрывают нюансы; нужен явный контроль над всеми параметрами inference.

• Llama.cpp остаётся лучшим выбором для полной прозрачности и доступа ко всем возможностям движка.

Такие эксперименты показывают, что старое серверное оборудование ещё долго будет полезным ресурсом для локальных NLP-задач (конфиденциальность, отсутствие зависимости от облачных API).

Если интересно попробовать самостоятельно даже скромный ноутбук позволит запустить компактные модели через Llama.cpp; документация проекта отлично написана и проведёт вас от установки до первого результата буквально за минуты; а если хочется погрузиться глубже обратите внимание на оригинальную статью point.free где автор подробно описал всю математику speculative decoding; удачного экспериментирования!

Ссылки

Дмитрий Полухин — продуктовый дизайнер. Пишу про разработку, AI и дизайн интерфейсов. Обо мне, контакты и профили.