在运行评测脚本之前,你需要先配置 VLMs,并正确设置模型路径。然后你可以使用脚本 run.py
进行多个VLMs和基准测试的推理和评估。
安装
git clone https://github.com/open-compass/VLMEvalKit.git
cd VLMEvalKit
pip install -e .
设置密钥
要使用 API 模型(如 GPT-4v, Gemini-Pro-V 等)进行推理,或使用 LLM API 作为评判者或选择提取器,你需要首先设置 API 密钥。如果你设置了密钥,VLMEvalKit 将使用一个评判 LLM 从输出中提取答案,否则它将使用精确匹配模式(在输出字符串中查找 "Yes", "No", "A", "B", "C"...)。精确匹配模式只能应用于是或否任务和多项选择任务。
-
你可以将所需的密钥放在
$VLMEvalKit/.env
中,或直接将它们设置为环境变量。如果你选择创建.env
文件,其内容将如下所示:# .env 文件,将其放置在 $VLMEvalKit 下 # 专有 VLMs 的 API 密钥 DASHSCOPE_API_KEY= GOOGLE_API_KEY= OPENAI_API_KEY= OPENAI_API_BASE= STEPAI_API_KEY= REKA_API_KEY= GLMV_API_KEY= CW_API_BASE= CW_API_KEY= SENSECHAT_AK= SENSECHAT_SK= # 你可以设置一个专用于评估阶段 API 调用的代理 EVAL_PROXY=
-
如果需要使用 API 在对应键值空白处填写上你的密钥。这些 API 密钥将在进行推理和评估时自动加载。
VLM 配置:所有 VLMs 都在 vlmeval/config.py
中配置。对于某些 VLMs,在进行评估之前,你需要配置代码根目录(如 MiniGPT-4、PandaGPT 等)或模型权重根目录(如 LLaVA-v1-7B 等)。在评估时,你应该使用 vlmeval/config.py
中 supported_VLM
指定的模型名称来选择 VLM。对于 MiniGPT-4 和 InstructBLIP,还需要修改 vlmeval/vlm/misc
中的配置文件来配置 LLM 路径和 ckpt 路径。
以下 VLMs 需要额外配置步骤:
代码准备和安装: InstructBLIP (LAVIS), LLaVA (LLaVA), MiniGPT-4 (MiniGPT-4), mPLUG-Owl2 (mPLUG-Owl2), OpenFlamingo-v2 (OpenFlamingo), PandaGPT-13B (PandaGPT), TransCore-M (TransCore-M).
手动权重文件准备与配置: InstructBLIP, LLaVA-v1-7B, MiniGPT-4, PandaGPT-13B
我们使用 run.py
进行评估。你可以使用 $VLMEvalKit/run.py
或创建脚本的软链接运行(以便在任何地方使用该脚本):
参数
--data (list[str])
: 设置在 VLMEvalKit 中支持的数据集名称(在vlmeval/utils/dataset_config.py
中定义)--model (list[str])
: 设置在 VLMEvalKit 中支持的 VLM 名称(在vlmeval/config.py
中的supported_VLM
中定义)--mode (str, 默认值为 'all', 可选值为 ['all', 'infer'])
:当 mode 设置为 "all" 时,将执行推理和评估;当设置为 "infer" 时,只执行推理--nproc (int, 默认值为 4)
: 调用 API 的线程数--work-dir (str, default to '.')
: 存放测试结果的目录--nframe (int, default to 8)
: 从视频中采样的帧数,仅对视频多模态评测集适用--pack (bool, store_true)
: 一个视频可能关联多个问题,如pack==True
,将会在一次询问中提问所有问题
用于评测图像多模态评测集的命令
你可以使用 python
或 torchrun
来运行脚本:
# 使用 `python` 运行时,只实例化一个 VLM,并且它可能使用多个 GPU。
# 这推荐用于评估参数量非常大的 VLMs(如 IDEFICS-80B-Instruct)。
# 在 MMBench_DEV_EN、MME 和 SEEDBench_IMG 上使用 IDEFICS-80B-Instruct 进行推理和评估
python run.py --data MMBench_DEV_EN MME SEEDBench_IMG --model idefics_80b_instruct --verbose
# 在 MMBench_DEV_EN、MME 和 SEEDBench_IMG 上使用 IDEFICS-80B-Instruct 仅进行推理
python run.py --data MMBench_DEV_EN MME SEEDBench_IMG --model idefics_80b_instruct --verbose --mode infer
# 使用 `torchrun` 运行时,每个 GPU 上实例化一个 VLM 实例。这可以加快推理速度。
# 但是,这仅适用于消耗少量 GPU 内存的 VLMs。
# 在 MMBench_DEV_EN、MME 和 SEEDBench_IMG 上使用 IDEFICS-9B-Instruct、Qwen-VL-Chat、mPLUG-Owl2。在具有 8 个 GPU 的节点上进行推理和评估。
torchrun --nproc-per-node=8 run.py --data MMBench_DEV_EN MME SEEDBench_IMG --model idefics_80b_instruct qwen_chat mPLUG-Owl2 --verbose
# 在 MME 上使用 Qwen-VL-Chat。在具有 2 个 GPU 的节点上进行推理和评估。
torchrun --nproc-per-node=2 run.py --data MME --model qwen_chat --verbose
用于评测视频多模态评测集的命令
# 使用 `python` 运行时,只实例化一个 VLM,并且它可能使用多个 GPU。
# 这推荐用于评估参数量非常大的 VLMs(如 IDEFICS-80B-Instruct)。
# 在 MMBench-Video 上评测 IDEFCIS2-8B, 视频采样 8 帧作为输入,不采用 pack 模式评测
torchrun --nproc-per-node=8 run.py --data MMBench-Video --model idefics2_8b --nframe 8
# 在 MMBench-Video 上评测 GPT-4o (API 模型), 视频采样 16 帧作为输入,采用 pack 模式评测
python run.py --data MMBench-Video --model GPT4o --nframe 16 --pack
评估结果将作为日志打印出来。此外,结果文件也会在目录 $YOUR_WORKING_DIRECTORY/{model_name}
中生成。以 .csv
结尾的文件包含评估的指标。
上述默认设置使用 OpenAI 的 GPT 作为评判 LLM。你也可以使用 LMDeploy 部署本地评判 LLM。
首先进行安装:
pip install lmdeploy openai
然后可以通过一行代码部署本地评判 LLM。LMDeploy 将自动从 Huggingface 下载模型。假设我们使用 internlm2-chat-1_8b 作为评判,端口为 23333,密钥为 sk-123456(密钥必须以 "sk-" 开头,后跟任意数字):
lmdeploy serve api_server internlm/internlm2-chat-1_8b --server-port 23333
使用以下 Python 代码获取由 LMDeploy 注册的模型名称:
from openai import OpenAI
client = OpenAI(
api_key='sk-123456',
base_url="http://0.0.0.0:23333/v1"
)
model_name = client.models.list().data[0].id
配置对应环境变量,以告诉 VLMEvalKit 如何使用本地评判 LLM。正如上面提到的,也可以在 $VLMEvalKit/.env
文件中设置:
OPENAI_API_KEY=sk-123456
OPENAI_API_BASE=http://0.0.0.0:23333/v1/chat/completions
LOCAL_LLM=<model_name you get>
最后,你可以运行第2步中的命令,使用本地评判 LLM 来评估你的 VLM。
请注意:
- 如果你希望将评判 LLM 部署在单独的一个 GPU 上,并且由于 GPU 内存有限而希望在其他 GPU 上评估你的 VLM,可以使用
CUDA_VISIBLE_DEVICES=x
这样的方法,例如:
CUDA_VISIBLE_DEVICES=0 lmdeploy serve api_server internlm/internlm2-chat-1_8b --server-port 23333
CUDA_VISIBLE_DEVICES=1,2,3 torchrun --nproc-per-node=3 run.py --data HallusionBench --model qwen_chat --verbose
- 如果本地评判 LLM 在遵循指令方面不够好,评估过程可能会失败。请通过 issues 报告此类失败情况。
- 可以以不同的方式部署评判 LLM,例如使用私有 LLM(而非来自 HuggingFace)或使用量化 LLM。请参考 LMDeploy doc 文档。也可以使用其他支持 OpenAI API 框架的方法。