Чиним падение DeepSeek V4 Flash в llama.cpp: пошаговый гайд | AiManual
AiManual Logo Ai / Manual.
08 Июл 2026 Гайд

Исправление падения DeepSeek V4 Flash в llama.cpp: обход бага и патч

DeepSeek V4 Flash падает на мульти-GPU? Решение: баг в шардинге MoE, патч в BeeLlama.cpp. Пошаговая инструкция и нюансы.

Одна секунда — и ядро упало

Вы скачали 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 производительность. И это не вариант для прода.

💡
Ирония судьбы: официальные разработчики llama.cpp уже знают о баге — он открыт в issue #10742. Но фикс не смержен уже две недели. Причина? Внутренние споры о правильной архитектуре шардинга для «Flash»‑моделей.

Решение: форк, который работает

Пока мейнстрим ждёт, ребята из 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 никогда не падают.

Подписаться на канал