模型评估

279 阅读15分钟

1.为什么要进行模型评估

每个模型的能力是不一样的,有的模型专注于逻辑推理,有的模型专注于文本生成,如果我们不知道模型的能力边界在哪里,就无法针对所需要做的事情来选择模型,对于大模型的开发者来说,他们就无法更好的去迭代模型的能力,所以需要进行模型评估,同时模型评估对于这个指导模型的能力提升也是具有非常重要的意义。在不同的业务场景下也同样需要一个健全的评估方式来评估选择什么样的大模型来适配要进行的业务场景。

2.OpenCompass

1.介绍

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

2.国内外评测体系的整体态势

3.OpenCompass评测能力能力层面

• 模型层:大模型评测所涉及的主要模型种类,OpenCompass 以基座模型和对话模型作为重点评测对象。

• 能力层:OpenCompass 从本方案从通用能力和特色能力两个方面来进行评测维度设计。在模型通用能力方面,从语言、知识、理解、推理、安全等多个能力维度进行评测。在特色能力方面,从长文本、代码、工具、知识增强等维度进行评测。

• 方法层:OpenCompass 采用客观评测与主观评测两种评测方式。客观评测能便捷地评估模型在具有确定答案(如选择,填空,封闭式问答等)的任务上的能力,主观评测能评估用户对模型回复的真实满意度,OpenCompass 采用基于模型辅助的主观评测和基于人类反馈的主观评测两种方式。

• 工具层:OpenCompass 提供丰富的功能支持自动化地开展大语言模型的高效评测。包括分布式评测技术,提示词工程,对接评测数据库,评测榜单发布,评测报告生成等诸多功能。

4.openCompass评测设计

5.多模态领域也能评测基于MMBench

6.法律领域评测基于LawBench评测集

7.医疗领域评测基于MedBench评测集

8.大模型评测领域的挑战

3.OpenCompass评估流程

在 OpenCompass 中评估一个模型通常包括以下几个阶段 :配置 -> 推理 -> 评估 -> 可视化

配置:这是整个工作流的起点。您需要配置整个评估过程,选择要评估的模型和数据集。此外,还可以选择评估策略、计算后端等,并定义显示结果的方式。

推理与评估:在这个阶段,OpenCompass 将会开始对模型和数据集进行并行推理和评估。推理阶段主要是让模型从数据集产生输出,而评估阶段则是衡量这些输出与标准答案的匹配程度。这两个过程会被拆分为多个同时运行的“任务”以提高效率,但请注意,如果计算资源有限,这种策略可能会使评测变得更慢。

可视化:评估完成后,OpenCompass 将结果整理成易读的表格,并将其保存为 CSV 和 TXT 文件。你也可以激活飞书状态上报功能,此后可以在飞书客户端中及时获得评测状态报告。

4.生成式大模型评估指标

核心评估指标:

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

  • 准确率(Accuracy): 用于选择题或分类任务,通过比对生成结果与标准答案计算正确率。在OpenCompass中通过metric=accuracy配置。
  • 困惑度(Perplexity,PPL): 衡量模型对候选答案的预测能力,适用于选择题评估。需使用ppl类型的数据集配置(如ceval_ppl)。
  • 生成质量(GEN): 通过文本生成结果提取答案,需结合后处理脚本解析输出。使用gen类型的数据集(如ceval_gen),配置metric=gen并指定后处理规则。
  • ROUGE/LCS: 用于文本生成任务的相似度评估,需安装rouge==1.0.1依赖,并在数据配置中设置metric=rouge(生成模型的准确率一般来讲是根据模型输出的答案和我们标签的答案,根据文本的长度进行一个序列的划分。然后去对比上下划分好的序列内容,结果相同的话就得分加一,不同的话得分给0,以这样的方式来算一个准确率)。
  • 条件对数概率(CLP): 结合上下文计算答案的条件概率,适用于复杂推理任务,需在模型配置中启用use_logprob=True。

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

1.主流开源数据集

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

• 知识类:C-Eval(中文考试题,对应上图中的学科)、CMLU(多语言知识问答)、MMLU(英文多选题)。

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

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

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

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

2.数据集区别与选择

评估范式差异:

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

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

领域覆盖:

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

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

