OFERRY正在进入矩阵

DeepSeek 开源 DeepInfer:155 万亿 token 一天的引擎,只开了一半

10 月 20 日,DeepSeek 在 GitHub 上放出了 DeepInfer——不是又一个「能跑通 Llama」的推理 demo,而是支撑自家 API 的生产推理栈,Apache 2.0。同一批还开源了 deepseek-recipe,一个用 Rust 写、带 Python 绑定的协议适配层,负责把 OpenAI / Anthropic 风格的请求翻译成模型真正吃进去的 token 序列。

这条消息在 PyTorch Conf 第一天发出来,时机挑得很准。过去两年,推理侧的工程进展基本关在 Fireworks、Baseten、Modal 这些公司的机房里;开源社区能拿到的是 vLLM、SGLang 这样的通用引擎,而「一家前沿实验室到底怎么把 155 万亿 token 一天的负载压到能赚钱」一直是个黑箱。DeepInfer 第一次把这个黑箱掀开了一条缝。

但只掀开了一条缝。KV cache 系统、PD 分离、跨副本负载均衡这三块没开源——恰恰是把吞吐从「不错」推到「155 万亿」的那三块。所以这篇不写「DeepSeek 良心开源」,写清楚它开了哪一半、剩下那一半为什么不开、以及你现在拿到手能干什么。

一、先把来源分层#

说法来源与性质
开源时间、Apache 2.0、只支持 V4.1-Flash、只支持离线推理、硬件白名单、构建依赖GitHub README(一手)
DSpark 的 5 token 草稿、置信头、验证量降 30%、吞吐涨 4%–7%官方技术博文转述(二手,README 未给数字)
SWA Bounded Replay 只回放尾部 128 token、prefill 计算近乎减半官方技术博文转述(二手)
155 万亿 token/天、平均 prompt 77K、96% 缓存命中、TTFT 400ms、230–300 tok/s、约 2400 卡官方博文《Production Deployment Practices of DeepSeek V4.1 Flash at Scale》,经 AINews 与 dev.to 转述(二手)
单卡每小时 38 美元收入、全成本 5–8 美元、80% 毛利、81 天回本AINews 基于公开定价与官方数字的测算(第三方推算,不是官方口径)
美国要求民事联邦机构移除 DeepSeek 产品The Next Web 报道(二手,本文不展开)

关键区别在这里:代码是一手的,性能数字几乎全是二手的。DeepInfer 仓库里没有 benchmark 脚本能复现 155 万亿这个数,也没有第三方独立测试。下面所有性能数字都按「官方自述」对待。

二、开了什么,没开什么#

README 把边界写得很直白,这在开源项目里反而少见:

维度这一版的状态
许可证Apache 2.0
支持的模型只有 DeepSeek-V4.1-Flash,默认 checkpoint DeepSeek-V4.1-Flash-1017
推理模式只有离线推理,没有在线 serving
NVIDIA只有 SM100(Blackwell);Hopper 及更早不支持
华为昇腾 950(CANN 9.2)
构建环境Linux、GCC ≥ 13、Python 3.12、CUDA 13
未开源KV cache 系统、PD 分离、跨副本负载均衡

「只支持一个模型」不是懒。DeepInfer 的 kernel 是按 V4.1-Flash 的算子形状手工调的:FlashMLA 负责 latent attention 解码,DeepGEMM 做 FP8 / MXFP4 分块缩放矩阵乘,DeepEP 处理 MoE 的 all-to-all,DeepSelect 把 top-k 路由融进一个 kernel,TileKernels 用 TileLang 做跨平台 JIT。这些名字在 DeepSeek 过去一年的开源里陆续出现过,DeepInfer 是把它们装进一台机器的那个壳。

换句话说,它更像一份「参考实现 + 调优配方」,而不是一个通用框架。你想拿它跑 Qwen 或者 Llama,得自己补模型适配、kernel 选择和并行策略——工作量不会比在 vLLM 上改小。

至于没开源的三块,README 给的理由是「与内部基础设施深度耦合」。这个说法站得住:KV cache 那套要跟 3FS 存储、72 小时分级缓存、96% 命中率配合;PD 分离要跟集群调度器和 RDMA 拓扑配合;跨副本负载均衡要跟全局路由配合。把其中任何一块单独摘出来,离开那套机房就是个跑不动的零件。

但对使用者的含义要说清楚:你拿到的是单副本引擎,不是一套能直接对外提供 API 的服务。官方给的参考拓扑是 8 卡紧凑 prefill 节点 + 64 到 128 卡 Wide-EP decode 超节点,1:1 配比——这个规模已经不是「一台机器试试看」的量级了。

三、真正值钱的四条优化#

