DeepInfer 深度解析——DeepSeek 生产推理引擎开源了什么

第 28/28 篇

系列目录 27 DeepSeek-V4 的极致性价比…

TL;DR

目录

DeepSeek 把自家线上推理栈的核心引擎开源了,仓库叫 DeepInfer。README 第一句写得很克制:它 powers DeepSeek’s large-scale production services,而这次 release 提供的是 offline inference,外加一套大规模服务真正用得上的核心能力。

对基础设施工程师来说,这比“又一个开源引擎”更值得读。原因不是 README 里的 Pareto 曲线有多漂亮,而是:你终于能对着生产同源的引擎代码,看清 DeepSeek 怎么把混合专家(MoE)、多头潜在注意力(MLA)/ 滑动窗口注意力(SWA)、推测解码、异步调度和双后端(NVIDIA SM100 / 昇腾 Ascend 950)拧成一条可跑通的离线路径——同时也能看清,哪些东西他们没有开源。

本文基于公开仓库 commit 5537415(README、examples/、doc/inference_deployment_qa.md、deepinfer/、csrc/)与社区源码导读站点 DeepInfer Explained(对照 commit 9bd9cf2)写成。命令与路径来自仓库;本文未在 SM100 / Ascend 950 上实跑 ./build.sh 或 offline。官方吞吐数字一律标明出处,不当独立复现。

下图是开源 release 的运行时分层——从 offline_inference.py 到 kernels / Platform;灰色边框外的 KV、E/P/D 入口与 DP Load Balancer 不在本包。

DeepInfer 运行时分层

〇、30 秒版

  1. DeepInfer = DeepSeek 生产推理引擎的开源切片:主模型目前是 DeepSeek-V4.1-Flash;硬件是 NVIDIA SM100(CUDA 13)和华为 Ascend 950(CANN 9.2);入口是 examples/offline_inference.py。
  2. 增量不在“再包一层 vLLM”,而在 kernels、注意力数据并行(DP)+ 上下文并行(CP)、专家并行(EP)+ 专家并行负载均衡(EPLB)、DSpark 置信度调度、SWA bounded replay、零开销异步调度(ZOS),以及 batch-invariant / structured outputs。
  3. 诚实边界:README 列了三项 not included——跨请求 KV、VE/Prefill/Decode 分离编排、Prefill/Decode 的 DP 负载均衡;Q&A 还列了 VE Load Balancer(同样未开源)。引擎里已有部分 hook,但服务周边不在这个包里。
  4. 怎么用:空 Python 3.12 环境 → export DEEPINFER_ACCELERATOR=nvidia|ascend → ./build.sh → python examples/offline_inference.py。没有 SM100 / Ascend 950,很难当真跑通;这时它的价值是源码教材,不是替换你现网的 vLLM/SGLang。
  5. 和系列的关系:机制看 11 / 12;引擎选型看 13;多 token 预测(MTP)看 15;V4 架构与成本看 26 / 27。本篇回答:DeepSeek 自己线上那套引擎,开出来长什么样——以及它相对 vLLM / SGLang / TensorRT-LLM 的优势、劣势与多条采用路径(§7)。

一、开篇:为什么值得基础设施工程师读

过去几年,社区推理引擎(vLLM、SGLang、TensorRT-LLM)和模型厂自研栈是两条平行线。模型厂的东西往往只以论文、技术报告、知乎长文出现;你能学到设计意图,却很难把 schedule()、forward()、sample() 在真实仓库里对上号。

DeepInfer 把这条平行线往社区扳了一截。Acknowledgments 写得很坦率:它 was originally built primarily on vLLM,并吸收了 SGLang、TensorRT-LLM 的思路。不少核心文件头仍留着 Derived from vLLM; modified by DeepSeek. 这意味着:

部署 Q&A(doc/inference_deployment_qa.md)还给出了生产语境(均为 DeepSeek 自述):单集群约 155 trillion tokens/day,按官方口径折合整体营收约 US$38 / GPU-hour(谷价口径)。这些数字用来理解量级即可,不要直接写进你的容量规划表。

二、定位与边界:开了什么,没开什么

2.1 开源包边界一览

维度 开了什么 / 没开什么 来源
模型 DeepSeek-V4.1-Flash(默认 HF:deepseek-ai/DeepSeek-V4.1-Flash-1017) README
形态 Offline inference(脚本喂 prompts,拿回 outputs) README
硬件 NVIDIA SM100;Huawei Ascend 950 README
并行 / 解码 / 长上下文 / 调度 EP+EPLB、DP/CP、DSpark、YOCO/SWA、ZOS、structured outputs、batch-invariant README + 源码
完整服务周边 KV 系统、E/P/D 编排、Prefill/Decode DP LB:未开源;VE LB:Q&A 有,仓库无 README / Q&A
License Apache-2.0 README

代码体量(本机浅克隆统计,量级与 Explain 站点一致):Python 包 deepinfer/ 约 4.6 万行,C++ csrc/ 约 0.6 万行;kernels 多在 vendor/ 子模块(FlashMLA、DeepGEMM、DeepEP、DeepSelect 及 Ascend 变体)。更细的“解决什么 / 落点”见第五节与第六节,这里不重复罗列。

2.2 完整在线服务还缺什么

README 列了三项 Required for a complete inference service (not included):

  1. A KV cache system——跨请求复用、落盘、命中匹配;Q&A 写明与内部设施耦合,生产侧挂在 3FS 一类存储集群上。
  2. VE / Prefill / Decode disaggregation——视觉编码、prefill、decode 分服务部署;README 说引擎侧“most required engine functionality is already implemented”,但服务编排与入口不在本包。
  3. Load balancing across data-parallel replicas for both prefill and decode——README 明文写的是 Prefill / Decode 的 DP 级负载均衡。VE Load Balancer 见 Q&A(同样未开源)。注意:专家并行的 EPLB 已在引擎内;缺的是跨 replica 的请求级 LB。

另外,协议层的 deepseek-recipe 是并列开源的 tokenization / API 对齐组件,也不在 DeepInfer 仓库内。

下图对照“开源引擎切片”与“生产还缺什么”;右侧的 US$38 是 Q&A 的整体营收口径,不是 GPU 成本。

开源 vs 生产边界

读法建议:把 DeepInfer 当成“引擎内核 + V4.1 特化运行时”;把知乎/Q&A 里的架构图当成“完整生产系统说明书”。两者叠在一起,才是 DeepSeek 线上推理的全貌。

三、如何使用:可跑通路径与现实门槛

3.1 环境前提

官方 Prerequisites:

这不是“笔记本也能玩”的门槛。SM100 / Ascend 950 决定了:多数读者第一天的收获是读代码和跟 examples,而不是在自家 H100 上对拍 README Pareto。

硬件与并行能力见下图:双后端共用 Platform 抽象;生产 Q&A 说当前 TP/CP 暂不用,CP 能力主要在引擎 / examples 侧。

硬件与并行

3.2 Build

# 必须先 export;ascend 平台改成 ascend
export DEEPINFER_ACCELERATOR=nvidia
./build.sh

build.sh 会:按 accelerator 装 requirements-*.txt;NVIDIA 路径强制重装 nvidia-nccl-cu13==2.32.3;跑 scripts/build_vendor.sh 编子模块;再 scripts/build.sh build 编 DeepInfer 本体。DEEPINFER_ACCELERATOR 需要在后续运行环境里保持一致(deepinfer/environ.py / platform.py 靠它选后端)。

3.3 Offline inference

python examples/offline_inference.py
python examples/offline_inference.py --ep 8
python examples/offline_inference.py --ep 2 --dp 8
python examples/offline_inference.py --ep 2 --cp 8

要点(来自 examples/README.md 与 _config.py):

Benchmark / Pareto 复现走 examples/benchmark.py 与 examples/sweep/run_sweep.sh。官方 README 图:prefill 在 4×SM100、decode 在 64×SM100(同一 scale-up domain)测得——这是 vendor 测量条件,不是你的集群保证。

