蚂蚁集团算法实习:流式长时视频生成与编辑、Prompt Control 与实时推理优化

4990 字
25 分钟
蚂蚁集团算法实习:流式长时视频生成与编辑、Prompt Control 与实时推理优化

实习背景#

2026 年 5 月起,我在蚂蚁集团担任视频生成算法实习生,主要围绕

流式长时视频生成与编辑(Streaming Long Video Generation & Editing)

开展研发工作。

传统视频生成模型通常面向固定长度视频进行离线生成,当生成时间继续延长,或者希望在生成过程中动态修改内容时,会逐渐暴露出几个问题:

  • 固定时间窗口限制,难以持续向后生成;
  • 跨 Chunk 生成时容易出现内容跳变和长时 Drift;
  • 新 Prompt 需要经过较长 Buffer 才能作用于输出;
  • V2V 场景还需要同时保持原视频结构、编辑语义和时间连续性;
  • 多步扩散 / Flow Matching 推理速度较慢,难以满足实时交互需求。

因此,我的工作主要沿着一条主线展开:

流式长时视频生成
Streaming Prompt Control
Streaming V2V 视频编辑
DMD + Multi-GPU 实时推理

Lance 和 LTX 主要作为不同的视频生成基模,用于验证这些 Streaming 方法的有效性与可迁移性,而不是分别设计两套独立方案。

最终希望实现的是:

一个能够持续生成、持续编辑、动态响应用户指令,并进一步具备实时交互能力的视频生成系统。


流式长时视频生成#

流式长时视频生成整体流程图
流式长时视频生成整体流程图

如果直接将离线的视频生成模型应用于长时视频生成,通常会出现严重的Drifting和误差累积等问题

可以看到如果直接拿离线模型生成长视频,前半段还算正常,但6s后就会出现明显的内容跳变和噪声累积。

流式长视频生成的核心,是将原本一次性完成的固定长度视频去噪,改造成可以持续运行的:

Stream Queue + Chunk Denoising

框架。

整个过程分别包含训练和推理两个阶段。


Streaming Training#

假设模型时间维输入长度为:

num_latent_t = 32

其中包含:

Sink Token 1 Latent
Motion Frame 1 Latent
Video Latents 30 Latents

当:

chunk_size = 5

时,30 个 Video Latents 可以划分为 6 个 Chunk:

Sink | Motion | Chunk0 | Chunk1 | Chunk2 | Chunk3 | Chunk4 | Chunk5

Streaming Training 的关键不是让所有 Chunk 使用相同噪声,而是显式模拟真实流式推理时:

不同 Chunk 同时处于不同去噪阶段。

例如可以构造:

Chunk0 Chunk1 Chunk2 Chunk3 Chunk4 Chunk5
↓ ↓ ↓ ↓ ↓ ↓
低噪声 较低 中等 较高 高 高噪声

也就是沿 Stream Queue 形成一组阶梯状噪声

训练流程可以概括为:

长视频
VAE Latent
随机裁剪训练片段
对齐对应 Caption / Prompt
选择 Chunk Size
划分多个 Chunk
分别施加不同等级的阶梯噪声
Sink + Motion Frame + Noisy Chunks
模型 Forward
学习不同去噪阶段下的 Chunk Recovery

同时结合 Sink Token、Motion Frame、Reference Noise、长视频 Random Crop 等机制,使模型能够在有限时间窗口中持续利用历史信息。


Streaming Inference#

推理阶段需要复现训练阶段的阶梯噪声状态。

首先根据初始 Prompt 正常完成一次视频去噪,同时保留不同去噪阶段对应的中间状态:

Noise
Step 1
Step 2
...
Clean Video

随后从这些状态中取出不同 Noise Level 的 Latent,组成初始 Stream Queue:

Sink | Motion | Chunk0 | Chunk1 | Chunk2 | Chunk3 | Chunk4 | Chunk5
↓ ↓ ↓ ↓ ↓ ↓
Clean Low Mid High Higher Noise

之后进入循环:

Denoise
最前端 Chunk 完成去噪
Emit 输出
Queue Shift
历史信息更新
新的高噪声 Chunk 加入队尾
继续 Denoise
Repeat

即:

Denoise → Emit → Shift → Refill → Repeat

通过不断复用固定长度的 Stream Queue,模型不需要重新处理完整历史视频,从结构上摆脱固定总视频长度的限制。


长时稳定性#

Streaming 架构跑通后,真正困难的问题变成:

如何让几十秒、几分钟之后的视频仍然保持稳定?

早期实验中主要出现两类现象:

  • 跨 Chunk 周期性内容跳变;
  • 长时间生成后主体、背景逐渐 Drift,最终出现明显噪声累积。

后续主要从历史条件和训练 / 推理分布一致性两方面进行优化:

  • 使用历史 Clean Frame / Motion Frame 为后续 Chunk 提供连续上下文;
  • 引入 Sink Token 保留长期全局语义;
  • 调整 Motion Frame 的输入与输出职责,减少周期性内容跳变;
  • 对长视频进行 Random Crop,避免模型只学习视频开头;
  • 对不同 Chunk、历史条件和 Reference 引入更符合流式推理过程的噪声设计。

在 Lance 上,模型从原本只能生成约数秒的视频逐渐扩展到分钟级持续生成,目前可以稳定生成较长视频,Streaming 结构本身可以继续向后运行。

在 LTX 上也观察到了类似结果:经过 Streaming Training 后,约 2 分钟视频后半段的主体和场景 Drift 明显小于原始权重,说明这种流式训练方式并不局限于单一基模。


Streaming Prompt Control#

长视频能够持续生成之后,还存在一个问题,就是模型响应prompt的时间过慢。

如上视频所示,Prompt变换后通常需要十几秒甚至几十秒才能有所响应

因此,下一步是让模型具备:

生成过程中实时接收新的 Prompt,并修改后续视频内容。

流式Prompt响应优化
流式Prompt响应优化

例如:

白天
黑夜
下雨
海啸

而不是每次修改 Prompt 都重新启动一次视频生成。

Streaming Prompt Control 最主要的问题是:

新的 Prompt 输入以后,为什么不能立刻改变下一帧?

原因在于 Stream Queue 中同时存在多个已经部分去噪的 Chunk。

例如:

Prompt 1
Sink | Motion | Chunk0 | Chunk1 | Chunk2 | Chunk3 | Chunk4 | Chunk5
↑ ↑ ↑ ↑ ↑ ↑
已经携带不同程度的 Prompt 1 信息

当 Prompt 2 输入时,这些 Chunk 并不会瞬间消失,因此新 Prompt 需要逐步穿过整个 Queue,最终才会反映到输出视频。

这形成了一个很明显的 Trade-off:

Buffer 长
→ 上下文丰富
→ 视频连续性好
→ Prompt 响应慢
Buffer 短
→ Prompt 响应快
→ 历史信息不足
→ 视频连续性下降

针对这一问题,目前主要设计了两条方案。


Motion Frame Buffer:无需训练的 Prompt 响应加速#

第一种方案完全修改推理结构,无需重新训练模型

原始 Streaming 输入为:

num_latent_t = 32
Sink | Motion | Chunk0 | Chunk1 | Chunk2 | Chunk3 | Chunk4 | Chunk5

其中:

Sink = 1
Motion Frame = 1
Streaming = 30 Latents

chunk_size = 5 时,相当于有:

6 个待去噪 Chunk

新的 Prompt 因此需要经过较长的 Stream Queue。

我的思路是:

保持模型看到的总历史长度基本不变,但减少真正处于去噪状态的 Chunk 数量。

具体增加一个:

Motion Frame Buffer

例如设定:

Motion Frame Buffer = 21 Latents

新的输入结构变成:

Sink | Motion | Motion Frame Buffer | Chunk0 | Chunk1
← Clean Historical Latents → ← Noise →

此时模型看到的时间上下文仍然接近原来的 32 个 Latents,但真正处于 Streaming Denoising 状态的只剩:

32 - 1 - 21 = 10 Latents

当:

chunk_size = 5

时,也就是:

2 个 Chunk

FIFO 历史更新#

Motion Frame Buffer 初始为空。

随着视频不断生成,每输出一个新的 Chunk,就把其中的历史 Clean Frame 按照 FIFO 的方式写入 Motion Frame Buffer:

输出 Chunk
提取历史 Clean Latents
写入 Motion Frame Buffer
最旧历史被移出
保持固定长度

因此虽然真正参与阶梯去噪的 Chunk 数量减少了,但模型仍然能够看到较长的历史视频。

Prompt Switch#

当用户修改 Prompt 时:

Prompt 1
[SWITCH]
Prompt 2

此时直接清空 Motion Frame Buffer:

Clear Motion Frame Buffer

避免模型继续大量参考 Prompt 1 对应的历史内容。

之后再由 Prompt 2 生成的新内容逐渐重新填入 Buffer。

这样,新 Prompt 不再需要经过 6 个 Chunk,而只需要经过约 2 个 Chunk 就能够完整作用于输出。

实验中可以做到:

30 s 输入新 Prompt,约 3~4 s 后开始出现明显响应。

这一方案的主要优势是:

  • 无需训练;
  • 可以直接应用于已有 Streaming Checkpoint;
  • 仍然保留较长历史上下文;
  • 显著缩短 Prompt 的有效传播路径。

代价是活跃 Streaming Chunk 数量减少以后,每轮能够向前推进的视频长度下降,因此整体生成吞吐也会有所降低。

这一点与后面的少步蒸馏具有较强的互补性:

Motion Frame Buffer
缩短 Prompt Buffer
+
DMD Distillation
减少单 Chunk 去噪步数
低延迟 + 长上下文 + 高吞吐

DMD Prompt Transition:学习如何切换 Prompt#

Motion Frame Buffer 是从推理结构缩短 Prompt 生效路径。

另一条路线则是:

直接让模型学习“Prompt Transition”本身。

这里同样使用 DMD,但需要特别区分:

这里的 DMD 不是为了减少采样步数,而是为了训练 Streaming Prompt Transition 能力。

整个训练过程分为五个阶段。

Stage 1:生成当前视频状态#

首先使用:

[CONTINUE] + Prompt 1

从普通噪声开始正常生成当前视频:

Noise
Student
x_stage1

其中 x_stage1 表示当前 Prompt 1 对应的视频状态。


Stage 2:构造真实 Streaming Queue#

x_stage1 不直接重新从纯噪声生成,而是按照 Streaming 推理时的方式重新加入阶梯噪声

x_stage1
Chunk0 Chunk1 Chunk2 Chunk3 Chunk4 Chunk5
↓ ↓ ↓ ↓ ↓ ↓
Clean Low Mid High Higher Noise

得到一个模拟真实 Streaming 状态的 Stream Queue。

此时 Queue 中仍然保留 Prompt 1 产生的中间状态。


Stage 3:切换到新的 Prompt#

然后输入:

[SWITCH] + Prompt 2

让 Student 不从头生成,而是从已有 Streaming Queue 状态继续去噪:

Stream Queue from Prompt 1
+
[SWITCH] + Prompt 2
Student
x_transition

x_transition 就是 Student 当前生成出来的 Prompt Transition 结果。

例如:

Prompt 1:白天城市
↓ SWITCH
Prompt 2:夜晚城市
白天 → 黄昏 → 夜晚

Stage 4:DMD Distribution Matching#

得到 x_transition 后,再对它进行一次 DMD 随机加噪:

x_transition
Random Noise Level
x_t

随后分别送入:

real_score

与:

fake_score

其中:

real_score
→ 描述 Teacher 目标分布
fake_score
→ 描述当前 Student Prompt Transition 分布

比较二者对当前 noisy sample 的预测差异。

直观理解就是:

Teacher 认为一个自然的 Prompt 2 视频应该朝哪个方向恢复,而 Student 当前生成出来的 Transition 又位于什么分布。


Stage 5:只更新 Prompt Transition 能力#

利用:

real_score - fake_score

形成 DMD Gradient,并更新 Student。

因此训练目标不是:

30 step → 6 step

而是:

Student Transition Distribution
逼近
Teacher Distribution

也就是只重点训练:

当 Streaming Queue 中仍然保留 Prompt 1 的状态时,模型如何响应 Prompt 2,并自然完成语义转换。

完整流程可以概括为:

[CONTINUE] + Prompt 1
生成 x_stage1
构造阶梯噪声 Stream Queue
[SWITCH] + Prompt 2
Student Streaming Denoising
生成 x_transition
随机加噪
real_score / fake_score
DMD Gradient
Update Student
学习 Prompt Transition

这个方案还有一个比较重要的优势:

不依赖真实 Prompt Transition 视频训练数据。

训练过程中只需要构造:

Prompt 1 → Prompt 2

的文本 Pair。

例如可以直接通过大语言模型批量生成:

白天城市 → 夜晚城市
晴天森林 → 暴雨森林
普通人物 → 钢铁侠
平静海面 → 海啸场景

视频状态本身可以由 Teacher / Student 在线生成,因此不需要人工采集大量:

Prompt 1 状态 → Prompt 2 状态

对应的真实渐变视频。

这使得 Prompt Transition 训练数据可以较低成本地扩展。


Streaming V2V 视频编辑#

除了 T2V Streaming 和 Prompt Control,另一项重要目标是:

Streaming Long Video-to-Video Editing

也就是:

输入一段持续到来的原视频,在保持主体、动作和整体时序结构的同时,根据编辑 Prompt 持续修改视频内容。

相比 T2V,Streaming V2V 的条件更加复杂:

Source Video
+
Editing Prompt
+
Historical Generated Video
+
Current Stream Queue
Edited Streaming Video

模型既要理解原视频,也要保证:

  • 原视频主体结构尽可能保持;
  • Prompt 编辑效果足够明显;
  • 跨 Chunk 不出现明显跳变;
  • 编辑效果不会随着时间逐渐消失;
  • 长时间运行后仍然保持稳定。

目前 Lance 和 LTX 上的 Streaming V2V 仍在继续补充实验,因此现阶段主要完成了 V2V 数据和训练 Pipeline 的准备。


50 万规模高质量编辑数据:为 V2V 服务#

为了进一步训练视频编辑能力,我构建了约 50 万对高质量指令式图像编辑数据

这部分工作并不是独立的数据集项目,而是服务于后续:

Image Editing → Video Editing → Streaming V2V

能力扩展。

整体数据生产流程包括:

原始图像采集
分辨率 / 内容筛选
Gemini 生成 Editing Prompt
Prompt 分类与 Case Sampling
GPT-Image-2 生成 Edited Image
Source / Prompt / Target 三元组展示
VLM + 人工质量过滤
高质量 Editing Pair

数据覆盖人物、动物、场景和物体等多种类型。

其中重点关注:

  • 编辑变化必须足够明显;
  • Prompt 必须准确作用于目标主体;
  • 编辑前后主体身份和结构尽可能稳定;
  • 避免无意义的光线、气味等弱视觉变化;
  • 避免比例、尺寸发生不必要的大幅变化;
  • 减少明显 Artifact 与结构错位。

这些数据首先提供高质量:

Source Image
+
Editing Instruction
Target Image

监督,使模型学习“什么应该保持、什么应该修改”。

后续再进一步加入时间维条件和 Streaming Queue,将编辑能力扩展到连续视频。

以下为部分编辑样例:

图像编辑样例:角色与服饰
图像编辑样例:角色与服饰

图像编辑样例:人物风格转换
图像编辑样例:人物风格转换

图像编辑样例:场景与物体编辑
图像编辑样例:场景与物体编辑

图像编辑样例:动物与形态转换
图像编辑样例:动物与形态转换


实时视频生成#

完成 Streaming 后,另一个重要问题是:

如何让这个系统真正以接近播放速度的吞吐持续运行?

实时视频生成加速
实时视频生成加速

主要瓶颈仍然来自多步 DiT / Flow Matching Denoising。

当前默认采样约:

30 Steps

输出视频本身为:

8 FPS

这里需要区分两个概念:

  • 8 FPS:生成视频的帧率;
  • 约 0.8 FPS:初始单 GPU 30-step 配置下实际生成吞吐。

因此初始系统速度约为:

0.8 FPS
≈ 0.1 × realtime

实时化主要从两个维度推进:

减少单 Chunk 去噪次数
+
多个 Chunk 并行计算

DMD 少步蒸馏#

这里再次使用 DMD,但和前面的 Prompt Transition DMD 目标不同。

这里的目标明确是:

减少 Sampling Steps,提高生成速度。

原始模型约需要:

30-step

而默认 Stream Queue 中有:

6 个 Chunk

当:

chunk_size = 5

时,每个 Chunk 至少需要一次有效的 Denoising Update。

因此主要目标设定为:

30-step Teacher
DMD Distillation
6-step Streaming Student

也就是:

30 → 6

理论上将去噪时间缩短为原来的:

6 / 30 = 1 / 5

约获得:

的计算加速。


Multi-GPU Chunk Parallelism#

Streaming 架构还天然暴露出了时间维上的并行性。

一个 Stream Queue 中:

Chunk0 | Chunk1 | Chunk2 | Chunk3 | Chunk4 | Chunk5

不同 Chunk 同时存在,只是分别位于不同的 Noise Level。

在一次 Streaming Iteration 内,可以将它们分别放到不同 GPU 上:

GPU 0 → Chunk 0
GPU 1 → Chunk 1
GPU 2 → Chunk 2
GPU 3 → Chunk 3
GPU 4 → Chunk 4
GPU 5 → Chunk 5

各 GPU 并行完成当前 Chunk 对应的一次 Denoising Update:

