LLaVA-OneVision:单图、多图、视频于一个模型
在 LLaVA-OneVision(Li 等人,2024 年 8 月)之前,开放 VLM 的世界有几条分开的脉络:LLaVA-1.5 做单图,Mantis 和 VILA 这类做多图,Video-LLaVA 和 Video-LLaMA 这类做视频。每个赢下自己的基准,又在其他上面败北。LLaVA-OneVision 主张:一套课程就能训出一个模型,在全部三种场景上都占主导,而那些涌现的任务迁移效应(单图技能输出到视频、多图推理输出到单图)胜过各路专家之和。配方简单得有点骗人:一个跨场景保持恒定的视觉 token 预算,加上一套从单图到 OneVision(多图)再到视频的明确课程。本节课通读这个预算、这套课程,以及那些涌现行为。
类型: Build 语言: Python(标准库,token 预算求解器 + 课程规划器) 前置要求: Phase 12 · 05(LLaVA)、Phase 12 · 06(任意分辨率) 预计时间: ~180 分钟
学习目标
- 设计一个在单图、多图、视频输入下保持恒定的视觉 token 预算。
- 排出一套训练课程,把技能从单图迁移到视频而不发生灾难性遗忘。
- 解释为什么课程做对了,单个模型能在相同参数量下击败专家。
- 说出 LLaVA-OneVision 报告的三种涌现能力:多摄像头推理、set-of-mark prompting、iPhone 截图 agent。
问题背景
图像、多图、视频各自以不同方式给模型施压。
单图想要高分辨率 token(AnyRes,约 2880 个视觉 token)来抓住 OCR 和细节。每样本预算:一张图,2880 token。
多图想要若干张中等分辨率的图(每张约 576 token),好让跨图推理塞进上下文。每样本预算:4-8 张图,每张 576,共 2300-4600 token。
视频想要很多帧低分辨率的图(池化后每帧约 196 token)来捕捉时间动态。每样本预算:8-32 帧,每帧 196,共 1600-6200 token。
如果你训分开的模型,就挑一个预算。如果你训一个模型,就需要预算在跨场景时合理地伸缩而不撑爆上下文。
OneVision 之前,默认答案是"训一个场景,无视其他"。Video-LLaVA 靠额外训练阶段把视频后装到一个图像模型上。LLaVA-NeXT 用切块加了多图支持。没有谁能干净地搞定全部三个。
核心概念
OneVision token 预算
LLaVA-OneVision 挑了一个统一的视觉 token 预算,每样本约 3000-4000 token,按场景做不同分配:
- 单图:AnyRes-9(3x3 tile + 缩略图),每个 tile 在 384 下 729 个 patch,激进的 2x2 双线性池化 → 每 tile 182。总计:9 * 182 + 182 = 1820 token。或 AnyRes-4 每 tile 729 = 2916 + 729。
- 多图:每张图中等分辨率(384,不切块),729 token 不池化。预算 6 张图 → 4374 token。
- 视频:32 帧 384 分辨率,配激进的 3x3 双线性池化 → 每帧 81 token。总计:32 * 81 = 2592 token。
这个分配让总 token 大致恒定。LLM 永远不会看到一个撑爆它上下文的 batch。编码器按场景产出不同的几何形状,但 LLM 消费的是同一份预算。
三阶段课程
LLaVA-OneVision 分三阶段训练:
- 单图 SFT(SI 阶段)。全部数据都是单图加文本。在高分辨率 AnyRes 输入上训练。这教会感知、OCR 和细粒度理解。用 LLaVA-NeXT 数据加 OneVision 专属的单图数据。
- OneVision SFT(OV 阶段)。混合单图 + 多图 + 视频(均匀采样帧)。在统一 token 预算上训练。这教会模型处理异质的 batch 形状。不重置权重——从 SI 阶段接着来。
- 任务迁移(TT 阶段)。继续在一个目标任务配比上训,通常按产品偏重多图或视频。可选的部署微调。
关键:课程顺序很要紧。先训视频或先训多图,比先训单图产出的图像性能更差,即便数据相同。论文对此做了明确消融。
课程为什么有效
单图训练打下感知基础。patch token 携带细粒度视觉特征;LLM 学会把它们与文本整合。多图和视频引入结构性挑战(哪张图是哪张、什么先发生),没有强感知基础很难学。
如果你把所有场景从头一起训,模型对感知欠拟合(每个 batch 里单图数据有限)、对结构过拟合(大量多图/视频数据)。结果是:一个会遵循跨图推理模式但视觉上很浅的模型。
课程排序让你从 SI 阶段拿到感知强度,再从 OV 阶段拿到组合/时间推理,两者都不丢。
涌现的跨场景技能
LLaVA-OneVision 论文报告了三种涌现能力:
- 多摄像头推理。分开在多图 + 视频上训练;推理时被要求推理一个多摄像头的驾驶场景。尽管训练中从没见过这种确切格式,模型仍正确整合了这些视角。
- set-of-mark prompting。用户用编号标记标注图中的物体;模型推理"标记 3 相对于标记 7 在做什么"。既没在标记上训、也没在标注上训;从空间 grounding + 多图引用的组合中学到。
- iPhone 截图 agent。用户给一张 iPhone 屏幕截图,要求规划下一次点击。在 UI 截图、用户工作流视频和多图前后对上训过。泛化到了 agent 用例。
这些不是被训练的任务;它们从课程的组合结构里涌现出来。
视觉 token 池化
token 预算需要池化。OneVision 在二维 patch 网格上用双线性插值:24x24 = 576 个 patch 变成 12x12 = 144(2 倍)或 8x8 = 64(3 倍)。池化在 patch 网格空间里做,而非 token 空间,以保留局部性。
每个场景的池化倍数本身就是个超参数。池化越少 = token 越多 = 表示越丰富。池化越多 = token 越少 = 塞得下越多帧/图。
LLaVA-OneVision-1.5
2025 年的续作(LLaVA-OneVision-1.5,arXiv 2509.23661)在训练数据、模型权重和代码上都"完全开放"。在部分基准上追平了与专有模型的差距,并使这套配方民主化。同样的课程,更多的数据,更好的基座 LLM。无架构改动。
与 Qwen2.5-VL 的对比
Qwen2.5-VL(第 12.09 课)做了不同选择。它用 M-RoPE 和动态 FPS,而非固定池化。它的预算随输入伸缩——一段 1 分钟视频比一段 5 秒视频用更多 token。LLaVA-OneVision 固定预算、伸缩池化。两者都有效;它们在可配置性和可预测性之间做了不同取舍。
l5-onevision-budget实际使用
code/main.py 是一个面向 OneVision 式 VLM 的课程与预算规划器。给定每样本的 token 预算和一个目标场景配比(比如 40% 单图、30% 多图、30% 视频),它:
- 为每个场景分配分辨率、池化倍数和帧数。
- 检查每个场景都塞进共享预算。
- 报告预期 token 数、LLM FLOPs,以及哪些场景 token 不足。
- 打印一份逐阶段的训练计划。
用它来规划一次 OneVision 微调,或者给一个 VLM 部署的每请求成本做合理性检查。
拿去用
本节课产出 outputs/skill-onevision-budget-planner.md。给定一个目标任务分布和一个每样本预算,它产出 AnyRes 倍数、每帧池化、视频帧数和课程阶段权重。每当你训练或微调一个统一场景的 VLM 时就用它。
练习
你的产品支持 80% 单图、10% 多图(2-4 张)、10% 视频(8-16 帧)。设计 token 预算。你会把不做重多图省下的额外预算放到哪里?
读 LLaVA-OneVision 第 4.3 节(涌现能力)。提出一个课程很可能解锁、但论文没报告的第四种涌现技能。
调换课程顺序——先训多图,再单图,再视频。预测哪些基准会退化、为什么。
论文报告的视频基准只在每样本 8 帧上训练。这能泛化到推理时的 30 秒视频吗?什么先崩——token 预算还是时间推理?
把 24x24 patch 双线性池化到 12x12,是每维 4 倍缩减。用标准库 Python 实现这个池化,并验证每个 2x2 块上的均值与双线性输出相符。
关键术语
| 术语 | 大家怎么说 | 它实际指什么 |
|---|---|---|
| OneVision 场景 | "单图、多图或视频" | 统一 VLM 处理的三种输入形状之一;预算跨它们保持恒定 |
| token 预算 | "每样本多少 token" | LLM 每个训练/推理样本看到的视觉 token 总数,通常 3000-4000 |
| 课程 | "训练顺序" | 为涌现迁移而选的阶段排序(单图 → 多图 → 视频) |
| 双线性池化 | "token 收缩" | 对 patch 网格(二维)做双线性插值以减少 token 数同时保留局部性 |
| 涌现技能 | "没训过,照样能用" | 因课程组合而在推理时出现、却无对应训练数据的能力 |
| AnyRes-k | "k-tile 设置" | k 个固定分辨率子 tile 加一张缩略图,典型 k ∈ {4, 9} |
| 任务迁移 | "跨场景泛化" | 单图上学的技能经共享骨干应用到视频(反之亦然) |