DeepSeek-V4.1-Flash 技术报告 / 报告正文

3. 通用基础设施

多模态训练基础设施、注意力共享训练与持久化 KV 缓存管理。

3.1. 训练基础设施

3.1.1. 多模态训练基础设施

对比学习中的通信-计算重叠。 视觉编码器首先通过对比学习目标优化,随后再用生成式 next-token prediction 损失进行微调。对比学习阶段,损失在完整的一批文本-视觉配对上计算,因此两种模态的特征都必须在数据并行 rank 之间执行 all-gather,带来显著通信开销。

由于文本特征的梯度只依赖聚合后的视觉特征,反之视觉特征的梯度只依赖聚合后的文本特征,因此每次 all-gather 都可以与前向或反向计算重叠,而无需阻塞流水线:

Forward⁡(V)→(Forward⁡(T)∥AllGather⁡(V))→∇Text→(Backward⁡(T)∥AllGather⁡(T))→∇Vision→Backward⁡(V).\operatorname{Forward}(V) \rightarrow \bigl(\operatorname{Forward}(T)\parallel\operatorname{AllGather}(V)\bigr) \rightarrow \nabla\text{Text} \rightarrow \bigl(\operatorname{Backward}(T)\parallel\operatorname{AllGather}(T)\bigr) \rightarrow \nabla\text{Vision} \rightarrow \operatorname{Backward}(V).

其中 VV 和 TT 分别表示视觉与文本特征,(A∥C)(A\parallel C) 表示计算 AA 与通信 CC 重叠执行,∇\nabla 表示梯度计算。在这一调度中,视觉特征在文本前向期间完成聚合,而文本特征在文本反向期间完成聚合,因此两次 all-gather 都可以完全隐藏在有效计算之后。

端到端并行。 为处理视觉编码器与 LLM 之间的模型异质性和数据异质性(Zhang et al., 2025b),我们采用近期训练系统中的解耦式编码器设计(Team et al., 2025, 2026b)。视觉编码器独立复制于 LLM 参数树之外,每个训练步骤被分为三个阶段:视觉编码器前向、LLM 前向/反向、视觉编码器反向。这样的分离避免视觉编码器计算与 LLM 计算彼此干扰。负载均衡的视觉处理仅位于第一和第三阶段,而 LLM 阶段不执行视觉计算,可继续沿用纯文本训练的并行策略。

长序列多模态训练优化。 DeepSeek-V4.1-Flash 训练序列最长达到 100 万 token,预训练和后训练中都有相当比例在超长序列上进行。在这些长度下,多模态样本会造成严重的 I/O、CPU 和内存瓶颈。

  • 均衡图像分片。 预训练时,一个超长且图像密集的序列可能在加载过程中耗尽单台主机的 I/O、CPU 和内存资源。因此,每条序列中的图像会以负载均衡方式分片到各 context-parallel(CP)rank,每张图像只加载一次。图像只读一次后,只要满足
NρBIO<NCBGPU⟺ρ<BIOBGPUC,\frac{N\rho}{B_{\mathrm{IO}}} < \frac{NC}{B_{\mathrm{GPU}}} \quad\Longleftrightarrow\quad \rho<\frac{B_{\mathrm{IO}}}{B_{\mathrm{GPU}}}C,

加载就可以始终隐藏在计算之后。其中 NN 是 token 数,ρ\rho 是每 token 对应的原始字节数,CC 是每 token 计算量,BIOB_{\mathrm{IO}} 和 BGPUB_{\mathrm{GPU}} 分别是文件系统与 GPU 带宽。由于 NN 可约去,该条件只与逐 token 的 ρ\rho 和 CC 有关,与序列长度及集群规模无关;ρ\rho 由视觉模块配置决定,例如分辨率上限或空间下采样。因此,存储吞吐只会在逐 token 计算量较低的小模型(例如消融实验)上成为瓶颈,而生产规模模型仍以计算为主要瓶颈。

  • 增量图像传输。 除上述均衡分片外,强化学习 rollout 仅以增量方式向推理引擎传输图像,并将引擎 CPU 侧的解码与预处理输出缓存在分布式文件系统上,以供不同 rollout 和后续训练复用。

3.1.2. CSA2 的注意力共享训练

第 2.3 节介绍了 CSA2:一种包含三种模式的注意力共享方法,其中部分模式会在多层之间共享主 KV、索引器 K 和 Top-K 索引中的一个或多个组件。在大规模分布式训练中支持 CSA2,需要在注意力计算之外增加额外协同机制。尤其是,共享注意力组件的层可能位于不同流水线阶段,直接复用模块与传统的阶段本地执行不兼容。因此,我们采用若干设计来支持 CSA2 训练。

