OpenCompass大模型评测实战笔记
介绍
如何通过能力评测促进模型发展
- 面向未来拓展能力维度
评测体系需增加新能力维度,如数学、复杂推理、逻辑推理、代码和智能体等,以全面评估模型性能。 - 扎根通用能力 聚焦垂直行业
在医疗、金融、法律等专业领域,评测需结合行业知识和规范,以评估模型的行业适用性。 - 高质量中文基准
针对中文场景,需要开发能准确评估其能力的中文评测基准,促进中文社区的大模型发展。 - 性能评测反哺能力迭代
通过深入分析评测性能,探索模型能力形成机制,发现模型不足,研究针对性提升策略。
大语言模型评测中的挑战
- 全面性
- 大模型应用场景千变万化
- 模型能力演进迅速
- 如何设计和构造可扩展的能力维度体系
- 评测成本
- 评测数十万道题需要大量算力资源
- 基于人工打分的主观评测成本高昂
- 数据污染
- 海量语料不可避免带来评测集污染
- 亟需可靠的数据污染检测技术
- 如何设计可动态更新的高质量评测基准
- 鲁棒性
- 大模型对提示词十分敏感
- 多次采样情况下模型性能不稳定
如何评测大模型
- 模型类型
- 基座模型
- 海量数据无监督训练(Base)
- 对话模型
- 指令数据有监督微调(SFT)
- 人类偏好对齐(RLHF)
- 公开权重的开源模型
- 使用GPU/推理加速卡进行本地推理
- API模型
- 发送网络请求获取回复
- 基座模型
- 客观评测与主观评测
- 客观问答题
- 客观选择题
- 开放式主观问答
- 提示词工程
- 明确性
- 概念无歧义
- 逐步引导
- 具体描述
- 迭代反馈
- 小样本学习
- 思维链技术
- 长文本评测
实战
- 背景知识
- bash脚本
Bash脚本是一种文本文件,其中包含了一系列用于在Unix/Linux系统上执行的命令。这些命令按照特定的顺序和逻辑组织,以实现特定的任务或自动化操作。Bash是一种Unix shell和命令语言,是许多Linux系统默认的shell。因此,Bash脚本是使用Bash语言编写的脚本文件,通常具有.sh
扩展名。
Bash脚本可以包含各种类型的命令,例如文件操作、条件判断、循环、函数定义等。它们通常用于执行系统管理任务、自动化工作流程、批量处理文件等操作。编写Bash脚本可以帮助用户节省时间和精力,提高工作效率。 - tokenizer
Tokenizer 是一个广泛用于自然语言处理 (NLP) 中的术语,它指的是将文本数据分割成更小单元的工具或模块。这些更小的单元可以是单词、子词、字符或其他更小的文本单位,取决于任务的需要。
在NLP中,tokenizer 的作用包括:
分词:将文本分割成单词或子词的序列。
标记化:将文本转换为标记或标识符的序列。
子词分割:将单词分割成子词的序列,用于处理词汇丰富的语言或处理未登录词。
字符级分割:将文本分割成字符的序列,有时用于处理字符级别的任务。
Tokenizer 在各种NLP任务中都是至关重要的,包括文本分类、情感分析、机器翻译、命名实体识别等。常见的tokenizer 包括空格分词器、NLTK、Spacy、Hugging Face Transformers等库中的tokenizer。 - batch-size
batch-size
是指在机器学习和深度学习中用于训练或推理的批量数据的大小。在训练神经网络时,通常会将数据划分成多个批次,并在每个批次上进行前向传播和反向传播,以更新模型的权重。批量大小决定了每个批次中包含的样本数量。
调整批量大小可以影响训练过程中的性能和效率。较大的批量大小通常可以提高训练速度,因为可以利用更大的计算资源并减少传输和计算的开销。但是,过大的批量大小可能会导致内存不足或训练过程不稳定。相反,较小的批量大小可能会减慢训练速度,但有助于模型更好地收敛,并且通常具有更好的泛化性能。
- bash脚本
使用 OpenCompass 评测 internlm2-chat-1_8b 模型在 C-Eval 数据集上的性能:
-
export MKL_SERVICE_FORCE_INTEL=1
设置环境变量,避免在开发机运行过程中报错。 -
启动评测方式
- 纯命令行
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
其中,
run.py
:指定运行的主函数
--datasets ceval_gen
:指定数据集,其中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的路径
--tokenizer-kwargs padding_side='left' truncation='left' trust_remote_code=True
:指定tokenizer的参数,其中tokenizer-kwargs
是指用于传递给分词器(tokenizer)的参数的关键字参数。在使用分词器时,有时候需要传递一些额外的参数以定制分词的行为。这些额外的参数通常以字典的形式传递给分词器的tokenizer-kwargs
参数。
--model-kwargs trust_remote_code=True device_map='auto'
:指定model的参数
--max-seq-len 1024
:指定读入token的最大长度(长文本一般2048即可)
--max-out-len 16
:指定模型回复/输出的token的最大长度(客观评测可以较小,提高运行速度;如果是主观评测,需要一问一答,则参数可较大,如512、1024等)
--batch-size 2
:指定推理时 batch size 的大小
--num-gpus 1
:指定可以用的 GPU 的个数
--work-dir xxxx/xxx
:指定OpenCompass在相关路径下执行操作,保存所有的结果、中间的日志等(若不布置,则默认为outputs/default
)
--reuse latest
:接着最新的时间戳继续跑
--debug
:指定进入 debug 模式,所有的bug信息会在terminal中显示(若不开,则默认存在工作路径的 logs 文件夹下)
相关文件夹:
configs 文件夹:对所有运行的config做总结
logs 文件夹:保存每次运行时相关的日志
prediction 文件夹:运行数据集的模型的预测结果
results 文件夹:保存运行结果
summary 文件夹:对results中运行结果做总结,如具体得多少分,怎么得分等等- 命令行+
configs
python run.py configs/eval_demo.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
部分存到configs/eval_demo.py
中 -
评测的逻辑
关注opencompass/opencompass文件夹,其中
partitioners文件夹对任务进行分片,以最大化利用资源,提高效率,
tasks文件夹指定每一片如何执行,
runners指定具体如何执行,
openicl文件夹给出执行时候的逻辑,
summarizers文件夹是所有任务执行完后进行总结。