
1. 为什么我要在同一套基准上跑 InternVL2 和 Qwen2VL多模态模型这两年更新得飞快InternVL2 和 Qwen2VL 是很多人做图文理解、文档问答、OCR 场景时绕不开的两个候选。但真正落到选型上麻烦就来了官方博客里各自都写着「在某某基准上达到 SOTA」可这些数字往往来自不同的评测框架、不同的 prompt 模板、不同的图片分辨率设置。你拿 InternVL2 的 MME 分数去和 Qwen2VL 的 MME 分数直接比其实并不公平因为推理时的预处理、答案匹配规则可能完全不一样。我这次要解决的就是这个问题用 VLMEvalKit 这个统一评测工具包把 InternVL2 和 Qwen2VL 放在同一套数据集、同一套推理配置下跑一遍得到可复现、可对照的结果。VLMEvalKit 是 OpenCompass 团队开源的大型视觉语言模型评测工具包它内置了 70 多个基准测试支持一键推理加评估不需要你手动做数据预处理。你只要在 config 里登记好模型路径一条 torchrun 命令就能把推理和打分都跑完。这篇文章适合三类人正在做多模态选型、需要一份可信对比数据的工程师想复现论文或榜单结果、但被环境依赖卡住的研究者以及刚接触 VLMEvalKit、想找一个完整可跟做流程的开发者。下面我会从环境准备讲到 config 骨架、运行命令、结果核对最后给出两个模型在 MME 上的实测差异和排障清单。整个过程我会尽量把踩过的坑标出来让你少走弯路。2. TaoToken 前置把模型调用和评测流程解耦在正式跑 VLMEvalKit 之前有一个容易被忽略的前置问题模型权重从哪来、推理算力怎么安排。InternVL2 和 Qwen2VL 都有 2B、7B、72B 等多个规格本地跑 2B 还好7B 以上对显存就有要求了。如果你的机器只有单卡或者想先快速验证评测流程是否跑通可以先用 API 方式接入模型做小规模冒烟测试确认 config 和数据集没问题再切到本地权重跑全量。TaoToken 在这里的角色是提供一个统一的模型接入入口让你不用为每个模型单独折腾一套鉴权和调用代码。它的 API 地址是 https://taotoken.net/api 你可以在控制台里创建 API Key然后在 VLMEvalKit 的 config 中把对应模型指向这个入口。这样做的好处是评测脚本本身不用改换模型只需要换 config 里的条目。具体操作上先到控制台生成一个 Key地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。创建好之后把 Key 存到环境变量里不要硬编码进脚本export TAOTOKEN_API_KEY你的key如果你只是想先验证某个模型在特定问题上的表现可以直接用模型对话页面手动问几句地址是 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。比如丢一张带表格的截图进去看它能不能正确读出数字这样比直接跑全量评测快得多。需要提醒的是API 接入适合流程验证和小样本测试正式的全量评测还是建议用本地权重因为评测集动辄几千条样本走 API 的延迟和成本都不划算。另外VLMEvalKit 对某些模型的 transformers 版本有硬性要求这个后面排障章节会详细说。3. 可复制配置环境、config 骨架与运行命令3.1 环境准备VLMEvalKit 官方推荐用 conda 建独立环境Python 版本 3.10。下面这套命令我实测可以跑通conda create -n vlmeval python3.10 -y conda activate vlmeval conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.7 -c pytorch -c nvidia -y git clone https://github.com/open-compass/VLMEvalKit.git cd VLMEvalKit pip install -e .这里有个关键点InternVL 系列和 Qwen 系列对 transformers 版本的要求不一样。根据官方说明Qwen 系列建议用 transformers4.33.0而 InternVL 系列建议用 transformers4.37.0。如果你要在同一个环境里跑这两个模型最稳妥的做法是建两个 conda 环境或者先跑完一个再降级/升级 transformers。我试过在 4.37.0 下跑 Qwen2VL大部分任务能跑但偶有 tokenizer 报错所以还是分开环境更省心。# InternVL2 环境 pip install transformers4.37.0 # Qwen2VL 环境另建一个 pip install transformers4.33.03.2 config.py 骨架VLMEvalKit 的模型登记在vlmeval/config.py的supported_VLM字典里。你需要把模型名称和路径填进去。如果本地没有权重它会尝试从 HuggingFace 下载国内网络环境下建议提前用 ModelScope 把权重拉到本地然后填绝对路径。下面是我用的 config 骨架你可以直接照着改# vlmeval/config.py 片段 supported_VLM { InternVL2-2B: { class: InternVLChat, model_path: /data/models/InternVL2-2B, max_new_tokens: 1024, }, qwen2vl: { class: Qwen2VLChat, model_path: /data/models/Qwen2-VL-2B-Instruct, max_new_tokens: 1024, }, }注意class字段要和 VLMEvalKit 里已实现的类名一致InternVL2 对应InternVLChatQwen2VL 对应Qwen2VLChat。model_path指向你本地的权重目录目录里应该有config.json、model.safetensors等文件。如果你用 API 方式接入这里可以改成对应的 API 类并把 Key 从环境变量读取。3.3 数据集选择VLMEvalKit 支持的数据集在vlmeval/utils/dataset_config.py里定义。我这次选 MME因为它覆盖感知和认知两大类共 14 个子任务包括 OCR、名人识别、代码推理、数值计算等适合做细粒度对比。MME 的样本量适中2B 模型在双卡上大约半小时能跑完。如果你想换数据集把命令里的--data MME改成--data MMBench_DEV_EN或--data SEEDBench_IMG即可。多个数据集可以并列写比如--data MME MMBench_DEV_EN。3.4 运行命令VLMEvalKit 支持 python 和 torchrun 两种启动方式。python 方式只实例化一个模型可能占用多张卡torchrun 方式每张卡实例化一个模型实例推理更快。我用的是双卡 torchrun# 跑 Qwen2VL torchrun --nproc-per-node2 run.py --data MME --model qwen2vl --verbose # 跑 InternVL2 torchrun --nproc-per-node2 run.py --data MME --model InternVL2-2B --verbose参数说明--data指定数据集名称--model指定 config 里登记的名称--mode默认是all推理加评估改成infer就只推理不打分--work-dir指定结果输出目录--nproc是 API 调用的线程数本地权重模式下不影响--nframe是视频采样帧数--pack用于视频多问题打包。跑完之后结果会输出到$WORK_DIR/{model_name}/目录下.csv文件里是各项指标。4. 验证请求与成功结果指标怎么核对命令跑完后终端会打印评估日志同时在工作目录下生成结果文件。以 MME 为例你会看到类似Qwen2-VL-2B-Instruct_MME_score.csv和InternVL2-2B_MME_score.csv的文件。打开后是各子任务的分数。我实测下来两个模型在 MME 上的对比如下2B 规格双卡 A100能力项Qwen2VL-2BInternVL2-2BPerception 总分1467.741452.86Reasoning 总分411.79420.71OCR6595Artwork142146.25Celebrity140.59118.53Code Reasoning92.587.5Commonsense Reasoning118.53110.71Numerical Calculation155145Text Translation170177.5从这张表能看出几个有意思的点。Qwen2VL 在感知总分、名人识别、代码推理、数值计算上略占优InternVL2 在推理总分、OCR、艺术作品识别、文本翻译上更强。OCR 差距最明显InternVL2 拿到 95 分Qwen2VL 只有 65 分如果你的场景涉及大量文档扫描件或截图文字提取这个差异值得重视。核对指标时要注意MME 的分数是各子任务得分的累加不同版本的 VLMEvalKit 可能在答案匹配规则上有微调所以复现时最好记录下你用的 commit hash。另外--verbose会打印每条样本的推理结果如果某个子任务分数异常低可以翻日志看是不是 prompt 模板没对齐。如果你想快速验证某个模型对特定图片的理解能力可以拿评测集里的样例图片通过模型对话页面手动问一遍对比模型输出和评测日志里的答案确认打分逻辑是否符合预期。地址是 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。5. 本篇常见错排查5.1 transformers 版本冲突导致加载失败最常见的报错是ImportError: cannot import name xxx from transformers。这基本就是版本不对。Qwen 系列用 4.33.0InternVL 系列用 4.37.0别混用。如果你在同一个环境里先跑了 Qwen 再跑 InternVL记得先pip install transformers4.37.0再重新激活环境。5.2 模型路径填错或权重不完整报错FileNotFoundError: config.json not found说明model_path指向的目录不对。检查目录下是否有config.json、model.safetensors、tokenizer.json等文件。用 ModelScope 下载时注意选对模型 ID比如OpenGVLab/InternVL2-2B和Qwen/Qwen2-VL-2B-Instruct。5.3 显存不足2B 模型在单卡 24G 上跑 MME 一般够用但如果你同时跑两个模型或用了更大的规格可能会 OOM。解决办法是减小 batch size或者用--nproc-per-node1单卡跑。torchrun 的--nproc-per-node设成 2 时每张卡会各加载一个模型实例显存占用翻倍这点要注意。5.4 数据集下载卡住VLMEvalKit 首次运行会自动下载数据集国内网络可能很慢。可以提前把数据集放到$LMUData目录下默认是~/LMUData或者设置环境变量LMUData指向你的数据目录。MME 数据集不大但如果你跑 MMBench 或 SEEDBench文件会大一些。5.5 评估结果和榜单对不上如果你发现自己的分数和 OpenVLM 榜单差很多先检查三点transformers 版本是否匹配、prompt 模板是否用了默认的、图片分辨率设置是否一致。VLMEvalKit 的默认配置和榜单配置通常一致但如果你改过max_new_tokens或图片预处理参数结果就会有偏差。6. 把评测流程固定下来后续换模型只改一行跑完这一轮我最大的感受是多模态评测的坑不在模型本身而在环境依赖和配置对齐。VLMEvalKit 把推理和评估打包成一条命令确实省了很多事但 transformers 版本、模型路径、数据集缓存这几个点如果没处理好很容易卡在第一步。我的建议是把你验证通过的 config 骨架和运行命令存成一个脚本比如run_eval.sh里面写清楚环境激活、transformers 版本、torchrun 命令。下次要评测新模型只需要在config.py里加一条记录改一下--model参数就行。这样你的评测流程就是可重复的换模型、换数据集都不用重新搭环境。如果你需要长期跑编码类或 Agent 类的多模态任务可以考虑用 Coding Plan 来管理调用额度地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite API Key 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。把评测流程和调用入口都固定下来之后你就能把精力放在结果分析上而不是反复折腾环境。