大模型评估测试和OpenCompass模型评估框架

一、为什么需要大模型评估指标?

生成式大模型,比如 ChatGPT、文心一言、Claude 等,会输出各种文本(比如写作、对话、摘要、代码等)。我们需要有方法来判断这些输出到底“行不行”、“好不好”、“能不能用”
想象下面这些场景: 
场景 评估目的
微调模型后 看模型是不是比之前更聪明了
多个模型对比 看哪个模型回答更好
训练参数调整后 看模型是不是更稳定、更准确
模型上线前 确保输出没有胡说八道、歧视、敏感信息等
学术论文发表 有量化的指标才能说明效果进步了

评估指标的作用,就是帮我们有标准、有数据、有依据地判断大模型的生成结果是不是靠谱的

它们像考试的评分标准,有了它们我们才能说“这个模型考了90分,那个只考了70分”。市面上几乎所有的大模型都会发布评估测试数据。如下是千问官方发布的Qwen2.7-72B的大模型评估。

二、生成式大模型的评估指标

核心评估指标
OpenCompass支持以下主要评估指标,覆盖生成式大模型的多样化需求:
  • 准确率(Accuracy):用于选择题或分类任务,通过比对生成结果与标准答案计算正确率。在OpenCompass中通过metric=accuracy配置
  • 困惑度(Perplexity, PPL):衡量模型对候选答案的预测能力,适用于选择题评估。需使用ppl类型的数据集配置(如ceval_ppl)
  • 生成质量(GEN):通过文本生成结果提取答案,需结合后处理脚本解析输出。使用gen类型的数据集(如ceval_gen),配置metric=gen并指定后处理规则
  • ROUGE/LCS:用于文本生成任务的相似度评估,需安装rouge==1.0.1依赖,并在数据配置中设置metric=rouge
  • 条件对数概率(CLP):结合上下文计算答案的条件概率,适用于复杂推理任务,需在模型配置中启用use_logprob=True

三、主流开源大模型评估数据集

数据集列表

开源的大模型评估数据集有很多种,详情可以看这篇《主流开源大模型评估数据集》。这里重点说下OpenCompass的内置数据集。OpenCompass内置超过70个数据集,覆盖五大能力维度:

  • 知识类:C-Eval(中文考试题)、CMMLU(多语言知识问答)、MMLU(英文多选题)。
  • 推理类:GSM8K(数学推理)、BBH(复杂推理链)。
  • 语言类:CLUE(中文理解)、AFQMC(语义相似度)。
  • 代码类:HumanEval(代码生成)、MBPP(编程问题)。
  • 多模态类:MMBench(图像理解)、SEED-Bench(多模态问答)。

数据集区别与选择

评估范式差异:

  • _gen后缀数据集:生成式评估,需后处理提取答案(如ceval_gen)
  • _ppl后缀数据集:困惑度评估,直接比对选项概率(如ceval_ppl)


领域覆盖:

  • C-Eval:侧重中文STEM和社会科学知识,包含1.3万道选择题
  • LawBench:法律领域专项评估,需额外克隆仓库并配置路径

四、什么是OpenCompass?

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

OpenCompass 的主要特点包括开源可复现、全面的能力维度、丰富的模型支持、分布式高效评测、多样化评测范式以及灵活化拓展。基于高质量、多层次的能力体系和工具链,OpenCompass 创新了多项能力评测方法,并构建了一套高质量的中英文双语评测基准,涵盖语言与理解、常识与逻辑推理、数学计算与应用、多编程语言代码能力、智能体、创作与对话等多个方面,能够实现对大模型真实能力的全面诊断。

官网:

https://opencompass.org.cn/home

github地址:

https://github.com/open-compass/opencompass/blob/main/README_zh-CN.md

官方文档:

https://opencompass.readthedocs.io/zh-cn/latest/get_started/installation.html

五、安装OpenCompass

安装OpenCompass 过程

1、使用Conda准备 OpenCompass 运行环境:python建议选择3.10版本。

conda create --name opencompass python=3.10 -y
# conda create --name opencompass_lmdeploy python=3.10 -y

conda activate opencompass

2、安装 OpenCompass,建议从源代码构建它

git clone https://github.com/open-compass/opencompass opencompass
cd opencompass
pip install -e .

下载数据集

OpenCompass 支持的数据集主要包括三个部分:

 (1)Huggingface 数据集: Huggingface Dataset 提供了大量的数据集,这部分数据集运行时会自动下载

