课程 2:学术级算力预训练多模态大模型

论文:Open-Qwen2VL: Compute-Efficient Pre-Training of Fully-Open Multimodal LLMs on Academic Resources

论文信息

标题:Open-Qwen2VL: Compute-Efficient Pre-Training of Fully-Open Multimodal LLMs on Academic Resources

作者:Weizhi Wang, Yu Tian, Linjie Yang, Heng Wang, Xifeng Yan

机构:UC Santa Barbara, ByteDance, Nvidia Research

来源:arXiv:2504.00595

一句话贡献:在 8×A100-40G 学术级 GPU 上,仅用 220 GPU 小时和 0.36% 的 Qwen2-VL 预训练 token,训练出性能更强的 2B 全开源多模态大语言模型。

2B
模型参数量
29M
图像-文本对
5B
Packed 多模态 Token
220h
A100-40G GPU 小时
0.36%
相对 Qwen2-VL 训练量
80.9
MMBench 得分

一、为什么读这篇论文?

近几年,多模态大语言模型(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)的新定义:必须同时公开 训练代码库详细的数据过滤技术全部预训练及监督微调数据。只有三者齐备,研究工作才真正可复现。

二、基础概念:MLLM 预训练全景

为了理解 Open-Qwen2VL 的设计选择,需要先建立几个基础概念。这些概念也是阅读任何 MLLM 论文时的共同语言。

2.1 MLLM 的三件套架构

典型的 MLLM 由三个模块组成:

MLLM 标准架构

图像输入
Vision Encoder
视觉编码器
Projector
投影层
LLM Backbone
语言模型骨干
文本输出

Open-Qwen2VL 的选择是:SigLIP-SO-400M 视觉编码器 + Adaptive Average-Pooling + 两层 MLP 投影层 + Qwen2.5-1.5B-Instruct 语言模型。这是一个非常简洁的架构,没有使用 Qwen2-VL 中复杂的 2D-Multimodal RoPE 或动态分辨率机制。

2.2 持续预训练 vs. 从头预训练

传统视觉-语言模型(如 CLIP、ALIGN)通常从随机初始化开始,在图像-文本对比数据上从头训练。而 MLLM 的常规做法是:

  1. 先有一个已经训练好的纯文本 LLM;
  2. 随机初始化 projector;
  3. 在大量图像-文本数据上继续训练 projector 与 LLM,让模型学会把视觉 token 映射到语言语义空间。

这种"站在巨人肩膀上"的策略称为持续预训练(Continual Pre-training)。它大大降低了训练成本,也是 Open-Qwen2VL 能在学术级算力上完成预训练的前提。

2.3 标题数据 vs. 图文交错数据

多模态预训练数据大致分为两类:

类型形式优势劣势
图像-文本标题数据一张图 + 一段描述文字规模大、结构简单、适合学习视觉-语义对齐缺乏上下文,多图推理能力弱
图文交错数据长文档中图像与文本自然穿插增强多图上下文学习与交错推理会削弱单图零样本推理能力,清洗更复杂

Open-Qwen2VL 明确只使用图像-文本标题数据进行预训练。这是为了在控制数据规模和训练成本的同时,保证单图理解与推理能力。

2.4 视觉编码器:SigLIP 与 CLIP 的区别

CLIP 是 OpenAI 提出的经典对比式视觉-语言模型,通过图像-文本对的对齐学习视觉表示。SigLIP 是其改进版,核心变化在于用 Sigmoid Loss 替代 CLIP 的 InfoNCE / Cross-Entropy Loss

直观理解:CLIP 在对比学习时需要把整个 batch 内的所有图文对都两两比较一次,batch 越大开销越高。SigLIP 的 Sigmoid Loss 允许每张图只和少量负样本比较,训练更稳定、更节省显存。Open-Qwen2VL 选用 SigLIP-SO-400M,既获得高质量视觉特征,也控制了计算成本。

2.5 为什么数据过滤是隐形的胜负手

大规模图像-文本数据来自网页抓取,质量参差不齐:图文不匹配、caption 太短、噪声大、重复多。直接用原始数据训练会浪费大量算力。

