OpenCompass,也称为“司南”,是由上海人工智能实验室发布的一个开源的大模型评测体系,已经成为目前权威的大型模型评估平台,本篇介绍如何使用OpenCompass进行大模型测评,以及其中涉及的相关知识。
在前文《大模型系列:LLM-eval大模型评测理论简述》中我们通过写Python脚本的方式实现了大模型在C-eval上的测评,包括手动实现了数据读取、prompt构建、模型推理、答案比对等步骤,而本篇要介绍的OpenCompass工具已经内置了一系列大模型测评常用的步骤模块,从而实现对大模型的高效自动化测评。OpenCompass是一个一站式的大模型评估平台,旨在为大模型评估提供一个公平、开放和可复制的基准。它不仅量化了模型在知识、语言、理解、推理等方面的能力,还推动了模型的迭代和优化。其主要特点包括:
OpenCompass工作流程图
- 对模型和数据集支持丰富:支持20+HuggingFace和API模型,70+数据集的模型评估方案,约40万个问题,从五个维度全面评估模型的能力
- 分布式高效评测:提供了分布式评测方案,支持了本机或集群上的计算任务并行分发,实现评测并行式的提速
- 评估范式多样化:支持Zero-Shot、Few-Shot、思维链,内置多种prompt模板,最大程度激发大模型潜能
- 模块化设计和可拓展性强:支持对用户自定义的的新模型或者数据集进行测评,各模块可高效复用和拓展
- 实验管理和报告机制:有完备的实验管理和报告结果跟踪,并且有多种可视化方案,输出到终端、文件、飞书
OpenCompass平台同时会发布大模型的评分榜,包含大语言模型、多模态模型、以及各个垂类领域的模型排名,为用户提供全面、客观、中立的评测参考。
安装完成后,下一步下载官方的测评数据,使用网页或者命令下载放在opencompass目录下解压为data目录
至此项目工程和评测数据已经安装下载完成。
OpenCompass快速开始
和前文一样,本节也采用C-eval数据来测评ChatGLM2-6B,在OpenCompass项目上只需要运行run.py脚本,并且通过命令行传参的方式指定模型文件路径和测评数据名称即可进行评测,执行脚本如下
其中datasets指定测评数据的配置方式为ceval_gen,gen代表以generate生成式的方式来评估大模型,ceval_gen配置方式和OpenCompass目录下的**/configs/datasets/ceval_gen.py对应,在配置里面指明了测试数据的地址、解析方式以及prompt构建等信息。hf-path和tokenizer-path分别指定模型文件个分词模型,直接瞄定本地已经下载好的HuggingFace模型文件即可。除此之外还需要指定其他的模型推理参数,包括max-out-len等。
另一种启动方式为使用模型配置,将所有模型信息以/configs/modelsconfigs/models/chatglm/hf_chatglm2_6b.py**对应,其中交代了大模型所在的路径,以及其他模型配置信息
至此评测数据集ceval_gen和待测评大模型chatglm2_6b已经提交给OpenCompass程序,运行日志如下
OpenCompass分别计算C-eval每个学科的正确率,最后输出模型在4个学科大类,以及Hard模式和整体的平均得分,测评结果如下
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下
OpenCompass会遍历C-eval的每一个科目,分别生成一个配置信息写入ceval_datasets,其中
- path: 指定了数据集的路径
- name:指定学科名称
- reader_cfg:测评数据读取的相关信息,包括输入的表头列,答案列,训练数据和测试数据分别对应的字符串标签
- infer_cfg:推理配置信息
- eval_cfg:评测的配置信息
推理配置信息infer_cfg包含推理的prompt模板,以gen为例推理配置如下,其中inferencer指定的类型为GenInferencer代表采用gen方式。
评测配置包含评测的指标和后处理,在C-eval这种单选题的形式下评测指标是正确率Accevaluator,如果采用的gen模式需要指定后处理方式,C-eval使用的first_capital_postprocess后处理
跟踪first_capital_postprocess,它的作用是抽取回答内容的第一个大写英文字母作为答案
ppl方式的prompt和后处理和gen有差异,感兴趣的读者可以自行阅读ppl的C-eval数据配置源码。
在OpenCompass快速开始章节中以chatglm2-6为例,其中已经给到了模型推理配置,包括模型和分词模型路径,最大推理长度,推理的batch_size等,在此不再敖述。
测评结果可视化
在OpenCompass快速开始章节中测评结果打印在终端上,同步的OpenCompass会将评测信息写入本地文件,默认在项目的outputs/default下,进入对应的评测版本号,一共有5个文件夹
- configs:记录了每个科目的数据配置信息,包括prompt模板,标签名称等
- logs:程序运行日志,又包括eval日志和infer日志,其中eval日志记录了每个科目的正确率和运行耗时,infer日志记录了推理日志,包括运行进度,报错信息等
- predictions:记录每个科目的模型回答结果,其中包含了模型的最终输入和输出,通过该文件可以追溯每一条问题的回答结果。以一条信息为例
origin_prompt为最终的模型输入,它采用Few-Shot Answer Only方式,将dev数据集中属于该科目的问题+答案作为范例,将其中一条val中的问题拼接在所有范例之后,让大模型回答答案。prediction为模型的回答,gold为标准答案,这条信息表明,大模型在该科目的编号为0的问题上回答为D,并且回答正确。
- results:记录了每个科目的正确率结果
- summary:记录了最终评测结果,以csv表格的形式呈现,结果如下
OpenCompass测评结果可视化
本篇介绍了如何快速上手和理解OpenCompass,对于该项目来说所介绍的内容只是冰山一角,有兴趣的读者可以自行阅读官方文档,全文完毕。
感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。
因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。
阅读AI大模型经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说,阅读经典书籍是非常有必要的。
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。