0%

大模型应用系列(十二) 大模型评估,openCompass的安装和使用

简单介绍大模型评估常用的指标和数据集,以及评估工具opencompass的安装和使用。

一. 生成式大模型的评估指标及OpenCompass介绍

1.1 核心评估指标

OpenCompass支持以下主要评估指标,覆盖生成式大模型的多样化需求:

准确率(Accuracy): 用于选择题或分类任务,通过比对生成结果与标准答案计算正确率。在OpenCompass中通过metric=accurancy配置。

困惑度(Perplexity, PPL): 衡量模型对候选答案的预测能力,适用于选择题评估。需使用ppl类型的数据集配置(如ceval_ppl)。

生成质量(GEN): 通过文本生成结果提取答案,需结合后处理脚本解析输出。使用gen类型的数据集(如ceval_gen),配置metric=gen并指定后处理预测。

ROUGE/LCS: 用于文本生成任务的相似度评估,需安装rouge==1.0.1依赖,并在数据配置中设置metric=rouge

条件对数概率(CLP): 结合上下文计算答案的条件概率,适用于复杂推理任务,需在模型配置中启用use_logprob=True

1.2 支持的开源评估数据集及使用差异

OpenCompass内置超过70个数据集,覆盖五大能力维度:

知识类: C-Eval(中文考试题),CMMLU(多语言知识问答),MMLU(英文多选题)。

推理类: GSM8K(数学推理),BBH(复杂推理链)。

语言类: CLUE(中文理解),AFQMC(语义相似度)。

代码类: HumanEval(代码生成),MBPP(编程问题)。

多模态类: MMBench(图像理解),SEED-Bench(多模态问答)。

1.3 OpenCompass介绍

OpenCompass是一个开源项目,旨在为机器学习和自然语言处理领域提供多功能,易于使用的工具和框架。其中包含的多个开源模型和开源数据集(BenchMarks), 方便进行模型的效果评测。

1.4 支持的开源评估数据集及使用差异

数据集区别与选择

评估范式差异:

_gen后缀数据集: 生成式评估,需后处理提取答案(如ceval_gen)

_ppl后缀数据集: 困惑度评估,直接比对选项概率(如ceval_ppl)

领域覆盖:

C-Eval: 侧重中文STEM和社会科学知识,包含1.3万到选择题

LawBench: 法律领域专项评估,需额外克隆仓库并配置路径。

1.5 在开源数据集上评估的必要性

在选型阶段,通过评估选择合适的模型。

在评估阶段,在公开数据集上评估可以判断模型微调后是否保持原有基本能力,而不至于过拟合。但某些场景模型往往需要过拟合: 比如应用中指定模型能回答的某些问题,可以通过应用层筛选。对于法律,医疗相关的问题,一般要训练充分,不必关注它的其他能力。

二. OpenCompass的安装和使用

2.1 OpenCompass的安装

参考文档: 欢迎来到 OpenCompass 中文教程! — OpenCompass 0.4.2 文档

注意: 安装的python必须是3.10版本。虽然官网没有特别说明,但我试过其他版本都不能用。

官网提供了pip安装和源码安装两种方式,在评测时可能需要写配置文件,需要源码,所以建议从源码安装。

1
2
3
4
5
6
7
8
## 创建并激活虚拟环境
conda create --name opencompass python=3.10 -y
conda activate opencompass

## 从源码安装opencompass
git clone https://github.com/open-compass/opencompass opencompass
cd opencompass
pip install -e .
2.2 数据集准备

OpenCompass准备了评估需要用到的常见数据集,如果要获取大多数数据集,可以:

在OpenCompass项目根目录下运行下面命令,运行下面命令

1
2
wget https://github.com/open-compass/opencompass/releases/download/0.2.2.rc1/OpenCompassData-core-20240207.zip
unzip OpenCompassData-core-20240207.zip

执行后在根目录会产生data文件夹,内容如下,包含了常见的数据集:

image-20250412230705261

如果需要使用 OpenCompass 提供的更加完整的数据集 (~500M),可以使用下述命令进行下载和解压:

1
2
3
4
wget https://github.com/open-compass/opencompass/releases/download/0.2.2.rc1/OpenCompassData-complete-20240207.zip
unzip OpenCompassData-complete-20240207.zip
cd ./data
find . -name "*.zip" -exec unzip "{}" \;

