这里是 【C-Eval 大语言模型评测基准- 用 LM Evaluation Harness + vLLM 跑起来】 的笔记哈。
C-Eval 的基本介绍
- C-Eval 是一个「知识评估基准」,参考国外的评测基准 MMLU 而来,发布于 2023 年 5 月 22 日
- 和 MMLU 一样,C-Eval 都是客观题评测,所有都是单项选择题,每个题目 ABCD 四个选项,有唯一答案
- C-Eval 涵盖了 52 个不同学科,一共 13948 个题目,难度级别覆盖初中、高中、大学和职业考试
- 52 个学科,每个学科拆分为三个数据集:dev、validation 和 test。每个科目的 dev 集包含五个示范实例以及为 chain of thought 格式提供的解释;validation 数据集主要是用于超参数评估,它给了问题的答案;而 test 集则用于模型评估。test 集上的答案不公开,需要用户提交其结果到官方网站才能获取测试结果。
题目来源
- 题目格式大多是 pdf 和 word,并做了大量的手工处理工作(ocr 之类的 未必准确,尤其很多带有复杂公式的题目)。
- C-Eval 的所有题目都是模拟题,不是真实的考试题目,这也是考虑真题可能更加容易被大语言模型训练集所包含。
测评方式
- 官方 github 里提到(当然也是论文里的内容),固定了两种提交模板,一种是 answer-only 一种是 chain-of-thought,并支持 zero-shot 和 five-shots 两种模式。
- 不过这次使用的 lm evaluation harness 只支持了 answer-only 模式,并且是 zero-shot。
Answer only
以下是中国关于{科目}考试的单项选择题,请选出其中的正确答案。
{题目1}
A. {选项A}
B. {选项B}
C. {选项C}
D. {选项D}
答案:A
[k-shot demo, note that k is 0 in the zero-shot case]
{测试题目}
A. {选项A}
B. {选项B}
C. {选项C}
D. {选项D}
答案:
CoT
以下是中国关于{科目}考试的单项选择题,请选出其中的正确答案。
{题目1}
A. {选项A}
B. {选项B}
C. {选项C}
D. {选项D}
答案:让我们一步一步思考,
1. {解析过程步骤1}
2. {解析过程步骤2}
3. {解析过程步骤3}
所以答案是A。
[k-shot demo, note that k is 0 in the zero-shot case]
{测试题目}
A. {选项A}
B. {选项B}
C. {选项C}
D. {选项D}
答案:让我们一步一步思考,
1.
测评流程
下面我将介绍如何使用 lm evaluation harness 跑 C-Eval 的基准测试。有关 vllm 的安装、模型的准备这里就不再赘述了,可以参考之前的文章 只需 24G 显存,用 vllm 跑起来 Yi-34B 中英双语大模型 。
install lm evaluation harness
安装 lm evaluation harness
git clone https://github.com/EleutherAI/lm-evaluation-harness
cd lm-evaluation-harness
pip install -e .
查看支持的所有的任务
lm-eval --tasks list
下载数据
lm evaluation harness 会自动从 huggingface 下载数据,但考虑到国内的网络环境,可以先手动下载数据
pip install huggingface_hub
huggingface-cli download ceval/ceval-exam --repo-type dataset
跑测试
然后我们执行以下命令用 vllm 的方式去加载模型并执行相应的测评
model_args
就是 vllm 执行所需要的参数,原来 vllm 需要什么参数这里就要填写什么参数tasks
使用ceval-valid
数据集batch_size
如果使用的是 24G 显存的话,设置为 1,如果是更大的显存,可以设置为 autooutput_path
就是输出结果的路径log_samples
就把执行的过程都记录下来,包括全部的提示词和答案
24G 显存
lm_eval --model vllm \
--model_args pretrained=/root/autodl-tmp/01ai/Yi-34B-Chat-4bits,dtype=float16,max_model_len=2048,quantization=awq \
--tasks ceval-valid \
--batch_size 1 \
--output_path c-eval-result \
--log_samples
更大显存
lm_eval --model vllm \
--model_args pretrained=/root/autodl-tmp/01ai/Yi-34B-Chat-4bits,dtype=float16,max_model_len=2048,quantization=awq \
--tasks ceval-valid \
--batch_size auto \
--output_path c-eval-result \
--log_samples
注意 C-Eval 的评测考虑上下文比较小的场景,2048 的上下文对于 answer only 是够用的,但是对于 chain of thought 的情况就比较难说了,论文里有做更多解释,这里我们先不展开了。
这里评测是是 valid 数据集 1300 多道题目,我这里 A40 大概跑了 20 分钟的样子,作为一个参考。
结果
Yi-34B-Chat-Int4 在 C-Eval 的 valid 数据集获得了一个 78% 的准确率。