文章目录
前言
OpenCompass,也称为“司南”,是由上海人工智能实验室发布的一个开源的大模型评测体系,已经成为目前权威的大型模型评估平台,本篇介绍如何使用OpenCompass进行大模型测评,以及其中涉及的相关知识。
官方看这里。
内容摘要
- OpenCompass概述介绍
- OpenCompass下载安装
- OpenCompass快速开始
- ppl、gen两种测评方式区别简述
- OpenCompass的Prompt构建
- 数据集、测评指标、模型推理的配置
- 测评结果可视化
1. OpenCompass概述介绍
OpenCompass是一个一站式的大模型评估平台,旨在为大模型评估提供一个公平、开放和可复制的基准。它不仅量化了模型在知识、语言、理解、推理等方面的能力,还推动了模型的迭代和优化。OpenCompass平台广泛支持 40 多个 HuggingFace 和 API 模型,整合了 100 多个基准和大约 400,000 个问题,以评估八个维度的模型。其高效的分布式评估系统可以快速、全面地评估数十亿规模的模型。该平台支持各种评估方法,包括零样本评估、少样本评估和思维链评估,并具有高度可扩展的模块化设计,可以轻松添加新模型、基准测试或定制任务策略。此外,OpenCompass 还包括强大的实验管理和报告工具,用于详细跟踪和实时结果呈现。
OpenCompass工作流程为:
1.1 OpenCompass主要特点包括:
- 对模型和数据集支持丰富:支持20+HuggingFace和API模型,70+数据集的模型评估方案,约40万个问题,从五个维度全面评估模型的能力
- 分布式高效评测:提供了分布式评测方案,支持了本机或集群上的计算任务并行分发,实现评测并行式的提速
- 评估范式多样化:支持Zero-Shot、Few-Shot、思维链,内置多种Prompt模板,最大程度激发大模型潜能
- 模块化设计和可拓展性强:支持对用户自定义的的新模型或者数据集进行测评,各模块可高效复用和拓展
- 实验管理和报告机制:有完备的实验管理和报告结果跟踪,并且有多种可视化方案,输出到终端、文件、飞书
OpenCompass平台同时会发布大模型的评分榜,包含大语言模型、多模态模型、以及各个垂类领域的模型排名,为用户提供全面、客观、中立的评测参考。
1.2 ppl、gen两种测评方式区别简述
在opencompass项目的configs/datasets
下能查看到ppl
和gen
两种数据配置,它们决定了测试数据集在Prompt构造和回答结果后处理的差异。
PPL
ppl 是困惑度 (perplexity) 的缩写,是一种评价模型进行语言建模能力的指标。在OpenCompass的语境下,它一般指一种选择题的做法:给定一个上下文,模型需要从多个备选项中选择一个最合适的。此时,我们会将n个选项拼接上下文后,形成n个序列,然后计算模型对这n个序列的perplexity,我们认为其中perplexity最低的序列所对应的选项即为模型在这道题上面的推理结果,该种评测方法的后处理简单直接、确定性高。ppl的工作流程图示如下
GEN
gen
是生成 (generate) 的缩写,它指的是在给定上下文的情况下,模型往后续写的结果就是这道题目上的推理结果。一般来说,续写得到的字符串需要结合上比较重的后处理过程,才能进行可靠的答案提取,从而完成评测。
ppl需要推理的试题+答案的组合,推理的组合数量由选项多少决定,对于单选题,如果有N个选项则需要推理N条句子分别得到困惑度才能获得最终的答案,而gen不需要组合答案,直接对问题进行推理,因此一条试题只需要推理一个句子,但是由于gen生成的结果不可控,需要配合复杂的后处理提取出答案,而ppl几乎不需要后处理。
从使用上来说,基座模型的单项选择题和部分具有选择题性质的题目会使用 ppl,基座模型的不定项选择和非选择题都会使用 gen。而对话模型的所有题目都会使用 gen,因为许多商用 API 模型不会暴露 ppl 的接口。但也存在例外情况,例如我们希望基座模型输出解题思路过程时 (例如 Let’s think step by step),我们同样会使用 gen,但总体的使用如下图所示:
CLP
在OpenCompass的官方文档中还提到第三种评估方法:clp(条件对数概率 ,conditional log probability),前文介绍的使用Python脚本来测试C-Eval就是采用clp的方法。clp条件对数概率是在给定上下文的情况下,计算下一个 token 的概率。它也仅适用于选择题,考察概率的范围仅限于备选项标号所对应的 token,取其中概率最高的 token 所对应的选项为模型的推理结果。
clp的评估示意图如下
clp和ppl一样,下一个token的条件概率对答案的判断起到决定作用,区别是clp只需要推理一次,而ppl需要推理选项个数N次,因此clp更加高效,但是clp更加容易受到prompt的扰动,因此OpenCompass官方一般都采用ppl的方式,由于ppl考虑了整个句子的合理性,比clp的鲁棒性更高。
2. OpenCompass评估流程
2.1 安装依赖库
GPU 环境:
conda create -n opencompass python=3.10
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia -y
cd ~
conda activate opencompass
git clone -b 0.2.4 https://github.com/open-compass/opencompass
cd opencompass
pip install -e .
apt-get update
apt-get install cmake
pip install -r requirements.txt
pip install protobuf
接下来的步骤是在克隆完成的opencompass目录下进行
2.2 数据准备
在opencompass
目录下下载OpenCompassData-core
这个数据集,然后直接解压,其中的所有数据集都会解压到opencompass/data/*
目录中。
wget https://github.com/open-compass/opencompass/releases/download/0.1.8.rc1/OpenCompassData-core-20231110.zip
unzip OpenCompassData-core-20231110.zip
2.3 快速模型评测
确保按照上述步骤正确安装 OpenCompass 并准备好数据集后,可以通过以下命令评测 LLaMA-7b 模型在 MMLU 和 C-Eval 数据集上的性能:
python run.py --models hf_llama_7b --datasets mmlu_ppl ceval_ppl
注意,通用流程中评测的是内置的一些模型,如何查看内置有哪些模型:
# 列出所有配置
python tools/list_configs.py
如果要看是否支持某个模型,可以:
python tools/list_configs.py | grep internlm2
如下:
2.4 评测internlm2-chat-1.8b
首先需要打开 opencompass文件夹下configs/models/hf_internlm/的hf_internlm2_chat_1_8b.py
,贴入以下代码
from opencompass.models import HuggingFaceCausalLM
models = [
dict(
type=HuggingFaceCausalLM,
abbr='internlm2-1.8b-hf',
path="/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b",
tokenizer_path='/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b',
model_kwargs=dict(
trust_remote_code=True,
device_map='auto',
),
tokenizer_kwargs=dict(
padding_side='left',
truncation_side='left',
use_fast=False,
trust_remote_code=True,
),
max_out_len=100,
min_out_len=1,
max_seq_len=2048,
batch_size=8,
run_cfg=dict(num_gpus=1, num_procs=1),
)
]
确保按照上述步骤正确安装 OpenCompass 并准备好数据集后,可以通过以下命令评测 InternLM2-Chat-1.8B 模型在 C-Eval 数据集上的性能。由于 OpenCompass 默认并行启动评估过程,我们可以在第一次运行时以 --debug 模式启动评估,并检查是否存在问题。在 --debug 模式下,任务将按顺序执行,并实时打印输出。
python run.py --models hf_internlm2_chat_1_8b --datasets ceval_gen --debug
成功启动时,能够看到在控制台输出:
接着可能会长时间看不到控制台输出,这是因为评测的日志都写到了tmp
目录下的*_debug.log
日志中,部分如下:
待全部运行完成后,可以看到控制台输出:
评测结果
打开opencompass/outputs/default/20240810_193335/summary
目录中的summery
文件可以看到详细的评测结果。
本次使用ceval评测hf_internlm2_chat_1_8b.py
的结果如下:
OpenCompass完整指令运行
和前文一样,本节也采用C-Eval数据来测评ChatGLM2-6B,在OpenCompass项目上只需要运行run.py脚本,并且通过命令行传参的方式指定模型文件路径和测评数据名称即可进行评测,执行脚本如下
python run.py \
--datasets ceval_gen \
--hf-path /root/model/internlm2-chat-1_8b \
--tokenizer-path /root/model/internlm2-chat-1_8b \
--model-kwargs device_map='auto' trust_remote_code=True \
--tokenizer-kwargs padding_side='left' truncation='left' use_fast=False trust_remote_code=True \
--max-out-len 100 \
--max-seq-len 2048 \
--batch-size 8 \
--no-batch-padding \
--hf-num-gpus 1
其中datasets指定测评数据的配置方式为ceval_gen,gen代表以generate生成式的方式来评估大模型,ceval_gen配置方式和OpenCompass目录下的**/configs/datasets/ceval_gen.py**对应,在配置里面指明了测试数据的地址、解析方式以及Prompt构建等信息。hf-path和tokenizer-path分别指定模型文件个分词模型,直接瞄定本地已经下载好的HuggingFace模型文件即可。除此之外还需要指定其他的模型推理参数,包括max-out-len等。
OpenCompass分别计算C-Eval每个学科的正确率,最后输出模型在4个学科大类,以及Hard模式和整体的平均得分,测评结果如下
3. 自定义评测
3.1 准备评测配置文件
新增如下文件./configs/eval_{你的模型名字}.py
,
里面的内容比如:
from mmengine.config import read_base
with read_base():
from .datasets.collections.base_medium_llama import piqa_datasets, siqa_datasets
from .models.hf_llama.hf_llama_7b import models
datasets = [*piqa_datasets, *siqa_datasets]
本段配置代码主要输出两个重要配置:
- 评测数据集 datasets,当前是 piqa_datasets 和 siqa_datasets,也可以选择多个评测集
- 待评测模型 models,当前是 hf_llama_7b
3.2 准备模型
下载模型,可以从HuggingFace上面下载,这里以下载internlm2-chat-1.8b
模型为例,
git clone https://huggingface.co/internlm/internlm2_5-1_8b-chat
3.3 修改模型配置
模型的下载没有问题后,通过如下方式来指定模型配置文件:./configs/models/{模型名字}/{具体模型名字}.py
,如图:
即刚刚在上个配置文件中指定的模型配置,内容修改的地方如下:
from opencompass.models import HuggingFaceCausalLM
models = [
# LLaMA 7B
dict(
type=HuggingFaceCausalLM,
abbr='llama-7b-hf',
path="/root/data/opencompass-main/llmmodel/llama-7b", # 你的模型存放的实际路径,建议使用完整绝对路径
tokenizer_path='/root/data/opencompass-main/llmmodel/llama-7b', # 你的模型存放的实际路径,建议使用完整绝对路径
tokenizer_kwargs=dict(padding_side='left',
truncation_side='left',
use_fast=False,
),
max_out_len=100,
max_seq_len=2048,
batch_size=8,
model_kwargs=dict(device_map='auto'),
batch_padding=False, # if false, inference with for-loop without batch padding
run_cfg=dict(num_gpus=1, num_procs=1),
)
]
将 path 和 tokenizer_path 指向本地模型目录即可。
3.4 启动评测
直接使用项目根目录下的 run.py,指定我们定义好的评测配置,即可运行:
python run.py configs/eval_{你的模型名字}.py
最终的评测结果会在 outputs/default/{时间戳}
输出: