ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Causal-Forcing代码深读:KV Cache + 块状去噪如何实现实时交互视频推理

Causal-Forcing代码深读:KV Cache + 块状去噪如何实现实时交互视频推理

【免费下载链接】Causal-Forcing

[ICML 2026] Official codebase for "Causal Forcing: Autoregressive Diffusion Distillation Done Right for High-Quality Real-Time Interactive Video Generation" & Causal Forcing++

项目地址:https://gitcode.com/gh_mirrors/ca/Causal-Forcing
点击查看免费下载

Causal-Forcing 是一个面向实时交互视频生成的开源项目,核心思想是用KV Cache(键值缓存)与块状去噪(block-wise denoising)把视频生成拆成"一块一块往外吐帧"的流式过程,从而在 1~4 步去噪下实现低延迟、可交互的实时视频推理。本文带你从推理管线pipeline/causal_inference.py和因果 Transformerwan/modules/causal_model.py出发,看懂这两块"发动机"是如何协作的。

一、为什么"实时交互视频"这么难

传统视频扩散模型是**双向(bidirectional)**的:整段视频的所有帧一次性、互相看见地去噪。这种方式画质高,但有两个致命问题:

  • 无法流式:必须等全部帧去噪完才能解码出第一帧,延迟极高;
  • 无法交互:生成中途改不了内容,做不了"世界模型"式的实时交互。

Causal-Forcing 的解法借鉴了 LLM 的自回归思路:让模型只朝前看(causal),一次生成一小块(1 帧或 3 帧),生成完立即把它的 KV 写进缓存,供后续帧使用。缓存机制来自wan/modules/causal_model.py中的自注意力实现,流式调度来自pipeline/causal_inference.py。

二、三阶段训练:为实时推理"铺路"

上面这张总览图展示了 Causal Forcing、Causal Forcing++ 与 Self Forcing 的差异。推理阶段能又快又好,靠的是训练时的三阶段蒸馏(配置见 configs/causal_forcing_dmd_framewise.yaml):

  1. Stage 1 — AR Diffusion:先教会模型"因果地"逐块预测(configs/ar_diffusion_tf_framewise.yaml里num_frame_per_block: 1)。
  2. Stage 2 — Causal ODE / Causal CD:做初始化,把双向 teacher 的能力迁移到自回归学生上,且保证帧级可注入(frame-level injectivity)。
  3. Stage 3 — 非对称 DMD:把去噪步数压缩到 4 步 / 2 步 / 1 步,实现少步高效推理。

训练完的模型参数直接决定推理时的去噪步数——配置里的denoising_step_list就是"发动机转速"。

三、KV Cache:让自回归"记住过去"

实时推理的关键是:生成第 N 块时,不需要重算前面 1~N-1 块的注意力。CausalInferencePipeline在初始化时预分配了整条视频所需的 KV 缓存:

# pipeline/causal_inference.py def _initialize_kv_cache(self, batch_size, dtype, device): for _ in range(self.num_transformer_blocks): # 30 个 Transformer 块 kv_cache1.append({ "k": torch.zeros([batch_size, kv_cache_size, 12, 128], ...), "v": torch.zeros([batch_size, kv_cache_size, 12, 128], ...), "global_end_index": ..., "local_end_index": ... })

真正读写缓存的逻辑在 wan/modules/causal_model.py 的CausalWanSelfAttention.forward中:

  • 只有当前块的 query 参与计算,key/value 从kv_cache中取历史段拼接后做注意力;
  • 每生成一块,把新帧的roped_key/v追加进缓存,并推进global_end_index、local_end_index两个游标;
  • 配合 RoPE 位置编码(causal_rope_apply里的start_frame),让新帧知道自己在时间轴上的绝对位置,保证时序连续。

长视频的"滚动窗口 + 注意力沉"

