Tencent GY-Lab(QQ影像中心)实习|流式实时可交互长视频生成:双向教师 → 因果流式 → 实时数字人
的长视频系统:先用 I/R2AV + Teacher/Diffusion Forcing 训出 30 步因果学生,再用 Self-Forcing + DMD 蒸馏到 8 步,靠 blank chunk + KV-Cache 双阶段纠偏稳住 8–10 分钟长视频,最后在单卡 H20 上做到 5 秒视频 4 秒出片(约 20 倍加速)、28 fps 的可交互数字人。
1. 背景与目标
线上这套视频生成模型是双向的:它得一次看完全部上下文再出片,一次只能产出 10 秒级、和人相关的剧情片段。10 秒讲不完一个故事,用户也无法在生成过程中插话——这两点决定了它既撑不起长时叙事,也做不了实时交互。
所以这段实习的核心命题,是把生成范式从双向重构为因果流式:模型逐 chunk 往外吐内容,边生成、边播放、边响应新输入。但因果化不是免费的午餐,长视频生成绕不开三道坎——人物 ID 一致性(分钟级滚动下脸不能变)、误差累积(因果链上每个 chunk 的残差会被继承放大)、场景切换(新 prompt 要能及时改变画面)。后面的全部工作,都是围绕这三道坎展开的。
2. 基础质量保障:TF+DF
因果化的第一步,是把教师模型在目标域里磨快。我们在大量多分镜 Human-about 数据上为 LTX-2.3 (22B) 训练了 I/R2AV,强化它在视频、人声、背景音频三个维度上的生成质量——教师只有在目标域足够强,后续蒸馏出来的学生才有意义。
第二步是把双向教师改造成能因果运行的学生,用的是 Teacher Forcing + Diffusion Forcing 混合训练。两种策略各管一头:Teacher Forcing 让历史 chunk 全部使用干净真实值,训练简单稳定;Diffusion Forcing 让每个 chunk 处在独立的随机噪声等级上,模型由此见过各种「带噪历史」的组合——推理时历史不必完全去噪就能给下一个 chunk 用,这正是后面多卡流水线并行的基础。
混合训练结束后,我们拿到了一个 30 步因果学生模型。它已经能流式生成,是长视频全部后续工作的基线。

3. 长视频稳定性
3.1 Self-Forcing + DMD:30 步蒸馏到 8 步
30 步学生有两个问题。一是训推不一致:训练时历史是干净数据或随机噪声,推理时历史却是模型自己刚生成的、已经带残差的结果,这个分布差异(Exposure Bias)会让误差逐帧放大。二是 30 步去噪对实时交互来说还是太慢。
解法是 Self-Forcing + DMD 联合训练:Self-Forcing 让学生在自己的历史输出上继续 rollout,从源头消除 Exposure Bias;DMD 用 Fake Score(学生当前 score)与 Real Score(冻结教师 score)之差做分布匹配,让少步生成既贴近真实分布、又不被「平均掉」。两者联合,推理步数从 30 步压到 8 步。
3.2 误差累积的根因
8 步学生能流式,但到 5–10 分钟就开始漂移、突然崩坏。四个原因:
1) 传递。 帧 的输出经 KV cache 成为后续帧的 attention 输入。高注意力权重把该帧误差 近乎无衰减地引入当前帧——这是无损搬运,本身不改变误差量级。
2) 累加(可靠机制)。 每帧生成自身还产生新误差 ,旧误差又不被清除,于是误差随帧数线性增长。这是误差累积中无争议的部分,只需「误差不消失 + 每帧新增」即可成立,无需任何放大假设。
3) attention 的注意和非线性激活(条件性)。 这个可能会使当前的误差被放大——人的眼睛对误差是很敏感的,相较于现在真实的东西。
4) 过度关注(面试官提的)。 当前 chunk 对前面某一个 chunk 或者某一帧、几帧过度关注导致的误差累积。误差累积强度正比于 attention 集中度:权重塌缩到单帧时,旧误差得不到多帧平均稀释( 通道被堵),累加更快,也更早触达 OOD 阈值;权重分散则单帧误差被稀释、无法主导输出。
每条一句话:传递让旧误差经 KV cache 无损进入后续帧;累加让误差不消失、每帧新增、线性增长;注意力与非线性激活条件性放大误差,而人眼对误差格外敏感;过度关注让集中度越高、稀释越少,累加越快、越早 OOD。
3.3 误差累积解决方案
对策从训练和推理两侧同时下手,正好分别对应上面第 4 点和第 1、2 点。
训练侧:blank chunk 平滑注意力分布。 既然注意力分布尖锐本身就是误差来源,那就让注意力摊开——训练时随机把部分历史 chunk 置为空白(blank chunk),模型被迫把注意力分散到更多帧上,「选错关注对象 → 误差放大」的脆弱性从源头被削弱。
推理侧:KV-Cache 双阶段纠偏。 第一阶段做身份锚定与注意力筛选:以首个 block 的人物特征作为 Identity Anchor,整段生成期间锁定不动,充当永不漂移的干净基准;同时用注意力分数筛出「对当前帧贡献大、且时间分布广」的历史帧,抑制冗余误差传播。第二阶段做在线纠偏:用锚定统计量持续校准漂移的历史特征,把它们拉回身份锚附近的可信分布。
两侧合力,最终模型可以稳定生成长达 8–10 分钟的因果流式视频,全程保持人物 ID 一致,并支持自然场景切换。