数据过滤的目标是从海量候选数据中挑选出"高质量"子集。传统方法依赖 CLIP 图文相似度(CLIPScore);较新的方法则训练一个轻量 MLLM 来评估 caption 质量。Open-Qwen2VL 同时使用了这两种思路。

2.6 Sequence Packing:把短样本拼成长序列

图像-文本 caption 数据的长度差异很大。如果按长度分组再 padding 到最长序列,会产生大量无效 padding token,浪费计算。

Sequence Packing 的思想是把多个较短的样本拼接成一个接近最大上下文长度(如 4096)的序列,只在末尾做少量 padding。这相当于把原本被 padding 占用的算力"捡起来"。

2.7 FSDP 与 DeepSpeed ZeRO3

训练大模型时,单卡显存放不下整个模型。常用的分布式训练策略包括:

Open-Qwen2VL 的代码库基于 Prismatic-VLM 的 FSDP 实现,作者报告其训练速度比 DeepSpeed ZeRO3 快约 17%。

2.8 常见多模态基准简介

基准测试能力
MMBench综合多模态理解(选择题形式)
SEEDBench图像理解的多维度评估
MMStar需要世界知识与推理的视觉问答
MathVista视觉数学推理
AI2D / TextVQA图表理解 / 图中文字识别(OCR-heavy)
POPE幻觉检测

三、模型架构:简洁但高效

3.1 低→高动态分辨率

Open-Qwen2VL 没有使用动态分辨率或 2D-RoPE,而是采用了一种更朴素的策略:

预训练阶段

图像 → SigLIP 729 patches
↓ Average-Pooling
144 visual tokens

SFT 阶段

图像 → 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 显存占用都大幅下降。

3.2 Adaptive Average-Pooling Projector

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 结构。

3.3 冻结视觉编码器

在预训练和 SFT 阶段,Open-Qwen2VL 都冻结了 SigLIP 视觉编码器的参数,只训练 projector 和 LLM。原因有两方面:

论文也做了消融实验:在 SFT 阶段解冻视觉编码器,平均性能略有提升,但 MMMU 明显下降。这说明是否解冻需要权衡。

四、数据工程:决定上限的关键

Open-Qwen2VL 的核心创新之一是对预训练数据的精心筛选与混合。论文中有一句值得记住的话:模型性能的上限往往由数据质量决定,而不是由模型规模决定。

4.1 四组候选数据集

ID数据集过滤模型规模
1CCS-CLIPCLIP8.5M
2DataComp-DFNDFN(CLIP-based)15M
3LAION-CLIPCLIP15M
4DataComp-MLM-Filter & DFNMLM-Filter + DFN19.9M

其中:

4.2 CLIP-based 过滤

CLIPScore 是最传统的图文质量指标。它计算图像特征与文本特征的余弦相似度,分数越高说明图文越匹配。DataComp-DFN 是这种方法的代表:用更大的 CLIP 模型作为"过滤器",在 DataComp 上训练出更强的筛选器。

注意:DFN 只发布了筛选后的数据索引,没有发布模型权重。这意味着研究者无法自行调整过滤阈值,只能使用官方提供的 top-15% 子集。

4.3 MLM-Filter:用 MLLM 当数据裁判

MLM-Filter 是较新的数据过滤方法。它用一个轻量级 MLLM 对每条图文对从四个维度打分:

指标含义用途
ITMImage-Text Matching 图文匹配度判断图与文是否相关
ODFObject Detail Fulfillment 物体细节满足度判断 caption 是否覆盖图中主要对象
CTQCaption Text Quality 文本质量判断 caption 是否通顺、语法正确
SUSemantic Understanding 语义理解度判断 caption 是否体现深层语义

Open-Qwen2VL 采用了 MLM-Filter 中的 Semantic Understanding(SU) 指标,并设置阈值为 85/100。论文引用 ATIQE 的结论:SU 指标对 MLLM 预训练的数据筛选效果最好。

4.4 数据混合消融实验

论文对四组数据做了组合消融,结果如下表(表 3 整理):