下图是一条 offline 请求从 prompt 到 RequestOutput 的路径;开启 ZOS 时,CPU 在 GPU 跑 forward(N)/sample(N) 的同时预排下一拍。

Offline 请求路径

3.4 关键环境变量速查

集中定义在 deepinfer/environ.py(布尔值接受 0/1/true/false,空串按 false;大小写不敏感;非法值直接报错——近期 commit 还收紧了解析)。

变量 作用
DEEPINFER_ACCELERATOR nvidia / ascend
DEEPINFER_HF_MODEL_DIR 默认模型本地路径(不覆盖显式 --model_name)
DEEPINFER_USE_NEXTN_DECODE 最大 draft 长度,默认 5;显式 0 关投机
DEEPINFER_ENABLE_MTP_VARLEN 打开置信度变长验证调度
DEEPINFER_YOCO_PREFILL_TRUNCATION_MODE off / mask / compact;V4.1 建议 compact
DEEPINFER_YOCO_PREFILL_KEEP_TOKENS 默认 0;启用 truncation 时必须显式设置,V4.1 建议 140
DEEPINFER_ZERO_OVERHEAD_SCHEDULING ZOS;NORMAL/COMPLETION 默认 setdefault 为 1
DEEPINFER_BATCH_INVARIANT 跨 batch 组成数值不变(NVIDIA)
DEEPINFER_OVERRIDE_NUM_EXTRA_EXPERTS EPLB 冗余专家下限
DEEPINFER_EXPERT_COUNT_WINDOW_SIZE 专家统计窗口;引擎默认 100,examples 为省显存设为 3
DEEPINFER_EXPERT_REARRANGEMENT_STEP_INTERVAL 重排间隔;引擎默认 0(关闭);examples 开 EPLB 时设为 30

Deterministic sampling(README):DEEPINFER_BATCH_INVARIANT=1 DEEPINFER_ENABLE_MTP_VARLEN=0,并向 SamplingParams 传固定 seq_seed(NVIDIA only)。

Structured outputs:SamplingParams(..., so_args={"schema_type": ..., "schema": ...}),见 examples/_structured_output.py;运行时走 structure_output/(xgrammar 相关 env:DEEPINFER_XGRAMMAR_*)。

四、亮点地图(问题 → 机制 → 落点)

这一节不再重复〇/2.1 的功能清单,只按“选型时会问的问题”给落点;机制细节进第六节。

你在问什么 机制一句话 主要落点
Attention / GEMM / EP 通信怎么加速? FlashMLA、DeepGEMM、DeepEP、DeepSelect、pip 包 TileKernels、仓内 tilelang_ops/ vendor/、tilelang_ops/
怎么放大 batch、切长上下文? Attention DP;balanced / mirror CP(只加速 prefill) parallel_utils/;--dp / --cp
Wide-EP 热专家怎么扛? EP + EPLB:冗余副本 + 周期性重排 model_executor/eplb/
推测解码验证算力怎么省? DSpark + 置信度变长验证 models/mtp/dflash.py、mtp_varlen.hpp
长上下文命中后 SWA 怎么少重算? bounded replay + YOCO compact YOCO env、cache_engine.py
GPU 等 CPU 的气泡怎么挤掉? ZOS 把 schedule/post-process 塞进 overlap zos.cpp、worker.py
评测怎么可复现?约束生成怎么做? batch-invariant / deterministic;structured outputs env + structure_output/

生产 Q&A 还描述了 Prefill/Decode LB、3FS KV、Mega MoE、Recipe 等——那是完整系统故事,开源包只覆盖其中引擎内核一段。

五、实现解剖:从 vLLM 血统到 DeepSeek 特化

5.1 和 vLLM / SGLang / TRT-LLM 的关系

一句话:骨架像 vLLM,调度 overlap 吸收了 SGLang/NanoFlow 一类思路,极致 kernel 与模型路径则是 DeepSeek 自己的。

5.2 目录与运行时分层

自上而下可以记成:

