DeepSeek открыла инференс-фреймворк, на котором сама обслуживает прод: только одна модель, только SM100 и Ascend 950, зато оптимизированные ядра, деквантование одним флагом и детерминированная генерация. Разбираем, что это даёт на практике и почему на домашнем ПК не заработает.
DeepInfer — открытый инференс-фреймворк DeepSeek, который «обслуживает крупномасштабные продовые сервисы» компании: так это сформулировано в README. В открытый релиз вынесли офлайн-инференс с ядрами, планировщиком и параллелизмом, но без KV-кэша и балансировки — то есть ядро движка есть, а обвязки для полноценного сервиса пока нет. За 13 дней репозиторий набрал больше 24 тысяч звёзд, и это самый быстрый способ запустить DeepSeek-V4.1-Flash на железе, под которое его оптимизировали.
По описанию в репозитории это «высокопроизводительный инференс-фреймворк, который обслуживает крупномасштабные продовые сервисы DeepSeek». Открытая версия даёт офлайн-инференс с ядром, которого достаточно для инференса на масштабе, но без части служебных подсистем, которые остались внутри компании. Авторы прямо перечисляют базу: движок изначально построен в основном на vLLM, с идеями из SGLang и TensorRT-LLM.
Отличие от универсальных движков в том, что DeepInfer не пытается поддерживать всё. В README один пункт в списке моделей — DeepSeek-V4.1-Flash. Это не ограничение «пока не добавили», а осознанный дизайн: под одну архитектуру можно вшить конкретные ядра, конкретную схему параллелизма и конкретные эвристики декодирования, которые для зоопарка моделей писать бессмысленно.
| Фреймворк | Звёзд GitHub | Модели | Кому |
|---|---|---|---|
| llama.cpp | 132 707 | GGUF, почти любые | ноутбуки, CPU, Apple Silicon |
| vLLM | 95 825 | широкий зоопарк | универсальный сервер инференса |
| SGLang | 38 338 | широкий зоопарк | сложные пайплайны и structured output |
| DeepInfer | 24 074 | только V4.1-Flash | кластеры SM100 и Ascend 950 |
| TensorRT-LLM | 14 969 | популярные LLM под NVIDIA | максимальная скорость на NVIDIA |
Полезно смотреть не на абсолютные числа, а на скорость: 24 тысячи звёзд за 13 дней — это уровень хайпа вокруг релиза, а не подтверждённая надёжность. Для сравнения, vLLM собирал свои 95 тысяч больше трёх лет. Вывод простой: DeepInfer интересен как способ выжать максимум из V4.1-Flash, а не как замена универсальному движку.
Здесь начинается самое неприятное для читателя из России с одной видеокартой. В README список поддерживаемых ускорителей состоит из двух строк: NVIDIA SM100 и Huawei Ascend 950. Потребительские карты там не упомянуты вообще, и это не забывчивость: ядра написаны под конкретные инструкции датацентровых чипов.
| Параметр | Требование | Комментарий |
|---|---|---|
| ОС | Linux | Windows и macOS не заявлены |
| Ускоритель | NVIDIA SM100 или Huawei Ascend 950 | потребительских карт в списке нет |
| Python | 3.12 (пустое окружение) | другие версии не тестировались |
| Компилятор | GCC 13.0 или новее | нужен для сборки ядер |
| CUDA | 13 (для NVIDIA) | для Ascend — CANN 9.2 |
| Переменная сборки | DEEPINFER_ACCELERATOR=nvidia или ascend | держать экспортированной при запуске |
Отдельно стоит сказать про вес модели. Репозиторий чекпойнта DeepSeek-V4.1-Flash-1017 на Hugging Face состоит из 55 файлов, из них 48 шардов .safetensors, и суммарно занимает 510,3 ГБ (475,3 GiB по метаданным HF API). Это смешанная точность, а не одна «половинная» копия: параметры в карточке разложены по BF16, F32, FP8 и I8.
Загрузки чекпойнта на 29.10.2026 — 116 770 при 3 646 лайках, дата публикации 17.10.2026, лицензия MIT. То есть вес открыт для коммерческого использования, вопрос только в железе: полтерабайта весов некуда положить, кроме серверного узла с быстрым NVMe.
Порядок в README короткий и без сюрпризов: чистое окружение Python 3.12, экспорт платформы, ./build.sh. Важная деталь — переменную DEEPINFER_ACCELERATOR нужно держать экспортированной не только при сборке, но и при каждом запуске: по ней выбирается бэкенд ядер.
git clone https://github.com/deepseek-ai/DeepInfer.git && cd DeepInfer
python3.12 -m venv .venv && source .venv/bin/activate
export DEEPINFER_ACCELERATOR=nvidia ./build.sh
python examples/offline_inference.py
export DEEPINFER_HF_MODEL_DIR=/models/DeepSeek-V4.1-Flash-1017
Чего в инструкции нет, так это примера для нескольких узлов. Замеры авторов сняты на 4 ускорителях для prefill и 64 для decode, «в пределах одного scale-up домена», но как именно запускать такую конфигурацию, README не описывает — отсылает к examples/sweep/run_sweep.sh, который воспроизводит бенчмарк, а не разворачивает сервис.
Список возможностей в README читается как инвентаризация того, что обычно остаётся за закрытыми дверями. Здесь и оптимизированные ядра из открытых проектов DeepSeek (FlashMLA, DeepGEMM, DeepEP, TileKernels, DeepSelect, плюс собственные ядра TileLang), и планировщик батчей с перекрытием CPU-работы и работы устройства, и схемы параллелизма для attention и MoE.
Самая интересная часть — декодирование с черновыми токенами. Флаг DEEPINFER_ENABLE_MTP_VARLEN=1 включает DSpark и «верификацию по расписанию уверенности»: модель предлагает черновик, а система решает, сколько токенов проверять, исходя из оценки уверенности. Длина черновика ограничивается DEEPINFER_USE_NEXTN_DECODE, по умолчанию 5.
| Флаг | Что делает | Когда трогать |
|---|---|---|
| DEEPINFER_ENABLE_MTP_VARLEN | =1 включает DSpark и верификацию по уверенности | когда нужна максимальная скорость декодирования |
| DEEPINFER_USE_NEXTN_DECODE | макс. длина черновика, по умолчанию 5 | уменьшать при падении качества приёма |
| DEEPINFER_YOCO_PREFILL_TRUNCATION_MODE | =compact включает SWA bounded replay | длинный контекст, экономия на prefill |
| DEEPINFER_YOCO_PREFILL_KEEP_TOKENS | =140 — дефолт для V4.1 | если меняете окно SWA, пересчитайте |
| DEEPINFER_BATCH_INVARIANT | =1 фиксирует результат независимо от состава батча | воспроизводимость, только NVIDIA |
| seq_seed | фиксированное зерно в SamplingParams | детерминированная генерация вместе с двумя флагами выше |
Для агентных сценариев важнее другая строка: structured outputs. Генерацию можно ограничить регулярным выражением, JSON-схемой или EBNF-грамматикой через so_args в SamplingParams. Это ровно то, что нужно, когда модель вызывает инструменты: без грамматики JSON-ответ ломается на длинных цепочках, и агент падает на парсинге. Пример лежит в examples/_structured_output.py.
Авторы публикуют два графика Парето — prefill (пропускная способность против задержки на некэшированном входе) и decode (выходная пропускная способность против скорости на пользователя). Условия указаны честно: 4 GPU SM100 для prefill и 64 для decode, в пределах одного scale-up домена, воспроизведение через examples/sweep/run_sweep.sh. Это не тест «на одной карте», и сравнивать эти цифры с домашними замерами нельзя.
Практический вывод для инженера: DeepInfer закрывает вопрос «как получить максимум токенов с SM100 на V4.1-Flash», но не закрывает «как поднять из этого API с кэшем и репликами». Если у вас уже есть vLLM-инфраструктура, честный путь — сравнить на своих промптах и оставить DeepInfer как эксперимент на отдельном узле, а не как замену всему стеку в первый же день.
Брать имеет смысл в трёх случаях: у вас кластер на NVIDIA SM100 и задача — отдавать V4.1-Flash дешевле, чем на универсальном движке; вам нужен детерминированный вывод для регрессионных тестов агента; вам нужна грамматика на выходе модели и вы готовы жить без готового сервера. Во всех трёх случаях вы получаете исследовательский код уровня «почти прод».
Проходить мимо стоит, если железа меньше серверного, если нужен OpenAI-совместимый API «из коробки» (его тут нет), если нужны другие модели, и если нет человека, который умеет собирать CUDA-ядра и разбираться с падением сборки на GCC. Отдельно: 510 ГБ весов и требование NVMe — это статья расходов, а не строчка в инструкции.