为了让视频可以无限延长、显存不爆,模型支持局部注意力(local_attn_size):缓存只保留最近若干帧,最旧的帧被"滚出"。同时sink_size参数会固定保留最初若干帧(类似 LLM 的 attention sink),防止滚动后上下文丢失。这段逻辑同样在CausalWanSelfAttention.forward的if self.local_attn_size != -1 ...分支中——正是它能生成分钟级长视频(见 long_video/)的底层支撑。

四、块状去噪:把"去噪"切成小块

所谓块状去噪(block-wise denoising),就是把一段 21 帧的视频拆成num_frame_per_block大小的块,逐块、少步地"精修":

# pipeline/causal_inference.py for block_index, current_num_frames in enumerate(all_num_frames): # 每个块内部:少步去噪循环 for index, current_timestep in enumerate(current_denoising_list): _, denoised_pred = self.generator(noisy_input, ..., kv_cache=self.kv_cache1, ...) # 块生成完 → 用干净帧刷新 KV cache,供下一块使用 self.generator(denoised_pred, timestep=0, kv_cache=self.kv_cache1, ...)

两个可自由调节的"粒度旋钮":

模式num_frame_per_block效果
frame-wise(帧级)1每块 1 帧,延迟最低、最易交互,原生支持 I2V
chunk-wise(块级)3每块 3 帧,计算更省、动态更丰富

denoising_step_list控制每个块去噪几遍:4 步模型是[1000,750,500,250],Causal Forcing++ 的 2 步 / 1 步模型分别压缩到 2 步 / 1 步(见 configs/causal_forcing_dmd_framewise_1step.yaml)。步数越少,单块耗时越短,实时性越强。

上面这张prompts/i2v/26-15/000001.png就是 I2V(图生视频)的条件输入图。frame-wise 模型天然支持 I2V:把第一帧的 latent 作为initial_latent喂给管线,管线会先把它的 KV 写入缓存,再逐帧向后生成,实现"以这张图开头"的实时视频。

五、实时交互:流式推理与首帧延迟

推理管线跑通后,真正的"实时感"来自流式解码 + 逐块推送。demo.py 实现了一个 Flask + SocketIO 的交互式服务:

  • 每生成一块,立刻用 VAE 解码成像素,逐帧放进发送队列推给前端,而不是等整段视频;
  • 记录first_chunk_time(首块延迟)与last_generation_time(总耗时),用来衡量实时 FPS;
  • 配合demo_utils/下的 VAE 加速(TAEHV / TensorRT)进一步压低解码开销。

这样用户看到的不是"转圈 30 秒后出片",而是边生成边播放——这正是"交互视频 / 世界模型"体验的核心。

六、快速跑通推理

配置与权重准备好后,用 inference.py 一键推理。以 frame-wise 4 步模型为例:

python inference.py \ --config_path configs/causal_forcing_dmd_framewise.yaml \ --output_folder output/framewise \ --checkpoint_path checkpoints/framewise/causal_forcing.pt \ --data_path prompts/demos.txt \ --use_ema

想测实时延迟,加--report_timing即可打印首块延迟与 FPS;想做 I2V 加--i2v并把数据指向prompts/i2v。

小结

Causal-Forcing 用两个关键机制把"高画质"和"实时交互"统一起来:

  • KV Cache:让自回归模型"记住过去",新帧只算增量注意力,local_attn_size+sink_size滚动窗口保证长视频显存可控;
  • 块状去噪:按num_frame_per_block切块、按denoising_step_list少步去噪,块生成完即解码即推送,把首帧延迟压到最低。

一句话:KV Cache 解决"如何高效记住历史",块状去噪解决"如何边生成边交付",两者叠加,就构成了 Causal-Forcing 实时交互视频推理的完整链路。

【免费下载链接】Causal-Forcing

[ICML 2026] Official codebase for "Causal Forcing: Autoregressive Diffusion Distillation Done Right for High-Quality Real-Time Interactive Video Generation" & Causal Forcing++

项目地址:https://gitcode.com/gh_mirrors/ca/Causal-Forcing
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进