GPU0 ─┐
GPU1 ─┤
GPU2 ─┤
GPU3 ─┼→ Sync → Update Stream Queue
GPU4 ─┤
GPU5 ─┘

随后统一同步 Queue 状态,再进入下一轮 Streaming Iteration。

这里利用的不是传统意义上的模型切分,而是 Streaming Video 本身产生的:

Chunk-Level Parallelism

因此在 6 个 Chunk 的配置下,理论上还可以进一步获得接近:

的并行加速。

实际运行中需要考虑:

  • GPU 间通信;
  • Queue Scheduling;
  • 数据同步;
  • VAE Decode;

因此不会达到理想的线性加速。


从 0.1× Real-time 到约 20 FPS#

整体实时推理优化链路为:

30-step Streaming
6-step DMD
6-GPU Chunk Parallelism
Async VAE Decode
Real-Time Streaming Video

初始吞吐约:

0.8 FPS

DMD 将:

30 → 6

理论上约:

0.8 × 5 ≈ 4 FPS

再使用 6 GPU 并行处理 6 个 Chunk:

4 × 6 ≈ 24 FPS

因此理想情况下可以达到约:

24 FPS

的实时视频吞吐。

进一步考虑 GPU 通信、调度以及 VAE Decode 等工程开销后,最终实际吞吐约为:

20 FPS

也就是说,整个系统从最初约:

0.1× realtime

逐步提升到接近实时运行。

这也是 Streaming 架构的重要价值之一:

它不仅解决“视频能不能持续生成”,同时还把原本串行的视频去噪过程拆解成可以进一步蒸馏和并行优化的计算结构。


视频增强#

生成模型本身主要负责视频内容和实时生成能力。

显示侧还可以进一步使用独立的视频增强模块:

  • FlashVSR:提高视频空间分辨率;
  • RIFE:进一步提高播放帧率。

生成模型与后处理模块保持解耦,可以根据不同应用场景在实时性和视觉质量之间进行调整。


阶段性总结#

整个实习围绕:

如何把离线视频生成模型变成可以持续运行、持续编辑并实时交互的视频生成系统

逐步推进。

整体能力链路可以概括为:

Fixed-Length Video Generation
Streaming Long Video Generation
Streaming Prompt Control
Streaming V2V Editing
DMD Distillation
Multi-GPU Parallelism
Real-Time Interactive Video Generation

目前主要形成了以下几项阶段性结果:

1. Streaming Long Video#

通过 Chunk-based Stream Queue、阶梯噪声训练和历史条件建模,将固定长度离线视频生成扩展到分钟级持续生成,并在 Lance / LTX 等不同基模上验证了 Streaming Training 对长时 Drift 的改善作用。

2. Streaming Prompt Control#

实现运行过程中动态修改 Prompt,并围绕 Prompt 响应延迟进一步提出:

Motion Frame Buffer

和:

DMD Prompt Transition

两条互补路线。

前者从推理结构上缩短有效 Buffer,不需要重新训练;后者直接让模型学习如何从旧 Prompt 的 Streaming 状态自然过渡到新 Prompt,并且不依赖真实视频 Transition 数据。

3. Streaming V2V#

围绕长时视频编辑继续扩展 Streaming 架构,并构建约 50 万规模的高质量 Editing Pair,为后续 V2V 指令理解和目标外观监督提供训练基础。

4. Real-Time Generation#

通过:

30-step → 6-step DMD

减少单 Chunk 计算量,再结合:

6-GPU Chunk Parallelism

并行处理 Stream Queue,最终将生成吞吐从约:

0.8 FPS

提升到约:

20 FPS

逐步接近实时视频生成。

相比单纯提升一次视频生成的视觉质量,这段实习让我更关注的是:

生成模型如何从一个离线 Demo,真正演变成具有长时记忆、动态控制、视频编辑和实时推理能力的持续运行系统。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

蚂蚁集团算法实习:流式长时视频生成与编辑、Prompt Control 与实时推理优化
https://example.com/posts/interview/00-ant-streaming-video-generation/
作者
王睿之
发布于
2026-08-09
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
王睿之
浙大 AI 方向硕士生|CV/多模态学习|AAAI & CVPR Findings 一作 | 校十佳大学生 | 国家奖学金
个人主页导航
欢迎访问我的个人作品站。可优先查看首页置顶的 6 篇项目/实习文章,快速了解科研与工程能力。
分类
标签
站点统计
文章
8
分类
4
标签
38
总字数
17,828
运行时长
0
最后活动
0 天前

目录