6.使用OpenCompass

1.安装

conda create -n opencompass python==3.10 -y

source activate opencompass

source /etc/network_turbo

cd /root/lanyun-tmp

git clone github.com/open-compas… opencompass

cd opencompass

pip install -e .

2.数据集准备

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 github.com/open-compas…

然后解压: 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 已经支持了大多数常用于性能比较的数据集,具体支持的数据集列表请直接在 ****configs/datasets ****下进行查找。

接下来,你可以阅读快速上手了解 OpenCompass 的基本用法。

3.配置评估任务

在 OpenCompass 中,每个评估任务由待评估的模型和数据集组成。

评估的入口点是 run.py 。用户可以通过命令行或配置文件选择要测试的模型和数据集。

对于 HuggingFace 模型,用户可以通过命令行直接设置模型参数,无需额外的配置文件。

1.单个模型评估

1.对话模型的评估:

单卡评估命令:

python run.py \
    --datasets demo_gsm8k_chat_gen demo_math_chat_gen \
    --hf-type chat \
    --hf-path /root/lanyun-tmp/LLM/Qwen/Qwen2.5-1.5B-Instruct \
    --debug

多卡评估命令:

python run.py \
    --datasets demo_gsm8k_chat_gen demo_math_chat_gen \
    --hf-type chat \
    --hf-path /root/lanyun-tmp/LLM/Qwen/Qwen2.5-1.5B-Instruct \
    --hf-num-gpus 2
    --debug

评测结果写入到了: /root/lanyun-tmp/opencompass/outputs/default/20250413_132916/summary/summary_20250413_132916.md

这张图展示了在 OpenCompass 评估平台上,针对:Qwen2.5-1.5B-Instruct_hf 的模型在两个不同数据集上的评测结果。以下是对图中信息的解释:

• 数据集(dataset):

demo_gsm8k:这是一个数学问题解答的数据集。

demo_math:这是另一个数学相关的问题解答数据集。

• 版本(version):

1d7fe4393424分别是这两个数据集的版本号。

• 评估指标(metric):

accuracy:表示使用准确率作为评估指标。

• 模式(mode):

gen:表示生成模式,即模型生成答案后需要通过后处理来提取最终答案。

• 评测分数:

Qwen2.5-1.5B-Instruct_hf模型在demo_gsm8k数据集上的准确率为 60.94%。

• 在demo_math数据集上的准确率为 39.06%。

这些分数反映了模型在不同数据集上的性能表现。准确率越高,表示模型在该数据集上的表现越好。

这里的评测是在生成模式下进行的,意味着模型需要生成答案,然后通过后处理步骤来提取和评估这些答案的正确性。

不同的数据集可能侧重于不同的能力,例如数学推理能力,因此模型在一个数据集上的表现可能优于另一个数据集。

2.基座模型的评估:
python run.py \
    --datasets demo_gsm8k_base_gen demo_math_base_gen \
    --hf-type base \
    --hf-path /root/lanyun-tmp/LLM/Qwen/Qwen2.5-1.5B \
    --debug

对话模型相比于基座模型,其名称上会多chat,instruct等额外文字描述,而基座模型的名称仅包含

“模型名称+版本+参数”。

3.HuggingFace模型完整参数列表:
命令行参数描述样例数值
--hf-typeHuggingFace 模型类型,可选值为 ****chat **** ****basechat
--hf-pathHuggingFace 模型路径/root/lanyun-tmp/LLM/Qwen/Qwen2.5-1.5B-Instruct
--model-kwargs构建模型的参数device_map=’auto’
--tokenizer-pathHuggingFace tokenizer 路径(如果与模型路径相同,可以省略)/root/lanyun-tmp/LLM/Qwen/Qwen2.5-1.5B-Instruct
--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 的 ID0
--peft-path(例如) LoRA 模型的路径/root/lanyun-tmp/LLM/Qwen/Qwen2.5-1.5B-Instruct
--peft-kwargs(例如) 构建 LoRA 模型的参数trust_remote_code=True

2.多个模型评估

1.查看模型与数据集配置

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

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

列出与 模型 和 数据集 相关的所有配置: python tools/list_configs.py modelName Dataset