1. DSpark:投机解码不再盲目猜#

投机解码的老问题是:草稿模型一次吐 K 个 token,验证时总有大量被拒,白算。DeepInfer 的做法是给草稿加一个置信头(confidence head),让它对自己提出的每个 token 给一个接受概率,验证阶段按置信度决定验多长。

官方给的口径是:草稿一次提 5 个 token,验证的草稿 token 总量减少约 30%,生产负载下净吞吐提升 4%–7%。

这个数字看起来不性感,但方向是对的。投机解码的收益从来不是线性的——K 从 4 加到 8,验证成本涨得比接受率快。用置信度做自适应截断,等于把「猜多长」这个超参交给模型自己决定。工程上还有一个隐藏好处:尾延迟更稳,因为不会每隔几步就撞上一次全拒。

在示例代码里它由环境变量控制,默认就开着:

SHELL
# 草稿步数(next-n),默认 5;显式设 0 可关掉投机解码
export DEEPINFER_USE_NEXTN_DECODE=5
READ / EXECUTE / UNDERSTANDUTF-8

2. SWA Bounded Replay:长上下文不再从头重算#

这一条是全文里我认为最值得抄的工程思路。

滑窗注意力(SWA)的模型在处理长 prompt 时,理论上有大量位置只依赖窗口内的 token。但实际推理引擎为了正确性,往往把整段 prompt 重放一遍 decoder 层,算力全花在重复计算上。DeepInfer 的做法是:只回放每段 prompt 尾部的一小段(官方博文说的是最后 128 个 token),把前面那些已经被窗口覆盖、且状态可复用的部分跳过。

效果是 prefill 的总计算量接近减半,而且长上下文的单位成本不再随长度线性上涨。这解释了另一个数字:官方说在 96% 缓存命中的情况下,平均 77K 的 prompt 还能把 TTFT 压在 400ms 左右。没有这条,77K 的首字延迟不可能做到这个量级。

代价是正确性验证更麻烦——哪些位置能跳、跳过的边界怎么锚定,一旦算错就是静默的精度损失。所以它在示例里配了 PPL 基线做逐样本比对,长上下文那组是 16389 token 输入、4096 token 输出,改动后必须跑 pytest 全量回归。

3. 异步调度:把 CPU 的活挪到 GPU 算的时候#

默认开启。调度器在设备执行当前 batch 的同时准备下一个 batch,把「算 token」和「拼 batch、做采样、处理停止条件」这两条时间线重叠起来。这不是新点子,vLLM 和 SGLang 都在做,但 DeepInfer 把它做成了默认路径,说明在自家负载上收益已经稳定到不需要开关。

4. 批不变 + 确定性采样:可复现比快更重要#

这是 NVIDIA 路径上默认打开的另一个开关:

SHELL
# 批不变推理:同一请求无论跟谁拼在一个 batch 里,输出都一致
export DEEPINFER_BATCH_INVARIANT=1
READ / EXECUTE / UNDERSTANDUTF-8

做过线上推理的人知道这有多难得。默认情况下,同一个 prompt 和不同长度的请求拼批,浮点累加顺序会变,采样结果就可能不一样。这导致两个后果:评测不可复现、A/B 实验的差异说不清是模型变了还是拼批变了。DeepInfer 直接把这个性质做进引擎,代价是放弃一部分 kernel 融合的自由度——它选了可复现。

注意这条只在 NVIDIA 上有效,昇腾路径没有。

四、结构化输出:三种语法,一个采样参数#

V4.1-Flash 把结构化输出做进了引擎,支持正则、JSON Schema、EBNF 三种约束。这对做 agent 的人比吞吐数字更有用——不用再在应用层写重试和解析兜底。

官方示例的写法很直接,约束挂在 SamplingParams 的 so_args 上:

PYTHON
import json
from deepinfer.sampling_params import SamplingParams

json_schema = {
    "type": "object",
    "properties": {
        "color": {"type": "string", "enum": ["red", "green", "blue"]},
        "count": {"type": "integer", "enum": [1, 2, 3]},
    },
    "required": ["color", "count"],
    "additionalProperties": False,
}

cases = [
    ("给我一个工单编号。", {"schema_type": "regex", "schema": r"[A-Z]{2}-[0-9]{3}"}),
    ("挑一个颜色和数量。", {"schema_type": "json", "schema": json.dumps(json_schema)}),
    ("给个结论。", {"schema_type": "ebnf", "schema": 'root ::= "answer=" ("yes" | "no") ";level=" [1-3]'}),
]