我服务器磁盘有限,就没有下载完整数据集。

2.3 配置评估任务

目前opencompass支持三种配置方式的评估任务,以下命令都在opencompass根目录下执行。

2.3.1 命令行(自定义HF模型)

对于HuggingFace模型, 用户可以通过命令行直接设置模型参数,这种方式比较简单,无需额外的配置文件,但缺点是每次只能在一个或多个数据集上评估一个模型,并且模型必须是huggingface模型。比如评估Qwen2.5-7B-Instruct模型在demo_gsm8k_chat_gen demo_math_chat_gen上的效果,可以用如下命令:

1
python run.py --datasets demo_gsm8k_chat_gen demo_math_chat_gen --hf-path /root/autodl-tmp/Qwen2.5-7B-Instruct --debug

我的安装版本中会报错AttributeError: module ‘torch’ has no attribute ‘device’,解决方式见 3.1, 解决后开始评估,如下图:

image-20250412231641622

评估结束后会输出以下结果:

image-20250412232921629

同时会在opencompass根目录下生成文件夹outputs用于保存输出,结构如下:

1
2
3
4
5
6
7
8
9
10
11
outputs/default/
├── 20200220_120000
├── 20230220_183030 # 每个实验一个文件夹
│ ├── configs # 用于记录的已转储的配置文件。如果在同一个实验文件夹中重新运行了不同的实验,可能会保留多个配置
│ ├── logs # 推理和评估阶段的日志文件
│ │ ├── eval
│ │ └── infer
│ ├── predictions # 每个任务的推理结果
│ ├── results # 每个任务的评估结果
│ └── summary # 单个实验的汇总评估结果
├── ...
2.3.2 命令行结合配置文件

首先查看

首先查看opencompass支持的模型和数据集。模型和数据集的配置文件预存于 configs/models 和 configs/datasets 中。用户可以使用tools/list_configs.py 查看或过滤当前可用的模型和数据集配置 。

1
2
3
4
# 列出所有配置, 内容过多,直接输出到根目录下的output.txt文件中
python tools/list_configs.py > output.txt
# 列出与llama和mmlu相关的所有配置
python tools/list_configs.py llama mmlu

输出中包含opencompass支持的所有模型和数据集,以及他们对应的配置文件,这相当于一个字典比如我们要评估Qwen2.5-7B-Instruct Qwen2.5-7B-Instruct模型在demo_gsm8k_chat_gen demo_math_chat_gen上的效果,output.txt的对应内容如下:

image-20250412234834243

我们先去对应的配置文件下,改好配置文件,然后再python run.py命令中输入的是前面的模型名称,opencompass就会根据模型名称找到相对应的配置文件。

opencompass/opencompass/configs/models文件夹下找到对应的模型配置文件,这里要修改的是hf前缀的文件,将配置文件中的模型路径改为我们自己的模型路径, 比如hf_qwen2_5_0_5b_instruct.py修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
from opencompass.models import HuggingFacewithChatTemplate

models = [
dict(
type=HuggingFacewithChatTemplate,
abbr='qwen2.5-0.5b-instruct-hf',
# path='Qwen/Qwen2.5-0.5B-Instruct',
path='/root/autodl-tmp/Qwen2.5-0.5B-Instruct', # 修改为自己的模型路径
max_out_len=4096,
batch_size=8,
run_cfg=dict(num_gpus=1), # 使用的卡数目
)
]

hf_qwen2_5_7b_instruct.py 同样修改,注意,可能opencompass 支持qwen, qwen2.5, 但不支持qwen1.5,如果想评估,qwen1.5, 可以选择要给qwen的配置文件,但再命令行中要输入选择的那个qwen的模型名称。也就是说--Model是output.txt中的Mode一列的值,真正的模型路径是在output.txtpath一列的值。

配置完成后使用如下命令

1
python run.py --models hf_qwen2_5_0_5b_instruct hf_qwen2_5_7b_instruct --datasets demo_gsm8k_chat_gen demo_math_chat_gen  --debug

成功执行后开始评估:

image-20250413003649462

显存使用情况如下,可以根据显存使用情况指定修改batch_size:

image-20250413003920264

如果你有多张卡,并评估多个模型,则会同时评估多个模型,每个模型用1张卡。

image-20250413233011648

最终结果如下,同时会在opencompass根目录下生成文件夹outputs用于保存输出。

image-20250413004518596

