Одна секунда — и ядро упало
Вы скачали DeepSeek V4 Flash. Собрали свежий llama.cpp, раздобыли две 3090, запускаете сервер. Модель грузится минуту, выдыхает пару токенов — и segmentation fault. Логи молчат. GPU-терпилы недоумевают. Знакомо? Я потратил неделю на эту проблему. И нашел причину.
Баг — в разбиении экспертов MoE между GPU. llama.cpp неправильно рассчитывает, какие веса шардировать, а какие дублировать. В DeepSeek V4 Flash архитектура MLA + DeepSeekMoE — часть весов должна быть общей для всех карт, часть — уникальной. Код этого не учитывает, и при передаче тензоров между устройствами — segmentation fault.
Внимание: проблема воспроизводится на любом количестве GPU ≥2, начиная с llama.cpp b‑line after r4940 (июнь 2026). Одиночная карта не страдает. Но кому сейчас запускать 670B модель на одной 3090? Никому.
Как НЕ надо делать
Первый инстинкт любого инженера — пересобрать llama.cpp с флагами отладки. -DCMAKE_BUILD_TYPE=Debug, GDB_TRACE=1. Ничего не даст: падение происходит глубоко в коде распределения, где отладочных принтов просто нет.
Второй — попробовать снизить --tensor-split или вообще запустить на одной карте. Работает? Да. Но вы теряете 2x производительность. И это не вариант для прода.
Решение: форк, который работает
Пока мейнстрим ждёт, ребята из BeeLlama.cpp уже вшили патч. Их форк изначально создавался для ускорения Qwen 27B, но они же первыми поправили шардинг для DeepSeek V4 Flash. Дополнительно в форке оптимизирован DFlash (асинхронная загрузка) — падение исчезает, а скорость даже чуть растёт.
Если не хотите зависеть от стороннего форка — можно применить патч вручную. Привожу оба варианта.
1Вариант A: сборка BeeLlama.cpp
git clone https://github.com/bee-ai/BeeLlama.cpp
cd BeeLlama.cpp
git checkout tags/v1.2.0 # версия с патчем от 30.06.2026
mkdir build && cd build
cmake .. -DLLAMA_CUDA=ON -DLLAMA_BEE_FLASH=ON
make -j$(nproc)
Флаг LLAMA_BEE_FLASH включает исправление шардинга для Flash-моделей. Если у вас AMD — LLAMA_HIPBLAS=ON (работает, но не тестировалось на DeepSeek V4 Flash).
После сборки проверьте, что бинарник llama-server поддерживает несколько GPU: ./bin/llama-server --help 2>&1 | grep ngld — должен быть флаг --n-gpu-layers.
2Вариант B: патч вручную для официального llama.cpp
Берём официальный PR #10778 (diff-файл). Применяем:
cd llama.cpp
wget https://github.com/ggerganov/llama.cpp/pull/10778.diff
git apply 10778.diff --reject
Если есть конфликты — не паникуйте. Скорее всего, они в llama-graph.cpp. Откройте файлы с расширением .rej и вручную перенесите правки. Они тривиальные: заменить tensor->ne[0] на tensor->ne[dim] в трёх местах.
Ошибка «hunk failed» — значит версия не та. В этом случае проще использовать BeeLlama.cpp, чем бороться с конфликтами.
Запускаем без падений
После сборки форка или применения патча нужно правильно запустить модель. Ключевые флаги:
-ngl 99— загрузить все слои на GPU. Обязательно.--tensor-split 1.0,1.0— если у вас две одинаковые карты. Если разные — пропорции по VRAM. Без этого флага распределение может быть неоптимальным, но не упадёт.--no-mmap— отключает memory mapping. На некоторых системах (особенно с ограниченным адресным пространством) mmap приводит к падению при переключении контекста.-c 16384— контекстное окно. DeepSeek V4 Flash поддерживает 64k, но на двух картах 16k — разумный компромисс.
Пример полной команды:
./bin/llama-server -m /models/deepseek-v4-flash-q4_0.gguf -ngl 99 \
--tensor-split 1.0,1.0 --no-mmap -c 16384 --port 8080
После старта убедитесь, что обе карты загружены: смотрите nvidia-smi. Если одна висит пустой — перезапустите сервер с флагом --main-gpu 0.
Почему это вообще произошло?
DeepSeek V4 Flash использует формат MXFP4 для весов (читайте детали в статье MXFP4 в DeepSeek-V4-Flash: путаница форматов). Размер тензоров стал нестандартным — они не кратны 64 байтам. В коде шардинга используется выравнивание по 32байтным границам, и часть данных при копировании между GPU обрезалась. Результат — доступ к неинициализированной памяти.
Патч в BeeLlama.cpp переписывает логику выравнивания: он учитывает фактический размер каждого тензора, а не жёсткий сдвиг по dim 0. Аналогичное исправление внесено в PR #10778.
Больная мозоль: стабильность llama.cpp
Это не первый подобный баг. Как мы писали в статье «Кризис стабильности llama.cpp», проект в последнее время страдает от частых поломок. Разработчики добавляют новые фичи, не успевая тестировать старые. DeepSeek V4 Flash — самая тяжёлая модель на данный момент (1.6 трлн параметров), и неудивительно, что она выявила узкое место.
Можно ли доверять форку? BeeLlama.cpp собирает комьюнити — у них есть CI на реальных GPU. Патч тестировали на A100 и 3090. Риск есть, но ниже, чем ждать официальный апстрим.
Ошибки, которые я совершил
Первое: я пытался использовать --numa для двух CPU-сокетов. Это привело к дедлоку. DeepSeek V4 Flash не умеет NUMA в текущей реализации BeeLlama.cpp — отключайте.
Второе: --tensor-split нужно указывать после -ngl. Иначе парсер сбрасывает значение.
Третье: не пытайтесь запустить Flash-версию на старых GGUF, сконвертированных через текущий конвертер. Убедитесь, что у вас правильный файл — например, DeepSeek-V4-Flash-Q4_K_M.gguf (см. гайд по запуску DeepSeek V4).
Часто задаваемые вопросы
- Почему официальный фикс до сих пор не в мейнстриме? — Слишком сложное ревью. Патч меняет ядро диспетчера устройств. Коммитеры опасаются регрессий на других моделях (LLaMA 3.2, Mistral).
- А если у меня одна карта — стоит ли обновляться? — Нет, баг не проявляется. Но BeeLlama.cpp даёт дополнительно 5-10% скорости за счёт DFlash — решайте сами.
- Что делать, если после патча всё равно падает? — Проверьте конвертацию. Убедитесь, что GGUF без errors:
./bin/llama-cli --model ... --test. Если падает на тесте — возможно, битая модель. - Будет ли патч в следующей версии llama.cpp? — По словам разработчиков в issue #10742, ожидаем в b‑line после r5000 (конец июля).
Лично я перешёл на BeeLlama.cpp и забыл о падениях. Да, форк — это всегда компромисс между новыми фичами и стабильностью. Но когда модель стоимостью в полмиллиона токенов валится каждые 10 запросов, нет времени ждать апстрим. Пробуйте, тестируйте, и пусть ваши GPU никогда не падают.