outputs = llm.generate(
    prompts=[p for p, _ in cases],
    sampling_params=[SamplingParams(temperature=0, max_tokens=128, so_args=so)
                     for _, so in cases],
    use_tqdm=False,
)
READ / EXECUTE / UNDERSTANDUTF-8

三个细节值得注意:

  • temperature=0 不是必须的,但结构化输出配确定性采样才好调试;
  • 约束是在解码时逐 token 屏蔽非法分支,不是生成完再校验,所以不会出现「格式错了重试三次」的循环;
  • EBNF 那条最有用——它能约束的不只是 JSON,还包括「先输出 answer= 再输出分号」这种固定壳子,适合把模型塞进既有协议。

配套的 deepseek-recipe 解决的是另一个层面的问题:过去 HF checkpoint 靠 Jinja 模板拼 chat template,模板和模型版本一错位,输出就漂。deepseek-recipe 用 Rust 重写了这套解析,把 OpenAI / Anthropic 协议、 thinking 内容隔离、tool call 解析都收进一个零拷贝的中间层,Python 侧只做绑定。这是把「协议」当成基础设施来维护,而不是当成配置文件。

五、上手:能跑,但要先接受它的前提#

README 给的构建路径是 Linux + build.sh,没有 pip 安装这一步:

SHELL
# 前提:GCC >= 13、Python 3.12、CUDA 13(NVIDIA)或 CANN 9.2(昇腾)
git clone https://github.com/deepseek-ai/DeepInfer
cd DeepInfer
bash build.sh
READ / EXECUTE / UNDERSTANDUTF-8

跑通官方离线样例,三种并行方式对应三种集群形状:

SHELL
# 专家并行:单机 8 卡
python examples/offline_inference.py --ep 8

# 数据并行 + 专家并行:两张卡一组专家,八个数据并行副本
python examples/offline_inference.py --ep 2 --dp 8

# 上下文并行:长序列切分到 8 张卡
python examples/offline_inference.py --ep 2 --cp 8
READ / EXECUTE / UNDERSTANDUTF-8

--ep、--dp、--cp 的约束写在脚本里:world_size = dp_size * cp_size,且必须能被 ep_size 整除。默认模型是 deepseek-ai/DeepSeek-V4.1-Flash-1017,走 huggingface_hub.snapshot_download 拉到本地缓存;也可以用 DEEPINFER_HF_MODEL_DIR 指向本地目录,完全不联网。

引擎构造的参数如下,注意 max_num_seqs=4 这个值——它是给离线 PPL 回归用的,不是线上吞吐配置:

PYTHON
from deepinfer.entrypoints.llm import LLM

llm = LLM(
    model=model_path,                  # 本地 HF 目录,需含 config.json
    expert_parallel_size=8,
    context_parallel_size=1,
    engine_rank=0,
    trust_remote_code=True,
    chunked_prefill=True,
    data_parallel_size=1,
    max_num_batched_tokens=32768,
    max_model_len=32768,
    max_num_seqs=4,
    gpu_memory_utilization=0.85,
    lookahead_tokens=1,                # 投机解码的 lookahead,min(1, nextn)
)
READ / EXECUTE / UNDERSTANDUTF-8

几个坑提前说:

  • Hopper 卡直接不支持。H100 / H800 跑不了,这不是「性能差一点」,是编译期就过不去。想试只能上 SM100 或昇腾 950。
  • 没有 OpenAI 兼容 server。这一版只有 LLM.generate() 的离线接口,要对外提供服务得自己包一层。
  • 权重是真的重。V4.1-Flash 是 MoE 大模型,8 卡只是官方示例的起步形状,实际部署按官方参考拓扑是 prefill 8 卡 + decode 64 到 128 卡。
  • 拒绝采样和结构化输出都依赖 tokenizer 的确定性行为,换 checkpoint 必须重跑 tests/models/test_offline_inference.py。

六、155 万亿 token 一天的账,怎么读#

官方博文里最扎眼的数字是单集群每天 155 万亿 token。拆开看,它由四个数支撑:

指标官方口径它意味着什么
平均 prompt 长度77K token负载以长上下文为主,不是聊天
KV cache 命中率96%绝大多数输入 token 不用重算
prefill 吞吐150 万 token/s/卡(含缓存命中)长 prompt 的成本被缓存摊薄
decode 吞吐1.4 万 token/s/卡按 230–300 tok/s/请求算,单卡并发约 50 路
集群规模约 2400 卡155T / 86400 秒 ≈ 18 亿 token/s 全局

再往下推一步:AINews 用公开定价(输入 0.15 美元、输出 0.60 美元每百万 token)反算,得到单卡每小时 38 美元收入;按全成本 5–8 美元/卡/小时,毛利超过 80%,单集群日收入约 2200 万美元,回本周期 81 天。

