Форк llama.cpp уместил DeepSeek-V4-Flash в 64 ГБ ОЗУ без видеокарты

Открытый проект llama-modchip сжал 284-миллиардную MoE-модель до 1,72 бита на вес и запускает её на процессоре с 64 ГБ памяти.

Обложка: Форк llama.cpp уместил DeepSeek-V4-Flash в 64 ГБ ОЗУ без видеокарты

Открытый проект llama-modchip под лицензией Apache 2.0 запускает DeepSeek-V4-Flash на 284 млрд параметров на обычном компьютере с 64 ГБ оперативной памяти и без видеокарты. По замерам авторов, модель в их кванте занимает 56,9 ГиБ и на 16-ядерном Ryzen 9 9955HX генерирует 8,66 токена в секунду. 13 ноября вышли релиз 2.5.3, в котором веса для 284B пересобраны напрямую из оригинального чекпоинта DeepSeek, а в бинарниках закрыта небезопасная работа с временными файлами, и релиз 2.5.4 с исправлениями бенчмарка, чата и сборки под Windows.

Для программиста это означает, что MoE-модель на 284 млрд параметров можно держать локально на рабочей станции или мини-сервере за цену 64 ГБ DDR5, без аренды GPU и без отправки кода во внешний API. Плата за это — сильное сжатие: в среднем 1,72 бита на вес и заметная просадка качества относительно эталона, которую авторы сами показывают в таблицах. Скорость около 9 токенов в секунду подходит для фоновых задач и агентов, которым не нужен быстрый отклик, но не для интерактивного автокомплита.

Ключевые выводы
  • DeepSeek-V4-Flash-0731 (284 млрд параметров, 13 млрд активных) в кванте MaxQ-Fractal весит 56,93 ГиБ и занимает 57,5–58,1 ГиБ ОЗУ при контексте 32 тыс. токенов.
  • По замерам авторов на Ryzen 9 9955HX с двухканальной DDR5: генерация 8,66 токена в секунду, обработка промпта 36–44 токена в секунду.
  • Пользователи подтвердили порядок скоростей: 6,35 токена в секунду на Ryzen 7 9800X3D и 8,11 на Ryzen 9 9950X3D, 27 токенов в секунду на Apple M5 Max, где часть модели работает на GPU через Metal.
  • Перплексия на тесте wiki-alt выше эталона MXFP4 на 60,8%, на собственном функциональном тесте модель набирает 70 из 80 баллов.
  • Кванты читает только движок llama-modchip: обычные llama.cpp, Ollama, vLLM и LM Studio их не загрузят.

Как 284 млрд параметров помещаются в 57 ГиБ

DeepSeek-V4-Flash — MoE-модель: на каждый токен в каждом слое работают 6 из 256 маршрутизируемых экспертов плюс один общий, поэтому активных параметров около 13 млрд, но в памяти должны лежать все 284 млрд. Генерация на процессоре упирается в пропускную способность памяти: на каждый токен нужно прочитать веса активных экспертов. Чем меньше бит на вес, тем меньше байт уходит по шине и тем больше модели помещается в ОЗУ.

llama-modchip — набор патчей к llama.cpp с двумя собственными форматами квантования блоками по 64 веса. Fractal-64 тратит 3,75 бита на вес, LUT-VQ3-64 — 3 бита: это векторный квантователь, который кодирует тройки весов индексом в таблице из 128 точек, а таблица целиком помещается в шести 512-битных регистрах AVX-512 и раскодируется инструкцией VPERMI2B без обращений к кэшу. По замерам авторов на весах экспертов Nemotron, Fractal-64 даёт отношение сигнал/шум 17,75 дБ против 16,30 дБ у стандартного Q3_K, а LUT-VQ3-64 — 13,57 дБ против 10,15 дБ у Q2_K.

Важная деталь, которую легко пропустить в README: форматы на 3–3,75 бита применяются к вниманию (MLA), индексатору и части общих экспертов. Основная масса весов, маршрутизируемые эксперты, сжата сильнее, и в среднем модель весит 1,72 бита на вес. В квант MaxQ-Fractal входят 174 плотных тензора в Q6_K и Q8_0, 317 тензоров внимания в Fractal-64 и 129 тензоров экспертов, квантованных с матрицей важности, которую опубликовал Сальваторе Санфилиппо, автор Redis. В пользовательском отчёте llama-bench определяет основной тип весов этого кванта как IQ1_S, 1,56 бита на вес.

Форк llama.cpp уместил DeepSeek-V4-Flash в 64 ГБ ОЗУ без видеокарты_7
Генерация одного запроса без спекулятивного декодинга, все 6 экспертов на слой. Кванты различаются: MaxQ-Fractal у авторов, Abliterated-Fractal и Fractal у пользователей. Источник данных: README и issues llama-modchip; график Tproger

Насколько быстро модель работает на процессоре?

Основной замер авторов сделан на ноутбучном Ryzen 9 9955HX (16 ядер Zen 5) с 64 ГБ двухканальной DDR5-5600, около 75 ГБ/с на чтение. Генерация одного запроса без спекулятивного декодинга со всеми шестью экспертами на слой — 8,66 токена в секунду. Обработка промпта с холодного старта — 36,1–37,6 токена в секунду, с прогретым префиксом — 44. По нашей оценке, промпт на 10 тыс. токенов при такой скорости обрабатывается не меньше четырёх минут, поэтому для агентов авторы кэшируют префикс системного промпта в /dev/shm и восстанавливают его за 10–30 мс.

Если урезать маршрутизацию до четырёх экспертов на слой (первые три слоя сохраняют шесть) и включить дополнительную оптимизацию SwiGLU, генерация на кванте Fractal вырастает до 10,1–10,7 токена в секунду ценой отклонения от исходного распределения: по замеру авторов, KL-дивергенция до 0,07 нат на токен. Режим включается вручную и сбрасывается при перезапуске сервера.

Независимые цифры есть в issues репозитория. Пользователь с Ryzen 7 9800X3D и 64 ГБ под Windows 11 получил 6,35 токена в секунду со всеми экспертами и 8,04 с четырьмя, обработку промпта 21–22 токена в секунду; запуск с контекстом в 1 млн токенов прошёл. На Ryzen 9 9950X3D со 128 ГБ — 8,11 токена в секунду генерации и 27,55 обработки. На Apple M5 Max с 64 ГБ, где модель работает на GPU и CPU вместе, llama-bench показал 27 токенов в секунду, а реальная генерация через llama-server — 20,7–23,6: там большая часть модели работает на Metal, а пять слоёв экспертов остаются на CPU.

Что даёт спекулятивный драфтер

Вместо отдельной маленькой модели-черновика llama-modchip угадывает следующие токены статистическим драфтером Stockfish-PVS: таблицы продолжений в духе шахматных движков (хеши Зобриста, поиск главного варианта) обновляются на текущем диалоге и умещаются в кэш процессора. Лучше всего это работает на повторяющемся тексте: правке кода, вызовах инструментов, JSON.

Для 284B выигрыш скромный. В сквозном тесте авторов средняя скорость с драфтером — 8,80 токена в секунду при 78,7% принятых черновых токенов, короткие всплески на правке кода и вызовах инструментов — 11–21 токен в секунду, а на варианте VQ3 — до 25,3. Цифру «до 25,3 токена в секунду» из описания репозитория стоит читать именно так: это пики на предсказуемом тексте, а не средняя скорость. На Nemotron-3.5-30B-A3B тот же механизм даёт авторам пиковые 60 токенов в секунду на рефакторинге.

Чем приходится платить за размер

Авторы публикуют перплексию на открытом корпусе wiki-alt от AtomicChat с контекстом 5632 токена. У MaxQ-Fractal она 7,30 против 4,54 у эталонного кванта MXFP4 (150,8 ГиБ), то есть на 60,8% выше. Квант Unsloth UD-IQ1_S (76,9 ГиБ) даёт 5,97, AD-IQ1_M (65,4 ГиБ) — 6,38, но оба не помещаются в 64 ГБ. Авторы оговаривают, что эталонные цифры AtomicChat получены на GPU, а их собственные — на CPU, и методики не совпадают полностью.

На собственном функциональном тесте авторов модель набирает 70 из 80: 30 из 30 за вызов инструментов, 20 из 20 за поиск факта в длинном контексте и математику и 20 из 30 за генерацию кода. Тест написан самими авторами, и независимой проверки качества на стандартных бенчмарках для кодинга пока нет.

Что говорят те, кто попробовал

В обсуждении на Hacker News 8 ноября главная претензия — к самому README: его называют сгенерированным ИИ и трудным для чтения, а в цифрах размеров легко запутаться. Пользователь с Ryzen 7945HX и 96 ГБ сравнил Nemotron-30B с обычным llama.cpp и увидел примерно ту же скорость генерации при заметно более быстрой обработке промпта. Ещё один участник не смог запустить готовые бинарники на старом Xeon без AVX-512 и не нашёл понятной инструкции по сборке; сейчас в релизе есть отдельная сборка для процессоров с AVX2. Скептики также сомневаются, что модель при сжатии до полутора-двух бит сохраняет пользу для реальной работы, и указывают на медленную обработку промпта.

Сравнения с ik_llama.cpp и другими форками, которые оптимизируют инференс MoE на CPU, авторы не приводят. Базой у них служит немодифицированный llama.cpp с квантом UD-IQ1_S: на 64 ГБ он уходит в своп и, по их замеру, выдаёт 5,91 токена в секунду.

Что нужно для запуска

Готовые бинарники собраны для Linux x86_64 с glibc 2.30 и новее (Ubuntu 20.04+, Debian 11+, Fedora, RHEL 9+) и требуют libgomp. Сборка с AVX-512 нужна для Zen 4 и Zen 5 и Intel начиная с Ice Lake (обязательна инструкция avx512vbmi), процессорам уровня x86-64-v3 с AVX2 (Intel начиная с Haswell, AMD Zen 1–3) подходит сборка AVX2, на более старых готовые бинарники не запустятся. Для macOS есть скрипты сборки под Apple Silicon с Metal, для Windows 10 и 11 — сборка движка из исходников через MinGW-w64.

Памяти нужно с запасом: процесс занимает 57,5–58,1 ГиБ неосвобождаемой кучи, а на машине с 64 ГБ системе доступно около 62,5 ГиБ. Авторы советуют контекст 32 тыс. токенов, включённый zram и закрытый браузер; контекст 256 тыс. токенов — только на выделенном сервере с zram или на машине от 96 ГБ. Сама модель поддерживает до 1 млн токенов, и пользователь с Ryzen 7 9800X3D такой запуск на 64 ГБ подтвердил. Быстрая проверка процессора без скачивания модели:

			curl -sL https://raw.githubusercontent.com/synchopate/llama-modchip/main/scripts/check_cpu_readiness.py | python3
		

Запуск 284B вручную по инструкции из README: бинарник из релиза, три файла модели с Hugging Face и сервер с OpenAI-совместимым API на порту 8080. Можно и через скрипт ./modchip chat из репозитория, который сам подберёт бинарник и модель.

			BIN_ISA=$(grep -Eq "avx512_?vbmi" /proc/cpuinfo && echo avx512 || echo avx2)
curl -fLO https://github.com/synchopate/llama-modchip/releases/download/v2.5.4/llama-server-modchip-linux-x86_64-${BIN_ISA}
chmod +x llama-server-modchip-linux-x86_64-${BIN_ISA}

hf download Synchopate/DeepSeek-V4-Flash-0731-MaxQ-Fractal-64GB-CPU-GGUF \
  --include "DeepSeek-V4-Flash-0731-MaxQ-Fractal-*.gguf" --local-dir ./dsv4-maxq

./llama-server-modchip-linux-x86_64-${BIN_ISA} \
  -m ./dsv4-maxq/DeepSeek-V4-Flash-0731-MaxQ-Fractal-00001-of-00003.gguf \
  -c 32768 -t 16 -b 2048 -ub 512 -ctk q8_0 -ctv q8_0 -fa on --port 8080
		
Бинарники релизов 2.5.1 и 2.5.2 писали настройки маршрутизации в /tmp/dsv4_moe_cfg.bin с правами 0666, то есть доступным на запись всем пользователям машины. Авторы просят не ставить эти версии на многопользовательские хосты. В 2.5.3 общие пути убраны: настройки и разделяемая память у каждого пользователя свои, файлы создаются с правами 0600.

Совместимость односторонняя. Формат Fractal-64 занимает номер типа тензора 42, под которым в основной ветке llama.cpp уже лежит другой формат Q2_0, а LUT-VQ3-64 добавляет тип 43. Поэтому GGUF-файлы llama-modchip не откроются в обычном llama.cpp, Ollama, vLLM и LM Studio. Кроме варианта по умолчанию в репозитории есть версии модели со снятыми отказами (abliterated); установщик ставит их только после явного подтверждения.

Почему именно V4-Flash-0731

Авторы выбрали июльскую версию DeepSeek-V4-Flash, а не более новую V4.1-Flash: в новой версии 384 эксперта на слой и около 189 ГиБ дополнительных таблиц, так что даже в двухбитном кванте ей нужно около 341 ГиБ: от 128 ГБ ОЗУ с подгрузкой таблиц с NVMe или 512 ГБ, чтобы всё лежало в памяти. Про исходную линейку V4 Tproger писал при её выходе, а общий разбор того, как встраивать локальную модель в прод, есть в отдельной статье.

Проект появился на GitHub 29 октября и выпускает версии почти каждый день; за 13 ноября вышли сразу две версии. Главный открытый вопрос — качество: пока единственные оценки кода и инструментов дают тесты самих авторов, а цифры перплексии показывают, что за помещение в 64 ГБ модель платит заметной частью точности.

Источники: GitHub: synchopate/llama-modchip, GitHub: релиз llama-modchip v2.5.3, GitHub: релиз llama-modchip v2.5.4, Hugging Face: DeepSeek-V4-Flash-0731-MaxQ-Fractal-64GB-CPU-GGUF, GitHub: замер на Ryzen 7 9800X3D (issue #28), GitHub: замер на Ryzen 9 9950X3D (issue #33), GitHub: отчёт о запуске на Apple M5 Max, Hacker News: обсуждение llama-modchip