我最早以为,多模态大模型就是把图片缩小成固定尺寸,然后丢给语言模型读像素。直到有一次,我拿一张工程图纸去试各种模型——图纸上密密麻麻的尺寸标注,连GPT-4V都读错了几个关键数字,而一个当时还没什么名气的开源模型居然一个不差。那个模型叫InternVL2。

这件事让我重新思考一个问题:多模态模型的差距,究竟差在哪里?答案不是“有没有视觉”,而是“怎么看”。
多模态模型的基础套路不难懂:把图片切成小块,每个小块变成向量,再拼接成一段“视觉token”,送给语言模型。但这里有个天然矛盾——图片信息密度太高了。一张高分辨率图片,如果直接缩到224×224,模型看到的只是一个模糊的轮廓;如果保留原始分辨率,token数量又会爆炸,算力扛不住。
早期的LLaVA、Qwen-VL都选了固定分辨率,通常是448×448。模型能看懂“猫在沙发上”,但看不懂“图纸右下角那个3.14mm的标注”。这就是多模态模型“瞎”的根源——不是没有眼睛,是眼睛的度数不够。
动态分辨率:把图片切成拼图,每一块都看清
InternVL2用了动态分辨率(Dynamic Resolution)。说人话:不把整张图压扁,而是先把图片按原始宽高比切分成多个patch,每个patch单独送入视觉编码器,再加上一个全局缩略图作为“全景参考”。
- 模型会计算一个最优的切分方案,比如把图片切成1×2、2×2或3×4个tile,每个tile大小固定为448×448。
- 每个tile独立通过ViT编码,得到局部视觉特征。
- 整张图缩略为一个448×448的全局图,也通过ViT编码,得到全局特征。
- 所有tile和全局图的token拼接在一起,加上位置信息,送进语言模型。
这意味着,一张1000×2000的长图,会被切成2个tile,每个tile保留原始分辨率下的细节。模型既能看清局部小字,又能理解整体布局。我最初觉得这不过是“切图拼图”,后来才发现真正的难点在最后一步——像素对齐。
因为切出来的tile是独立的,每个tile的坐标信息是混乱的。模型怎么知道tile A在tile B的左边?InternVL2在视觉token里加入了像素坐标信息,把每个token对应在原图中的精确位置告诉语言模型。这个设计看起来简单,却是决定“能否看图说话”的关键。
还有一个值得注意的细节:InternVL2在视觉编码器后接了一个Pixel Shuffle操作,把相邻的视觉token合并,让token数量减少到原来的四分之一。这个设计既保留了视觉信息,又降低了计算量。我最早没看懂这个操作,后来意识到这就是“动态分辨率”能跑起来的关键——不然动辄上千个token,任何语言模型都吃不消。
你可能会问,为什么之前没人这么做?其实早期一些模型也尝试过切图,但往往忽略了坐标信息,导致模型看到了细节却不知道细节在哪里。InternVL2的贡献在于把“切图”和“位置编码”做成了一个整体,让模型在接收大量视觉token时,仍然知道自己看到的是哪里。
更大的模型,但视觉塔反而变小了?
你可能会以为,多模态模型升级就是把视觉模型和语言模型一起变大。InternVL2恰恰相反——它的视觉编码器比InternVL1.0小得多。
InternVL1.0用的是6B参数的ViT(视觉Transformer),方案来自InternVL1.0论文;而InternVL2换回了标准的300M左右的ViT,把省下来的算力全部给了语言模型。语言模型从1.8B一直扩展到76B。
这个选择有点反直觉。我一开始也困惑:视觉编码器变小,视觉能力不会下降吗?后来看到评测才明白,多模态模型的上限更多取决于语言模型的理解和推理能力。视觉塔只需要把“像素”变成“语义”,真正的深度思考发生在语言模型里。为什么6B的ViT反而不好?因为训练成本高,而且容易过拟合。视觉Transformer的任务相对简单——提取局部特征,不需要那么大的容量。反而语言模型需要更大的容量来推理和生成。InternVL2的设计更像人类:眼睛的视神经不粗,但大脑皮层很大。
我们用一张表来对比InternVL1和InternVL2的核心差异:
| 维度 | InternVL1.0 | InternVL2 |
|---|---|---|
| 视觉编码器 | 6B ViT | 约300M ViT |
| 语言模型 | 1.8B/7B | 1B~76B(InternLM2/Qwen2) |
| 分辨率 | 固定448 | 动态448×N |
| 像素对齐 | 无 | 有(坐标注入) |
| 训练数据 | 大规模图文对 | 更高质量、更重OCR与图表数据 |
所以InternVL2的“更大模型”不是简单堆参数,而是把语言模型做大,视觉模型做精,配合动态分辨率,让“眼睛”和“大脑”的分工更合理。
数据比模型更值钱:InternVL2的数据配方
训练多模态模型,很多人只关注模型结构,忽略了数据。InternVL2在GitHub主页上明确强调:他们的训练数据经过了严格的清洗和配比,尤其加大了OCR、图表、文档理解类数据的比例。这解释了为什么它看工程图纸那么准。
我最早以为,多模态数据越多越好。后来读了一些分析,才发现数据配比才是真正的“炼金术”。如果图像描述类数据占主导,模型会变成“复读机”;只有加入大量需要推理的视觉问答数据,模型才能学会“看-想-答”。InternVL2的训练分为两个阶段:先做图文对齐预训练,让视觉token和语言token对齐;再用指令微调数据做多任务学习,让模型学会遵循人类指令。
我后来在训练日志里看到一个小细节:他们故意把“图像描述”和“视觉问答”的比例控制在了一个平衡点。如果描述数据太多,模型会变得话痨,但答非所问;如果问答数据太多,模型又会失去描述能力。InternVL2花了很大功夫做数据配比,这种“斤斤计较”最终反映在了评测分数上。
这个流程和LLaVA相似,但InternVL2把数据规模和多样性拉高了几个量级。它在OpenCompass多模态评测榜上的表现,一度超越了许多闭源模型。
“InternVL2-76B在OpenCompass多模态评测的多个基准上超越了GPT-4V和Gemini Pro。” —— 引自InternVL项目主页
5分钟上手InternVL2
InternVL2的推理非常简单,直接通过transformers加载即可。下面是加载8B模型的示例:
from transformers import AutoModel, AutoTokenizer
import torch
model = AutoModel.from_pretrained(
'OpenGVLab/InternVL2-8B',
trust_remote_code=True,
torch_dtype=torch.bfloat16
).cuda()
tokenizer = AutoTokenizer.from_pretrained('OpenGVLab/InternVL2-8B', trust_remote_code=True)
注意,因为模型支持动态分辨率,你不需要对图片做任何预处理,模型会自己决定怎么切分。
开源标杆,但不是万能的
InternVL2系列从1B到76B,覆盖了从手机端到服务器端的全场景。我自己用下来的感受是:在文档解析、图表理解、OCR这类任务上,它已经是开源第一梯队;但在复杂空间推理和数学问题上,它仍然会犯低级错误。
比如,让它数一张图里有几个相交的圆,它可能一本正经地给出错误答案。原因是视觉token在传递到语言模型时,空间位置信息仍然有损耗。动态分辨率解决了“看不清”,但解决不了“想不通”。
另外,多模态模型普遍存在的幻觉问题,InternVL2也有。你问它图片里有什么,它可能会“看到”不存在的物体。这在开源模型里尤其明显,因为开源模型的可控性不如闭源。而且有点反直觉:越是细节丰富的图片,它越容易把注意力放在显眼的物体上,忽略背景中的小物体。比如一张超市货架图,它会准确说出中间的饮料,却漏掉角落的价签。这种“注意力偏置”是视觉Transformer的固有毛病,不是数据能完全解决的。
如果你要部署InternVL2,我的建议是:纯OCR任务选8B,通用对话选26B,复杂图表推理选76B。更大的模型不一定更好,但如果你有足够的显存,76B的推理深度确实有明显优势。
所以我的判断是:InternVL2是当前开源多模态的标杆,它的架构思路(动态分辨率+像素对齐+轻量ViT+强LLM)已经成了后续模型的默认范式。但如果你要处理的是高风险的视觉决策,比如医疗影像、自动驾驶,还是需要额外的验证机制,不能盲信模型输出。
InternVL2和LLaVA有什么本质区别?
LLaVA是基础范式,InternVL2在视觉编码和数据处理上做了深度优化。前者是“能看”,后者是“看得准、看得懂”。
是不是模型越大越好?
不是。InternVL2的8B和26B在多数任务上已经超过了许多百亿级模型。数据质量和视觉对齐往往比参数规模更关键。
回到开头的工程图纸。InternVL2能读对,不是因为它“聪明”,而是因为它把“看”这件事拆成了可解释的步骤:动态切分保证细节,像素对齐还原位置,大数据配方让语言模型学会从视觉特征中推理。这条路未必是终点,但它至少证明了:开源多模态模型不必永远落后闭源一步。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/286.html