这组数要打三个折扣:

  1. 96% 命中率是负载性质决定的,不是引擎白送的。DeepSeek 的 API 用户大量重复提交长文档、长代码库,缓存才吃得满。换成一个每次都是全新 prompt 的业务,命中率可能只有个位数,单位成本立刻翻几倍。
  2. 38 美元/卡时是收入不是利润,而且用的是峰谷定价里的低价档。真实毛利依赖利用率和折旧假设,AINews 自己也在推演里标了这是估算。
  3. 没有第三方复现。开源的是引擎,不是那套缓存和调度;即便你有 2400 张 SM100,也拼不出同一个集群。

所以正确的读法是:155 万亿证明的是「这套架构在特定负载下能跑通」,不是「你拿它能跑到这个数」。真正可迁移的是那四条优化和那套 kernel,不是吞吐数字。

七、为什么同时支持昇腾 950#

这次发布有一个容易被忽略的细节:NVIDIA 和昇腾是同一天、同一份代码支持。TileLang 那层 JIT 就是为这个准备的——同一套 kernel 描述,编译到 CUDA 或 CANN 两条后端。

把时间线摆在一起看更有意思:9 月 30 日华为开源 TileLang,10 月 19 日美国要求民事联邦机构移除 DeepSeek 产品,10 月 20 日 DeepInfer 同时支持 SM100 和昇腾 950。开源一个绑定双硬件的推理栈,等于把「换卡」这件事的迁移成本公开降到接近零。对国内客户是降低锁定,对 DeepSeek 自己是保证供应链弹性。

这也解释了为什么 Hopper 不支持:不是技术做不到,是没必要为上一代 NVIDIA 卡投入适配人力——那批卡的存量用户本来也不是它的目标。

八、和 vLLM、SGLang、TensorRT-LLM 什么关系#

README 写得很老实:DeepInfer 是在 vLLM 基础上定制的,同时致谢 SGLang 和 TensorRT-LLM。vLLM 官方也转发了这条消息。

所以它不是「取代 vLLM 的新框架」,而是一份把 vLLM 推到极致的分支:

你想要的该选什么
跑任意 HF 模型、要 OpenAI 兼容 servervLLM / SGLang
要最强的结构化输出和前缀缓存调度SGLang
只有 H100、想立刻上线vLLM(DeepInfer 不支持 Hopper)
有 SM100 或昇腾 950、只跑 V4.1-Flash、能接受离线批处理DeepInfer
想学前沿实验室怎么调 MoE kernelDeepInfer,读代码比跑它更值

对绝大多数独立开发者和小团队,结论很直接:现在用不上,但值得读。它的价值不在部署,在于把「生产级 MoE 推理要考虑哪些维度」摊开给你看——批不变性、置信度投机、滑窗重放、EPLB 重排周期,这四个词以后看任何推理引擎的更新日志都会反复遇到。

九、还剩哪些没答案#

  • 在线 serving 什么时候放:README 只说这一版是离线,没给路线图。
  • KV cache 和 PD 分离会不会开源:官方说与内部基础设施耦合,但没说永远不开。3FS 已经开了,剩下两块不是没有可能。
  • Hopper 会不会补:按目前的取舍,短期不会。
  • 155 万亿的独立复现:在 KV cache 那套没开源之前,不可能。

有一个细节我挺在意:DeepInfer 的示例里,PPL 基线是按「平台 / 负载」存的,不按模型目录。这意味着他们内部把「同一份权重在不同硬件上的数值一致性」当成一条硬指标在守。一个团队愿意为数值可复现付出性能代价,通常说明它已经被不可复现坑过一次。 这比 155 万亿更像个生产团队的痕迹。

十、结论#

DeepInfer 是一次「半开源」:引擎给你,配方给你,机房不给你。它证明了中国实验室在生产推理工程上已经能拿出可对标 TensorRT-LLM 的东西,但也把开源社区的期待值校准了一次——真正的护城河不是 kernel,是那套跟存储、网络、调度长在一起的系统。

如果你今天就想动手:一台 SM100 机器、一份 V4.1-Flash 权重、bash build.sh,跑通 --ep 8 的样例,大概一个下午。跑通之后你会发现,限制你的不是代码,是那张卡的显存和那张卡的价钱。

至于那 155 万亿,把它当成一份「架构可行性报告」读,别当成「性能承诺」读。

DeepSeek 开源 DeepInfer:155 万亿 token 一天的引擎,只开了一半

https://www.oferry.com/posts/a490/
作者
摆渡
发布于
许可协议
CC BY-NC-SA 4.0

除另有声明外,本文采用上述许可协议。转载或改编请注明作者与原文地址,并遵守许可条款。