4. Prompt 遵循:Recache
长视频还有一个坑:用户换了 prompt,画面却经常不响应。排查下来根因很明确——KV-Cache 被旧 prompt 污染,旧 prompt 的条件特征残留在缓存里,新 prompt 的信号一来就被稀释掉了。
解法借鉴 LongLive 的 recache 策略:检测到场景切换时,清掉受污染的 KV-Cache,基于新 prompt 重新生成。这样人物的肢体动作、画面里的物品、乃至整个场景,都能跟着新 prompt 干净利落地切换。
5. 工程化落地
训练解决了「能不能流式」和「能不能长」,工程要解决的是「够不够快」。
多卡流水线:物理意义上的「单步」生成。 Teacher Forcing 模型推理只能严格串行,每 8 步才吐一个 chunk;Diffusion Forcing 模型因为训练时见过 的各种噪声组合,历史不等干净就能给下一个 chunk 用。让每张 GPU 固定负责一个噪声等级,chunk 像工件一样流过多卡:流水线灌满后进入稳态,每张卡每步只做一步去噪,每步就产出一个 chunk。再叠加 Self-Forcing 训练中形成的 exit step 能力(每个 block 以一个 exit step 收尾、产生训练信号),这套流水线达到了物理意义上的「单步」生成——用户不用再等一个 chunk 走完完整的串行去噪链路。
关键性能。 121 帧、5 秒、768×512 分辨率的视频,单卡 H20 上 4 秒出片;同样的活儿,8 步双向教师要 76 秒——接近 20 倍的加速。
| 配置 | 时间 |
|---|---|
| 8 步双向教师 | 约 76 秒 |
| 因果学生 + 并行推理(单卡 H20) | 约 4 秒 |
实时交互闭环。 最后把所有能力串成一个可交互数字人 demo:MLLM 配一个简单的记忆系统,理解用户输入的图像和 prompt 并生成回答;回答交给流式视频模型逐 chunk 生成画面;ffmpeg 同步推流播放。整条链路跑起来,生成帧率高达 28 fps——用户不用等整段视频结束,生成过程中随时可以插话,模型据此更新后续画面。
6. 效果汇总
| 项目 | 结果 |
|---|---|
| 视频配置 | 121 帧、5 秒、768×512 |
| 因果学生 + 并行推理 | 单卡 H20 约 4 秒 |
| 8 步双向教师 | 约 76 秒 |
| 相对加速 | 近 20 倍 |
| 长视频稳定时长 | 8–10 分钟 |
| 实时生成帧率 | 高达 28 fps |
| 交互方式 | MLLM + 记忆系统 + 逐 chunk 生成 + ffmpeg 推流 |
7. 流式视频生成效果展示
7.1 因果化基础生成样例
Teacher/Diffusion Forcing 训练后的 30 步因果生成,以及 Self-Forcing + DMD 蒸馏后的 8 步生成。每个视频左右两栏分别是 student 与 teacher 的对比:
7.2 长视频稳定性
KV-Cache 双阶段纠偏下的稳定长视频(1 分钟级切片)。Identity Anchor 锚定下,人物 ID、面部特征和服装在整段时间内保持一致:
对照:没有纠偏机制时,长视频后期人物 ID 漂移、突然崩坏的失败样例:
7.3 参考图驱动的人相关片段(I/R2AV)
参考图条件下的动作与镜头切换:
7.4 实时交互 demo 与推理速度
串联 MLLM、记忆系统、流式生成和 ffmpeg 推流后的完整 demo,以及推理时间与 FPS 测试:
8. 总结
回头看,整条链路环环相扣:I/R2AV 把教师磨快,Teacher/Diffusion Forcing 把双向教师改造成 30 步因果学生,Self-Forcing + DMD 蒸馏到 8 步并消除 Exposure Bias,blank chunk 与 KV-Cache 双阶段纠偏一起把误差累积按住,换来 8–10 分钟的稳定长视频;Recache 让 prompt 切换干净利落;最后多卡流水线与推流工程把这一切变成 4 秒出片、28 fps、随时可插话的实时数字人。
「边输入、边生成、边交互」的流式长视频生成,至此才算真正跑通。