StreamingVLM: Real-Time Understanding for Infinite Video Streams
Authors: Ruyi Xu, Guangxuan Xiao, Yukang Chen, Liuning He, Kelly Peng, Yao Lu, Song Han Affiliations: MIT, NVIDIA, First Intelligence arXiv: 2510.09608 Project Page: streamingvlm.hanlab.ai GitHub: mit-han-lab/streaming-vlm
1. Motivation (研究动机)
StreamingVLM 研究的是 近乎无限长视频流的实时理解。作者指出,现有 Vision-Language Models 在这个场景下存在三类根本矛盾:
- Full Attention 不可扩展:视频越长,视觉 token 越多,attention 成本接近 ,显存和延迟都会爆炸;
- 普通 sliding window 会破坏一致性:不重叠窗口虽然省算力,但会切断上下文;重叠窗口虽然保留了一些连续性,却会因为重复计算而让延迟飙升;
- 训练与推理不匹配:真实 streaming inference 需要持续接收新视频并低延迟输出,但训练不可能真的在无限长上下文上进行,因此模型往往没有学到“如何在流式上下文里稳定工作”。
因此,这篇论文要解决的问题是:如何在不训练超长上下文模型的前提下,让 VLM 既能实时处理无限视频流,又能保持长程一致性与低延迟?
这个问题非常关键,因为未来的实时视频助理、具身智能体、自动驾驶系统,本质上都需要对持续到来的视频流进行在线理解,而不是离线地“看完整段视频再回答”。
2. Idea (核心思想)
StreamingVLM 的核心思想可以概括成一句话:用一个与 streaming inference 对齐的 KV-cache 机制做推理,并用 overlapped-chunk 的全注意力 SFT 去模拟这种推理模式,从而实现 training–inference alignment。
具体来说,它不是重新设计一个全新的 backbone,而是建立在 Qwen2.5-VL-7B-Instruct 上,通过三类机制实现流式视频理解:
- Streaming-aware KV Cache:保留 attention sink、最近文本窗口、最近视觉窗口;
- Contiguous RoPE / 3D RoPE:在 token 淘汰后把位置索引左移,保持位置连续,避免位置分布越界;
- Overlapped-chunk SFT:训练时把长视频切成短但相互重叠的片段,在片段内做 full attention,并按 1 秒粒度交错视觉与文本,从而让模型在短训练上下文中学到与流式推理一致的行为。
与现有 streaming VLM 最本质的区别在于:它不只是“推理时加一个缓存”,而是把训练过程也重构成与缓存推理相匹配的形式。
3. Method (方法)
3.1 Overall comparison with prior inference paradigms
Figure 1 解读: Figure 1 直接对比了四种长视频处理方式。(a) Full Attention 对全部 token 做全连接注意力,复杂度为 ,很快 OOM;(b) 不重叠 sliding window 虽然有界,但 chunk 被切开后上下文割裂;(c) 重叠 sliding window 为了保持一致性需要反复重算先前窗口,导致延迟高;(d) StreamingVLM 则通过“sliding window + KV reuse”保留必要历史状态,不重算旧 token,同时维持上下文连续性。图中还给出了在 Inf-Streams-Eval 上相对 GPT-4o mini 的胜率:Full Attention 只有 3.89%,普通 window 为 23.54%,重叠 window 为 66.54%,StreamingVLM 达到 66.18%,但延迟显著更稳定。
这张图准确刻画了 StreamingVLM 的定位:它不是为了追求最高离线精度,而是为了在近似不损失能力的前提下,把推理延迟压到实时范围内。
3.2 Streaming-aware KV Cache
Figure 2 解读: Figure 2 展示了 StreamingVLM 的核心推理结构。它保留三类状态:一组 attention sink token、较长的最近文本窗口,以及较短的最近视觉窗口。随着新视频到来,旧视觉 token 优先被淘汰,而文本保留更久,用于维持长程语义一致性。图中给出的默认示意是:保留 512 个 attention sink token、512 个最近文本 token,以及覆盖 16 秒的视觉窗口。这种“长文本、短视觉”的不对称缓存结构,正是为了同时兼顾语义连贯和低推理成本。
论文在方法里把这套机制称为 Streaming-aware KV Cache。与重叠 sliding window 最大的差异是:
- 它不重算旧窗口;
- 它只保留对实时输出最重要的历史状态;
- 视觉内容优先短期保留,文本内容优先长期保留。
这种设计背后的直觉很清晰:视频的局部感知需要最近帧,但长程叙事和上下文连贯更依赖文本历史。
KV Reuse 与重叠 Sliding Window 的对比(直觉理解):
假设视频分三段 A → B → C,B 是重叠部分:
(c) 重叠 Sliding Window 的做法:
- 处理 Window 1 = [A, B]:算 A 的 KV,算 B 的 KV(B 看到 A)
- 处理 Window 2 = [B, C]:重新算 B 的 KV(此时 A 不在窗口,B 看不到 A),再算 C 的 KV
- B 被计算了两次,开销大;且重算后 B 的 KV 反而丢失了 A 的影响
(d) KV Reuse 的做法:
- 处理 A:算 A 的 KV → 存入 cache
- 处理 B:算 B 的 KV(B 通过 cache 看到 A)→ 存入 cache
- 处理 C:算 C 的 KV(C 通过 cache 看到 A、B)→ 存入 cache,旧 vision KV 按策略淘汰
- 每个 token 的 KV 只算一次,后续新 token 直接复用 cache,不重算
结论:KV Reuse 不仅更快(无重算),B 的表示还更丰富(保留了 A 的影响)。两者性能差距极小(66.18% vs 66.54%),但延迟差距显著。
3.3 Contiguous RoPE / Contiguous 3D RoPE
当旧 token 被 eviction 后,如果仍保留原始位置索引,RoPE 编号会越来越大,最终超出训练时的分布范围,导致推理不稳定。为此,StreamingVLM 采用 contiguous RoPE:
- 删除早期 token 后,把后续 token 的位置统一左移;
- 使得缓存中保留 token 的位置始终落在一个固定、连续的区间内;
- 对于 Qwen-VL 一类使用 3D RoPE 的视觉 token,还要做对应的 contiguous 3D RoPE。
这一步虽然在论文中没有非常复杂的封闭公式,但从官方实现可见,它是整个 streaming stability 的关键工程细节。
在代码中:
streaming_vlm/inference/qwen2_5/pos_emb.py实现了 Qwen2.5-VL 的 RoPE 索引逻辑;train.py中通过model.get_rope_index = MethodType(get_rope_index, model)把该逻辑 patch 到模型里;streaming_vlm/inference/inference.py中通过StreamingArgs(pos_mode=...)控制流式位置模式。
3.4 Overlapped-chunk SFT
Figure 3 解读: Figure 3 说明训练策略并不是直接模拟真实 infinite streaming,而是把视频切成重叠短块。在每个块内,模型看到的是 full causal attention(即 chunk 内不加 sliding window 限制,每个 token 可以 attend 到 chunk 内所有在它之前的 token,但仍是单向因果,不是双向 attention);但由于块与块之间有 overlap,并保留 attention sink,这种训练监督与测试时的 streaming attention pattern 非常接近。换言之,作者用一个”短块 + 重叠 + full causal attention”的训练近似,逼近”长流式 + 局部缓存”的推理过程,从而在成本可接受的前提下实现训练–推理对齐。
三种 attention 的区别:
- Full causal attention:attend 范围无限制,但只看左边(自回归);Figure 1(a) 和 Figure 3 chunk 内都是这种,区别是前者范围是整段视频,后者范围限于 chunk 内
- Sliding window causal attention:只 attend 最近 W 个 token,仍是单向;Figure 1(b)(c) 和推理时的 StreamingVLM 用的是这种
- Full bidirectional attention:双向,能看到左右两边;BERT 类模型使用,autoregressive LLM 不用
训练时,作者将长视频流切成连续 chunk:
- chunk 长度为 ;
- chunk 间重叠长度为 ,满足 ;
- 默认设置是 ,。
训练数据内部按 1 秒粒度交错视觉与文本,并只在对齐到每秒 narration 的文本位置上计算 loss。如果某一秒没有 narration,就插入占位 token "..."。这样做的目的不是单纯训练 captioning,而是教会模型:
- 什么时候应该继续评论;
- 什么时候应该沉默;
- 如何利用上一秒的文本和当前秒的视频保持实时连续解说。
3.5 Data curation pipeline