影子索引器(shadow indexers) 通过在每个参与阶段放置一个轻量可执行副本来解决这一问题,同时共享参数仍只有一个逻辑所有者。参数所有者负责优化和检查点保存,参数同步与梯度聚合则使各影子副本在训练期间保持一致。

该设计保留原始模型语义,同时无需让流水线调度器把共享层视为特殊执行单元。

流水线 payload 扩展 用于在源层和消费层跨越流水线边界时,向下游消费者提供所需的中间表示与稀疏路由信息。这些状态被纳入现有点对点通信路径,并与 context parallelism 保持一致的分区方式,从而避免不必要的复制,同时维持相应梯度流。

micro-batch 级共享状态管理 跟踪并发活跃的流水线 micro-batch 相关状态,并协调这些状态在前向执行、激活重计算和反向传播之间的生命周期。共享状态会一直保留到最后一个消费者完成,然后立即释放,以限制额外内存开销。同一运行时抽象还负责阶段放置与源-消费者关系,使注意力实现可以访问共享状态,而不依赖具体物理流水线布局。

结合对优化器、检查点、warm-up 和计算图 tracing 工作流的轻量适配,这些机制使 CSA2 能够在现有分布式训练接口与流水线调度中透明运行。

3.1.3. Engram

Engram 嵌入表按行划分到专用的 Engram parallel 进程组中。进程组大小决定单设备内存占用与嵌入查找通信范围之间的权衡。每个表分区的优化器状态还会在其副本之间进一步分片。

Engram 查找索引完全由输入 token 序列决定。因此,每个训练步骤中,在各流水线阶段开始处理 micro-batch 之前,会先对整个本地 batch 发起嵌入预取,尽量减少对流水线执行的干扰。反向传播期间,嵌入梯度被缓冲;主干反向完成后,再返回对应所有者 rank。为高效集成多模态训练,嵌入预取和梯度传输会与视觉编码器的前向、反向计算重叠。

嵌入以 FP8 存储和读取,取回的数值与 scale 直接输入后续 GEMM。对于 Engram 表更新,Sinkhorn 归一化会跨迭代维护行、列缩放向量,以避免重复写入完整归一化矩阵。行归一化和部分列统计的累积被融合为单一内核,以进一步减少内存流量。

在 RL rollout 期间,Engram 嵌入表常驻 GPU 内存。这种放置方式可降低主机内存压力,并减少主机内存碎片导致 OOM 的风险。

3.2. 推理系统

DeepSeek-V4.1-Flash 将推理效率视为首要设计目标。虽然架构概念上较复杂,但最终推理内核流程非常简洁。通过合理的内核融合,我们将复杂操作封装在少量融合内核中,并保持硬件资源充分流水化,包括 FlashMLA(Li and Liu, 2025)中的 fused-RoPE-attention-RoPE-cast 内核、DeepGEMM(Zhao et al., 2025)中的 Mega-Gate、Mega-mHC 与 Mega-MoE 内核、TileKernels(Wang et al., 2026a)中的内核,以及 DeepSelect(Qian et al., 2026)中的 TopK 内核。

因此,绝大多数 Transformer 层——即 CSA2 采用 Reuse Mode 的层——预填充时仅执行 15 个内核,解码时仅执行 11 个内核,同时实现高吞吐与低延迟推理。

在部署层面,我们采用 Encoder-Prefill-Decode(EPD)解耦,使视觉编码、预填充和解码可以独立扩缩容并重叠执行。

3.2.1. 持久化 KV 缓存管理

在相同工作负载下,V4.1 的持久化 KV 缓存占用仅为 V4 的 1/8。这一缩减来自两个乘法因素:第一,持久化 KV 缓存不再存储 SWA KV,容量近似减半;第二,其中保留的全局 KV 通过架构与精度优化进一步压缩到 V4 的 1/4。

在 V4 部署中,SWA KV 几乎占据持久化 KV 缓存容量的一半。全局 KV 与 SWA KV 在该缓存中分别管理,并采用 LRU 淘汰策略。全局 KV 完整存储,命中时可复用完整前缀。相比之下,SWA KV 仅在两个特定位置缓存——提示末尾和输出末尾——以支持重新生成和多轮会话;命中后可从该缓存位置继续计算。为了维持较高命中率,我们在 SSD 上配置了足够大的持久化 KV 缓存,使两种 KV 在典型工作负载下都能驻留超过 72 小时。即使只在指定位置保留 nwinn_{\text{win}} 个 KV 条目,未压缩 SWA KV 的存储开销仍然很大,尤其是在每轮很短的多轮对话中。

