# 评测

[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.4.10/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/r2.4.10/docs/mindformers/docs/source_zh_cn/usage/evaluation.md)

## Harness评测

### 基本介绍

[LM Evaluation Harness](https://github.com/EleutherAI/lm-evaluation-harness)是一个开源语言模型评测框架,提供60多种标准学术数据集的评测,支持HuggingFace模型评测、PEFT适配器评测、vLLM推理评测等多种评测方式,支持自定义prompt和评测指标,包含loglikelihood、generate_until、loglikelihood_rolling三种类型的评测任务。基于Harness评测框架对MindFormers进行适配后,支持加载MindFormers模型进行评测。

目前已适配的模型和支持的评测任务如下表所示(其余模型和评测任务正在积极适配中,请关注版本更新):

| 适配的模型     | 支持的评测任务                |
|-----------|------------------------|
| Llama3-8B | Gsm8k、Boolq、Mmlu、Ceval |
| Qwen2-7B  | Gsm8k、Boolq、Mmlu、Ceval                  |

### 安装

Harness支持pip安装和源码编译安装两种方式。pip安装更简单快捷,源码编译安装更便于调试分析,用户可以根据需要选择合适的安装方式。

#### pip安装

用户可以执行如下命令安装Harness:

```shell
pip install lm_eval==0.4.4
```

#### 源码编译安装

用户可以执行如下命令编译并安装Harness:

```bash
git clone --depth 1 https://github.com/EleutherAI/lm-evaluation-harness
cd lm-evaluation-harness
git checkout v0.4.4
pip install -e .
```

### 使用方式

#### 查看数据集评测任务

用户可以通过如下命令查看Harness支持的所有评测任务:

```shell
#!/bin/bash

python toolkit/benchmarks/eval_with_harness.py --tasks list
```

#### 启动单卡评测脚本

- 评测前准备

  1. 创建模型目录MODEL_DIR;
  2. 模型目录下须放置yaml配置文件(\*.yaml)、分词器文件(\*_tokenizer.py),获取方式参考[模型库](../start/models.md)中各模型说明文档;
  3. 配置yaml配置文件,参考[配置文件说明](../appendix/conf_files.md)。

        yaml配置样例:

        ```yaml
        run_mode: 'predict'       # 设置推理模式
        model:
          model_config:
            use_past: True
            checkpoint_name_or_path: "model.ckpt"      # 权重路径
        processor:
          tokenizer:
            vocab_file: "tokenizer.model"     # tokenizer路径
        ```

- 执行以下评测命令

   ```shell
   #!/bin/bash

   python toolkit/benchmarks/eval_with_harness.py --model mf --model_args "pretrained=MODEL_DIR,device_id=0" --tasks TASKS
   ```

   > 执行脚本路径:[eval_with_harness.py](https://gitee.com/mindspore/mindformers/blob/r1.3.0/toolkit/benchmarks/eval_with_harness.py)

#### 评测参数

Harness主要参数

| 参数            | 类型  | 参数介绍                      | 是否必须 |
|---------------|-----|---------------------------|------|
| `--model`      | str | 须设置为mf,对应为MindFormers评估策略 | 是    |
| `--model_args`  | str | 模型及评估相关参数,见下方模型参数介绍       | 是    |
| `--tasks`       | str | 数据集名称,可传入多个数据集,逗号分割       | 是    |
| `--batch_size` | int | 批处理样本数                    | 否    |
| `--limit`       | int | 每个任务的样本数,多用于功能测试          | 否    |

MindFormers模型参数

| 参数           | 类型   | 参数介绍                              | 是否必须 |
|--------------|------|-----------------------------------|------|
| `pretrained`   | str  | 模型目录路径                            | 是    |
| `use_past`     | bool | 是否开启增量推理,generate_until类型的评测任务须开启 | 否    |
| `device_id`    | int  | 设备id                              | 否    |

### 评测样例

```shell
#!/bin/bash

python eval_with_harness.py --model mf --model_args "pretrained=./llama3-8b,use_past=True" --tasks gsm8k
```

评测结果如下,其中Filter对应匹配模型输出结果的方式,Metric对应评测指标,Value对应评测分数,stderr对应分数误差。

| Tasks | Version | Filter           | n-shot | Metric      |   | Value  |   | Stderr |
|-------|--------:|------------------|-------:|-------------|---|--------|---|--------|
| gsm8k |       3 | flexible-extract |      5 | exact_match | ↑ | 0.5034 | ± | 0.0138 |
|       |         | strict-match     |      5 | exact_match | ↑ | 0.5011 | ± | 0.0138 |

## VLMEvalKit评测

### 基本介绍

[VLMEvalKit](https://github.com/open-compass/VLMEvalKit)
是一款专为大型视觉语言模型评测而设计的开源工具包,支持在各种基准测试上对大型视觉语言模型进行一键评估,无需进行繁重的数据准备工作,让评估过程更加简便。 它支持多种图文多模态评测集和视频多模态评测集,支持多种API模型以及基于PyTorch和HF的开源模型,支持自定义prompt和评测指标。基于VLMEvalKit评测框架对MindFormers进行适配后,支持加载MindFormers中多模态大模型进行评测。

### 支持特性说明

1. 支持自动下载评测数据集;
2. 支持用户自定义输入多种数据集和模型(目前仅支持`cogvlm2-llama3-chat-19B`,后续版本会逐渐增加);
3. 一键生成评测结果。

### 安装

```shell
git clone https://github.com/open-compass/VLMEvalKit.git
cd VLMEvalKit
pip install -e .
```

### 使用方式

执行脚本[eval_with_vlmevalkit.py](https://gitee.com/mindspore/mindformers/blob/r1.3.0/toolkit/benchmarks/eval_with_vlmevalkit.py)。

#### 启动单卡评测脚本

```shell
#!/bin/bash

python eval_with_vlmevalkit.py \
  --data MME \
  --model cogvlm2-llama3-chat-19B \
  --verbose \
  --work-dir /{path}/evaluate_result \
  --model-path /{path}/cogvlm2_model_path \
  --config-path /{path}/cogvlm2_config_path
```

#### 评测参数

VLMEvalKit主要参数

| 参数            | 类型  | 参数介绍                                                            | 是否必须 |
|---------------|-----|-----------------------------------------------------------------|------|
| `--data`      | str | 数据集名称,可传入多个数据集,空格分割。                                            | 是    |
| `--model`  | str | 模型名称,可传入多个模型,空格分割。                                              | 是    |
| `--verbose`       | /   | 输出评测运行过程中的日志。                                                   | 否    |
| `--work-dir`  | str | 存放评测结果的目录,默认存储在当前目录与模型名称相同的文件夹下。                                | 否    |
| `--model-path` | str | 包含模型所有相关文件(权重、分词器文件、配置文件、processor文件)的路径,可传入多个路径,按照模型顺序填写,空格分割。 | 是    |
| `--config-path`       | str | 模型配置文件路径,可传入多个路径,按照模型顺序填写,空格分割。                                 | 是    |

#### 评测前准备

1. 创建模型目录model_path;
2. 模型目录下须放置yaml配置文件(\*.yaml)、分词器文件(\*_tokenizer.model),获取方式参考[模型库](../start/models.md)中各模型说明文档;
3. 配置yaml配置文件,参考[配置文件说明](../appendix/conf_files.md)。

yaml配置样例:

```yaml
load_checkpoint: "/{path}/model.ckpt"  # 指定权重文件路径
model:
  model_config:
    use_past: True                         # 开启增量推理
    is_dynamic: False                       # 关闭动态shape

  tokenizer:
    vocab_file: "/{path}/tokenizer.model"  # 指定tokenizer文件路径
```

### 评测样例

```shell
#!/bin/bash

export USE_ROPE_SELF_DEFINE=True
python eval_with_vlmevalkit.py \
  --data COCO_VAL \
  --model cogvlm2-llama3-chat-19B \
  --verbose \
  --work-dir /{path}/evaluate_result \
  --model-path /{path}/cogvlm2_model_path \
  --config-path /{path}/cogvlm2_config_path
```

评测结果如下,其中`Bleu`和`ROUGE_L`表示评估翻译质量的指标,`CIDEr`表示评估图像描述任务的指标。

```json
{
   "Bleu": [
      15.523950970070652,
      8.971141548228058,
      4.702477458554666,
      2.486860744700995
   ],
   "ROUGE_L": 15.575063213115946,
   "CIDEr": 0.01734615519604295
}
```