拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

VLMEvalKit 使用记录:把 MMBench 评测环境配到 TaoToken 统一通道

VLMEvalKit 使用记录:把 MMBench 评测环境配到 TaoToken 统一通道

1. VLMEvalKit 跑 MMBench 时模型接入到底卡在哪

VLMEvalKit 是 OpenCompass 团队开源的 VLM 评测工具包,专门用来跑 MMBench、MMMU、MME 这类多模态基准。它能做什么?一句话:你给它一个模型名和一个数据集名,它自动下载数据、加载模型、跑推理、算指标。适合谁?正在做 VLM 预训练或微调、需要横向对比多个 checkpoint 的开发者。我这次的目标很明确:环境已经装好 OpenCompass 和 flash-attn,MMBench_DEV_EN 数据集也手动放好了,接下来要把模型请求从本地权重加载切到统一 API 通道,让评测跑起来的同时不占本地显存。

先说清楚为什么要做这个切换。本地加载 Qwen2.5-VL-7B-Instruct 跑 MMBench,光权重就 15GB 左右,加上 flash-attn 的 KV cache,一张 24G 卡跑 DEV_EN 的 4000 多道题,推理阶段还行,但如果你想同时对比三四个模型,显存直接爆炸。更现实的问题是:每次换模型都要重新下载权重、重新配 flash-attn 编译环境,时间成本太高。把模型侧改成走统一 API 通道后,本地只负责数据加载和指标计算,模型推理走远端,换模型只需要改一个 model 字段。

这里有个关键点容易被忽略:VLMEvalKit 的模型接入层在vlmeval/vlmeval/api/下面,它内置了一批 API 模型的封装,比如 GPT-4o、Claude、Qwen-VL 的 API 版本。但默认这些封装指向的是各家官方端点,你需要做的是把 Base URL 改写成统一通道地址,同时把 API Key 换成你在 TaoToken 控制台生成的 Key。改完之后,--model参数传的不再是本地权重名,而是 API 模型对应的注册名。

我试过直接改config.py里的model_path指向本地绝对路径,这条路能跑通,但只适合单模型验证。一旦你要跑多模型对比,或者本地卡不够,就得走 API 通道。下面我把两条路都写清楚,你可以按自己的硬件情况选。

MMBench 的评测流程本身不复杂:数据集是 TSV 格式,每行一道选择题,模型输出选项字母,脚本比对答案算 accuracy。真正耗时间的是模型加载和推理。走 API 通道后,推理延迟取决于网络和远端排队,但本地显存占用几乎为零,这对只有一张卡还想跑多模型对比的场景非常实用。

还有一个坑:VLMEvalKit 默认会检查.env文件加载环境变量,如果你没建这个文件,日志里会反复出现Did not detect the .env file的 ERROR。这个不影响运行,但看着烦,建议在项目根目录建一个.env,把 API Key 写进去,后面配置会用到。

2. TaoToken 前置准备:Key、Base URL 与模型名三件套

在改 VLMEvalKit 配置之前,先把 TaoToken 侧的三件套准备好:API Key、Base URL、Model ID。这三个东西缺一不可,而且必须和 VLMEvalKit 里写的完全一致,否则就是 401 或者 model not found。

第一步,打开 TaoToken 控制台生成 API Key。地址是 https://taotoken.net/api-keys ,登录后点创建新 Key,复制出来存好。注意这个 Key 只在创建时完整显示一次,关掉页面就看不到了,建议直接写进.env文件。

第二步,确认 Base URL。TaoToken 的 API 端点是https://taotoken.net/api,注意这里不要加任何 UTM 参数,就是纯 API 地址。VLMEvalKit 里配置的时候,有些封装要求你写到/v1结尾,有些要求写到根路径,这个要看具体模型封装的实现。我下面给的配置片段会写清楚。

第三步,确认 Model ID。这个是你想评测的模型在 TaoToken 上的注册名,比如Qwen2.5-VL-7B-Instruct或者gpt-4o。你可以在模型对话页面 https://taotoken.net/models 看到可用模型列表,复制对应的 ID。注意 Model ID 大小写敏感,写错了会报 model not found。