examples/offline_inference.py
  → deepinfer/entrypoints/llm.py          # 用户 API
  → deepinfer/engine/llm_engine.py        # 引擎循环、请求生命周期
  → csrc/engine/scheduler.*               # 选 batch、KV block
  → deepinfer/worker/{worker,model_runner}.py
  → model_executor/models/* + layers/*    # 前向
  → layers/sampler.py + structure_output/ # 采样与约束
  → vendor/* + tilelang_ops/              # 设备内核

EngineType(engine/engine_type.py)已区分 NORMAL / PROMPT / COMPLETION,对应未来 E/P/D 分角色;当前 offline 默认 NORMAL(同进程做 prefill+decode)。EngineArgs.__post_init__ 会按引擎类型 setdefault ZOS 与 multimodal pool。

5.3 推测解码路径(DSpark)

Draft 不是外挂小模型进程,而是主模型上的 MTP_module(DFlash 实现:model_executor/models/mtp/dflash.py)。流程概览:

  1. Draft 侧生成最多 DEEPINFER_USE_NEXTN_DECODE 个 token,并走 ConfidenceHead 得到 per-draft accept rate(MTPPredictInfo.confidence_rates)。
  2. Target 前向一次验证;DEEPINFER_ENABLE_MTP_VARLEN=1 时,验证长度不再固定为 nextn,而是按置信度与吞吐曲线挑“边际回报最高的前缀集合”。
  3. 与 ZOS 叠加时:CPU 调度下一拍时置信度可能尚未返回,于是 CPU 只定总预算,GPU 上 TileLang kernel 再算 per-request seqlens_q(Q&A 原话)。

这和系列 15:推测解码与 MTP 里的“固定 K 验证”叙事相比,关键增量是 把验证算力当成稀缺资源来调度,而不是只追平均接受长度。

下图对照“固定验证 5 个 draft”与“按置信度只验高边际回报前缀”;条上的 0.92 / 0.81…是示意值,底部吞吐增益才是 Q&A 表。

DSpark 置信度调度

5.4 并行切分数据流

生产 Q&A 的推荐形状(注意:这是完整服务部署建议,不是 offline 脚本默认;且 Q&A 明确说当前生产 TP/CP 都不用):

开源 examples 用 --ep / --dp / --cp 表达引擎能力。CP 是 mirror CP:每个 rank 取 prompt 的前段+后段来平衡 causal 负载,只加速 prefill;每个 rank 仍持有全量 KV,decode 不会更快。README 的 balanced CP 与 examples 的 --cp 是引擎能力/其他场景,别把它当成当前生产配方。整除约束见 §3.3(offline 与 benchmark 不同)。EPLB 则在 EP 组内复制热专家并周期性重排,避免 Wide-EP 被少数热专家拖成短板——见下图。

EP + EPLB

六、几处硬核细节

下面四条都尽量落到文件路径 + 机制,不编造第三方 benchmark。

6.1 DSpark 变长验证:前缀约束与双队列

csrc/engine/mtp_varlen.hpp 里的调度注释几乎是一篇微型设计文档:

Q&A 给出的厂商表(EP64/DP64):动态长度把平均验证 draft 数从 5.00 降到约 3.2–4.4,接受长度几乎不动;16 seqs/rank 时约 −1.5%,约 60 时 +5.4%,96 时可到约 +11%——收益随并发上升,不是所有并发都赚。请把它读成“DeepSeek 在自己曲线上的增益”,而不是你的 SLA 承诺。

6.2 EPLB:logical → physical,再周期性 shuffle

model_executor/eplb/__init__.py 的 ExpertLoadBalancer 把状态摊开得很干净:

生产 Q&A 补充了 Prefill/Decode 不同的冗余与重排周期(Decode 起步 1/GPU,EP64 取整后约 7/GPU,不含 shared expert),以及测得的 moe_lb(最慢 rank / 均值)。开源包给了机制;线上那组超参是运维经验。

6.3 SWA bounded replay 与 YOCO compact

长上下文命中后,如果 SWA(滑动窗口注意力)状态缺失,朴素做法是重放整段前缀——成本随长度线性涨。DeepSeek 的做法是:命中长度由 block KV 决定;SWA 只在最近一个有界窗口上重建。

开源侧你能直接操作的旋钮:

export DEEPINFER_YOCO_PREFILL_TRUNCATION_MODE=compact
export DEEPINFER_YOCO_PREFILL_KEEP_TOKENS=140

KEEP_TOKENS 在 environ.py 默认是 0;docstring 写明启用截断时必须显式设置。只开 TRUNCATION_MODE=compact 而不设 KEEP_TOKENS,会撞上 model_runner.py 的 assert:KEEP_TOKENS >= window_size + DEEPINFER_MAX_BACKTRACKING_TOKENS。cache_engine.py 把 StateBlock 切成 stored / dropped 区:该持久的 SWA 留存,YOCO consumer SWA 与部分 compression state 可丢、靠有界重算恢复。

下图概括 Encoder / Decoder 两条 replay 路径,以及“重算成本近似常数”的效果边界。

SWA bounded replay

Q&A 还写了“最多命中到 L - 134”(128 窗口 + 6 的投机回退余量)这类硬约束。跨机 SWA 目录与 3FS block KV 则仍在未开源的 KV 系统里。

6.4 ZOS:把 schedule/post-process 塞进 GPU 气泡

同步路径的经典浪费是:

schedule(N) → forward(N) → sample(N) → 等 D2H → post-process(N) → schedule(N+1)

GPU 在最后两段经常空转。ZOS(DEEPINFER_ZERO_OVERHEAD_SCHEDULING)把流水改成:GPU 跑 forward(N)/sample(N) 时,CPU 并行做 schedule(N+1)、launch_sample(N+1)、以及更早一步的 post-process。

代码落点:

因此 ZOS 下 step(N) 返回的是 N−1 的 token;最后一次结果由 flush_inflight_reqs() 收尾(llm.py 在无未完成请求时走 flush)。看到日志里 step 与 token 错一拍,不是 bug,是设计。也因此,6.1 里那套 N-1/N-2 rate 会计才变得必要。

下图对照同步路径的 GPU 空等与 ZOS 流水重叠。

ZOS 时间线

6.5(加餐)Batch-invariant 与 structured output 的工程味道

七、优势 / 劣势与多路径选型

本节是架构对比,不是同硬件吞吐排行榜。DeepSeek Q&A 的 155T / $38 营收、DSpark 表、EPLB 的 moe_lb 都是厂商自述;本文未在 SM100 / Ascend 950 上对拍 vLLM / SGLang / TensorRT-LLM。通用引擎横评仍以系列 13 为主,这里只叠加「DeepSeek 生产引擎切片」这一维。

7.0 先看三条决策路径

下图按「主约束」分四条路:要对齐 DeepSeek-V4.1-Flash 生产配方且有 SM100 / Ascend 950 → DeepInfer;多模型通用 serving → vLLM;前缀缓存 / 结构化 / 异步优先 → SGLang;接受 TensorRT 编译栈做 NVIDIA 极致优化 → TensorRT-LLM。昇腾完整 serving 旁路可看 MindIE;轻量部署还可对照 TGI / LMDeploy(本篇不展开实测)。

选型多路径决策图

现实里多数团队会走重叠路径:现网继续 vLLM / SGLang,DeepInfer 当源码与配方对照——不是二选一替换。

7.1 DeepInfer 的优势(相对社区引擎)

优势 依据(本文已写到的事实) 你能拿去干什么
生产同源的 V4.1-Flash 引擎切片 README:powers … production services;模型名单极窄但路径对齐 私有化 / 专有云要对齐官方行为时,少猜一层
kernels + Wide-EP + EPLB FlashMLA / DeepGEMM / DeepEP;eplb/;Q&A 冗余与 moe_lb 对照自研 MoE 调度与热专家复制
DSpark 置信度变长验证 dflash.py + mtp_varlen.hpp;Q&A 表含 −1.5%~+11% 改进固定 K 推测解码(对照 15)
SWA bounded replay / YOCO YOCO env + cache_engine.py StateBlock 长上下文命中后少重算
ZOS 异步调度 zos.cpp;step(N) 返回 N−1 挤掉 GPU 等 CPU 气泡
双后端一等公民 SM100 + Ascend 950 共用 Platform 国产卡路径比「口头支持」更有信息量(26)
可复现纪律 BATCH_INVARIANT、deterministic(NVIDIA 有条件) offline PPL / 回归更敢信

一句话:DeepInfer 强在「DeepSeek 自己怎么跑 V4.1-Flash」的可审计实现,不强在「替你接管所有模型的生产 serving」。

7.2 DeepInfer 的劣势与诚实边界

劣势 表现 工程含义
开源不等于完整服务 KV、E/P/D 编排、Prefill/Decode DP LB 未开源;VE LB 仅见 Q&A 不能 pip install 复制 155T/day
模型面极窄 公开名单基本是 DeepSeek-V4.1-Flash 多模型 / 多 LoRA 场景直接出局
硬件门槛高 SM100(CUDA 13)/ Ascend 950(CANN 9.2) A100/H100/消费卡难当真跑通
形态是 offline 入口 offline_inference.py 无开箱 OpenAI Server / K8s 全家桶
缺少独立第三方横评 吞吐数字均为厂商口径 容量规划不能直接抄 Q&A
生态与文档重心 社区工具链、插件、案例远少于 vLLM/SGLang 排障与招人成本更高

骨架仍像 vLLM、调度 overlap 吸收了 SGLang 一类思路(§5.1),所以「读得懂」不等于「能替换」。

7.3 和其他方案怎么放一起看

下图是能力矩阵的示意(● / ◐ / ○),不是分数、不是 tokens/s。

引擎能力矩阵

对照读法(与 13 互补):

机制层背景可回 11 / 12;推测解码对照 15。

7.4 适用场景与「还不如继续用 vLLM / SGLang」

更适合认真跟进 DeepInfer 的人:

什么时候还不如继续用 vLLM / SGLang(或 TRT-LLM):

7.5 四条采用路径(可并行)

「多花途径」这里按字面落实成多条可采用路径:读源码、学生产配方、等硬件/模型面、现网继续社区引擎——默认建议 A+B+D 并行,只有约束匹配才评估 C→上线。

四条采用路径

务实顺序:

  1. 路径 A:Explain 站 “life of a request” → llm_engine → scheduler → worker → dflash → sampler。
  2. 路径 B:打开 DEEPINFER_ENABLE_MTP_VARLEN / YOCO compact(显式设 KEEP_TOKENS),把 EPLB / varlen / bounded replay 做成对照实验。
  3. 路径 C:有 SM100 或 Ascend 950 再 ./build.sh + offline_inference.py;无卡不要硬移植 kernels。
  4. 路径 D:在线服务的 KV、E/P/D、LB、网关仍单独规划;不要假设能复制官方集群。
  5. 成本与架构不够时先补 27 与 15。

八、小结

DeepInfer 的价值,不是在引擎排行榜上再插一根柱子,而是把 DeepSeek 生产推理里能分享的那一层摊开:双后端 Platform、MoE Wide-EP 与 EPLB、带置信度调度的 speculative decoding、为 SWA/YOCO 服务的有界重算、以及把 CPU 调度气泡挤掉的 ZOS。和 vLLM / SGLang / TensorRT-LLM 比,它赢在配方可审计,不赢在通用 serving 完整度——选型应走 §7 的多路径,而不是单一替换。

它同时用 README 三项 not included 画清了边界——引擎 ≠ 完整推理服务。对读者,最健康的预期是:

交叉阅读:

参考

源码下载

本文相关源码已整理,共 1 个文件。

打开下载目录 →

文章导航

分类入口
architectureai-infra
标签入口
#llm#infra#deepinfer#deepseek#inference#vllm#moe#mtp#sglang#ascend

读完这篇,下一步读什么

优先读同系列或同问题的下一篇,把单篇消费变成主题集群。


By .