大模型系列:OpenCompass(司南)大模型测评工具介绍和实践

关键词:OpenCompassLLM大模型测评

前言

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测评结果可视化

本篇介绍了如何快速上手和理解OpenCompass,对于该项目来说所介绍的内容只是冰山一角,有兴趣的读者可以自行阅读官方文档,全文完毕。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容