例如运行: python tools/list_configs.py llama mmlu 会产生如下内容:

+-----------------+-----------------------------------+
| Model           | Config Path                       |
|-----------------+-----------------------------------|
| hf_llama2_13b   | configs/models/hf_llama2_13b.py   |
| hf_llama2_70b   | configs/models/hf_llama2_70b.py   |
| ...             | ...                               |
+-----------------+-----------------------------------+
+-------------------+---------------------------------------------------+
| Dataset           | Config Path                                       |
|-------------------+---------------------------------------------------|
| cmmlu_gen         | configs/datasets/cmmlu/cmmlu_gen.py               |
| cmmlu_gen_ffe7c0  | configs/datasets/cmmlu/cmmlu_gen_ffe7c0.py        |
| ...               | ...                                               |
+-------------------+---------------------------------------------------+

我们可以使用第一列中的名称作为 python run.py --models --datasets 的输入参数。对于数据集,同一名称的不同后缀通常表示其提示或评估方法不同。

2.找到评估模型存放的位置

这个models下存放的就是openCompass支持的所有的模型

3.处理要评估模型的配置
1.修改Qwen1.5b的路径

2.新建一个上次量化的千问进行评估:

3.查询模型

python tools/list_configs.py hf_qwen

通过这个命令就可以筛选出来目前opencompass的框架下面所支持的所有的HuggingFace的千问系列的模型名称。因为hf_qwen是个模型的前缀,所以它会输出hf_qwen的所有模型的名称,

看到有配置的两个模型。

4.执行评估:

*python run.py *

*--models hf_qwen2_5_1_5b_instruct hf_qwen2_5_1_5b_instruct_int8 *

*--datasets demo_gsm8k_chat_gen demo_math_chat_gen *

--debug

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_base_gen import gsm8k_datasets
    from .datasets.demo.demo_math_base_gen import math_datasets
    from .models.qwen2_5.hf_qwen2_5_1_5b_instruct import models as hf_qwen2_5_1_5b_instruct
    from .models.qwen.hf_qwen1_5_1_8b_chat import models as hf_qwen1_5_1_8b_chat

datasets = gsm8k_datasets + math_datasets
models = hf_qwen2_5_1_5b_instruct + hf_qwen1_5_1_8b_chat

python run.py /root/opencompass/opencompass/configs/eval_base_demo.py --debug

4.加速评测

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

1.lmDeploy加速评测

1.修改配置文件

在目录configs/models下找lmdeploy_开头的大模型配置文件,

以lmdeploy_qwen2_5_1_5b_instruct.py举例。

  • path修改为本地大模型目录,
  • max_batch_size和batch_size保持一致,若显卡性能较差,可以调小些

2.执行评测

*python run.py *

*--models lmdeploy_qwen2_5_1_5b_instruct *

*--datasets demo_gsm8k_chat_gen demo_math_chat_gen *

--debug

3.vllm加速评测

操作和上面一样改vllm的文件就行

5.指定数据集评测

上面的评测任务都是使用2个demo数据集,某些需求和场景,我们需要指定不同的数据集,比如使用C-Eval(中文考试题)这个数据集来评测一下模型对于中文理解的能力。

1、查找数据集 OpenCompass内置的数据集都在 configs/datasets/ 目录下。

也可以通过命令查询:

python tools/list_configs.py ceval

使用ceval_gen 数据集评测

*python run.py *

*--models lmdeploy_qwen2_5_1_5b_instruct *

*--datasets ceval_gen *

--debug

得分如下:

6.自定义数据集评测

OpenCampass目前支持 .jsonl .csv 两种格式的数据集。

1.选择题

对于选择 ( 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

2.问答题

对于问答 ( 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

3.执行评测

1.csv格式

*python run.py *

--models lmdeploy_qwen2_5_1_5b_instruct **

*--custom-dataset-path xxx/test_mcq.csv *

*--custom-dataset-data-type mcq *

--custom-dataset-infer-method ppl

2.jsonl格式

*python run.py *

--models lmdeploy_qwen2_5_1_5b_instruct **

*--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

*python run.py *

--hf_patch /root/LLM/Qwen/Qwen2.5-1.5B-Instruct **

*--custom-dataset-path xxx/test_qa.jsonl *