Skip to content

LLaVA-OneVision:单图、多图、视频统一于一个模型

在 LLaVA-OneVision(Li 等,2024 年 8 月)之前,开源 VLM 世界是分裂的谱系:LLaVA-1.5 处理单图,多图模型如 Mantis 和 VILA,视频模型如 Video-LLaVA 和 Video-LLaMA。每个模型都能赢下自己的 benchmark,却会在其他场景失手。LLaVA-OneVision 认为,一套统一课程(curriculum)就能训练出一个同时统治这三种场景的模型,而且由此产生的任务迁移(task transfer)效应——单图技能迁移到视频、多图推理迁移到单图——会超过“多个专家模型的总和”。它的配方看似简单得惊人:让视觉 token 预算在不同场景下保持恒定,再配上一个明确的课程顺序,从单图走向 OneVision(多图)再走向视频。本课会拆解它的预算、课程以及涌现行为(emergent behaviors)。

类型: 构建 语言: Python(stdlib,token budget solver + curriculum planner) 先修要求: 第 12 阶段 · 05(LLaVA),第 12 阶段 · 06(any-resolution) 时间: ~180 分钟

学习目标

  • 设计一个在单图、多图和视频输入之间保持恒定的视觉 token 预算。
  • 排列训练课程,使技能从单图迁移到视频时不会发生灾难性遗忘(catastrophic forgetting)。
  • 解释为什么在参数量相同的情况下,只要课程设计正确,一个统一模型就能胜过多个专用模型。
  • 说出 LLaVA-OneVision 报告的三种涌现能力:multi-camera reasoning、set-of-mark prompting、iPhone-screenshot agent。

问题

图像、多图和视频会以不同方式压迫模型。

单图需要高分辨率 token(AnyRes,约 2880 个视觉 token)来捕捉 OCR 和细粒度细节。每个样本的预算:1 张图像,2880 个 token。

多图需要若干张中等分辨率图像(每张约 576 个 token),这样跨图像推理才能装进上下文。每个样本的预算:4-8 张图像,每张 576 个,总计 2300-4600 个 token。

视频则需要许多低分辨率帧(池化后每帧约 196 个 token)来捕捉时间动态。每个样本的预算:8-32 帧,每帧 196 个,总计 1600-6200 个 token。

如果你训练多个独立模型,你只需为每个模型选一个预算。如果你训练一个统一模型,你就必须让这套预算在不同场景间合理缩放,同时又不能把上下文撑爆。

在 OneVision 之前,默认答案是“训练一种场景,忽略其他场景”。Video-LLaVA 通过额外训练阶段,把视频能力硬接到图像模型上。LLaVA-NeXT 通过 tiling 增加了多图支持。但没有任何方案能优雅地同时覆盖三者。

概念

OneVision 的 token 预算

LLaVA-OneVision 选择了一个统一的视觉 token 预算:每个样本大约 3000-4000 个 token,但在不同场景下分配方式不同:

  • 单图:AnyRes-9(3x3 tiles + thumbnail),每个 tile 分辨率为 384,含 729 个 patch,再进行激进的 2x2 双线性池化(bilinear pooling)→ 每个 tile 182 个 token。总计:9 * 182 + 182 = 1820 个 token。或者使用 AnyRes-4,每个 tile 保持 729 个 token,则为 2916 + 729。
  • 多图:每张图像使用中等分辨率(384,不做 tiling),无池化时为 729 个 token。预算 6 张图像 → 4374 个 token。
  • 视频:32 帧、384 分辨率,并做激进的 3x3 双线性池化 → 每帧 81 个 token。总计:32 * 81 = 2592 个 token。

这种分配让总 token 数大致保持恒定。LLM 不会看到任何会撑爆上下文的 batch。编码器在不同场景下产出不同几何结构,但 LLM 消耗的是同一份预算。

三阶段课程

LLaVA-OneVision 分三个阶段训练:

  1. 单图 SFT(阶段 SI)。所有数据都由单图 + 文本组成。用高分辨率 AnyRes 输入训练。这一阶段教会模型感知、OCR 和细粒度理解。数据使用 LLaVA-NeXT 数据以及 OneVision 专用的单图数据。
  2. OneVision SFT(阶段 OV)。混合单图 + 多图 + 视频(均匀采样帧)。在统一 token 预算上训练。这一阶段教模型处理异构 batch 形状。不重置权重——直接从阶段 SI 继续。
  3. 任务迁移(阶段 TT)。继续按照目标任务组合训练,通常会根据产品需求更偏向多图或视频。部署前可选做进一步微调。

关键点:课程顺序很重要。即便数据相同,先训视频或先训多图,得到的图像性能也会比“先训单图”更差。论文明确做了这个消融。

为什么课程有效

单图训练会建立感知基础。Patch token 携带细粒度视觉特征;LLM 学会把它们与文本整合。多图和视频则引入结构性挑战(哪张图对应哪张图、先发生了什么),如果没有强感知基础,这些能力很难学会。

如果你从头把所有场景一起训练,模型就会对感知欠拟合(因为每个 batch 中单图数据有限),同时对结构过拟合(因为多图 / 视频数据很多)。结果就是:模型学会了跨图像推理模式,但视觉理解本身很浅。

课程排序让你先从阶段 SI 获得感知强度,再从阶段 OV 获得组合式/时序推理,而且两者都不会丢失。

跨场景涌现技能

LLaVA-OneVision 论文报告了三种涌现能力:

  1. 多摄像头推理(multi-camera reasoning)。训练时多图与视频是分别给的;推理时却要求模型对一个多摄像头驾驶场景进行联合推理。模型能够正确整合多个视角,尽管它从未在训练中见过完全相同的格式。
  2. 标记集合提示(set-of-mark prompting)。用户用编号标记图像中的对象;模型需要推理“标记 3 相对于标记 7 在做什么”。训练时既没有标记,也没有标注格式;这种能力来自空间 grounding 与多图引用能力的组合。
  3. iPhone 截图 agent。用户提供一张 iPhone 屏幕截图,并要求模型规划下一次点击。模型训练过 UI 截图、用户工作流视频,以及多图 before/after 对,因此能够泛化到 agent 使用场景。

这些都不是显式训练任务;它们是由课程的组合结构自然涌现出来的。

视觉 token 池化

要满足 token 预算,就必须做池化。OneVision 在二维 patch 网格上使用双线性插值:24x24 = 576 个 patch,可以变成 12x12 = 144(2x 因子)或 8x8 = 64(3x 因子)。池化是在 patch-grid 空间完成,而不是 token 空间,这样可以保留局部性(locality)。

不同场景使用什么池化因子,本身也是一个超参数。池化越少 = token 越多 = 表示越丰富。池化越多 = token 越少 = 能容纳更多帧 / 图像。

LLaVA-OneVision-1.5

2025 年的后续版本(LLaVA-OneVision-1.5,arXiv 2509.23661)在训练数据、模型权重和代码上都“完全开放”。它在某些 benchmark 上缩小了与专有模型的差距,也让这套配方更民主化。课程不变,数据更多,基础 LLM 更强。架构没有变化。

与 Qwen2.5-VL 的对比

Qwen2.5-VL(课程 12.09)做出了不同选择。它使用 M-RoPE 和动态 FPS,而不是固定池化。它的预算会随输入扩展——1 分钟视频比 5 秒视频会使用更多 token。LLaVA-OneVision 则固定预算,通过调整池化来缩放。两者都有效;它们是在“可配置性”和“可预测性”之间做不同权衡。

使用它

code/main.py 是一个面向 OneVision 风格 VLM 的课程与预算规划器。给定每样本 token 预算和目标场景分布(例如 40% 单图、30% 多图、30% 视频),它会:

  • 为每种场景分配分辨率、池化因子和帧数。
  • 检查每种场景是否都能装进共享预算。
  • 报告预期 token 数、LLM FLOPs,以及哪些场景 token 不足。
  • 打印逐阶段训练计划。

你可以用它来规划 OneVision 微调,或对某个 VLM 部署的单请求成本做合理性检查。

交付它

本课会生成 outputs/skill-onevision-budget-planner.md。给定目标任务分布和每样本预算,它会输出 AnyRes 因子、每帧池化、视频帧数以及课程各阶段权重。凡是训练或微调统一场景 VLM 时,都可以使用它。

练习

  1. 你的产品支持 80% 单图、10% 多图(2-4 张图像)、10% 视频(8-16 帧)。请设计 token 预算。对于因为不做重度多图而省下的额外预算,你会投放到哪里?

  2. 阅读 LLaVA-OneVision 第 4.3 节(涌现能力)。提出第四种很可能由这套课程解锁、但论文未报告的涌现技能。

  3. 调换课程顺序——先训练多图,再训练单图,最后训练视频。预测哪些 benchmark 会退化,以及为什么。

  4. 论文报告的视频 benchmark 每个样本只用 8 帧训练。这能泛化到推理时的 30 秒视频吗?最先出问题的是 token 预算,还是时间推理(temporal reasoning)?

  5. 把 24x24 patch 做双线性池化到 12x12,在每个维度上是 4x reduction。请用标准库 Python 实现这个池化,并验证每个 2x2 block 的均值与双线性输出一致。

关键术语

术语人们怎么说实际含义
OneVision scenario“单图、多图或视频”统一 VLM 所处理的三种输入形状之一;预算在三者之间保持恒定
Token budget“每个样本多少 token”LLM 在训练 / 推理的每个样本中看到的总视觉 token 数,通常为 3000-4000
Curriculum“训练顺序”为了获得涌现迁移而选择的阶段顺序(单图 → 多图 → 视频)
Bilinear pooling“token 缩水”对 patch 网格(2D)应用双线性插值,以减少 token 数同时保留局部性
Emergent skill“没训练过,但也能做”在没有对应训练数据的情况下,于推理时出现的能力,源自课程组合
AnyRes-k“k-tile 设置”k 个固定分辨率子 tile 加一张缩略图,常见 k ∈
Task transfer“跨场景泛化”在单图上学到的技能通过共享骨干迁移到视频(反之亦然)

延伸阅读