把这三个东西写进.env文件,放在 VLMEvalKit 项目根目录:

# /path/to/VLMEvalKit/.env TAOTOKEN_API_KEY=sk-你的实际Key TAOTOKEN_BASE_URL=https://taotoken.net/api TAOTOKEN_MODEL_ID=Qwen2.5-VL-7B-Instruct

然后确认 VLMEvalKit 能读到这个文件。它的misc.py里有个load_env函数,默认从项目根目录找.env。如果你之前跑的时候看到Did not detect the .env file的报错,说明文件没放对位置或者名字不对。放好之后重新跑,这个 ERROR 就消失了。

接下来要确认你的 VLMEvalKit 版本支持 API 模型接入。打开vlmeval/vlmeval/api/目录,看看里面有没有qwen_vl.py或者类似的 API 封装文件。如果没有,你需要手动加一个,或者用通用的 OpenAI 兼容封装。我下面给的是基于 OpenAI 兼容接口的配置方式,大部分 API 模型都能走这条路。

还有一点:TaoToken 的 API 是 OpenAI 兼容格式,请求体里model字段传 Model ID,messages里放图文内容。VLMEvalKit 的 API 封装会帮你拼这个请求,你只需要保证 Base URL 和 Key 对就行。如果你要跑 Claude 系列模型,注意它的图片传入格式和 OpenAI 略有不同,VLMEvalKit 里有单独的claude.py封装,配置时 Base URL 同样写https://taotoken.net/api。

3. 可复制配置:改写 VLMEvalKit 的 API 模型注册

这一节是核心,我直接把改好的配置片段贴出来,你复制到对应文件里就能用。VLMEvalKit 的模型注册逻辑在vlmeval/config.py,API 模型的封装在vlmeval/api/下面。我们要做两件事:一是在config.py里注册一个走 TaoToken 通道的模型,二是确保 API 封装里的 Base URL 指向正确。

先看config.py里 API 模型的注册部分。找到类似api_models的字典,在里面加一项:

# vlmeval/config.py 片段 api_models = { # ... 其他模型 'Qwen2.5-VL-7B-Instruct-TaoToken': partial( Qwen2VLApi, model='Qwen2.5-VL-7B-Instruct', api_base='https://taotoken.net/api', key=os.environ.get('TAOTOKEN_API_KEY'), temperature=0.0, ), }

这里Qwen2VLApi是 VLMEvalKit 里已有的 API 封装类,如果你用的模型没有对应封装,可以用通用的OpenAIWrapper。model字段传的是 TaoToken 上的 Model ID,api_base传 Base URL,key从环境变量读。temperature=0.0是为了评测结果可复现,MMBench 这种选择题评测必须用 0 温度。

如果你用的模型在 VLMEvalKit 里没有现成封装,用 OpenAI 兼容封装这样写:

# vlmeval/config.py 片段 - 通用 OpenAI 兼容 from vlmeval.api.openai import OpenAIWrapper api_models = { 'My-VLM-TaoToken': partial( OpenAIWrapper, model='你的Model-ID', api_base='https://taotoken.net/api/v1', key=os.environ.get('TAOTOKEN_API_KEY'), temperature=0.0, max_tokens=2048, ), }

注意这里api_base写的是https://taotoken.net/api/v1,因为 OpenAI 兼容封装会自动在末尾拼/chat/completions。如果你用的封装类自己会拼/v1,那就写https://taotoken.net/api。这个细节要看具体封装实现,报 404 的时候先检查这里。

然后是 API 封装类里的 Base URL 处理。打开vlmeval/api/qwen_vl.py(或者你用的对应文件),找到__init__方法里设置self.api_base的地方,确认它没有硬编码官方地址。如果有硬编码,改成从参数读取:

# vlmeval/api/qwen_vl.py 片段 class Qwen2VLApi(BaseAPI): def __init__(self, model, api_base=None, key=None, **kwargs): self.model = model self.api_base = api_base or os.environ.get('TAOTOKEN_BASE_URL', 'https://taotoken.net/api') self.key = key or os.environ.get('TAOTOKEN_API_KEY') # ... 其余初始化

改完之后,跑评测的命令行里--model传你注册的名字:

