前言
OpenCompass,也称为“司南”,是由上海人工智能实验室发布的一个开源的大模型评测体系,已经成为目前权威的大型模型评估平台,本篇介绍如何使用OpenCompass进行大模型测评,以及其中涉及的相关知识。
内容摘要
- OpenCompass概述介绍
- OpenCompass下载安装
- OpenCompass快速开始
- ppl、gen两种测评方式区别简述
- OpenCompass的Prompt构建
- 数据集、测评指标、模型推理的配置
- 测评结果可视化
OpenCompass概述介绍
在前文《大模型系列:LLM-Eval大模型评测理论简述》中我们通过写Python脚本的方式实现了大模型在C-Eval上的测评,包括手动实现了数据读取、Prompt构建、模型推理、答案比对等步骤,而本篇要介绍的OpenCompass工具已经内置了一系列大模型测评常用的步骤模块,从而实现对大模型的高效自动化测评。OpenCompass是一个一站式的大模型评估平台,旨在为大模型评估提供一个公平、开放和可复制的基准。它不仅量化了模型在知识、语言、理解、推理等方面的能力,还推动了模型的迭代和优化。其主要特点包括:
OpenCompass工作流程图
- 对模型和数据集支持丰富:支持20+HuggingFace和API模型,70+数据集的模型评估方案,约40万个问题,从五个维度全面评估模型的能力
- 分布式高效评测:提供了分布式评测方案,支持了本机或集群上的计算任务并行分发,实现评测并行式的提速
- 评估范式多样化:支持Zero-Shot、Few-Shot、思维链,内置多种Prompt模板,最大程度激发大模型潜能
- 模块化设计和可拓展性强:支持对用户自定义的的新模型或者数据集进行测评,各模块可高效复用和拓展
- 实验管理和报告机制:有完备的实验管理和报告结果跟踪,并且有多种可视化方案,输出到终端、文件、飞书
OpenCompass平台同时会发布大模型的评分榜,包含大语言模型、多模态模型、以及各个垂类领域的模型排名,为用户提供全面、客观、中立的评测参考。
OpenCompass大语言模型排行榜
OpenCompass下载安装
OpenCompass基于Python实现,安装参考其Github的项目链接,下载项目源码之后,创建conda虚拟环境,再安装项目目录下所需的依赖
conda create --name opencompass python=3.10 pytorch torchvision pytorch-cuda -c nvidia -c pytorch -y
conda activate opencompass
git clone https://github.com/open-compass/opencompass opencompass
cd opencompass
pip install -r ./requirements/runtime.txt
pip install -e .
安装完成后,下一步下载官方的测评数据,使用网页或者命令下载放在opencompass目录下解压为data目录
wget https://github.com/open-compass/opencompass/releases/download/0.1.8.rc1/OpenCompassData-core-20231110.zip
unzip OpenCompassData-core-20231110.zip
至此项目工程和评测数据已经安装下载完成。
OpenCompass快速开始
和前文一样,本节也采用C-Eval数据来测评ChatGLM2-6B,在OpenCompass项目上只需要运行run.py脚本,并且通过命令行传参的方式指定模型文件路径和测评数据名称即可进行评测,执行脚本如下
python run.py \
--datasets ceval_gen \
--hf-path /home/model/chatglm2-6b \
--tokenizer-path /home/model/chatglm2-6b \
--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 \
--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等。
另一种启动方式为使用模型配置,将所有模型信息以/configs/models/**内的配置文件交代清楚,再以命令行中直接传入models模型配置来启动,启动命令如下
python run.py --datasets ceval_gen --models hf_chatglm2_6b
其中hf_chatglm2_6b和**/configs/models/chatglm/hf_chatglm2_6b.py**对应,其中交代了大模型所在的路径,以及其他模型配置信息
# hf_chatglm2_6b.py
models = [
dict(
type=HuggingFace,
abbr='chatglm2-6b-hf',
path='/home/model/chatglm2-6b',
tokenizer_path='/home/model/chatglm2-6b',
model_kwargs=dict(
trust_remote_code=True,
device_map='auto',
),
tokenizer_kwargs=dict(
padding_side='left',
truncation_side='left',
trust_remote_code=True,
),
max_out_len=16,
max_seq_len=4096,
batch_size=8,
run_cfg=dict(num_gpus=1, num_procs=1),
)
]
至此评测数据集ceval_gen和待测评大模型chatglm2_6b已经提交给OpenCompass程序,运行日志如下
02/19 16:30:29 - OpenCompass - INFO - Loading ceval_gen: configs/datasets/ceval/ceval_gen.py
02/19 16:30:29 - OpenCompass - INFO - Loading example: configs/summarizers/example.py
02/19 16:30:29 - OpenCompass - WARNING - SlurmRunner is not used, so the partition argument is ignored.
02/19 16:30:29 - OpenCompass - INFO - Partitioned into 1 tasks.
...
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [06:53<00:00, 413.05s/it]
02/19 16:37:22 - OpenCompass - INFO - Partitioned into 52 tasks.
launch OpenICLEval[opencompass.models.huggingface.HuggingFace_model_chatglm2-6b/ceval-operating_system] on CPU
launch OpenICLEval[opencompass.models.huggingface.HuggingFace_model_chatglm2-6b/ceval-computer_network] on CPU
...
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 52/52 [06:12<00:00, 7.17s/it]
dataset version metric mode opencompass.models.huggingface.HuggingFace_model_chatglm2-6b
---------------------------------------------- --------- ------------- ------ -----------------------------------------------------------------------------------------
ceval-computer_network db9ce2 accuracy gen 15.79
ceval-operating_system 1c2571 accuracy gen 47.37
...
ceval-stem - naive_average gen 43.44
ceval-social-science - naive_average gen 60.04
ceval-humanities - naive_average gen 58.58
ceval-other - naive_average gen 49.21
ceval-hard - naive_average gen 36.24
ceval - naive_average gen 51.06
OpenCompass分别计算C-Eval每个学科的正确率,最后输出模型在4个学科大类,以及Hard模式和整体的平均得分,测评结果如下
学科 | 得分 |
---|---|
ceval-stem | 43.44 |
ceval-social-science | 60.04 |
ceval-humanities | 58.58 |
ceval-other | 49.21 |
ceval-hard | 36.24 |
ceval | 51.06 |
ppl、gen两种测评方式区别简述
上一节中使用ceval_gen数据配置来评估大模型,表明其采用generate的形式,额外的还有另一种评估形式ppl,在项目的configs/datasets下能查看到ppl和gen两种数据配置,它们决定了测试数据集在Prompt构造和回答结果后处理的差异。
数据配置下的gen和ppl两种形式
ppl 是困惑度 (perplexity) 的缩写,是一种评价模型进行语言建模能力的指标。在OpenCompass的语境下,它一般指一种选择题的做法:给定一个上下文,模型需要从多个备选项中选择一个最合适的。此时,我们会将n个选项拼接上下文后,形成n个序列,然后计算模型对这n个序列的perplexity,我们认为其中perplexity最低的序列所对应的选项即为模型在这道题上面的推理结果,该种评测方法的后处理简单直接、确定性高。ppl的工作流程图示如下
ppl测评的方式
gen 是生成 (generate) 的缩写,它指的是在给定上下文的情况下,模型往后续写的结果就是这道题目上的推理结果。一般来说,续写得到的字符串需要结合上比较重的后处理过程,才能进行可靠的答案提取,从而完成评测。
gen测评的方式
ppl需要推理的试题+答案的组合,推理的组合数量由选项多少决定,对于单选题,如果有N个选项则需要推理N条句子分别得到困惑度才能获得最终的答案,而gen不需要组合答案,直接对问题进行推理,因此一条试题只需要推理一个句子,但是由于gen生成的结果不可控,需要配合复杂的后处理提取出答案,而ppl几乎不需要后处理。
ppl和gen的选取由大模型的类型、试题类型和提示词要求多方因素决定,一般Base模型没有经过指令微调,更加适合续写任务,因此Base模型一般采用ppl的方式,而Chat模型可以直接对问题进行回答,因此采用gen的方式,特殊的,如果Base模型面对的试题存在多选题,或者需要CoT思维链的方式引入中间过程,则还是采用gen方式。
在OpenCompass的官方文档中还提到第三种评估方法:clp(条件对数概率 ,conditional log probability),前文介绍的使用Python脚本来测试C-Eval就是采用clp的方法。clp条件对数概率是在给定上下文的情况下,计算下一个 token 的概率。它也仅适用于选择题,考察概率的范围仅限于备选项标号所对应的 token,取其中概率最高的 token 所对应的选项为模型的推理结果。clp的评估示意图如下
clp测评的方式
clp和ppl一样,下一个token的条件概率对答案的判断起到决定作用,区别是clp只需要推理一次,而ppl需要推理选项个数N次,因此clp更加高效,但是clp更加容易受到prompt的扰动,因此OpenCompass官方一般都采用ppl的方式,由于ppl考虑了整个句子的合理性,比clp的鲁棒性更高。
OpenCompass的Prompt构建
OpenCompass将测评数据集的试题通过Prompt模板组装成最终输入给大模型的语句,模板分为数据侧(Prompt Template)和模型侧(Meta Template),原始试题依次进入为数据侧和模型侧的Prompt模板最终输入给大模型。
数据侧的Prompt模板包括需要完成的任务说明,以及上下文样例,一个数据侧的Prompt模板样例如下
数据侧的Prompt模板样例
其中任务说明为**“Solve math questions”**,而round定义了每一轮HUMAN和BOT对话的范例,使用这个模板对数学计算问题进行提问,最终格式如下
仅使用数据侧的Prompt模板的大模型输入
其中左侧代表采用ppl的方式,将最后的答案11拼接到Prompt中让模型推理出困惑度,而右侧代表gen的方式,不需要给到答案,只需要提问5+6=?,基于模型生成的答案再做提取。
模型侧的Prompt模板一般为了迎合模型在SFT过程中所加入一些预定义的自负串,包括在对话开头加入的系统层级的指令,以及每轮对话期望的文本格式,模型侧的Prompt模板样例如下
模型侧的Prompt模板样例
模型侧的Prompt在开头给到大模型身份提示,并且约定了每轮问答的文本格式,最终加入模型侧Prompt后的模型输入如下,上方为ppl方式,下方为gen方式
融合模型侧Prompt和数据侧Prompt的最终输入
数据集、测评指标、模型推理的配置
在数据配置中对数据集、测评指标等相关信息进行了指定,我们以C-Eval测评数据为例,配置代码在configs/datasets/ceval/ceval_gen下
ceval_datasets.append(
dict(
type=CEvalDataset,
path="./data/ceval/formal_ceval",
name=_name,
abbr="ceval-" + _name if _split == "val" else "ceval-test-" +
_name,
reader_cfg=dict(
input_columns=["question", "A", "B", "C", "D"],
output_column="answer",
train_split="dev",
test_split=_split),
infer_cfg=ceval_infer_cfg,
eval_cfg=ceval_eval_cfg,
))
OpenCompass会遍历C-Eval的每一个科目,分别生成一个配置信息写入ceval_datasets,其中
- path: 指定了数据集的路径
- name:指定学科名称
- reader_cfg:测评数据读取的相关信息,包括输入的表头列,答案列,训练数据和测试数据分别对应的字符串标签
- infer_cfg:推理配置信息
- eval_cfg:评测的配置信息
推理配置信息infer_cfg包含推理的Prompt模板,以gen为例推理配置如下,其中inferencer指定的类型为GenInferencer代表采用gen方式。
ceval_infer_cfg = dict(
ice_template=dict(
type=PromptTemplate,
template=dict(
begin="</E>",
round=[
dict(
role="HUMAN",
prompt=
f"以下是中国关于{_ch_name}考试的单项选择题,请选出其中的正确答案。\n{{question}}\nA. {{A}}\nB. {{B}}\nC. {{C}}\nD. {{D}}\n答案: "
),
dict(role="BOT", prompt="{answer}"),
]),
ice_token="</E>",
),
retriever=dict(type=FixKRetriever, fix_id_list=[0, 1, 2, 3, 4]),
inferencer=dict(type=GenInferencer),
)
评测配置包含评测的指标和后处理,在C-Eval这种单选题的形式下评测指标是正确率AccEvaluator,如果采用的gen模式需要指定后处理方式,C-Eval使用的first_capital_postprocess后处理
ceval_eval_cfg = dict(
evaluator=dict(type=AccEvaluator), # TODO 评估指标:正确率
pred_postprocessor=dict(type=first_capital_postprocess)) # TODO 后处理,提取第一个大写英文字符
跟踪first_capital_postprocess,它的作用是抽取回答内容的第一个大写英文字母作为答案
@TEXT_POSTPROCESSORS.register_module('first-capital')
def first_capital_postprocess(text: str) -> str:
for t in text:
if t.isupper():
return t
return ''
ppl方式的Prompt和后处理和gen有差异,感兴趣的读者可以自行阅读ppl的C-Eval数据配置源码。
在OpenCompass快速开始章节中以chatglm2-6为例,其中已经给到了模型推理配置,包括模型和分词模型路径,最大推理长度,推理的batch_size等,在此不再敖述。
测评结果可视化
在OpenCompass快速开始章节中测评结果打印在终端上,同步的OpenCompass会将评测信息写入本地文件,默认在项目的outputs/default下,进入对应的评测版本号,一共有5个文件夹
(opencompass) ubuntu@root :~/myproject/opencompass-main/outputs/default/20240220_143747$ ls -l
总用量 20
drwxr-xr-x 2 root root 4096 2月 20 14:37 configs
drwxr-xr-x 4 root root 4096 2月 20 14:45 logs
drwxr-xr-x 3 root root 4096 2月 20 14:38 predictions
drwxr-xr-x 3 root root 4096 2月 20 14:45 results
drwxr-xr-x 2 root root 4096 2月 20 14:48 summary
- configs:记录了每个科目的数据配置信息,包括Prompt模板,标签名称等
- logs:程序运行日志,又包括eval日志和infer日志,其中eval日志记录了每个科目的正确率和运行耗时,infer日志记录了推理日志,包括运行进度,报错信息等
- predictions:记录每个科目的模型回答结果,其中包含了模型的最终输入和输出,通过该文件可以追溯每一条问题的回答结果。以一条信息为例
{
"0": {
"origin_prompt": "以下是中国关于注册会计师考试的单项选择题,请选出其中的正确答案。\n甲公司是国内一家上市公司。甲公司对其各子公司实行全面预算管理,并通常使用增量预算方式进行战略控制,子公司预算需要经甲公司预算管理委员会批准后执行。2015年10月,甲公司投资了一个新的项目乙(子公司)。2015年11月,甲公司启动2016年度预算编制工作,此时甲公司应要求乙公司编制____。\nA. 增量预算\nB. 零基预算\nC. 固定预算\nD. 弹性预算\n答案: \nB\n以下是中国关于注册会计师考试的单项选择题,请选出其中的正确答案。\n债务人转让全部合同义务的,下列说法不正确的是____。\nA. 须债权人同意方可进行\nB. 新债务人可主张原债务人对债权人的抗辩\nC. 债务人转移债务的,原债务人对债权人享有债权的,新债务人可以向债权人主张抵销\nD. 非专属于原债务人自身的从债务,一并转让给新债务人\n答案: \nC\n以下是中国关于注册会计师考试的单项选择题,请选出其中的正确答案。\n某公司2012年以150万元的价格进口了1台仪器;2014年6月因出现故障运往日本修理(出境时已向海关报明),2014年10月,按海关规定的期限复运进境。此时,该仪器的国际市场价格为200万元。若经海关审定的修理费和料件费为40万元,运费为1.5万元,保险费用为2.8万元,进口关税税率为6%。该仪器复运进境时,应缴纳的进口关税为____万元。\nA. 9\nB. 3\nC. 2.4\nD. 12\n答案: \nC\n以下是中国关于注册会计师考试的单项选择题,请选出其中的正确答案。\n公开发行公司债券,证监会同意注册的决定自作出之日起一定期限内有效,发行人应当该期限内发行公司债券。该期限是____。\nA. 6个月\nB. 1年\nC. 2年\nD. 3年\n答案: \nC\n以下是中国关于注册会计师考试的单项选择题,请选出其中的正确答案。\n某集团公司在一家银行开设了许多不同的银行账户,那么,该集团公司可以要求银行在考虑其利息及透支限额时将其子公司的账户余额集中起来。下列不属于现金余额集中的好处是____。\nA. 盈余与赤字相抵\nB. 加强控制\nC. 增加投资机会\nD. 匹配\n答案: \nD\n以下是中国关于注册会计师考试的单项选择题,请选出其中的正确答案。\n下列关于税法基本原则的表述中,不正确的是____。\nA. 税收法定原则包括税收要件法定原则和税务合法性原则\nB. 税收公平原则源于法律上的平等性原则\nC. 税
收效率原则包含经济效率和行政效率两个方面\nD. 税务机关按法定程序依法征税,可以自由做出减征、停征或免征税款的决定\n答案: ",
"prediction": "\nD",
"gold": "D"
},
}
origin_prompt为最终的模型输入,它采用Few-Shot Answer Only方式,将dev数据集中属于该科目的问题+答案作为范例,将其中一条val中的问题拼接在所有范例之后,让大模型回答答案。prediction为模型的回答,gold为标准答案,这条信息表明,大模型在该科目的编号为0的问题上回答为D,并且回答正确。
- results:记录了每个科目的正确率结果
- summary:记录了最终评测结果,以csv表格的形式呈现,结果如下
本篇介绍了如何快速上手和理解OpenCompass,对于该项目来说所介绍的内容只是冰山一角,有兴趣的读者可以自行阅读官方文档,全文完毕。
最后的最后
感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。
因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
四、AI大模型商业化落地方案
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】