持久化存储 SWA KV 不仅成本高,而且效果不理想,因为其访问模式与持久化 KV 缓存的长期保留策略不匹配。与具有长尾复用特性的全局 KV 不同,SWA KV 只会在活跃会话内的分钟级短窗口中复用;会话结束或下一轮开始后,旧 SWA KV 即失效。V4 技术报告曾提出 Zero SWA Caching,通过重计算缺失 SWA KV 来避免存储开销。然而,精确恢复需要对 L×nwinL\times n_{\text{win}} 个 token 执行完整前向传播,在生产部署中成本过高。

因此,V4.1 对持久化 KV 缓存管理作如下修改:

  1. SWA KV 不再进入持久化 KV 缓存。 它改为存放于一个分布式内存池,该内存池由每台机器 10% 的主机 DRAM 提供。虽然其总容量远小于持久化缓存,但 TTL 只有数分钟,过期条目可立即回收给新会话;真实工作负载下,这种高周转率足以覆盖绝大多数并发活跃会话。全局 KV 仍保留在持久化 KV 缓存中,并保证至少 72 小时生命周期。
  2. SWA KV 被淘汰后通过轻量后备机制恢复。 对于不可避免但不频繁的“全局 KV 命中、SWA KV 未命中”请求,Encoder SWA Bounded Replay(详见第 3.2.2 节)只需重计算 nwinn_{\text{win}} 个 token,而非完整的 L×nwinL\times n_{\text{win}} token 前向传播。有界重放是该设计的核心:它将灾难性的缓存未命中转化为平滑且低成本的退化,从而使移除持久化 SWA KV 成为可行方案。

3.2.2. SWA Bounded Replay

由于 SWA 依赖会跨层累积,要精确重建 LL 层的 SWA KV,需要重放 L×nwinL\times n_{\text{win}} 个 token。SWA Bounded Replay 只重放最近的 nwinn_{\text{win}} 个 token,并将 SWA 截断到重放片段,因此接受近似状态。若重放从位置 ss 开始,则位置 ii 的 query 仅关注以下区间内的 SWA key:

[max⁡(s,i−W+1), i].[\max(s, i-W+1),\ i].

Encoder SWA Bounded Replay。 该机制使前缀缓存只依赖全局 KV,从而可以将 SWA KV 从持久化 KV 缓存中完全移除。

当编码器 SWA KV 缺失时,我们重放已缓存前缀最后的 nwinn_{\text{win}} 个 token,并将其与未缓存后缀一起处理。被重放的 token 只重新生成 SWA KV;其全局 KV 直接复用缓存,不重计算也不覆盖。未缓存后缀则同时生成全局 KV 与 SWA KV。

按设计,重放后的前缀状态是近似的,因此未缓存后缀计算出的全局 KV 与 SWA KV 会依赖缓存命中位置,并非在不同位置上严格数学等价。实验结果表明,这种有界重放策略几乎不会损害响应质量。

Decoder SWA Bounded Replay。 该机制将解码器前向传播限制在 nwinn_{\text{win}} 个 token 上,使总预填充计算量近似减半。

在 CED 中,解码器全局 KV 由最终编码器隐藏状态投影产生。阻止预填充直接在编码器结束的唯一因素是解码器 SWA KV:它由每个解码器层自身的隐藏状态生成,并且在初始解码步骤中必需。由于我们从不缓存解码器 SWA KV,要精确重建它,需要让 L/2L/2 个解码器层对提示最后的 (L/2)×nwin(L/2)\times n_{\text{win}} 个 token 运行,这在很长缓存前缀后只跟少量未缓存后缀时尤其昂贵。

因此,我们同样对此采用有界重放:每次预填充时,仅重放提示最后的 nwinn_{\text{win}} 个 token,将其编码器输出送入解码器层,并采用相同 SWA 截断。由此得到的解码器 SWA KV 只用于解码,不用于前缀缓存。

按设计,重建后的解码器 SWA KV 与完整解码器前向传播得到的结果并不严格数学等价。但我们发现,这一策略对响应质量只有可忽略影响。为进一步提高稳健性,后训练期间还会模拟同样的重放,使模型对该近似具有训练感知适应能力。