Figure 4 解读: Figure 4 说明了 StreamingVLM 的数据管线。作者从五类体育比赛中收集比赛视频,先用 WhisperX 做实时 ASR,再用 GPT-5 逐句过滤、编辑和重写解说内容,构造出适合 streaming narration 的训练数据。随后又分成两条支线:一条是用于主 SFT 的 overlapped streaming chunks,另一条是强调高质量实时动作描述的 annealing data。这说明 StreamingVLM 的效果并不只来自架构 patch,也来自高度针对“实时体育解说”任务的数据工程。
作者构建的数据包括:
- Inf-Streams-Train:来自超过 4000 小时体育解说视频;
- Inf-Streams-Eval:20 场完整比赛,平均长度 2.12 小时;
- 另外还加入 Live-WhisperX-526K 等数据源作为补充。
3.6 Pseudocode(基于官方实现)
组件 A:Streaming-aware KV cache 推理
# Algorithm: Streaming inference with compact KV cache
# Input: video stream, question q, window_size, text_sink, text_sliding_window
# Output: streaming responses
def streaming_inference(model, processor, video_stream, question):
kv_cache = None
previous_text = []
for chunk in stream_video(video_stream, chunk_duration=1):
# build current multimodal prompt
prompt = build_prompt(previous_text, chunk, question)
# run one-step multimodal prefilling / generation
outputs = model.forward(prompt, past_key_values=kv_cache)
kv_cache = outputs.past_key_values
# evict old vision first, then old text according to sink/window policy
kv_cache = process_past_kv(
kv_cache,
text_sink=512,
text_sliding_window=512,
vision_window=16,
)
response = decode_current_text(outputs)
previous_text.append(response)
return previous_text组件 B:Contiguous RoPE patching
# Algorithm: Contiguous RoPE indexing
# Input: kept tokens after eviction
# Output: bounded, contiguous position ids
def contiguous_rope(position_ids, kept_tokens):
# remove evicted positions and shift remaining ids left
compact_ids = remap_to_contiguous_range(position_ids, kept_tokens)
return compact_ids组件 C:Overlapped-chunk streaming SFT
# Algorithm: Overlapped chunk SFT
# Input: long video V, chunk length W, overlap O
# Output: streaming-aligned supervised training samples
def build_training_chunks(video, transcript, W=24, O=12):
chunks = split_video_with_overlap(video, chunk_len=W, overlap=O)
samples = []
for chunk in chunks:
interleaved = interleave_video_text_by_second(chunk, transcript)
loss_mask = build_loss_mask(interleaved, placeholder='...')
samples.append((interleaved, loss_mask))
return samples3.7 Code-to-paper mapping table
| Paper Concept | Source File | Key Class/Function |
|---|---|---|
| Streaming inference pipeline | streaming_vlm/inference/inference.py | streaming_inference, process_past_kv |
| Streaming hyperparameters | streaming_vlm/inference/streaming_args.py | StreamingArgs |
| Contiguous RoPE for Qwen2.5-VL | streaming_vlm/inference/qwen2_5/pos_emb.py | get_rope_index |
| Patch model into streaming mode | streaming_vlm/inference/qwen2_5/patch_model.py | convert_qwen2_5_to_streaming |
| Streaming SFT entry | train.py | trainer initialization / rope patching |
| Training data construction | streaming_vlm/data/lmm_dataset.py | LMMDataset, preprocess_conversation_stream |
| Efficiency eval | scripts/eval_efficiency.sh | evaluation script |
4. Experimental Setup (实验设置)
4.1 Training
- 基础模型:Qwen2.5-VL-7B-Instruct
- SFT 两阶段:
- 用 Inf-Stream-Train + Live-WhisperX-526K 做 streaming pattern 训练;
- 用 high-quality annealing data(约 14K streaming samples)继续精炼实时动作解说能力。
- 总训练算力约:128 H100-days
4.2 Evaluation Benchmarks
- Captioning / Commentary
- Inf-Streams-Eval
- LiveSports3K-CC
- VQA
- MVBench
- VideoMME
- LongVideoBench
- OVOBench Realtime
4.3 Core inference settings
根据正文与消融:
- 默认训练 chunk:24s
- overlap:12s
- 最优推理设置:
- 推理速度:单张 NVIDIA H100 上最高可达 8 FPS
5. Experimental Results (实验结果)
5.1 Captioning / Commentary main results
论文在 Inf-Streams-Eval 上采用 pairwise win rate,对比对象为 GPT-4o mini 与 LiveCC:
| Model A = StreamingVLM | vs GPT-4o mini | vs LiveCC (chunk) | vs LiveCC (infinite) |
|---|---|---|---|
| Win rate | 66.18 | 87.81 | 99.12 |
在 LiveSports3K-CC 上,StreamingVLM 的 win rate 为:
- vs LLaVA:47.33
- vs GPT-4o:45.59
- vs Gemini:44.21
- vs LiveCC:56.19
这些结果说明两点:
- 它并不是只会“短视频描述”,而是真的能在超长体育视频上保持较高的实时解说质量;
- 与 LiveCC 这类强短视频评论模型相比,StreamingVLM 的优势主要来自 infinite inference 能力,而不是单个 chunk 内的表达能力。
5.2 VQA results
| Model | MVBench | VideoMME | LongVideoBench | OVOBench Realtime |
|---|---|---|---|---|
| Qwen2.5-VL-7B-Instruct | 67.34 | 65.10 | 54.70 | 56.00 |
| StreamingVLM | 69.16 | 65.10 | 59.00 | 61.96 |
关键提升是:
- LongVideoBench:+4.30
- OVOBench Realtime:+5.96
而且这些结果是在没有做任何额外 VQA-specific finetuning 的前提下得到的,说明它的 streaming SFT 不只提升了解说能力,也提升了通用长视频理解能力。
5.3 Efficiency
Figure 5 解读: Figure 5 对比了四种方案的 per-token latency 随视频长度变化。Full Attention 很快 OOM;普通 sliding window 虽然可运行,但随着 chunk 重建上下文会出现周期性高延迟;重叠 sliding window 则因重复计算始终代价偏高。StreamingVLM 的延迟曲线最平稳,且整体始终低于实时阈值(图中的虚线,约 0.1 秒 / token),这正说明 KV reuse + bounded context 的优势不是理论上的,而是能直接转化成实时服务能力。
论文明确指出:
- Full attention 很快超出实时限制;
- StreamingVLM 可以在单张 H100 上支持 8 FPS;
- 相比重新计算旧窗口的方法,StreamingVLM 的 latency 随视频长度增长更稳定。
5.4 Key ablations
(1) Contiguous RoPE
| Setting | vs GPT-4o | vs LiveCC (chunk) | vs LiveCC (infinite) |
|---|---|---|---|
| Native RoPE (chunk) | 63.23 | 74.00 | 98.07 |
| Native RoPE (infinite) | 25.09 | 59.42 | 60.32 |
| Contiguous RoPE (infinite) | 66.18 | 87.81 | 99.12 |
这个表非常关键,说明真正支撑无限长 streaming inference 的不是单纯缓存,而是 Contiguous RoPE。如果不做位置压缩,模型在 infinite streaming 上会明显崩坏。
(2) Sink / window size
最佳设置为:
在 basketball subset 的 Inf-Streams-Eval 上:
- 对 GPT-4o:73.64
- 对 LiveCC chunk:92.33
- 对 LiveCC infinite:99.38
同时, 在文本与视觉连续性之间取得最好平衡;视觉窗口过短会损失动作信息,过长则增加推理负担。
(3) SFT strategy and data
从最弱到最强:
- 仅 base Qwen2.5-VL:对 GPT-4o win rate 只有 0.01
-
- Live-WhisperX-526K:提升到 32.17
-
- Inf-Stream-Train:提升到 63.46
-
- High-Quality Annealing Data:达到 66.18
这说明 StreamingVLM 的成功不只是 inference trick,更依赖其 overlapped streaming SFT + 高质量实时动作语料。
5.5 Limitations / 结论
论文没有单独列出 formal limitations,但从结果可以看出几个边界:
- 它的主要优势集中在 实时无限流视频理解 / 解说,并不一定在所有离线 VQA 指标上大幅超过更重型模型;
- 其训练和数据构建明显偏向体育流媒体场景,因此跨领域泛化还取决于后续数据扩展;
- 该方法目前强依赖 streaming-specific KV/cache 设计,对普通离线视频建模未必是最优。
总体而言,StreamingVLM 最有价值的地方在于:它第一次把“实时无限视频理解”的核心瓶颈明确拆成推理机制、位置编码和训练对齐三部分,并证明这三者缺一不可。