AI 大模型评测难?OpenCompass 这个‘自动跑分神器’来破局!

技术

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

生成式大模型,比如 ChatGPT、QWen、Claude 等,会输出各种文本(比如写作、对话、摘要、代码等)。我们需要有方法来判断这些输出到底“行不行”、“好不好”、“能不能用”。

想象下面这些场景:

| 场景 | 评估目的 | | --- | --- | | 微调模型后 | 看模型是不是比之前更聪明了 | | 多个模型对比 | 看哪个模型回答更好 | | 训练参数调整后 | 看模型是不是更稳定、更准确 | | 模型上线前 | 确保输出没有胡说八道、歧视、敏感信息等 | | 学术论文发表 | 有量化的指标才能说明效果进步了 |

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

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

picture.image

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

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内置超过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),方便进行模型的效果评测。

picture.image

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

官网:https://opencompass.org.cn/

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 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 中所含数据集列表如此处所示。

picture.image

六、评估任务

在 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-typeHuggingFace 模型类型,可选值为 chatbasechat
--hf-pathHuggingFace 模型路径internlm/internlm2-chat-1_8b
--model-kwargs构建模型的参数device_map=’auto’
--tokenizer-pathHuggingFace 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停用词列表‘<
--pad-token-id填充 token 的 ID0
--peft-path(例如) LoRA 模型的路径internlm/internlm2-chat-1_8b
--peft-kwargs(例如) 构建 LoRA 模型的参数trust_remote_code=True

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

picture.image

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

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 数量,必须小于服务器显卡数量。

picture.image

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

(2)找大模型名称

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

  
python tools/list\_configs.py hf\_qwen

picture.image

可以找到对应的模型名称: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的评估结果要好,即便参数量较小。

picture.image

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保持一致,若显卡性能较差,可以调小些。

picture.image

3、运行评测命令

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

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

picture.image

在 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

执行结果如下:

picture.image

九、自定义数据集

1、支持格式

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

2、选择题 (mcq)

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

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

.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: 表示问答题的正确答案。可缺失,表示该数据集无正确答案。

.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。

picture.image

探秘 Hugging Face:何为 Hugging Face 及其核心组件全览

LLaMA Factory 如何对大模型进行微调、导出和量化!掌握这几步,轻松搞定!

大模型部署该选谁?Ollama、vLLM 和 LMDeploy,各有千秋!

大型语言模型如何高效微调量化?答案就是 QLoRA!

LLaMA Factory微调后的大模型在vLLM框架中对齐对话模版

AI大模型分布式训练技术原理是什么?看这篇超犀利解析!

XTuner对大模型 微调训练、转换、合并和验证 !这篇文章让你轻松拿捏!

基于Bert大模型增量微调训练:中文评价情感分析

大模型高并发请求和单卡显存不足怎么办?分布式推理和量化部署来救场!

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
高性能存储虚拟化方案 NVMe over Fabric 在火山引擎的演进
在云计算中,虚拟化存储扮演着重要角色,其中 iSCSI 协议在业界开放、流行多年。近年来,拥有更优性能的 NVMe over Fabrics 协议也得到了发展。本次分享介绍了 NVMe over Fabrics 在云原生和虚拟化方向的演进工作和成果。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论