Workshop

DeepInfer 实战:把 DeepSeek 开源推理引擎跑起来

5 min read ·

10 月 20 日,DeepSeek 把内部推理引擎 DeepInfer 完整开源,Hacker News 上拿到 2099 个赞、818 条评论,是当日热度最高的技术发布。仓库地址 deepseek-ai/DeepInfer,上线一天 star 数已过 1.2 万,许可证为 Apache 2.0。这不是又一个推理包装器,而是支撑 DeepSeek-V4.1-Flash 大规模生产服务的引擎本体。本文按官方 README 的顺序,把这套引擎的硬件门槛、构建步骤、离线推理跑通流程和核心开关逐项拆开,方便你判断它是否值得进入自己的技术栈。

它到底是什么

DeepInfer 的定位一句话能说清:为 DeepSeek 模型服务的高性能大规模推理框架,本次开源的是离线推理形态,包含规模化服务所需的核心特性。README 的致谢部分写得很坦诚:引擎最初主要基于 vLLM 构建,同时借鉴了 SGLang 与 TensorRT-LLM 的设计,但核心调度逻辑、数据预处理流水线和采样计算模块经历了自底向上的全面重构。换句话说,血统来自开源社区,骨架已经换成了自己的。

当前版本支持的模型只有一款:DeepSeek-V4.1-Flash,默认权重 deepseek-ai/DeepSeek-V4.1-Flash-1017,首次运行自动下载到 Hugging Face 缓存,也可以用环境变量 DEEPINFER_HF_MODEL_DIR 指向本地副本。对想研究引擎本身而不是跑某个具体模型的开发者,这个信息很重要:现在入场的窗口期,代码结构还贴着单一模型的形态,还没有被多模型抽象层包裹。

硬件与软件前提

先把丑话说在前面,DeepInfer 对运行环境相当挑剔:

  • 操作系统:仅 Linux
  • 编译器:GCC 13.0 及以上
  • Python:3.12(README 要求构建前创建并激活一个空的 3.12 环境)
  • NVIDIA 路径:CUDA 13,且仅支持 SM100 架构 GPU
  • 昇腾路径:CANN 9.2,对应昇腾 950 NPU

这套组合基本排除了消费级显卡和绝大多数存量训练卡。SM100 是 NVIDIA 最新的数据中心架构,配套 CUDA 13,意味着引擎大量使用了新一代指令与内存特性;昇腾 950 同期在列,说明内核层做了双后端适配,这在国产推理栈里也算是走在前面的工程决策。macOS 和 Windows 用户这次连边都摸不到,建议直接看代码仓库里的内核实现部分。

从零构建与首次推理

官方上手路径只有三步,核心是构建前导出加速器标识:

# NVIDIA 平台;昇腾平台把值换成 ascend
# 这个变量需要在运行 DeepInfer 的环境里一直保持导出
export DEEPINFER_ACCELERATOR=nvidia
./build.sh

构建脚本会拉齐内核依赖并编译引擎本体。完成后跑官方示例即可发起第一次离线推理:

python examples/offline_inference.py

首次执行会自动下载默认检查点到 Hugging Face 缓存。如果你已经本地存有模型权重,用下面这个变量指过去,避开重复下载:

export DEEPINFER_HF_MODEL_DIR=/path/to/DeepSeek-V4.1-Flash-1017

示例目录 examples/ 下有更完整的用法说明,结构化输出、性能扫描等场景都有对应脚本。 benchmark 的复现入口是 examples/sweep/run_sweep.sh,官方基准在单一 scale-up 域内测量:预填充用 4 张 SM100,解码用 64 张,分别给出吞吐与时延的帕累托曲线。自己跑基准时注意卡数对齐,否则数字没有可比性。

核心开关逐项讲

DeepInfer 把大量调优能力做成了环境变量,这是它最好上手也最值得研究的部分。下面按特性分组说明。

内核与并行

引擎内置的内核栈包括 FlashMLA、DeepGEMM、DeepEP、TileKernels、DeepSelect,以及仓库 deepinfer/model_executor/layers/tilelang_ops 下的自研 TileLang 内核。并行策略覆盖三个维度:注意力层面的数据并行与均衡上下文并行,MoE 层面的专家并行外加 EPLB 专家负载均衡。这套组合是当前大规模 MoE 推理的标准答案,真正的差异在调度层。

MTP 草稿与置信度调度验证

加速解码的机制叫 DSpark 加置信度调度验证:用草稿 token 先行试跑,再用模型自身的置信度估计来安排验证节奏。打开方式与参数:

export DEEPINFER_ENABLE_MTP_VARLEN=1
# 控制最大草稿长度,默认 5
export DEEPINFER_USE_NEXTN_DECODE=5

这属于推测解码家族的一员,但验证调度由模型置信度驱动,而不是固定步长。注意它与批不变推理互斥:启用确定性采样时必须关掉 MTP 变长。

SWA 有界回放

滑动窗口注意力的解码器需要保留一段历史,DeepInfer 的做法是只回放一个有界后缀来减少预填充工作量:

export DEEPINFER_YOCO_PREFILL_TRUNCATION_MODE=compact
export DEEPINFER_YOCO_PREFILL_KEEP_TOKENS=140

140 是 V4.1 的默认值,保留的后缀必须同时覆盖 SWA 窗口与最大回溯长度,改这个值之前先算清楚这两个下界,否则会出现静默的上下文残缺。

异步调度

CPU 批调度与设备执行重叠,默认开启,官方描述为零开销批调度。这项没有独立开关,属于引擎默认行为。

批不变推理与确定性采样

这两个特性面向复现性诉求,都仅限 NVIDIA 平台:

# 批不变:同一输入在不同批组成下结果一致
export DEEPINFER_BATCH_INVARIANT=1

# 确定性采样:相同输入 token 与采样参数下输出逐 token 一致
export DEEPINFER_BATCH_INVARIANT=1
export DEEPINFER_ENABLE_MTP_VARLEN=0
# 同时给 SamplingParams 传固定的 seq_seed

对做回归测试、A/B 评测的团队,这两个开关的价值比性能数字更直接:没有它们,同一请求两次调用的输出差异足以让评测结论失真。

结构化输出

通过 SamplingParams 的 so_args 传入正则、JSON schema 或 EBNF 文法约束生成,示例在 examples/_structured_output.py。企业接入场景里这是刚需,官方把它做进引擎层而不是留给上层框架,省一层转换开销。

没开源的部分

README 用一小段明确列出了构建完整推理服务还需要、但本次未包含的组件:KV cache 系统、预填充与解码的分离部署(大部分引擎功能已实现)、数据并行副本间的负载均衡。翻译一下:开源的是引擎核心,不是一套开箱即用的服务系统。如果你想拿它搭生产服务,这三块要么自己补,要么等后续发布。对研究者和个人开发者,离线推理加内核代码已经足够有吸引力。

值不值得投入

分三类读者给结论。跑推理服务的团队:V4.1-Flash 的用户值得认真评估,官方同款引擎的同模型优化通常强于通用框架,但要接受硬件门槛与补齐三块缺失组件的工作量。做推理引擎研发的团队:这是目前能拿到的最完整生产级参考实现之一,调度、内核、并行三层的取舍都能对照源码学习。普通应用开发者:不必急着迁移,但建议把仓库纳入观察名单,尤其是结构化输出与确定性采样这两块的设计,很可能被其他引擎快速跟进。

推理引擎的开源节奏这两年明显加快,头部模型公司开始把生产栈直接交出来。DeepInfer 的特别之处在于它来自一个以算法效率著称的团队,工程取舍处处透着对成本的执念。读懂这些开关背后的设计,比记住怎么配环境变量更有长期价值。

Frequently asked questions

DeepInfer 和 vLLM 是什么关系?
README 明确说明 DeepInfer 最初主要基于 vLLM 构建,并借鉴了 SGLang 与 TensorRT-LLM,但其核心调度逻辑、数据预处理流水线与采样计算模块经历了自底向上的全面重构,不是简单的分支镜像。
没有 SM100 显卡能跑吗?
官方支持的硬件只有 NVIDIA SM100 GPU 与华为昇腾 950 NPU 两类,其他卡型不在支持矩阵内。CPU 或老架构显卡用户只能参考其内核实现,无法直接复现官方基准。
开源版本能直接用于生产服务吗?
本次开源的是离线推理与规模化服务的核心特性,KV cache 系统、预填充与解码分离、数据并行副本间的负载均衡明确不在发布范围内,生产部署需要自行补齐这三块。
批不变推理和确定性采样有什么区别?
批不变推理保证同一输入在不同批组成下得到相同模型结果;确定性采样进一步要求相同输入 token 与相同采样参数下输出逐 token 一致,需要额外关闭 MTP 变长并传入固定的 seq_seed。
普通开发者值得读这个仓库吗?
值得。它把一家头部模型公司的生产推理栈完整摊开:调度、内核、采样、并行策略的取舍都能在代码里对照,是学习推理工程少见的活标本,即使不用 DeepSeek 模型也有参考价值。
// next.txt ›

Some outbound links in this post are affiliate links — see disclosure.