数据组合总样本数MMBenchMMStarPOPE平均
1 + 2(CCS + DataComp-DFN)23.5M75.639.679.255.3
1 + 3(CCS + LAION-CLIP)23.5M75.941.780.155.4
1 + 2 + 338.5M75.941.777.755.5
1 + 4(CCS + DataComp-MLM&DFN)28.4M77.341.380.156.0
关键发现:单纯把 DataComp-DFN 和 LAION-CLIP 加在一起(1+2+3)并没有显著提升,可能因为两者分布太相似。但加入少量(约 5M)由 MLM-Filter 筛选出的高质量数据后,平均性能提升了 +0.5。这说明数据多样性比数据总量更重要

五、训练效率:三个杠杆

Open-Qwen2VL 能在学术级算力上完成预训练,靠的是三个相互配合的效率杠杆。

5.1 杠杆一:低分辨率预训练

前面已经提到,预训练阶段用 144 visual tokens,SFT 阶段升到 729。这一步直接减少了 attention 计算量、KV Cache 占用和梯度通信量。下表总结了配置差异:

配置预训练SFT
视觉编码器SigLIP-so400m-384pxSigLIP-so400m-384px
ProjectorAdaptive Avg-Pooling + MLPMLP(此时 pool 为恒等)
每张图 visual tokens144729
上下文长度40964096
Sequence Packing
Global Batch Size256128
训练 epoch11

5.2 杠杆二:多模态序列打包

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 文件保存:

额外收益:序列打包构造了一种"伪交错"数据结构。同一个序列里出现多张图和多个 caption,模型在预训练阶段就接触到多图上下文,这为后续的 in-context learning 能力打下了基础。论文表 5 显示,8-shot 上下文学习相比 0-shot 在 VQA-v2 上提升超过 11 个百分点。

5.3 杠杆三:FSDP 训练框架

Open-Qwen2VL 的训练代码基于 Prismatic-VLM,并保留其 FSDP trainer。作者对比了 FSDP 与 DeepSpeed ZeRO3 的实现,发现 FSDP 每个训练步骤快约 17%。这看起来只是工程优化,但在 220 GPU 小时的总预算下,17% 的加速意味着节省了约 37 GPU 小时,相当于数天的训练时间。

六、监督微调:从 665k 到 10M

6.1 SFT 数据规模曲线

预训练后的 base 模型还需要经过监督微调(SFT)才能听懂人类指令。论文先使用 LLaVA-665k 做基础 SFT,然后进一步把视觉 SFT 数据扩展到 MAmmoTH-VL-10M 的单图子集。

实验结果显示:

6.2 10M 数据的内存优化

10M 条样本如果用传统 LLaVA 式 dataloader 一次性加载完整 JSON,会占用超过 200GB CPU 内存。Open-Qwen2VL 采用的解决方案是:

  1. 把每个样本存成单独的 JSON 文件;
  2. 生成一个 10M 索引文件加载到内存,索引项包括:样本路径、是否纯文本、预计算长度;
  3. 按长度 batchfy,按需读取单个样本。
# 伪代码:索引驱动加载
indices = load_json("sft_10m_indices.json")
# indices[i] = {
#     "path": "samples/0000001.json",
#     "is_text_only": false,
#     "length": 312
# }

七、实验结果与批判性解读

7.1 与 Qwen2-VL-2B 对比

论文把最终模型与多个 2B 级别的 SOTA MLLM 对比:

模型预训练 TokenMMBenchSEEDBenchMMStarMathVista
InternVL2.5-2B-MPO277B72.573.254.355.3
DeepSeekVL-2-Tiny8.1T68.372.549.954.5
Qwen2-VL-2B-Instruct1.4T68.872.046.348.0
Open-Qwen2VL5B80.972.549.753.1

Open-Qwen2VL 在 MMBench 上大幅领先,在 SEEDBench、MMStar、MathVista 上超过 Qwen2-VL-2B。值得注意的是,它只用了 Qwen2-VL 0.36% 的预训练 token。

7.2 优势与短板

优势

  • 极高的训练效率
  • 全开源,可复现
  • MMBench 等通用理解任务表现突出
  • 数据工程方法清晰可迁移