(2)ModelScope 数据集ModelScope OpenCompass Dataset 支持从 ModelScope 自动下载数据集。要启用此功能,请设置环境变量:export DATASET_SOURCE=ModelScope,可用的数据集包括(来源于 OpenCompassData-core.zip):

humaneval, triviaqa, commonsenseqa, tydiqa, strategyqa, cmmlu, lambada, piqa, ceval, math, LCSTS, Xsum, winogrande, openbookqa, AGIEval, gsm8k, nq, race, siqa, mbpp, mmlu, hellaswag, ARC, BBH, xstory_cloze, summedits, GAOKAO-BENCH, OCNLI, cmnli

(3)自建以及第三方数据集:OpenCompass 还提供了一些第三方数据集及自建中文数据集。运行以下命令手动下载解压

在 OpenCompass 项目根目录下运行下面命令,将数据集准备至 ${OpenCompass}/data 目录下:

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

一般来说我们只要下载这个数据集就够用了。

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

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 "{}" \;

两个 .zip 中所含数据集列表如此处所示。

六、评估任务

在 OpenCompass 中,每个评估任务由待评估的模型和数据集组成。评估的入口点是 run.py。用户可以通过命令行或配置文件选择要测试的模型和数据集。

1、命令行-自定义HF模型

对于 HuggingFace 模型,用户可以通过命令行直接设置模型参数,无需额外的配置文件。例如,对于 对话模型 Qwen1.5-4B-Chat 和基座模型Qwen/Qwen2.5-1.5B,您可以使用以下命令进行评估:

  对于对话模型

python run.py \
    --datasets demo_gsm8k_chat_gen demo_math_chat_gen \
    --hf-type chat \
    --hf-path /root/autodl-tmp/llm/Qwen/Qwen1.5-4B-Chat \
    --debug

   对于基座模型

python run.py \
    --datasets demo_gsm8k_base_gen demo_math_base_gen \
    --hf-type base \
    --hf-path /root/autodl-tmp/llm/Qwen/Qwen2.5-1.5B \
    --debug

对话模型相比于基座模型,其名称上会多chat,instruct等额外文字描述,而基座模型的名称仅包含“模型名称+版本+参数”。

请注意,通过这种方式(命令行-自定义HF模型),OpenCompass 一次只评估一个模型,而其他方式可以一次评估多个模型。

参数说明 

命令行参数

描述

样例数值

--hf-type

HuggingFace 模型类型,可选值为 chat 或 base

chat

--hf-path

HuggingFace 模型路径

internlm/internlm2-chat-1_8b

--model-kwargs

构建模型的参数

device_map=’auto’

--tokenizer-path

HuggingFace tokenizer 路径(如果与模型路径相同,可以省略)

internlm/internlm2-chat-1_8b

--tokenizer-kwargs

构建 tokenizer 的参数

padding_side=’left’ truncation=’left’ trust_remote_code=True

--generation-kwargs

生成的参数

do_sample=True top_k=50 top_p=0.95

--max-seq-len

模型可以接受的最大序列长度

2048

--max-out-len

生成的最大 token 数

100

--min-out-len

生成的最小 token 数

1

--batch-size

批量大小

64

--hf-num-gpus

运行一个模型实例所需的 GPU 数量

1

--stop-words

停用词列表

‘<|im_end|>’ ‘<|im_start|>’

--pad-token-id

填充 token 的 ID

0

--peft-path

(例如) LoRA 模型的路径

internlm/internlm2-chat-1_8b

--peft-kwargs

(例如) 构建 LoRA 模型的参数

trust_remote_code=True

训练结果可以在控制台看到,OpenCompass也会将结果保存文件里,路径在根目录的outputs下,日期的目录-summary。

结果的精度得分是百分制,分数越高越好。

2、命令行

 用户可以使用 --models 和 --datasets 结合想测试的模型和数据集。这种一次可以跑多个模型。

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

# 列出所有配置
python tools/list_configs.py

# 列出与llama和mmlu相关的所有配置
python tools/list_configs.py llama mmlu

(1)修改配置文件

在评估之前,需要修改大模型配置文件,比如Qwen1.5-4B-Chat大模型,需要修改这个文件

 opencompass/opencompass/configs/models/qwen/hf_qwen1_5_4b_chat.py。

  • 将path路径改为本地正确的路径地址;
  • batch_size默认为8,若GPU显存性能较差,可以调整小点;
  • run_cfg中的num_gpus表示使用运行一个模型实例所需的 GPU 数量,必须小于服务器显卡数量。

我们再修改个大模型Qwen2.5-1.5B-Instruct的配置文件,便于后续测试。

(2)找大模型名称

 命令中 models 后跟着大模型的名称,该名称需要使用OpenCompass定义的名称,找的方法有有2种,可以根据配置文件的名称(不带py),也可以通过命令搜索,我们使用的是hf_qwen,则如下命令:

python tools/list_configs.py hf_qwen

可以找到对应的模型名称:hf_qwen1_5_4b_chat 和 hf_qwen2_5_1_5b_instruct。

(3)运行评测命令

	python run.py \
    --models hf_qwen1_5_4b_chat hf_qwen2_5_1_5b_instruct \
    --datasets demo_gsm8k_chat_gen demo_math_chat_gen \
    --debug

评估结果如下图,可以看到qwen2.5明显比1.5的评估结果要好,即便参数量较小。

3、配置文件方式

除了通过命令行配置实验外,OpenCompass 还允许用户在配置文件中编写实验的完整配置,并通过 run.py 直接运行它。配置文件是以 Python 格式组织的,并且必须包括 datasets 和 models 字段。

本次测试配置在 configs/eval_chat_demo.py 中。此配置通过 继承机制 引入所需的数据集和模型配置,并以所需格式组合 datasets 和 models 字段。

from mmengine.config import read_base

with read_base():
    from .datasets.demo.demo_gsm8k_chat_gen import gsm8k_datasets
    from .datasets.demo.demo_math_chat_gen import math_datasets
    from .models.qwen.hf_qwen2_1_5b_instruct import models as hf_qwen2_1_5b_instruct_models
    from .models.hf_internlm.hf_internlm2_chat_1_8b import models as hf_internlm2_chat_1_8b_models

datasets = gsm8k_datasets + math_datasets
models = hf_qwen2_1_5b_instruct_models + hf_internlm2_chat_1_8b_models

运行任务时,我们只需将配置文件的路径传递给 run.py

python run.py configs/eval_chat_demo.py --debug

七、加速评测

OpenCompass支持在评测大语言模型时,使用 LMDeploy 作为推理加速引擎。LMDeploy 是涵盖了 LLM 和 VLM任务的全套轻量化、部署和服务解决方案,拥有卓越的推理性能。本教程将介绍如何使用 LMDeploy 加速对模型的评测。

1、安装LMDeploy

pip install lmdeploy

2、调整配置文件

在目录configs/models下找lmdeploy_打头的大模型配置文件。比如lmdeploy_qwen2_5_1_5b_instruct.py文件。

path修改为本地大模型目录,

max_batch_size和batch_size保持一致,若显卡性能较差,可以调小些。

3、运行评测命令

	python run.py \
    --models lmdeploy_qwen2_5_1_5b_instruct \
    --datasets demo_gsm8k_chat_gen demo_math_chat_gen \
    --debug

 评测的速度明显快与第六章节的3种方式。

在 OpenCompass 评测过程中,默认使用 Huggingface 的 transformers 库进行推理,这是一个非常通用的方案,也可使用更高效的推理方法来加速这一过程,比如借助LMDeploy 或 vLLM 。 本章节的方法同样使用与vLLM。

八、指定数据集

上面的评测任务都是使用2个demo数据集,根据需求和场景,我们需要指定不同的数据集,比如我们使用C-Eval(中文考试题)这个数据集来评测。

1、查找数据集

OpenCompass内置的数据集都在 configs/datasets/ 目录下。也可以通过命令查询:

python tools/list_configs.py ceval

结果:

+--------------------------------+------------------------------------------------------------------------------+
| Dataset                        | Config Path                                                                  |
|--------------------------------+------------------------------------------------------------------------------|
| ceval_clean_ppl                | opencompass/configs/datasets/ceval/ceval_clean_ppl.py                        |
| ceval_contamination_ppl_810ec6 | opencompass/configs/datasets/contamination/ceval_contamination_ppl_810ec6.py |
| ceval_gen                      | opencompass/configs/datasets/ceval/ceval_gen.py                              |
| ceval_gen_2daf24               | opencompass/configs/datasets/ceval/ceval_gen_2daf24.py                       |
| ceval_gen_5f30c7               | opencompass/configs/datasets/ceval/ceval_gen_5f30c7.py                       |
| ceval_internal_ppl_1cd8bf      | opencompass/configs/datasets/ceval/ceval_internal_ppl_1cd8bf.py              |
| ceval_internal_ppl_93e5ce      | opencompass/configs/datasets/ceval/ceval_internal_ppl_93e5ce.py              |
| ceval_ppl                      | opencompass/configs/datasets/ceval/ceval_ppl.py                              |
| ceval_ppl_1cd8bf               | opencompass/configs/datasets/ceval/ceval_ppl_1cd8bf.py                       |
| ceval_ppl_578f8d               | opencompass/configs/datasets/ceval/ceval_ppl_578f8d.py                       |
| ceval_ppl_93e5ce               | opencompass/configs/datasets/ceval/ceval_ppl_93e5ce.py                       |
| ceval_zero_shot_gen_bd40ef     | opencompass/configs/datasets/ceval/ceval_zero_shot_gen_bd40ef.py             |
+--------------------------------+------------------------------------------------------------------------------+

我们选择ceval_gen这个数据集测试。

2、运行评测命令

	python run.py \
    --models lmdeploy_qwen2_5_1_5b_instruct \
    --datasets ceval_gen \
    --debug

执行结果如下:

九、自定义数据集

1、支持格式

支持 .jsonl 和 .csv 两种格式的数据集。

2、选择题 (mcq)


对于选择 (mcq) 类型的数据,默认的字段如下:

  • question: 表示选择题的题干
  • A, B, C, …: 使用单个大写字母表示选项,个数不限定。默认只会从 A 开始,解析连续的字母作为选项。
  • answer: 表示选择题的正确答案,其值必须是上述所选用的选项之一,如 A, B, C 等。

对于非默认字段,我们都会进行读入,但默认不会使用。如需使用,则需要在 .meta.json 文件中进行指定。

.jsonl 格式样例如下:

{"question": "165+833+650+615=", "A": "2258", "B": "2263", "C": "2281", "answer": "B"}
{"question": "368+959+918+653+978=", "A": "3876", "B": "3878", "C": "3880", "answer": "A"}
{"question": "776+208+589+882+571+996+515+726=", "A": "5213", "B": "5263", "C": "5383", "answer": "B"}
{"question": "803+862+815+100+409+758+262+169=", "A": "4098", "B": "4128", "C": "4178", "answer": "C"}


.csv 格式样例如下:

question,A,B,C,answer
127+545+588+620+556+199=,2632,2635,2645,B
735+603+102+335+605=,2376,2380,2410,B
506+346+920+451+910+142+659+850=,4766,4774,4784,C
504+811+870+445=,2615,2630,2750,B


3、问答题 (qa)


对于问答 (qa) 类型的数据,默认的字段如下:

  • question: 表示问答题的题干
  • answer: 表示问答题的正确答案。可缺失,表示该数据集无正确答案。

对于非默认字段,我们都会进行读入,但默认不会使用。如需使用,则需要在 .meta.json 文件中进行指定。

.jsonl 格式样例如下:

{"question": "752+361+181+933+235+986=", "answer": "3448"}
{"question": "712+165+223+711=", "answer": "1811"}
{"question": "921+975+888+539=", "answer": "3323"}
{"question": "752+321+388+643+568+982+468+397=", "answer": "4519"}


.csv 格式样例如下:

question,answer
123+147+874+850+915+163+291+604=,3967
149+646+241+898+822+386=,3142
332+424+582+962+735+798+653+214=,4700
649+215+412+495+220+738+989+452=,4170


命令行列表
自定义数据集可直接通过命令行来调用开始评测。

python run.py \
    --models hf_llama2_7b \
    --custom-dataset-path xxx/test_mcq.csv \
    --custom-dataset-data-type mcq \
    --custom-dataset-infer-method ppl
python run.py \
    --models hf_llama2_7b \
    --custom-dataset-path xxx/test_qa.jsonl \
    --custom-dataset-data-type qa \
    --custom-dataset-infer-method gen

在绝大多数情况下,--custom-dataset-data-type 和 --custom-dataset-infer-method 可以省略,OpenCompass 会根据以下逻辑进行设置:

  • 如果从数据集文件中可以解析出选项,如 A, B, C 等,则认定该数据集为 mcq,否则认定为 qa。
  • 默认 infer_method 为 gen。