ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

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

VLMEvalKit 使用记录:把 MMBench 评测环境配到 TaoToken 统一通道 1. VLMEvalKit 跑 MMBench 时模型接入到底卡在哪VLMEvalKit 是 OpenCompass 团队开源的 VLM 评测工具包专门用来跑 MMBench、MMMU、MME 这类多模态基准。它能做什么一句话你给它一个模型名和一个数据集名它自动下载数据、加载模型、跑推理、算指标。适合谁正在做 VLM 预训练或微调、需要横向对比多个 checkpoint 的开发者。我这次的目标很明确环境已经装好 OpenCompass 和 flash-attnMMBench_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_KEYsk-你的实际Key TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_MODEL_IDQwen2.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 IDmessages里放图文内容。VLMEvalKit 的 API 封装会帮你拼这个请求你只需要保证 Base URL 和 Key 对就行。如果你要跑 Claude 系列模型注意它的图片传入格式和 OpenAI 略有不同VLMEvalKit 里有单独的claude.py封装配置时 Base URL 同样写https://taotoken.net/api。3. 可复制配置改写 VLMEvalKit 的 API 模型注册这一节是核心我直接把改好的配置片段贴出来你复制到对应文件里就能用。VLMEvalKit 的模型注册逻辑在vlmeval/config.pyAPI 模型的封装在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, modelQwen2.5-VL-7B-Instruct, api_basehttps://taotoken.net/api, keyos.environ.get(TAOTOKEN_API_KEY), temperature0.0, ), }这里Qwen2VLApi是 VLMEvalKit 里已有的 API 封装类如果你用的模型没有对应封装可以用通用的OpenAIWrapper。model字段传的是 TaoToken 上的 Model IDapi_base传 Base URLkey从环境变量读。temperature0.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_basehttps://taotoken.net/api/v1, keyos.environ.get(TAOTOKEN_API_KEY), temperature0.0, max_tokens2048, ), }注意这里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_baseNone, keyNone, **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 而不是 URLVLMEvalKit 会自动处理。Base URL 同样写https://taotoken.net/apiKey 用同一个。配置改完后建议先跑一个最小验证确认请求能走通再跑完整 MMBench。下一节讲怎么验证。4. 验证请求一次最小评测确认通道走通配置改完不要直接跑完整 MMBench_DEV_EN4000 多道题跑完要很久万一配置有问题就白等了。先跑一个最小验证确认请求确实走通。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里keyos.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, indent2, ensure_asciiFalse))还有一种情况是模型返回了空内容导致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。
返回列表