python run.py --data MMBench_DEV_EN --model Qwen2.5-VL-7B-Instruct-TaoToken --verbose

这里有个容易踩的坑:--model传的是你在config.py里注册的 key,不是 Model ID。Model ID 是在partial里通过model=参数传的。这两个别搞混,搞混了会报 model not found。

另外,如果你要跑 Claude 系列,VLMEvalKit 有claude.py封装,配置方式类似,但注意 Claude 的图片格式是 base64 而不是 URL,VLMEvalKit 会自动处理。Base URL 同样写https://taotoken.net/api,Key 用同一个。

配置改完后,建议先跑一个最小验证,确认请求能走通,再跑完整 MMBench。下一节讲怎么验证。

4. 验证请求:一次最小评测确认通道走通

配置改完不要直接跑完整 MMBench_DEV_EN,4000 多道题跑完要很久,万一配置有问题就白等了。先跑一个最小验证,确认请求确实走通。

VLMEvalKit 支持用--data指定小数据集,或者用--limit限制题目数量。我建议用 MMBench_DEV_EN 加--limit 5,只跑前 5 道题:

python run.py --data MMBench_DEV_EN --model Qwen2.5-VL-7B-Instruct-TaoToken --verbose --limit 5

跑之前确认数据集已经手动放好了。如果你之前遇到过ContentTooShortError或者 md5 不匹配的报错,说明数据集下载不完整。解决办法是从日志里找到下载 URL,手动下载后放到LMUData目录。默认路径是~/LMUData或者项目根目录下的LMUData,具体看日志里提示的路径。

# 手动下载数据集示例 mkdir -p ~/LMUData/MMBench wget https://opencompass.openxlab.space/utils/benchmarks/MMBench/MMBench_DEV_EN.tsv -O ~/LMUData/MMBench/MMBench_DEV_EN.tsv

放好之后重新跑,日志里应该看到数据集加载成功,不再有下载进度条。然后模型侧会开始发请求。如果配置正确,你会看到类似这样的输出:

[2025-08-05 20:15:30] INFO - api.py: generate - 128: Sending request to https://taotoken.net/api/v1/chat/completions [2025-08-05 20:15:32] INFO - api.py: generate - 145: Response received, tokens: 156 [2025-08-05 20:15:32] INFO - run.py: main - 320: Inference completed for 1/5

看到Response received就说明请求走通了。如果卡在Sending request不动,或者报连接超时,检查 Base URL 和网络。如果报 401,检查 API Key 是否正确写入.env并且被加载。如果报 model not found,检查 Model ID 大小写和拼写。

5 道题跑完后,会生成一个结果文件,通常在outputs/目录下,文件名类似Qwen2.5-VL-7B-Instruct-TaoToken_MMBench_DEV_EN.csv。打开看看每道题的预测答案和标准答案,确认模型确实在回答问题而不是返回空。

验证通过后,去掉--limit跑完整评测:

python run.py --data MMBench_DEV_EN --model Qwen2.5-VL-7B-Instruct-TaoToken --verbose

完整跑完后会输出 accuracy 指标。MMBench_DEV_EN 的官方 baseline 大概在 75-80 分左右(取决于模型版本),如果你的结果在这个区间,说明整个链路没问题。

这里提醒一个细节:VLMEvalKit 默认会缓存推理结果,如果你中途断了重新跑,加--reuse可以复用之前的临时文件,不用从头开始。但如果你改了配置,建议先删掉outputs/下的临时文件再跑,避免读到旧结果。

5. 本篇常见报错排查:401、local proxy failed、reading choices

跑 VLMEvalKit 接 API 通道,最常见的报错就那么几个,我按实际遇到的频率排一下。

401 Unauthorized:这个最直接,Key 不对或者没传进去。检查.env文件里TAOTOKEN_API_KEY的值,确认没有多余空格和换行。然后确认config.py里key=os.environ.get('TAOTOKEN_API_KEY')这行确实读到了环境变量。可以在 Python 里打印一下os.environ.get('TAOTOKEN_API_KEY')看是不是 None。如果是 None,说明.env没被加载,检查文件位置和load_env的调用路径。

