evalscope/docs/zh/user_guides/backend/vlmevalkit_backend.md

358 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(vlmeval)=
# VLMEvalKit
为便于使用VLMEvalKit 评测后端我们基于VLMEvalKit源码做了定制命名为`ms-vlmeval`该版本在原版基础上对评测任务的配置和执行进行了封装并支持pypi安装方式使得用户可以通过EvalScope发起轻量化的VLMEvalKit评测任务。同时我们支持基于OpenAI API格式的接口评测任务您可以使用[ms-swift](https://github.com/modelscope/swift)、[vLLM](https://github.com/vllm-project/vllm)、[LMDeploy](https://github.com/InternLM/lmdeploy)、[Ollama](https://ollama.ai/)等模型服务,部署多模态模型服务。
## 1. 环境准备
```shell
# 安装额外依赖
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 | |
````{note}
数据集的详细信息可以参考[VLMEvalKit支持的图文多模态评测集](https://github.com/open-compass/VLMEvalKit/blob/main/docs/zh-CN/README_zh-CN.md#%E6%94%AF%E6%8C%81%E7%9A%84%E5%9B%BE%E6%96%87%E5%A4%9A%E6%A8%A1%E6%80%81%E8%AF%84%E6%B5%8B%E9%9B%86)。
您可以使用以下方式,来查看数据集的名称列表:
```python
from evalscope.backend.vlm_eval_kit import VLMEvalKitBackendManager
print(f'** All models from VLMEvalKit backend: {VLMEvalKitBackendManager.list_supported_datasets()}')
```
````
## 3. 模型评测
模型评测有两种方式可以选择,一种是部署模型服务评测,另一种是本地模型推理评测。具体如下:
### 方式1. 部署模型服务评测
#### 模型部署
下面介绍四种方式部署模型服务:
::::{tab-set}
:::{tab-item} vLLM 部署
参考[vLLM 教程](https://docs.vllm.ai/en/latest/index.html) for more details.
[支持的模型列表](https://docs.vllm.ai/en/latest/models/supported_models.html#multimodal-language-models)
**安装vLLM**
```shell
pip install vllm -U
```
**部署模型服务**
```shell
VLLM_USE_MODELSCOPE=True CUDA_VISIBLE_DEVICES=0 python -m vllm.entrypoints.openai.api_server --model Qwen/Qwen2.5-VL-3B-Instruct --port 8000 --trust-remote-code --max_model_len 4096 --served-model-name Qwen2.5-VL-3B-Instruct
```
```{tip}
如遇到`ValueError: At most 1 image(s) may be provided in one request`错误,可尝试将设置`--limit-mm-per-prompt "image=5"`参数并可以将image设置为更大的值。
```
:::
:::{tab-item} ms-swift部署
使用ms-swift部署模型服务具体可参考[ms-swift部署指南](https://swift.readthedocs.io/zh-cn/latest/Instruction/%E6%8E%A8%E7%90%86%E5%92%8C%E9%83%A8%E7%BD%B2.html#id3)。
**安装ms-swift**
```shell
pip install ms-swift -U
```
**部署模型服务**
```shell
CUDA_VISIBLE_DEVICES=0 swift deploy --model Qwen/Qwen2.5-VL-3B-Instruct --port 8000
```
:::
:::{tab-item} LMDeploy 部署
参考 [LMDeploy 教程](https://github.com/InternLM/lmdeploy/blob/main/docs/en/multi_modal/api_server_vl.md).
**安装LMDeploy**
```shell
pip install lmdeploy -U
```
**部署模型服务**
```shell
CUDA_VISIBLE_DEVICES=0 lmdeploy serve api_server Qwen-VL-Chat --server-port 8000
```
:::
:::{tab-item} Ollama 部署
使用Ollama一键运行ModelScope上托管的模型参考[文档](https://www.modelscope.cn/docs/models/advanced-usage/ollama-integration)
```shell
ollama run modelscope.cn/IAILabs/Qwen2.5-VL-7B-Instruct-GGUF
```
:::
::::
#### 配置模型评测参数
编写配置
::::{tab-set}
:::{tab-item} yaml 配置文件
```yaml
work_dir: outputs
eval_backend: VLMEvalKit
eval_config:
model:
- type: Qwen2.5-VL-3B-Instruct
name: CustomAPIModel
api_base: http://localhost:8000/v1/chat/completions
key: EMPTY
temperature: 0.0
img_size: -1
max_tokens: 1024
video_llm: false
data:
- SEEDBench_IMG
- ChartQA_TEST
mode: all
limit: 20
reuse: false
nproc: 16
judge: exact_matching
```
:::
:::{tab-item} TaskConfig 字典
```python
from evalscope import TaskConfig
task_cfg_dict = TaskConfig(
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': 'Qwen2.5-VL-3B-Instruct',
'img_size': -1,
'video_llm': False,
'max_tokens': 1024,}
],
'reuse': False,
'nproc': 16,
'judge': 'exact_matching'}
)
```
:::
::::
### 方式2. 本地模型推理评测
不启动模型服务,直接配置模型评测参数,在本地进行推理
#### 配置模型评测参数
::::{tab-set}
:::{tab-item} yaml 配置文件
```{code-block} yaml
:caption: eval_openai_api.json
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
```
:::
:::{tab-item} TaskConfig 字典
```python
from evalscope import TaskConfig
task_cfg_dict = TaskConfig(
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',
'video_llm': False,
'max_new_tokens': 1024,
}
],
'reuse': False}
)
```
:::
::::
### 参数说明
- `eval_backend`:默认值为 `VLMEvalKit`,表示使用 VLMEvalKit 评测后端。
- `work_dir`:字符串,保存评测结果、日志和摘要的目录。默认值为 `outputs`
- `eval_config`:字典,包含以下字段:
- `data`:列表,参考[目前支持的数据集](#2-数据准备)
- `model`:字典列表,每个字典可以指定以下字段:
- 使用远程API调用时
- `api_base`:模型服务的 URL。
- `type`API 请求模型名称,例如 `Qwen2.5-VL-3B-Instruct`
- `name`:固定值,必须为 `CustomAPIModel`
- `key`:模型 API 的 OpenAI API 密钥,默认值为 `EMPTY`
- `temperature`:模型推理的温度系数,默认值为 `0.0`
- `max_tokens`:模型推理的最大 token 数,默认值为 `2048`
- `img_size`:模型推理的图像大小,默认值为 `-1`,表示使用原始大小;设置为其他值,例如 `224`,表示将图像缩放到 224x224 大小。
- `video_llm`:布尔值,默认为`False`,在评测视频数据集时,如需传递 `video_url` 参数,请设置为 `True`
- 使用本地模型推理时:
- `name`:模型名称,参考[VLMEvalKit支持的模型](https://github.com/open-compass/VLMEvalKit/blob/main/vlmeval/config.py)。
- `model_path`等其余参数:参考[VLMEvalKit支持的模型参数](https://github.com/open-compass/VLMEvalKit/blob/main/vlmeval/config.py)
- `mode`:选项: `['all', 'infer']``all`包括推理和评测;`infer`仅进行推理。
- `limit`:整数,评测的数据数量,默认值为 `None`,表示运行所有示例。
- `reuse`:布尔值,是否重用评测结果,否则将删除所有评测临时文件。
```{note}
对与`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 部署指南](https://swift.readthedocs.io/zh-cn/latest/LLM/VLLM%E6%8E%A8%E7%90%86%E5%8A%A0%E9%80%9F%E4%B8%8E%E9%83%A8%E7%BD%B2.html)
````{note}
在未部署裁判员模型模型时,将使用后处理+精确匹配进行评判;且**必须配置裁判员模型环境变量才能正确调用模型**。
````
#### 部署裁判员模型
```shell
# 部署qwen2-7b作为裁判员
CUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen2-7b-instruct --model_id_or_path models/Qwen2-7B-Instruct --port 8866
```
#### 配置裁判员模型环境变量
在yaml配置文件的`eval_config`中增加如下配置:
```yaml
eval_config:
# ... 其他配置
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. 执行评测任务
```{caution}
若想让模型重新进行推理,需清空`outputs`文件夹下的模型预测结果再运行脚本。
因为之前的预测结果不会自动清除,若存在该结果**会跳过推理阶段**,直接对结果进行评测。
```
配置好配置文件后,运行以下脚本即可
```{code-block} python
:caption: eval_openai_api.py
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()
```
运行以下命令:
```shell
python eval_openai_api.py
```