论文:Open-Qwen2VL: Compute-Efficient Pre-Training of Fully-Open Multimodal LLMs on Academic Resources
近几年,多模态大语言模型(Multimodal Large Language Models, MLLMs)成为研究热点。GPT-4o、Claude、Qwen2-VL 等模型展现出强大的图文理解与推理能力。然而,这些模型的训练细节、数据筛选方法、代码库往往并不完全公开。Open-Qwen2VL 的出现,至少提供了三个值得关注的角度:
1. 全开源:不仅放出模型权重,还放出训练代码、全部预训练与 SFT 数据、数据过滤脚本与序列打包脚本。
2. 学术友好:整个预训练在 8×A100-40G 上完成,耗时约 220 GPU 小时,普通高校实验室可以负担。
3. 效率惊人:仅使用 Qwen2-VL 0.36% 的预训练 token,就在多个基准上超过 Qwen2-VL-2B。
论文提出了对 MLLM 领域"全开源"(fully open)的新定义:必须同时公开 训练代码库、详细的数据过滤技术 与 全部预训练及监督微调数据。只有三者齐备,研究工作才真正可复现。
为了理解 Open-Qwen2VL 的设计选择,需要先建立几个基础概念。这些概念也是阅读任何 MLLM 论文时的共同语言。
典型的 MLLM 由三个模块组成:
Open-Qwen2VL 的选择是:SigLIP-SO-400M 视觉编码器 + Adaptive Average-Pooling + 两层 MLP 投影层 + Qwen2.5-1.5B-Instruct 语言模型。这是一个非常简洁的架构,没有使用 Qwen2-VL 中复杂的 2D-Multimodal RoPE 或动态分辨率机制。
传统视觉-语言模型(如 CLIP、ALIGN)通常从随机初始化开始,在图像-文本对比数据上从头训练。而 MLLM 的常规做法是:
这种"站在巨人肩膀上"的策略称为持续预训练(Continual Pre-training)。它大大降低了训练成本,也是 Open-Qwen2VL 能在学术级算力上完成预训练的前提。
多模态预训练数据大致分为两类:
| 类型 | 形式 | 优势 | 劣势 |
|---|---|---|---|
| 图像-文本标题数据 | 一张图 + 一段描述文字 | 规模大、结构简单、适合学习视觉-语义对齐 | 缺乏上下文,多图推理能力弱 |
| 图文交错数据 | 长文档中图像与文本自然穿插 | 增强多图上下文学习与交错推理 | 会削弱单图零样本推理能力,清洗更复杂 |
Open-Qwen2VL 明确只使用图像-文本标题数据进行预训练。这是为了在控制数据规模和训练成本的同时,保证单图理解与推理能力。
CLIP 是 OpenAI 提出的经典对比式视觉-语言模型,通过图像-文本对的对齐学习视觉表示。SigLIP 是其改进版,核心变化在于用 Sigmoid Loss 替代 CLIP 的 InfoNCE / Cross-Entropy Loss。
大规模图像-文本数据来自网页抓取,质量参差不齐:图文不匹配、caption 太短、噪声大、重复多。直接用原始数据训练会浪费大量算力。
数据过滤的目标是从海量候选数据中挑选出"高质量"子集。传统方法依赖 CLIP 图文相似度(CLIPScore);较新的方法则训练一个轻量 MLLM 来评估 caption 质量。Open-Qwen2VL 同时使用了这两种思路。
图像-文本 caption 数据的长度差异很大。如果按长度分组再 padding 到最长序列,会产生大量无效 padding token,浪费计算。
Sequence Packing 的思想是把多个较短的样本拼接成一个接近最大上下文长度(如 4096)的序列,只在末尾做少量 padding。这相当于把原本被 padding 占用的算力"捡起来"。
训练大模型时,单卡显存放不下整个模型。常用的分布式训练策略包括:
Open-Qwen2VL 的代码库基于 Prismatic-VLM 的 FSDP 实现,作者报告其训练速度比 DeepSpeed ZeRO3 快约 17%。
| 基准 | 测试能力 |
|---|---|
| MMBench | 综合多模态理解(选择题形式) |
| SEEDBench | 图像理解的多维度评估 |
| MMStar | 需要世界知识与推理的视觉问答 |
| MathVista | 视觉数学推理 |
| AI2D / TextVQA | 图表理解 / 图中文字识别(OCR-heavy) |
| POPE | 幻觉检测 |
Open-Qwen2VL 没有使用动态分辨率或 2D-RoPE,而是采用了一种更朴素的策略:
图像 → SigLIP 729 patches
↓ Average-Pooling
144 visual tokens
图像 → SigLIP 729 patches
↓ 直接输入
729 visual tokens
核心洞察是:预训练阶段的目标是学习视觉-语言对齐,不需要用最高分辨率。144 tokens 足以让 projector 和 LLM 学到语义映射,同时显著降低显存与计算。到了 SFT 阶段,再恢复完整 729 tokens,让模型获得高分辨率图像理解能力。
这种"低→高"策略的好处可以从下面这个粗略估算中感受:
# 假设 batch_size=256,context_len=4096,视觉 token 占主要显存 # 预训练:每张图 144 tokens visual_tokens_pretrain = 144 # SFT:每张图 729 tokens visual_tokens_sft = 729 # 仅视觉部分,SFT 是预训练的 5 倍 ratio = visual_tokens_sft / visual_tokens_pretrain # 5.06x
在预训练阶段把视觉 token 降到 1/5,意味着同样的 batch size 下,attention 计算量和 KV Cache 显存占用都大幅下降。
SigLIP 对 384×384 的输入会输出 729 个 patch tokens(27×27)。Open-Qwen2VL 的 projector 先用一个 2D Adaptive Average-Pooling 把 27×27 降到 12×12(即 144 个 token),再过一个两层 MLP 对齐到 LLM 维度。
# PyTorch 伪代码
from torch import nn
projector = nn.Sequential(
nn.AdaptiveAvgPool2d((12, 12)), # 27x27 -> 12x12 = 144 tokens
nn.Flatten(start_dim=2), # [B, C, 144]
nn.Linear(vision_dim, llm_dim),
nn.GELU(),
nn.Linear(llm_dim, llm_dim)
)
这个设计的关键优点是可伸缩:预训练时 pool 到 144,SFT 时可以把 pool 目标设成 (27, 27) 得到 729 tokens,完全不需要改动 projector 结构。
在预训练和 SFT 阶段,Open-Qwen2VL 都冻结了 SigLIP 视觉编码器的参数,只训练 projector 和 LLM。原因有两方面:
论文也做了消融实验:在 SFT 阶段解冻视觉编码器,平均性能略有提升,但 MMMU 明显下降。这说明是否解冻需要权衡。
Open-Qwen2VL 的核心创新之一是对预训练数据的精心筛选与混合。论文中有一句值得记住的话:模型性能的上限往往由数据质量决定,而不是由模型规模决定。
| ID | 数据集 | 过滤模型 | 规模 |
|---|---|---|---|
| 1 | CCS-CLIP | CLIP | 8.5M |
| 2 | DataComp-DFN | DFN(CLIP-based) | 15M |
| 3 | LAION-CLIP | CLIP | 15M |
| 4 | DataComp-MLM-Filter & DFN | MLM-Filter + DFN | 19.9M |
其中:
CLIPScore 是最传统的图文质量指标。它计算图像特征与文本特征的余弦相似度,分数越高说明图文越匹配。DataComp-DFN 是这种方法的代表:用更大的 CLIP 模型作为"过滤器",在 DataComp 上训练出更强的筛选器。
MLM-Filter 是较新的数据过滤方法。它用一个轻量级 MLLM 对每条图文对从四个维度打分:
| 指标 | 含义 | 用途 |
|---|---|---|
| ITM | Image-Text Matching 图文匹配度 | 判断图与文是否相关 |
| ODF | Object Detail Fulfillment 物体细节满足度 | 判断 caption 是否覆盖图中主要对象 |
| CTQ | Caption Text Quality 文本质量 | 判断 caption 是否通顺、语法正确 |
| SU | Semantic Understanding 语义理解度 | 判断 caption 是否体现深层语义 |
Open-Qwen2VL 采用了 MLM-Filter 中的 Semantic Understanding(SU) 指标,并设置阈值为 85/100。论文引用 ATIQE 的结论:SU 指标对 MLLM 预训练的数据筛选效果最好。
论文对四组数据做了组合消融,结果如下表(表 3 整理):
| 数据组合 | 总样本数 | MMBench | MMStar | POPE | 平均 |
|---|---|---|---|---|---|
| 1 + 2(CCS + DataComp-DFN) | 23.5M | 75.6 | 39.6 | 79.2 | 55.3 |
| 1 + 3(CCS + LAION-CLIP) | 23.5M | 75.9 | 41.7 | 80.1 | 55.4 |
| 1 + 2 + 3 | 38.5M | 75.9 | 41.7 | 77.7 | 55.5 |
| 1 + 4(CCS + DataComp-MLM&DFN) | 28.4M | 77.3 | 41.3 | 80.1 | 56.0 |
Open-Qwen2VL 能在学术级算力上完成预训练,靠的是三个相互配合的效率杠杆。
前面已经提到,预训练阶段用 144 visual tokens,SFT 阶段升到 729。这一步直接减少了 attention 计算量、KV Cache 占用和梯度通信量。下表总结了配置差异:
| 配置 | 预训练 | SFT |
|---|---|---|
| 视觉编码器 | SigLIP-so400m-384px | SigLIP-so400m-384px |
| Projector | Adaptive Avg-Pooling + MLP | MLP(此时 pool 为恒等) |
| 每张图 visual tokens | 144 | 729 |
| 上下文长度 | 4096 | 4096 |
| Sequence Packing | 是 | 否 |
| Global Batch Size | 256 | 128 |
| 训练 epoch | 1 | 1 |
Sequence Packing 的算法伪代码如下。它本质上是一个 First-Fit-Decreasing(FFD)装箱问题:先把样本按长度从长到短排序,再依次放入当前剩余空间最小的 bin,直到接近 4096 的上下文上限。
# 序列打包核心思想(简化版)
def pack_sequences(samples, max_len=4096):
# 1. 计算每个样本的图文总长度
items = [(s, len(s['text_tokens']) + len(s['visual_tokens']))
for s in samples]
# 2. 按长度降序排序
items.sort(key=lambda x: x[1], reverse=True)
# 3. FFD:把每个样本放进第一个能装下的 bin
bins = []
for sample, length in items:
placed = False
for b in bins:
if sum(l for _, l in b) + length <= max_len:
b.append((sample, length))
placed = True
break
if not placed:
bins.append([(sample, length)])
# 4. 同一个 bin 内的样本拼接,用 <|im_end|> 分隔
return bins
打包后的每个 pickle 文件保存:
images:PIL 图像列表;input_ids:带 <image> 占位符的 token 序列;lengths:每个样本的多模态长度。Open-Qwen2VL 的训练代码基于 Prismatic-VLM,并保留其 FSDP trainer。作者对比了 FSDP 与 DeepSpeed ZeRO3 的实现,发现 FSDP 每个训练步骤快约 17%。这看起来只是工程优化,但在 220 GPU 小时的总预算下,17% 的加速意味着节省了约 37 GPU 小时,相当于数天的训练时间。
预训练后的 base 模型还需要经过监督微调(SFT)才能听懂人类指令。论文先使用 LLaVA-665k 做基础 SFT,然后进一步把视觉 SFT 数据扩展到 MAmmoTH-VL-10M 的单图子集。
实验结果显示:
10M 条样本如果用传统 LLaVA 式 dataloader 一次性加载完整 JSON,会占用超过 200GB CPU 内存。Open-Qwen2VL 采用的解决方案是:
# 伪代码:索引驱动加载
indices = load_json("sft_10m_indices.json")
# indices[i] = {
# "path": "samples/0000001.json",
# "is_text_only": false,
# "length": 312
# }
论文把最终模型与多个 2B 级别的 SOTA MLLM 对比:
| 模型 | 预训练 Token | MMBench | SEEDBench | MMStar | MathVista |
|---|---|---|---|---|---|
| InternVL2.5-2B-MPO | 277B | 72.5 | 73.2 | 54.3 | 55.3 |
| DeepSeekVL-2-Tiny | 8.1T | 68.3 | 72.5 | 49.9 | 54.5 |
| Qwen2-VL-2B-Instruct | 1.4T | 68.8 | 72.0 | 46.3 | 48.0 |
| Open-Qwen2VL | 5B | 80.9 | 72.5 | 49.7 | 53.1 |
Open-Qwen2VL 在 MMBench 上大幅领先,在 SEEDBench、MMStar、MathVista 上超过 Qwen2-VL-2B。值得注意的是,它只用了 Qwen2-VL 0.36% 的预训练 token。
论文作者也明确指出,OCR 短板是因为预训练数据缺少 SynthDoG、LAIONCOCO-OCR 等 OCR 专用 caption 数据。只要在数据混合中加入这类数据,性能会显著提升。
表 5 显示,用打包数据预训练的 base 模型具备良好的多图 in-context learning 能力:
| shots | GQA | VQA-v2 | VizWiz | OKVQA | Text-VQA |
|---|---|---|---|---|---|
| 0 | 27.1 | 40.2 | 26.1 | 24.7 | 30.4 |
| 8 | 35.4 | 51.8 | 31.2 | 27.1 | 30.6 |
VQA-v2 从 40.2 提升到 51.8,提升超过 11 个百分点。这说明序列打包不仅是效率优化,也是能力优化。
表 6 对比了 SFT 阶段冻结与解冻视觉编码器:
| Vision Encoder | Avg | MMMU | MMBench | TextVQA |
|---|---|---|---|---|
| Frozen | 56.0 | 38.0 | 77.3 | 57.0 |
| Trainable | 56.3 | 36.1 | 76.5 | 57.6 |
解冻后平均只提升 0.3,但 MMMU 下降近 2 分。这说明解冻视觉编码器并非总是更优,需要根据任务和算力预算权衡。
Open-Qwen2VL 最重要的贡献可能不是模型本身,而是它对"全开源"标准的重新界定。表 1 比较了多个 SOTA MLLM 的开放程度:
| 模型 | 代码库 | 过滤方法 | 预训练数据 | SFT 数据 |
|---|---|---|---|---|
| VILA | Open | None | Open | Open |
| MM1 | Closed | Closed | Closed | Closed |
| Qwen2-VL | Closed | Closed | Closed | Open |
| Open-Qwen2VL | Open | Open | Open | Open |
这种全开源模式对学术社区意义重大:它证明预训练研究不只是巨头的游戏,只要数据工程做得足够好,高校实验室也能训练出有竞争力的 MLLM。
假设你只有 8×A100-40G GPU 和 200 GPU 小时的预算,想要训练一个 2B MLLM。基于 Open-Qwen2VL 的经验,你会如何取舍以下三个方面?请简述理由:
主要来源:Open-Qwen2VL 原始论文 (arXiv:2504.00595)
代码与数据:
相关概念:
有疑问? 随时向我提问!可以要求我进一步解释某个指标、某个消融实验,或对比 Open-Qwen2VL 与 Qwen2-VL 的架构差异。