一、OpenCompass:
上海人工智能实验室科学家团队正式发布了大模型开源开放评测体系 “司南” (OpenCompass2.0),用于为大语言模型、多模态模型等提供一站式评测服务。其主要特点如下:
- 开源可复现:提供公平、公开、可复现的大模型评测方案
- 全面的能力维度:五大维度设计,提供 70+ 个数据集约 40 万题的的模型评测方案,全面评估模型能力
- 丰富的模型支持:已支持 20+ HuggingFace 及 API 模型
- 分布式高效评测:一行命令实现任务分割和分布式评测,数小时即可完成千亿模型全量评测
- 多样化评测范式:支持零样本、小样本及思维链评测,结合标准型或对话型提示词模板,轻松激发各种模型最大性能
- 灵活化拓展:想增加新模型或数据集?想要自定义更高级的任务分割策略,甚至接入新的集群管理系统?OpenCompass 的一切均可轻松扩展!
1.1、客观评测:
针对具有标准答案的客观问题,我们可以我们可以通过使用定量指标比较模型的输出与标准答案的差异,并根据结果衡量模型的性能。同时,由于大语言模型输出自由度较高,在评测阶段,我们需要对其输入和输出作一定的规范和设计,尽可能减少噪声输出在评测阶段的影响,才能对模型的能力有更加完整和客观的评价。 为了更好地激发出模型在题目测试领域的能力,并引导模型按照一定的模板输出答案,OpenCompass采用提示词工程 (prompt engineering)和语境学习(in-context learning)进行客观评测。 在客观评测的具体实践中,我们通常采用下列两种方式进行模型输出结果的评测:
- 判别式评测:该评测方式基于将问题与候选答案组合在一起,计算模型在所有组合上的困惑度(perplexity),并选择困惑度最小的答案作为模型的最终输出。例如,若模型在 问题? 答案1 上的困惑度为 0.1,在 问题? 答案2 上的困惑度为 0.2,最终我们会选择 答案1 作为模型的输出。
- 生成式评测:该评测方式主要用于生成类任务,如语言翻译、程序生成、逻辑分析题等。具体实践时,使用问题作为模型的原始输入,并留白答案区域待模型进行后续补全。我们通常还需要对其输出进行后处理,以保证输出满足数据集的要求。
1.2、主观评测:
语言表达生动精彩,变化丰富,大量的场景和能力无法凭借客观指标进行评测。针对如模型安全和模型语言能力的评测,以人的主观感受为主的评测更能体现模型的真实能力,并更符合大模型的实际使用场景。 OpenCompass采取的主观评测方案是指借助受试者的主观判断对具有对话能力的大语言模型进行能力评测。在具体实践中,我们提前基于模型的能力维度构建主观测试问题集合,并将不同模型对于同一问题的不同回复展现给受试者,收集受试者基于主观感受的评分。由于主观测试成本高昂,本方案同时也采用使用性能优异的大语言模拟人类进行主观打分。在实际评测中,本文将采用真实人类专家的主观评测与基于模型打分的主观评测相结合的方式开展模型能力评估。 在具体开展主观评测时,OpenComapss采用单模型回复满意度统计和多模型满意度比较两种方式开展具体的评测工作。
二、动手实践:
2.1、环境准备:
首先需要创建一个python的虚拟环境,并激活它:
# 这里学习机里已经完成了虚拟环境的创建,我就直接激活了:
conda activate opencompass
再拉取OpenCompass源码。并下载需要的依赖包:
git clone -b 0.2.4 https://github.com/open-compass/opencompass
cd opencompass
pip install -r requirements.txt
# 也不知道为什么,这个protobuf包需要单独安装
pip install protobuf
2.2、数据集准备:
将OpenCompass准备好的数据复制到我们实践运行的opencompass文件件中:
# 复制到当前文件夹下
cp /share/temp/datasets/OpenCompassData-core-20231110.zip /root/opencompass/
#解压文件
unzip OpenCompassData-core-20231110.zip
这里特此说明一下:复制数据集压缩包的命令不能用软连接代替,软连接(symbolic link)是一种指向另一个文件的引用。它本身并不包含任何数据,只是存储了被引用的文件的路径。因此,如果使用软连接来复制文件,则原始文件仍然存在,并且两个文件将共享相同的存储空间。对于压缩包之类的大型文件,并不稳定,反正我试了几次都没能成功,当然如果又大佬成功了,期待打脸(手动狗头)
2.3实际评测:
列出所有跟 internlm 及 ceval 相关的配置
python tools/list_configs.py internlm ceval
在运行之前,为了避免一些冲突,可以通过设置下面两个变量来控制:
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
这两条命令都用于配置 Intel Math Kernel Library (MKL) 的行为。MKL 是一个用于加速数学运算的库,通常用于科学计算和机器学习应用程序。
1. export MKL_SERVICE_FORCE_INTEL=1
此命令强制 MKL 使用 Intel 线程化层 (Threading Layer)。线程化层是负责管理线程的软件组件。MKL 支持两种线程化层:Intel 线程化层和 GNU 线程化层。
默认情况下,MKL 会自动选择最适合当前系统的线程化层。但是,如果您遇到性能问题或兼容性问题,则可能需要强制 MKL 使用特定的线程化层。
设置 MKL_SERVICE_FORCE_INTEL=1
将强制 MKL 使用 Intel 线程化层。这可能对使用 Intel 处理器的系统有益,因为它可以提高性能。但是,在某些情况下,它可能会导致性能下降或兼容性问题。
2. export MKL_THREADING_LAYER=GNU
此命令将 MKL 的线程化层设置为 GNU 线程化层。GNU 线程化层是 GNU C 运行时库 (glibc) 的一部分。
设置 MKL_THREADING_LAYER=GNU
将强制 MKL 使用 GNU 线程化层,即使系统上安装了 Intel 线程化层也是如此。这可能对使用非 Intel 处理器的系统有益,或者如果您遇到与 Intel 线程化层相关的性能问题或兼容性问题时有益。
任选一个命令执行,下面就可以正式开启评测了:
输入下面命令开启评测:
python run.py --datasets ceval_gen --hf-path /share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b --tokenizer-path /share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b --tokenizer-kwargs padding_side='left' truncation='left' trust_remote_code=True --model-kwargs trust_remote_code=True device_map='auto' --max-seq-len 1024 --max-out-len 16 --batch-size 2 --num-gpus 1 --debug
参数解析:
--datasets ceval_gen \ #使用的测试数据集
--hf-path /share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b \ # HuggingFace 模型路径
--tokenizer-path /share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b \ # HuggingFace tokenizer 路径(如果与模型路径相同,可以省略)
--tokenizer-kwargs padding_side='left' truncation='left' trust_remote_code=True \ # 构建 tokenizer 的参数
--model-kwargs device_map='auto' trust_remote_code=True \ # 构建模型的参数
--max-seq-len 1024 \ # 模型可以接受的最大序列长度
--max-out-len 16 \ # 生成的最大 token 数 --batch-size 2 \ # 批量大小
--num-gpus 1 # 运行模型所需的 GPU 数量
运行完成之后就可以看到1.8B模型的测试结果了:
当然,也可以在 /root/opencompass/outputs/default/20240421_201640/summary目录下查看Excel版的结果:
三、其他:
在OpenCompass官网上传数据集:
教程很详细,这里唯一需要大家注意的是:.md文件中不要使用大括号,不要使用,不要使用!!!