内容提要
DeepSeek-V4.1为降低长上下文agent负载成本,将滑窗KV从SSD移至主机内存池,仅保留几分钟;全局KV仍存SSD至少72小时。滑窗KV丢失后用SWA Bounded Replay只回放128个token近似重建,代价是结果不精确。CSA2跨层共享在流水线并行下通过shadow indexer等三项支持训练。多模态训练有三处系统改动。
延伸解读
滑窗 KV 的存储成本与访问模式错配
文章指出,V4 的 SSD 缓存中滑窗 KV 占用近一半空间,因其不压缩且每层都有。按 V4-Flash 估算,每轮存两处约 6.3 MB,而新增全局 KV 每 token 3514 字节,两者相等点约 1800 token。短多轮对话中滑窗 KV 开销更大。但滑窗 KV 只在几分钟内有用,与 72 小时保留期不匹配,造成 SSD 空间浪费。
Bounded Replay 的近似代价与影响
滑窗 KV 丢失后,SWA Bounded Replay 只回放最近 128 个 token 近似重建,导致回放段开头状态不精确。Encoder 版本中,新内容的全局 KV 会继承近似并写回缓存,使同一 prompt 在不同缓存命中位置下数学上并不相同。论文称实验表明几乎不影响回答质量,但未给具体数字,并承认边界情况下可能能力下降。
CSA2 跨层共享在流水线并行下的训练支持
CSA2 打破流水线并行只传隐藏态的前提,第 20 层生成的全局 KV 需被后续层读取,反向时梯度需回传。论文列出三项支持:shadow indexer 在各段放置轻量副本;扩展流水线传递内容,将中间表示和稀疏选择结果随隐藏态通信;按 micro-batch 管理共享状态,及时释放显存。这些机制使训练接口对上层透明。
多模态训练的系统改动与加载瓶颈条件
多模态训练有三处改动:对比学习阶段将通信藏在计算后;视觉编码器拆到语言模型参数树外;长序列图像分片加载。论文给出加载不成为瓶颈的条件:ρ < (B_IO / B_GPU) C,其中 ρ 为每 token 原始字节数,C 为每 token 计算量。该条件与序列长度和集群规模无关,只有每 token 计算量很小的小模型才会被存储拖住。
Q&A
DeepSeek-V4.1 为什么要把滑窗 KV 从 SSD 挪到主机内存池?
因为滑窗 KV 的访问模式与 72 小时的保留期不匹配:它只在几分钟内有用,却占着为 72 小时准备的 SSD 空间,而且开销相当大,在每轮都很短的多轮对话里尤其如此。V4.1 把它放进一个分布式内存池,用每台机器 10% 的主机内存,条目只存活几分钟,周转快,足以覆盖绝大多数同时活跃的会话。
SWA Bounded Replay 是怎么用 128 个 token 重建滑窗 KV 的?
精确重建 L 层滑窗 KV 需要回放 L×n_win 个 token,因为每层滑窗 KV 依赖上一层往前 128 个位置的输出。Bounded Replay 只回放最近的 n_win=128 个 token,并把滑窗截断在回放段以内:位置 i 的 query 在滑窗分支里只看 [max(s, i-W+1), i],W=128。回放段开头的 token 滑窗残缺,得到的状态是近似的,但全局分支读到的全局 KV 是完整的。
Encoder SWA Bounded Replay 和 Decoder SWA Bounded Replay 分别用在什么时候?
Encoder 版本用在请求前缀命中了 SSD 上的全局 KV、但内存池里已没有对应 encoder 滑窗 KV 时:取前缀最后 128 个 token 和后面新内容一起送进 encoder,回放部分只重建滑窗 KV,新内容照常计算。Decoder 版本在每次 prefill 之后都用,因为 decoder 的滑窗 KV 从来不缓存:取 prompt 最后 128 个 token 在 encoder 的输出送进 decoder 的 20 层,得到 decoder 滑窗 KV,只用于接下来的生成,不进前缀缓存。
滑窗 KV 丢失后用 Bounded Replay 重建,代价有多大?
滑窗 KV 丢失的代价是多算 20×128=2560 个「层 × token」,比正常情况多两成;精确重建约是它的 11 倍。论文对两个版本都明说结果不精确:回放出的前缀状态是近似的,新内容接在后面算,其全局 KV 和滑窗 KV 也带上近似,同一段文本一次读完和分几次接续读完得到的全局 KV 会有细微差别。论文称实验证据表明几乎不影响回答质量,并在 post-training 里模拟了 decoder 回放让模型适应。
CSA2 的跨层共享在流水线并行下训练需要哪些支持?
论文列了三项支持:一是 shadow indexer,在每个用到跨层共用注意力组件的流水线段上放一个轻量可执行副本,参数只有一个逻辑归属方,负责优化和存 checkpoint,参数同步和梯度聚合让副本保持一致;二是扩展流水线传递的内容,源层和用它的层跨段边界时,下游要用的中间表示和稀疏选择结果随隐藏态一起走已有的点对点通信,切分方式与上下文并行保持一致;三是按 micro-batch 管理共享状态,跟踪每份共享状态属于哪个 micro-batch,留到最后一个用它的层算完再释放。加上对优化器、checkpoint、热身和计算图追踪的少量适配,CSA2 对上层的训练接口和流水线调度是透明的。
加入图像后,多模态训练系统做了哪三处改动?
三处改动都和「图像处理不要拖住语言模型」有关:第一,对比学习阶段把通信藏在计算后面,利用文本特征梯度只依赖收集来的图像特征、图像特征梯度只依赖收集来的文本特征,把图像特征收集放在文本前向时、文本特征收集放在文本反向时,两次通信都被计算盖住;第二,把视觉编码器拆到语言模型的参数树之外,每个训练步分三段,中间段没有视觉计算,沿用纯文本训练的并行策略;第三,长序列里的图像分片加载,把一条序列里的图像分到上下文并行的各个 rank 上加载,每张图只读一次。
V4.1 的推理 kernel 流程为什么很短?一个 Reuse 层执行多少个 kernel?
因为把零碎的操作融合进少数几个大 kernel。论文点名的有 FlashMLA(一层的核心注意力)、DeepGEMM(Mega-mHC 的残差更新、输入混合、系数预测,以及 Mega-Gate、Mega-MoE 的 MoE 路由和 expert 计算)、DeepSelect(indexer 的 top-512 选择)和 TileKernels 里的 kernel。结果是一个 Reuse 模式的层,prefill 时只执行 15 个 kernel,decode 时 11 个;40 层里有 30 层是 Reuse,这和 CSA2 的设计互相成全,因为 Reuse 层没有压缩算子也没有 indexer。