短板

  • AI2D、TextVQA 等 OCR 任务较弱
  • 预训练未使用交错数据
  • 视觉编码器冻结,可能限制上限
  • 仅在 2B 规模验证,大规模是否成立未知

论文作者也明确指出,OCR 短板是因为预训练数据缺少 SynthDoG、LAIONCOCO-OCR 等 OCR 专用 caption 数据。只要在数据混合中加入这类数据,性能会显著提升。

7.3 序列打包的意外收获

表 5 显示,用打包数据预训练的 base 模型具备良好的多图 in-context learning 能力:

shotsGQAVQA-v2VizWizOKVQAText-VQA
027.140.226.124.730.4
835.451.831.227.130.6

VQA-v2 从 40.2 提升到 51.8,提升超过 11 个百分点。这说明序列打包不仅是效率优化,也是能力优化。

7.4 解冻视觉编码器的消融

表 6 对比了 SFT 阶段冻结与解冻视觉编码器:

Vision EncoderAvgMMMUMMBenchTextVQA
Frozen56.038.077.357.0
Trainable56.336.176.557.6

解冻后平均只提升 0.3,但 MMMU 下降近 2 分。这说明解冻视觉编码器并非总是更优,需要根据任务和算力预算权衡。

八、批判性讨论:"Fully Open" 与可复现性

Open-Qwen2VL 最重要的贡献可能不是模型本身,而是它对"全开源"标准的重新界定。表 1 比较了多个 SOTA MLLM 的开放程度:

模型代码库过滤方法预训练数据SFT 数据
VILAOpenNoneOpenOpen
MM1ClosedClosedClosedClosed
Qwen2-VLClosedClosedClosedOpen
Open-Qwen2VLOpenOpenOpenOpen

这种全开源模式对学术社区意义重大:它证明预训练研究不只是巨头的游戏,只要数据工程做得足够好,高校实验室也能训练出有竞争力的 MLLM。

批判性思考:Open-Qwen2VL 的成功是否说明"数据质量 > 数据规模"?在 2B 参数规模上似乎是成立的。但在更大规模(7B、13B)或需要更强推理能力的场景下,这个结论是否仍然成立,还需要更多研究验证。

九、互动练习

练习 1:Open-Qwen2VL 在预训练阶段每张图使用多少个 visual tokens?
A. 729 个 tokens,与 SFT 阶段相同
B. 144 个 tokens,通过 adaptive pooling 压缩
C. 4096 个 tokens,等于上下文长度
D. 512 个 tokens,与图像短边分辨率一致
练习 2:MLM-Filter 中哪个指标被 Open-Qwen2VL 用于最终数据筛选?
A. ITM(图文匹配度)
B. ODF(物体细节满足度)
C. CTQ(caption 文本质量)
D. SU(语义理解度)
练习 3:序列打包的主要目的是什么?
A. 增加模型的上下文长度
B. 减少 padding token 浪费,提高训练效率
C. 让模型同时看到更多高分辨率图像
D. 替代数据过滤步骤
练习 4:Open-Qwen2VL 在哪个任务上相对较弱,作者归因于预训练数据缺失?
A. AI2D / TextVQA 等 OCR 相关任务
B. MMBench 通用理解任务
C. POPE 幻觉检测任务
D. 多图 in-context learning
练习 5:论文提出的"fully open"标准包含以下哪三项?
A. 模型权重、训练日志、推理 API
B. 训练代码库、数据过滤方法、全部训练数据
C. 论文、演示视频、模型权重
D. 数据集、评估脚本、超参数

设计思考题

假设你只有 8×A100-40G GPU 和 200 GPU 小时的预算,想要训练一个 2B MLLM。基于 Open-Qwen2VL 的经验,你会如何取舍以下三个方面?请简述理由:

十、本课小结

核心要点

十一、延伸阅读

主要来源:Open-Qwen2VL 原始论文 (arXiv:2504.00595)

代码与数据:

相关概念:

有疑问? 随时向我提问!可以要求我进一步解释某个指标、某个消融实验,或对比 Open-Qwen2VL 与 Qwen2-VL 的架构差异。