VLMEvalKit#
为便于使用VLMEvalKit 评测后端,我们基于VLMEvalKit源码做了定制,命名为ms-vlmeval
,该版本在原版基础上对评测任务的配置和执行进行了封装,并支持pypi安装方式,使得用户可以通过EvalScope发起轻量化的VLMEvalKit评测任务。同时,我们支持基于OpenAI API格式的接口评测任务,您可以使用ms-swift、vLLM、LMDeploy、Ollama等模型服务,部署多模态模型服务。
1. 环境准备#
# 安装额外依赖
pip install evalscope[vlmeval] -U
2. 数据准备#
在加载数据集时,若本地不存在该数据集文件,将会自动下载数据集到 ~/LMUData/
目录下。
目前支持的数据集有:
名称 |
备注 |
---|---|
A-Bench_TEST, A-Bench_VAL |
|
AI2D_TEST, AI2D_TEST_NO_MASK |
|
AesBench_TEST, AesBench_VAL |
|
BLINK |
|
CCBench |
|
COCO_VAL |
|
ChartQA_TEST |
|
DUDE, DUDE_MINI |
|
DocVQA_TEST, DocVQA_VAL |
DocVQA_TEST没有提供答案,使用DocVQA_VAL进行自动评测 |
GMAI_mm_bench_VAL |
|
HallusionBench |
|
InfoVQA_TEST, InfoVQA_VAL |
InfoVQA_TEST没有提供答案,使用InfoVQA_VAL进行自动评测 |
LLaVABench |
|
MLLMGuard_DS |
|
MMBench-Video |
|
MMBench_DEV_CN, MMBench_DEV_CN_V11 |
|
MMBench_DEV_EN, MMBench_DEV_EN_V11 |
|
MMBench_TEST_CN, MMBench_TEST_CN_V11 |
MMBench_TEST_CN没有提供答案 |
MMBench_TEST_EN, MMBench_TEST_EN_V11 |
MMBench_TEST_EN没有提供答案 |
MMBench_dev_ar, MMBench_dev_cn, MMBench_dev_en, |
|
MMBench_dev_pt, MMBench_dev_ru, MMBench_dev_tr |
|
MMDU |
|
MME |
|
MMLongBench_DOC |
|
MMMB, MMMB_ar, MMMB_cn, MMMB_en, |
|
MMMB_pt, MMMB_ru, MMMB_tr |
|
MMMU_DEV_VAL, MMMU_TEST |
|
MMStar |
|
MMT-Bench_ALL, MMT-Bench_ALL_MI, |
|
MMT-Bench_VAL, MMT-Bench_VAL_MI |
|
MMVet |
|
MTL_MMBench_DEV |
|
MTVQA_TEST |
|
MVBench, MVBench_MP4 |
|
MathVision, MathVision_MINI, MathVista_MINI |
|
OCRBench |
|
OCRVQA_TEST, OCRVQA_TESTCORE |
|
POPE |
|
Q-Bench1_TEST, Q-Bench1_VAL |
|
RealWorldQA |
|
SEEDBench2, SEEDBench2_Plus, SEEDBench_IMG |
|
SLIDEVQA, SLIDEVQA_MINI |
|
ScienceQA_TEST, ScienceQA_VAL |
|
TaskMeAnything_v1_imageqa_random |
|
TextVQA_VAL |
|
VCR_EN_EASY_100, VCR_EN_EASY_500, VCR_EN_EASY_ALL |
|
VCR_EN_HARD_100, VCR_EN_HARD_500, VCR_EN_HARD_ALL |
|
VCR_ZH_EASY_100, VCR_ZH_EASY_500, VCR_ZH_EASY_ALL |
|
VCR_ZH_HARD_100, VCR_ZH_HARD_500, VCR_ZH_HARD_ALL |
|
Video-MME |
备注
数据集的详细信息可以参考VLMEvalKit支持的图文多模态评测集。
您可以使用以下方式,来查看数据集的名称列表:
from evalscope.backend.vlm_eval_kit import VLMEvalKitBackendManager
print(f'** All models from VLMEvalKit backend: {VLMEvalKitBackendManager.list_supported_datasets()}')
3. 模型评测#
模型评测有两种方式可以选择,一种是部署模型服务评测,另一种是本地模型推理评测。具体如下:
方式1. 部署模型服务评测#
模型部署#
下面介绍四种方式部署模型服务:
使用ms-swift部署模型服务,具体可参考:ms-swift部署指南。
安装ms-swift
pip install ms-swift -U
部署模型服务
CUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen-vl-chat --port 8000
参考vLLM 教程 for more details.
安装vLLM
pip install vllm -U
部署模型服务
CUDA_VISIBLE_DEVICES=0 python -m vllm.entrypoints.openai.api_server --model InternVL2-8B --port 8000 --trust-remote-code --max_model_len 4096
参考 LMDeploy 教程.
安装LMDeploy
pip install lmdeploy -U
部署模型服务
CUDA_VISIBLE_DEVICES=0 lmdeploy serve api_server Qwen-VL-Chat --server-port 8000
备注
Ollama 对于 OpenAI API 的支持目前处于实验性状态,本教程仅提供示例,请根据实际情况修改。
参考 Ollama 教程。
安装Ollama
# Linux 系统
curl -fsSL https://ollama.com/install.sh | sh
启动Ollama
# 默认端口为 11434
ollama serve
小技巧
若使用ollama pull
拉取模型,可跳过以下创建模型的步骤;若使用ollama import
导入模型,则需要手动创建模型配置文件。
创建模型配置文件 Modelfile
# 模型路径
FROM models/LLaVA
# 温度系数
PARAMETER temperature 1
# system prompt
SYSTEM """
You are a helpful assistant.
"""
创建模型
会将模型自动转为ollama支持的格式,同时支持多种量化方式。
ollama create llava -f ./Modelfile
配置模型评测参数#
编写配置
work_dir: outputs
eval_backend: VLMEvalKit
eval_config:
model:
- type: qwen-vl-chat
name: CustomAPIModel
api_base: http://localhost:8000/v1/chat/completions
key: EMPTY
temperature: 0.0
img_size: -1
data:
- SEEDBench_IMG
- ChartQA_TEST
mode: all
limit: 20
reuse: false
nproc: 16
task_cfg_dict = {
'work_dir': 'outputs',
'eval_backend': 'VLMEvalKit',
'eval_config':
{'data': ['SEEDBench_IMG', 'ChartQA_TEST'],
'limit': 20,
'mode': 'all',
'model': [
{'api_base': 'http://localhost:8000/v1/chat/completions',
'key': 'EMPTY',
'name': 'CustomAPIModel',
'temperature': 0.0,
'type': 'qwen-vl-chat'}
],
'reuse': False,}}
方式2. 本地模型推理评测#
不启动模型服务,直接配置模型评测参数,在本地进行推理
配置模型评测参数#
work_dir: outputs
eval_backend: VLMEvalKit
eval_config:
model:
- name: qwen_chat
model_path: models/Qwen-VL-Chat
data:
- SEEDBench_IMG
- ChartQA_TEST
mode: all
limit: 20
reuse: false
work_dir: outputs
nproc: 16
task_cfg_dict = {
'work_dir': 'outputs',
'eval_backend': 'VLMEvalKit',
'eval_config':
{'data': ['SEEDBench_IMG', 'ChartQA_TEST'],
'limit': 20,
'mode': 'all',
'model': [
{'name': 'qwen_chat',
'model_path': 'models/Qwen-VL-Chat'}
],
'reuse': False}}
参数说明#
eval_backend
:默认值为VLMEvalKit
,表示使用 VLMEvalKit 评测后端。work_dir
:字符串,保存评测结果、日志和摘要的目录。默认值为outputs
。eval_config
:字典,包含以下字段:data
:列表,参考目前支持的数据集model
:字典列表,每个字典可以指定以下字段:使用远程API调用时:
api_base
:OpenAI API 的URL,即模型服务的 URL。type
:OpenAI API 请求模型名称。若使用
ms-swift
部署,设置为--model_type
的值;若使用
vLLM
或LMDeploy
部署模型,则设置为model_id
;若使用
Ollama
部署模型,则设置为model_name
,使用ollama list
命令查看。
name
:固定值,必须为CustomAPIModel
。key
:模型 API 的 OpenAI API 密钥,默认值为EMPTY
。temperature
:模型推理的温度系数,默认值为0.0
。img_size
:模型推理的图像大小,默认值为-1
,表示使用原始大小;设置为其他值,例如224
,表示将图像缩放到 224x224 大小。video_llm
:布尔值,默认为False
,在评测视频数据集时,如需传递video_url
参数,请设置为True
。
使用本地模型推理时:
name
:模型名称,参考VLMEvalKit支持的模型。model_path
等其余参数:参考VLMEvalKit支持的模型参数
mode
:选项:['all', 'infer']
,all
包括推理和评测;infer
仅进行推理。limit
:整数,评测的数据数量,默认值为None
,表示运行所有示例。reuse
:布尔值,是否重用评测结果,否则将删除所有评测临时文件。备注
对与
ms-vlmeval>=0.0.11
参数rerun
更名为reuse
,默认值为False
。设置为True
时需要在task_cfg_dict中添加use_cache
来指定使用的缓存目录。nproc
:整数,并行调用 API 的数量。nframe
:整数,视频数据集的视频帧数,默认值为8
,fps
:整数,视频数据集的帧率,默认值为-1
,表示使用nframe
;设置为大于0,则使用fps
来计算视频帧数。use_subtitle
:布尔值,视频数据集是否使用字幕,默认值为False
。
(可选) 部署裁判员模型#
部署本地语言模型作为评判 / 选择提取器,同样使用ms-swift部署模型服务,具体可参考:ms-swift LLM 部署指南 。
备注
在未部署裁判员模型模型时,将使用后处理+精确匹配进行评判;且必须配置裁判员模型环境变量才能正确调用模型。
部署裁判员模型#
# 部署qwen2-7b作为裁判员
CUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen2-7b-instruct --model_id_or_path models/Qwen2-7B-Instruct --port 8866
配置裁判员模型环境变量#
在yaml配置文件中增加如下配置:
OPENAI_API_KEY: EMPTY
OPENAI_API_BASE: http://127.0.0.1:8866/v1/chat/completions # 裁判员模型的 api_base
LOCAL_LLM: qwen2-7b-instruct #裁判员模型的 model_id
4. 执行评测任务#
小心
若想让模型重新进行推理,需清空outputs
文件夹下的模型预测结果再运行脚本。
因为之前的预测结果不会自动清除,若存在该结果会跳过推理阶段,直接对结果进行评测。
配置好配置文件后,运行以下脚本即可
from evalscope.run import run_task
from evalscope.summarizer import Summarizer
def run_eval():
# 选项 1: python 字典
task_cfg = task_cfg_dict
# 选项 2: yaml 配置文件
# task_cfg = 'eval_openai_api.yaml'
run_task(task_cfg=task_cfg)
print('>> Start to get the report with summarizer ...')
report_list = Summarizer.get_report_from_cfg(task_cfg)
print(f'\n>> The report list: {report_list}')
run_eval()
运行以下命令:
python eval_openai_api.py