Forcing-KV: Hybrid KV Cache Compression for Efficient Autoregressive Video Diffusion Models

Paper: arXiv:2605.09681 Code: zju-jiyicheng/Forcing-KV Code reference: main @ 50ac1f45 (2026-05-17)

1. Motivation (研究动机)

自回归视频扩散模型把长视频生成改写成“chunk by chunk”的流式过程:模型先生成一小段,再把历史视频的 key/value 状态作为 KV cache 供下一段查询。这类方法继承了 Self Forcing、LongLive、Rolling Forcing 一类训练或推理范式的优势,可以降低首段视频的等待时间,支持可变长度、长时域和交互式输入;但它也把瓶颈从一次性双向 denoising 转移到了不断增长的历史 KV cache。随着视频越生成越长,当前 chunk 需要对越来越多的历史 frame/token 做 self-attention,计算复杂度和显存占用都会累积,尤其在高分辨率和 30 秒以上场景里很快成为实时生成的限制。论文在引言里给出的例子是:Self Forcing 在单张 NVIDIA H200 上生成 1080P、30 秒视频需要超过 2 分钟,这与“real-time responsiveness”的目标明显冲突。

Figure 1 解读:teaser 直接把问题和目标放在同一张图里:Forcing-KV 不是重新训练一个视频模型,而是在自回归推理阶段压缩历史 KV cache,使生成速度超过 29 FPS,同时报告约 30% cache memory reduction。图中强调的“static structural pruning + dynamic similarity pruning”说明作者认为不同 attention heads 的历史依赖并不等价,不能用单一 sliding window 或单一最近邻保留策略处理。

现有 KV 压缩方法不能直接解决这个问题。LLM 里的 StreamingLLM/H2O/DuoAttention 等方法主要围绕文本 token 的注意力分布设计,常见做法是保留 sink token 和最近窗口;视频 AR diffusion 的 token 却同时含有空间 patch、时间帧、去噪步和 chunk 边界,错误丢弃 transition anchor frame 会造成 chunk 交界处闪烁或断裂。Dummy Forcing 是针对 AR diffusion 的更接近 baseline,它观察到部分 head 更关注当前 chunk,并对“local heads / neighbor heads”采取激进压缩;但论文指出它缺少对每类 head 功能的细粒度刻画,容易牺牲 temporal dynamics 和 chunk continuity。换言之,问题不只是“缓存太长”,而是“哪些 head 需要什么历史上下文”没有被区分。

本文的核心任务可以写成一个推理侧约束优化问题:给定 AR diffusion 在第 个 chunk 的 query 以及历史 ,希望在不重新训练、尽量不改变输出分布的前提下,从每个 head 的历史 cache 中选择更小的子集,使 self-attention 的吞吐、显存和长时域可扩展性提升,同时保留视觉质量、动态程度和 chunk 边界连续性。作者因此把评估重点拆成两类:效率指标包括 DiT 内部 FPS、speedup、KV cache memory;质量指标包括 VBench/VBench-Long 总分、dynamic degree、chunk discontinuity 以及用户主观偏好。这个问题属于 World Model / Real-Time & Streaming,因为它服务的是长时域、流式、可交互视频世界生成,而不是静态图像压缩或离线后处理。

2. Idea (核心思想)

Forcing-KV 的根本新意是:AR 视频扩散模型里的 attention heads 存在稳定的功能分工,压缩策略应该按 head type 区分,而不是按所有 heads 统一保留最近窗口。作者把 heads 分成 static heads 和 dynamic heads。static heads 主要服务当前帧/当前 chunk 的空间细节和跨 chunk 的 transition anchor frame,因此需要保留 sink frame、上一段最后的 transition frame 和当前 chunk;dynamic heads 主要服务跨帧运动与一致性,它们需要历史中的“发生变化的区域”,而高度相似的背景或静止片段可以优先丢弃。

这个 insight 与 StreamingLLM 的差别在于,StreamingLLM 只做 frame-level sink + recent window,不知道哪些 head 依赖 long-range temporal context;与 Dummy Forcing 的差别在于,Dummy Forcing 主要从 local/neighbor heads 的可见窗口出发,缺少稳定 head profiling 和动态区域相似度判断,导致 aggressive pruning 时 chunk discontinuity 和 dynamic degree 下降。Forcing-KV 的 hybrid 设计更像一个两阶段选择器:离线用 attention mass 给每个 head 打标签,在线推理时 static heads 走结构化保留,dynamic heads 走 segment-wise redundancy pruning。

直观地说,作者不是把历史视频平均地“缩短”,而是把历史 cache 解释为两类信息:一类是 chunk 边界过渡所需的锚点,必须被 static heads 看见;另一类是同一空间区域在不同时间上的演化,应该让 dynamic heads 重点保留“变化大、不冗余”的 segment。这样做的好处是推理侧 plug-and-play:不改训练目标,不需要重新拟合基础模型,只需要在已开源代码中加载 head config、设置 sink/context/retention 参数,并替换 causal attention 的 KV 组织方式。

3. Method (方法)

3.1 观察:AR 视频扩散中的 static / dynamic head 分工

Figure 2 解读:图中展示了两种 head pattern。static heads 的注意力集中在当前 chunk 内部以及最近的 transition anchor frame,形成局部块状模式;dynamic heads 的注意力沿着时间方向对齐同一空间位置,形成跨帧条纹。这个观察说明,历史 KV cache 不是一个同质序列:有些 head 的历史需求很短但对边界帧敏感,有些 head 需要更长时间上的对应区域。

作者随后做功能性 ablation:逐步 mask dynamic heads 的上下文会使 dynamic degree 和 consistency 下降;mask static heads 的 transition frame 则会显著提高 chunk discontinuity。这意味着 static heads 的关键不是“更多历史”,而是“正确的边界锚点”;dynamic heads 的关键不是“所有历史”,而是“能解释运动变化的区域”。进一步的 PCA 可视化显示,不同样本和 denoising steps 下 head 功能聚类稳定,平均 intra-head divergence 低于 inter-head divergence,因此可以离线 profile 一次,在真实推理中复用。

Figure 3 解读:左侧 ablation 把功能差异转化为可测指标:dynamic heads 上下文减少时动态性和一致性下降,static heads 失去 transition anchor 时边界断裂增加。右侧 PCA 说明这种 head property 不是单个 prompt 或单个 step 的偶然现象,而是跨样本、跨 denoising step 稳定存在的可利用结构。

3.2 Offline Head Profiling:一次性给 head 分类

Forcing-KV 在推理前做 offline profiling。给定某个 head 在整个 attention window 上的 attention mass ,当前生成 chunk 的 mass ,transition frame 的 mass ,以及 sink frame 的 mass ,作者使用: 这里排除 sink frame 是因为一些 AR 视频模型在训练配方中对 sink frames 有特殊处理,如果把 sink mass 计入分母或分子,可能把“通用稳定锚点”误判成 static/dynamic 功能。论文 appendix 给出的实现细节是:用单个 prompt 完成 offline classification,,几分钟内完成。开源代码的 configs_head/head_profile.py 也把 THRESHOLD = 0.8 写死,并根据每个 (layer_idx, head_idx) 的 attention score 输出 static_head / dynamic_head JSON。

Figure 4 解读:head distribution 显示 dynamic heads 约占全部 heads 的 60%,在中间层如 layer 13、15、17 更集中。作者的解释是,靠近输入/输出的层更偏局部结构抽取和质量保持,中间层更依赖上下文进行细节 refinement 与 temporal dynamics 建模。这也解释了为什么 uniform pruning 会损失质量:被压缩的不是同一类功能单元。

3.3 Static Structural Pruning:static heads 只保留结构关键帧

对 static heads,Forcing-KV 不做复杂 token scoring,而是结构化保留 sink frames、transition anchor frame 和当前 chunk。若每个 chunk 有 帧,每帧有 个 tokens,第 个 AR step 的 static head self-attention 可写成: 这个公式的重点是 transition anchor frame 。它是上一段与当前段之间的视觉桥梁,如果被删除,模型虽然仍能看见当前 chunk,但跨 chunk 的局部连续性会断裂。代码中对应的 cache 命名也很直接:group_sink_static_k/v 保存 sink,group_static_prev_k/v 保存上一段 transition,当前 chunk 的 cur_static_k/v 与它们 concat 后进入 attention。

3.4 Dynamic Similarity Pruning:dynamic heads 保留低相似度 segment

对 dynamic heads,历史帧中的所有空间区域并不等价。背景、静止物体或重复纹理在相邻帧之间 key states 高度相似;动作区域、形变区域、交互区域则变化更大。Forcing-KV 因此把每个 latent frame 均匀划分为 个 contiguous segments,计算相邻帧同一 segment 的 key cosine similarity: 直觉上,similarity 越高越可能是冗余片段,similarity 越低越可能携带运动或物体变化;所以保留 BottomK,即低相似度 segment。论文 appendix 写的是默认动态压缩比例 ,每帧划分 个 segment,从第二个 AR step 开始压缩,并保留 sink frame。开源 YAML 中实际评测配置使用 sim_retention_ratio: 0.33dynamic_context_length: 1,这与论文默认值非常接近;代码为了省计算,只在 diffusion transformer 的第一个 block 上计算 segment-wise similarity proxy,然后通过 shared indices 复用于后续处理。