2.3.3 python脚本+配置文件

除了通过命令行配置实验外,OpenCompass 还允许用户在配置文件中编写实验的完整配置,并通过run.py 直接运行它。配置文件是以 Python 格式组织的,并且必须包括 datasets 和 models 字段。 其实他就是写一个python脚本去加载修改好的配置文件,所以先跟2.3.2一样修改配置文件,然后使用如下代码:

1
2
3
4
5
6
7
8
9
10
from mmengine.config import read_base

with read_base():
from .datasets.demo.demo_gsm8k_base_gen import gsm8k_datasets # Instruct模型对应的是base模型
from .datasets.demo.demo_math_base_gen import math_datasets
from .models.qwen.hf_qwen2_5_0_5b_instruct import models as hf_qwen2_5_0_5b_instruct_models
from .models.hf_internlm.hf_qwen2_5_7b_instruct import models as hf_qwen2_5_7b_instruct

datasets = gsm8k_datasets + math_datasets
models = hf_qwen2_1_5b_instruct_models + hf_internlm2_chat_1_8b_models

将该文件保存到opencompass/opencompass/configs目录下

直接运行:

1
python /root/autodl-tmp/opencompass/opencompass/configs/run.py --debug
2.3.4 多卡评估

在评估配置文件中指定run_cfg=dict(num_gpus=2)参数即可,其他操作同上。这里只在两个数据集上评估一个模型。

修改hf_qwen2_5_0_5b_instruct.py,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
from opencompass.models import HuggingFacewithChatTemplate

models = [
dict(
type=HuggingFacewithChatTemplate,
abbr='qwen2.5-0.5b-instruct-hf',
# path='Qwen/Qwen2.5-0.5B-Instruct',
path='/root/autodl-tmp/Qwen2.5-0.5B-Instruct',
max_out_len=4096,
batch_size=8,
run_cfg=dict(num_gpus=2),
)
]

指令如下:

1
python run.py --models hf_qwen2_5_0_5b_instruct --datasets demo_gsm8k_chat_gen demo_math_chat_gen  --debug

我一开始总是报错FileNotFoundError: Prediction files not found: neither outputs/default/20250413_233935/predictions/qwen2.5-0.5b-instruct-hf/demo_gsm8k.json nor outputs/default/20250413_233935/predictions/qwen2.5-0.5b-instruct-hf/demo_gsm8k_0.json exists ,后来我把其他日志目录下的对应文件复制到新的目录下,就正常运行了。

GPU使用情况如下图: 两张GPU都用上了。

image-20250413233826431

2.3.5 使用LMDeploy或vllm加速评估

目前opencompass支持vllm和LMDeploy加速评估。这里受用LMDeploy。

首先在当前环境安装LMDdeploy:

1
pip install LMDeploy

接着修改配置文件,要修改LMDeploy对应的配置文件,这里修改的是/root/autodl-tmp/opencompass/opencompass/configs/models/qwen2_5/lmdeploy_qwen2_5_0_5b_instruct.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from opencompass.models import TurboMindModelwithChatTemplate

models = [
dict(
type=TurboMindModelwithChatTemplate,
abbr='qwen2.5-0.5b-instruct-turbomind',
# path='Qwen/Qwen2.5-0.5B-Instruct',
path='/root/autodl-tmp/Qwen2.5-0.5B-Instruct', # 修改为模型路径
engine_config=dict(session_len=16384, max_batch_size=16, tp=1), # 这些参数和微调后测试时的参数保持一致
gen_config=dict(top_k=1, temperature=1e-6, top_p=0.9, max_new_tokens=4096),
max_seq_len=16384,
max_out_len=4096,
batch_size=16,
run_cfg=dict(num_gpus=1),
)
]

命令行运行

1
python run.py --models lmdeploy_qwen2_5_0_5b_instruct --datasets demo_gsm8k_chat_gen demo_math_chat_gen  --debug

速度会肉眼可见地变快。

三. 遇到的问题以及解决方法

3.1 torch 版本问题

报错 [AttributeError: module 'torch' has no attribute 'device']) ,原因是torch版本不对,我虚拟环境版本是2.6.0,一般用2.5比较好,在opencompass/requierments/runtime.txt 中需改torch>=1.13.1torch==2.5.1, 把原来环境删除,重新执行2.1安装步骤。

如果您读文章后有收获,可以打赏我喝咖啡哦~