local proxy failed / Connection refused:这个报错通常出现在你本地有代理设置,但代理没开或者代理地址不对。VLMEvalKit 发请求走的是requests库,它会读HTTP_PROXY和HTTPS_PROXY环境变量。如果你不需要代理,直接 unset 掉:

unset HTTP_PROXY unset HTTPS_PROXY unset http_proxy unset https_proxy

然后重新跑。如果你确实需要走代理,确认代理地址和端口正确,并且代理进程在运行。注意这里不要用任何不合规的网络工具,就用正常的网络环境。

reading choices 相关报错:这个通常出现在结果解析阶段,报错信息类似KeyError: 'choices'或者IndexError: list index out of range。原因是 API 返回的 JSON 结构和你预期的不一样。比如你用的封装类期望response['choices'][0]['message']['content'],但实际返回的是response['data']['content']。解决办法是打开对应的 API 封装文件,找到解析 response 的地方,打印一下原始返回,然后按实际结构调整解析逻辑。

# 调试用:打印原始返回 import json print(json.dumps(response, indent=2, ensure_ascii=False))

还有一种情况是模型返回了空内容,导致choices[0]存在但message.content为空。这通常是 max_tokens 设太小或者模型被截断。把max_tokens调到 2048 以上再试。

flash-attn not install:这个报错出现在你走本地权重加载的时候,不是 API 通道的问题。如果你确实需要本地加载,装 flash-attn 的步骤是:

pip install flash-attn --no-build-isolation

装之前确认 gcc 版本、glibc 版本、CUDA 版本和 torch 版本匹配。编译报错就一个个解决,通常是 CUDA 版本和 torch 编译版本不一致导致的。这个和 API 通道无关,走 API 通道不需要 flash-attn。

OAuth / token 过期:如果你用的是需要 OAuth 的模型,报错信息里会出现OAuth token expired或者invalid_grant。TaoToken 的 API Key 是长期有效的,不存在 OAuth 刷新问题。如果你遇到这个报错,说明你配置的 Base URL 指向了别的地方,检查api_base是不是写成了官方端点。

数据集 md5 不匹配:这个不是 API 通道的问题,是数据集文件损坏。解决办法是删掉LMUData下对应的文件重新下载,或者手动下载后校验 md5。日志里会提示期望的 md5 和实际 md5,对比一下就知道文件对不对。

排查顺序建议:先确认 Key 和 Base URL 对,再确认 Model ID 对,然后确认网络通,最后看返回结构。大部分问题在前两步就能解决。

6. 统一通道跑 VLM 评测的长期用法与 CTA

把 VLMEvalKit 的模型侧切到统一 API 通道后,最大的好处是换模型成本极低。你不需要重新下载权重、不需要重新编译 flash-attn、不需要担心显存不够。想对比 Qwen2.5-VL-7B 和 InternVL2-8B,只需要在config.py里加两个注册项,然后分别跑一遍,本地只负责数据加载和指标计算。

如果你要长期跑评测,建议把模型注册做成配置化,不要硬编码在config.py里。可以写一个models.yaml,启动时读取并动态注册。这样换模型只需要改 YAML 文件,不用动代码。

对于需要跑大量模型对比的场景,可以考虑用 Coding Plan 来管理 API 调用配额,地址是 https://taotoken.net/coding-plan 。它适合那种需要长期、高频调用模型的编码和评测任务,比按次计费更划算。

如果你在配置过程中遇到问题,先看接入文档 https://taotoken.net/doc ,里面有针对不同工具链的配置示例。模型列表和可用 Model ID 在 https://taotoken.net/models 可以查到。API Key 管理在 https://taotoken.net/api-keys 。

最后说一个实用技巧:VLMEvalKit 的--reuse参数在调试阶段很有用,它会把中间结果缓存下来,断了重跑不用从头开始。但正式跑最终结果时建议去掉--reuse,确保每次都是全新推理。另外,MMBench 的评测结果对 temperature 很敏感,一定要用 0 温度,否则同一道题两次跑可能得到不同答案,指标不可复现。

整个链路跑通后,你可以在本地只保留数据集和评测脚本,模型推理全部走远端。这样一台普通开发机就能跑多模型对比,不用排队等 GPU。

返回列表