Figure 5 解读:方法总览把三个动作串起来:先 offline head profiling,把 head 分成 static 和 dynamic;推理时 static 分支保留 sink、transition、current chunk;dynamic 分支按相邻帧 segment similarity 选择低冗余区域。图中“one frame per chunk”只是简化展示,真实配置里 chunk/frame/segment 会由基础模型和 YAML 参数决定。

Figure 6 解读:动态剪枝准则实验比较 random token pruning、uniform token pruning 和 similarity pruning。Forcing-KV 的优势来自两个层面:一是按 segment 而不是孤立 token 做选择,更符合视频 latent 中局部区域连续变化的结构;二是选择低相似度 segment,相当于把有限预算留给运动和变化区域,而不是平均浪费在静止背景上。

3.5 代码映射与实现伪代码

Paper ConceptSource FileKey Class/Function
Offline head profilingconfigs_head/head_profile.pycompute_attn_score, build_head_config
Hybrid Forcing-KV attentionwan/modules/causal_model_forcingkv.pyCausalWanSelfAttention.dynamic_compression, attention cache branches
Inference pipeline wiringpipeline/causal_inference_forcingkv.pyCausalInferencePipeline_ForcingKV, _initialize_kv_cache
Public evaluation configsconfigs/forcing-kv/*.yamlmethod: forcingkv, sim_retention_ratio, dynamic_context_length

开源仓库是推理侧 toolkit,不是训练仓库。configs_head/forcingkv_heads_selfforcing.json 有 30 层、360 个 heads,其中 static 134、dynamic 226;forcingkv_heads_longlive.json 有 static 154、dynamic 206;forcingkv_heads_realtime_14b.json 用 40 层 list-format,static/dynamic 各 800。主评测配置如 forcingkv_self_forcing_vbench.yamlforcingkv_longlive_vbenchlong.yaml 都设置 sink_size: 1spatial_context_length: 1temporal_context_length: 1dynamic_context_length: 1sim_retention_ratio: 0.33,并使用 method: forcingkv 进入 CausalInferencePipeline_ForcingKV

def profile_heads(attn_records, alpha=0.8):
    config = []
    for layer in layers(attn_records):
        static, dynamic = [], []
        for head in heads(layer):
            a_total, a_generate, a_transition, a_sink = attention_mass(attn_records, layer, head)
            score = (a_generate + a_transition) / (a_total - a_sink)
            if score >= alpha:
                static.append(head)
            else:
                dynamic.append(head)
        config.append({"layer": layer, "static_head": static, "dynamic_head": dynamic})
    return config
def static_attention(q, k_cur, v_cur, cache, static_heads):
    # mirrors causal_model_forcingkv.py: group_sink_static + group_static_prev + current
    k_static = torch.cat([
        cache["group_sink_static_k"],
        materialize(cache["group_static_prev_k"]),
        k_cur[:, :, static_heads, :],
    ], dim=1)
    v_static = torch.cat([
        cache["group_sink_static_v"],
        materialize(cache["group_static_prev_v"]),
        v_cur[:, :, static_heads, :],
    ], dim=1)
    return attention(q[:, :, static_heads, :], k_static, v_static)
def dynamic_compression(old_frames_k, old_frames_v, new_frames_k, new_frames_v, keep_chunks):
    # implementation uses first DiT block as proxy and shares selected indices
    chain = torch.cat([old_frames_k, new_frames_k[:, :1]], dim=1)
    current = chain[:, :-1].reshape(1, num_pairs, num_patches, chunk_tokens, -1)
    nxt = chain[:, 1:].reshape(1, num_pairs, num_patches, chunk_tokens, -1)
    token_scores = F.cosine_similarity(current, nxt, dim=-1)
    patch_scores = token_scores.mean(dim=3).flatten()
    keep_indices = torch.topk(patch_scores, k=keep_chunks, largest=False).indices
    return gather_chunks(old_frames_k, old_frames_v, keep_indices.sort().values)
def forcing_kv_attention(q, k_cur, v_cur, cache, head_config):
    static_heads = head_config["static_head"]
    dynamic_heads = head_config["dynamic_head"]
    out = torch.empty_like(q)
    out[:, :, static_heads, :] = static_attention(q, k_cur, v_cur, cache, static_heads)
    k_dyn = torch.cat([cache["group_sink_temporal_k"], cache["group_dynamic_temporal_k"], k_cur[:, :, dynamic_heads, :]], dim=1)
    v_dyn = torch.cat([cache["group_sink_temporal_v"], cache["group_dynamic_temporal_v"], v_cur[:, :, dynamic_heads, :]], dim=1)
    out[:, :, dynamic_heads, :] = attention(q[:, :, dynamic_heads, :], k_dyn, v_dyn)
    update_ring_cache(cache, k_cur, v_cur)
    return out

4. Experimental Setup (实验设置)

模型与 baseline:主实验使用 Self Forcing 和 LongLive 两个 mainstream AR video generation models。Full KV 是不压缩历史 cache 的上限设置;StreamingLLM 作为 LLM KV 压缩迁移 baseline,在 appendix 实现中保留 3 个 sink frames 和 4 个 recent frames;Dummy Forcing 作为 AR diffusion compression baseline,按原论文保留 local region,并调节 neighbor heads 的 history cache length ,激进版本 ,保守版本在 Self Forcing 上 、LongLive 上 。appendix 还报告了 Krea-Realtime-14B、Causal Forcing、Raven、interactive LongLive、FP8 quantization 等扩展实验,说明代码不是只为单一模型写死。

数据与评测:5 秒短视频使用 946 个官方 VBench prompts,并评估 16 个维度;30 秒和 60 秒长视频使用 MovieGen 的 128 个 prompts,按 VBench-Long 标准系数加权总分,所有 prompts 用 5 个 seeds。用户研究有 12 名参与者,每人评估 15 组视频,每组包含不同方法生成的结果,视频覆盖 Self Forcing 和 LongLive 的 5 秒/30 秒生成,从 946 个 VBench 视频全集中随机抽取;为避免位置偏置,视频随机放在 left/middle/right,总计 540 次评价。

指标:效率指标是在单张 NVIDIA H200 上统计 DiT 内部 frames per second 和相对 speedup,同时统计 KV cache GPU memory;论文明确排除 VAE overhead,因为该部分不是主要瓶颈且可用 pipeline 隐藏。质量指标包括 VBench/VBench-Long total score、imaging quality、subject/background consistency、motion smoothness、aesthetic quality、quality score、semantic score 等。由于现有指标不能充分捕获 AR chunk 边界的闪烁和断裂,作者定义了 chunk discontinuity:对连续视频计算相邻帧 optical flow difference,取 Top- 最大值的平均并除以整体均值,RAFT 用于 optical flow 估计。这个指标假设视频本身没有 scene cut,适合衡量 chunk boundary 是否异常突变。

Figure 7 解读:chunk discontinuity 的例子显示,高分视频在固定间隔 chunk boundary 上出现局部峰值;低分视频的 optical flow difference 更均匀。这个指标对本文很关键,因为很多方法可能总分相近,但在边界处出现肉眼可见的 flickering 或 broken transition。

实现超参:论文 appendix 的 Forcing-KV 使用 做 head profiling,dynamic heads 默认 compression ratio ,每帧均分 个 contiguous segments;为了避免生成开头缺少相邻帧,从第二个 autoregressive step 开始做 KV compression,并保留 sink frame。开源评测 YAML 中 sim_retention_ratio 为 0.33,dynamic_context_length 为 1,sink_size 为 1。注意这些是推理配置,不是训练配置;仓库没有提供训练脚本来更新模型权重,而是把 Forcing-KV 作为可组合的 inference acceleration method。

5. Experimental Results (实验结果)

主结果证明 Forcing-KV 在保持质量的同时提升吞吐。LongLive 60 秒设置下,Full KV 为 20.48 FPS、chunk discontinuity 2.6、dynamic degree 42.40、total score 80.23;Forcing-KV 达到 26.71 FPS、1.30× speedup、chunk discontinuity 2.5、dynamic degree 43.56、total score 80.43。LongLive 30 秒设置下,Forcing-KV 为 26.77 FPS、1.27×、chunk discontinuity 2.4、dynamic degree 43.65、total score 80.65,相比 Full KV 的 21.10 FPS、42.54 dynamic degree、80.38 total score 仍略优。Self Forcing 30 秒设置下提升更明显:Full KV 为 17.76 FPS、chunk discontinuity 3.4、dynamic degree 46.86、total score 79.72;Forcing-KV 达到 26.65 FPS、1.50×、chunk discontinuity 2.7、dynamic degree 52.23、total score 80.07。

短视频上,由于 attention window 在早期尚未充分增长,speedup 理论上会小一些,但 Forcing-KV 仍有效。LongLive 5 秒设置下,Full KV 为 21.85 FPS、dynamic degree 40.28、total score 83.19;Forcing-KV 为 29.58 FPS、1.35×、dynamic degree 45.56、total score 83.23,chunk discontinuity 持平为 2.1。Self Forcing 5 秒设置下,Full KV 为 19.56 FPS、dynamic degree 66.39、total score 83.91;Forcing-KV 为 28.18 FPS、1.44×、dynamic degree 69.17、total score 83.98。论文还指出,通过 head-wise hybrid compression,参与 self-attention 计算的 KV cache 只有约 27%(Self Forcing)和约 46%(LongLive),说明速度提升不是来自牺牲大部分质量指标,而是来自更精确的历史上下文选择。

Figure 8 解读:用户研究与自动指标一致。论文正文报告 Forcing-KV 在 visual quality 上与 Full KV 接近(45.0% vs. 50.0%),在 temporal dynamics 上更强(52.8% vs. 42.2%);相对于 Dummy Forcing,Forcing-KV 的主观优势更明显,正文给出 45.0% vs. 5.0% 的对比。这个结果说明 Dummy Forcing 即使有接近 speedup,也会因为 chunk discontinuity 和动态性损失被用户感知到。

Figure 9 解读:scaling law 展示 attention window 和分辨率越大,Forcing-KV 的收益越明显。原因是 KV cache 的 attention computation 随上下文近似二次增长、memory 线性增长;在相同压缩比例下,高分辨率和长 window 会放大节省。论文报告 speedup 从 1.40× 提升到 2.82×,同时保持约 30% memory reduction。作者也提醒 dynamic heads 为了 similarity computation 仍保留部分历史帧,因此未来可以通过 retrieval strategy 进一步降低有效 memory。

ablation 支持两个设计点。第一,head profiling 足够可靠:LongLive 30 秒主文讨论中,简单 profiling 的 total score 接近人工 profiling(80.65 vs. 80.71),优于 random profiling;appendix 5 秒实验中,LongLive 上 Forcing-KV / random / human 的 total score 分别为 83.22 / 82.82 / 83.31,Self Forcing 上为 83.98 / 82.76 / 84.10。第二,hybrid compression 的两个 cache 都有必要:去掉 static-head cache 会显著提高 chunk discontinuity,例如 appendix LongLive 5 秒从 2.1 变为 3.9,Self Forcing 5 秒从 2.1 变为 3.4;去掉 dynamic-head cache 会降低 dynamic degree,例如 LongLive 5 秒从 45.56 降到 43.33,Self Forcing 5 秒从 69.17 降到 62.50。这个结果与方法动机一致:static branch 负责边界连续,dynamic branch 负责运动与长程一致性。

Figure 10 解读:self-attention runtime 占比随历史上下文增长而上升,这解释了为什么 KV cache compression 对 AR streaming video 尤其关键。短视频和低分辨率下,VAE、I/O 或其它模块可能稀释收益;长视频、高分辨率、长 attention window 下,self-attention 逐渐成为主瓶颈,Forcing-KV 的 head-wise cache 剪枝收益会更大。

扩展实验说明方法有一定泛化性。Krea-Realtime-14B 5 秒实验中,Forcing-KV 达到 5.22 FPS、1.26× speedup、chunk discontinuity 1.9、dynamic degree 73.61、total score 85.35;interactive LongLive 60 秒实验中,Forcing-KV 的 FPS 为 26.35、total score 79.52,高于 LongLive 的 23.07 FPS / 78.63 和 Dummy Forcing 的 25.74 FPS / 78.04。FP8 quantization 组合实验也显示 Forcing-KV 可与量化叠加,例如 LongLive 60 秒从 26.71 FPS / 1.30× 进一步到 28.05 FPS / 1.37×,质量几乎不变。这些结果表明它更像一个 inference-side cache policy,而不是只服务某个固定模型的特殊 case。

局限性也很清楚。首先,方法依赖 head 功能稳定性;如果某个新 AR diffusion 架构的 head 分工不稳定,单 prompt offline profiling 可能不足,需要更多 prompts 或在线校准。其次,dynamic similarity pruning 当前用第一 block key states 作为 proxy,节省了计算但可能漏掉深层语义变化;场景切换、镜头快速转场或复杂交互可能让“相邻帧低相似度即重要”的假设变弱。第三,chunk discontinuity 指标假设视频没有 scene cut,因此更适合评估连续生成,不适合剪辑式视频。最后,代码仓库主要提供推理与评估配置,复现实验仍需要相应基础模型权重、H200 级 GPU 和 VBench/VBench-Long 环境;它没有证明压缩策略与训练阶段联合优化后的上限。