DeepSeek 的推理架构,已经不只比参数了
模型内部把注意力成本砍到零头,模型外部把线上真正在跑的推理框架开源。读懂这两层,比记住参数量有用。
一、三层改动,各解决一个瓶颈
| 层 | 改动 | 解决什么 |
|---|---|---|
| 模型结构 | CSA + HCA 混合注意力 | 百万上下文下 KV 放不下 |
| 读写路径 | Causal-Encoder-Decoder 非对称 | prefill 和 decode 的瓶颈不一样 |
| 服务系统 | DeepInfer 的调度与验证 | 单机跑多快、多省 |
数字上:V4-Pro 在 1M 上下文下单 token 推理 FLOPs 约为 V3.2 的 27%,KV Cache 约为 10%;V4.1 Flash 把全局 KV 压到约 890 B/token,HBM 占用约为前代的四分之一。
三件事叠起来,成本核算的单位就从“模型多大”换成了“每个 token 要读多少 KV、跑几次前向”。
二、CSA 管细节,HCA 管全局
单一稀疏机制在 1M 上会同时撞两堵墙:压缩率不够,KV 放不下;压得太狠,局部细节丢失,长文档里的精确引用开始出错。
V4 的做法是两种稀疏按层交错,各管一段。
CSA(压缩稀疏注意力)四步:
- 4 倍 KV 压缩:每 4 个连续 token 的 K/V 用 softmax 门控池化成一个代表 token,1M 变 250K。
- 一个小 indexer(FP8 加速)给每个 query 在 250K 个压缩 token 上打分。
- 取分数最高的 1024 个压缩块,对应回原序列约 4096 个 token。
- 只对这 4096 个 token 做完整注意力。
HCA(高压缩注意力)压得更狠,但读全部压缩条目。它不追局部精度,只保证全局视野始终在线。
偶数层走 CSA,奇数层走 HCA。前者保细节,后者保全局,缺一个都会在长文档里露馅。
代价是稀疏选择与请求内容相关:不同请求选中的块不同,prefix cache 不能只按 token 前缀对齐。后面 DeepInfer 的重放机制,很大一部分是在补这个洞。
三、mHC:残差通路的数值账
网络堆深、专家做多之后,单路残差累加会出现尺度漂移,深层输入的方差逐步偏离初始化分布。常见做法是靠更细的归一化和更小的学习率硬压。
mHC(流形约束超连接)改的是信息在注意力与 MoE 子层之间绕行的方式:把超连接的混合矩阵约束在流形上,保持范数一类性质,让多层叠加后的信号尺度不发散。
这件事在模型侧看是训练稳定性,在系统侧看是算子融合的机会。DeepInfer 和 SGLang 都把 mHC 做成了 Mega 系列算子,与 MegaMoE 直接对接,省掉中间结果的显存往返。同样的卡、同样的权重,拉开差距的往往不是算力,而是 kernel 启动次数和中间张量的读写。
四、8B 读,16B 写
V4.1 Flash 是 552B 参数的 MoE,语言骨干 40 层:20 层因果编码器加 20 层解码器,另有 196B 的 Engram 参数。输入侧激活 8B,输出侧激活 16B。
为什么不对称,看两种负载就行:
- prefill 是 compute-bound。整段 prompt 一次并行算完,矩阵乘规模大、并行度高,算力容易打满,此时再堆参数收益递减。
- decode 是 memory-bound。每步只出一个 token,算术强度极低,时间几乎全花在把权重和 KV 从 HBM 搬到计算单元上,参数量带来的表达能力更值钱。
所以 8B 给读、16B 给写,是让两边各落在自己的最优区间,不是取平均值。定价把输入输出分列,也只是如实反映这个成本结构。
Engram 是查表,不参与全量前向。196B 放哪,直接决定还剩多少 HBM 给 KV:放 host memory 省显存但查表走 PCIe;分片放各卡、peer read 省一次主机往返,但要互联带宽。长上下文高并发选前者,短请求高吞吐选后者。
五、DeepInfer 的三个手段
10 月 20 日开源,Apache 2.0。官方定位很明确:这不是通用框架,是支撑 V4.1 Flash 大规模服务的那套引擎。
并行策略没什么新鲜的:注意力侧 DP 加均衡 CP,MoE 侧 EP 加 EPLB。宽 EP 下 EPLB 基本必开——路由是数据相关的,热点专家会直接变成整条流水线的尾延迟。
值得看的是三个调度手段。
DSpark:验证多长由置信度决定。 固定草稿长度的毛病是,越靠后的草稿被接受概率越低,验证它纯亏。DSpark 给草稿加置信度估计,用“前缀存活概率 × 当前吞吐曲线”算这一步验证几个最划算,草稿上限默认 5。
SWA bounded replay:长 prompt 只重放尾巴。 滑窗注意力下,解码层只看最后一段窗口,前面那些层算完就扔是浪费。DeepInfer 让靠后的解码层只对最后 128 个 prompt token 重放;prefix cache 命中时,用最后 128 个缓存 token 重建滑窗 KV,而不是从头重算。长系统提示词、多轮对话、Agent 反复带同一份工具定义,省的就是这部分。
零开销调度:CPU 准备第 N+1 步,GPU 跑第 N 步。 这个思路 DeepInfer 文档里直接记在 SGLang 名下。
另外三个特性在生产里比 benchmark 数字更值钱:
- 批不变推理:同一条请求不受同批其他人影响,逐 token 一致,线上问题才复现得了。
- 确定性采样:给定种子可重放,评测和回归测试的前提。
- 结构化输出:正则、JSON Schema、EBNF 三种约束,Agent 工具调用的底座。
六、它没做的三件事
README 写得很直白:这一版不含 KV cache 系统,不含 PD 分离,不含跨 DP 副本的负载均衡。
SGLang 在 10 月 24 日把这些补上:Mega 系列算子、DSpark、SWA replay、两种 Engram 放置全部进主线,再接自己的 radix cache、PD 分离和副本路由。同硬件对测,64×GB300 上 decode 步长比 DeepInfer 短 1.1% 到 7.4%,prefill 吞吐最高 1.04 倍。
结论很朴素:专用引擎把单机推到极限,通用框架把集群拼成服务。生产选型不必二选一。
七、昇腾 950 上先看哪几个数
DeepInfer 官方支持两套算力:NVIDIA SM100 和昇腾 950。跨平台要处理的是集合通信、内存层级、算子覆盖三件事,按踩坑概率排:
- CANN 与固件版本对齐。版本错配的典型表现不是报错,是算子悄悄 fallback 到通用实现,吞吐掉一半还没人发现。
- HCCL 拓扑先配对。EP 超过单机 8 卡时,跨机走 RoCE 还是 IB,直接决定 EPLB 的均衡粒度。
- 权重是目标精度且已做平台转换。别拿 GPU 侧的融合权重直接跑。
启动模板,路径和并行度按机器填,参数名以仓内 README 和 --help 为准:
export DEEPINFER_ENABLE_MTP_VARLEN=1 # 打开变长草稿验证
export DEEPINFER_USE_NEXTN_DECODE=5 # 草稿上限,默认 5
deepinfer serve \
--model /models/DeepSeek-V4.1-Flash \
--device ascend \
--tp 8 --ep 16 \
--enable-eplb \
--max-model-len 131072 \
--enable-prefix-cache \
--port 8000
调的顺序:先 prefill,再 decode。prefill 阶段的通信、算子覆盖、显存碎片问题,会伪装成 decode 的性能问题,反过来调会白调一天。
稳住之后再动三个旋钮:草稿长度(接受率高于 0.6 上调,低于 0.3 关掉)、EPLB(EP 大于等于 16 且请求长度方差大时开)、Engram 放置(KV 吃紧放 host)。
八、一表看穿
| 症状 | 先查什么 | 别急着做什么 |
|---|---|---|
| 长上下文 OOM | 单 token KV 占用、Engram 放置 | 先降 max-model-len |
| decode 慢、GPU 利用率低 | 草稿接受率、EPLB 分布 | 加卡 |
| prefix cache 命中但没提速 | SWA replay 是否生效 | 换框架 |
| 同样的请求两次结果不同 | 批不变推理、确定性采样开关 | 怀疑模型 |
| 昇腾上吞吐只有 GPU 一半 | 算子是否 fallback、HCCL 拓扑 | 调 batch size |
参考:
- DeepSeek-V4 技术报告,arXiv:2606.19348
- DeepSeek API 文档 · 更新日志(V4.1-Flash-1017,2026-10-17)
- DeepInfer 仓库与 README:github.com/deepseek-ai/DeepInfer
- LMSYS Blog《More Than DeepInfer: What SGLang Delivers》,2026-10-24
- DSpark: Confidence-Scheduled Speculative Decoding,arXiv:2607.05147
- 点赞
- 收藏
- 关注作者
评论(0)