OpenCompass框架介绍
OpenCompass 是一个开源项目,旨在为机器学习和自然语言处理领域提供多功能、易于使用的工具和框架
生成式大模型的核心评估指标(大模型通用能力的评估指标)⭐⭐⭐
准确率(Accuracy)
- 原理:统计模型输出与标准答案完全匹配的比例(Accuracy=正确预测数/总样本数×100%)
- 适用任务
- 选择题(CEval、MMLU)
- 分类任务(情感分析、主题分析)
- 在OpenCompass中通过metric=accuracy配置
- 对生成式答案需要进行后处理
困惑度(Perplexity,PPL)
- 原理:衡量模型对文本的预测能力
- 适用任务:选择题的概率评估
- 需要使用ppl类型的数据集配置(如ceval_ppl)
生成质量(GEN)
- 原理:通过文本生成结果提取答案,需要结合后处理脚本解析输出
- 使用gen类型的数据集(如ceval_gen),配置metric=gen并指定后处理规则
文本相似度(ROUGE/LCS)
- 原理:统计生成文本与参考答案的重叠率
- 适用任务
- 摘要生成
- 机器翻译评估
- 需要安装rouge==1.0.1依赖,并在数据配置中设置metric=rouge
条件对数概率(CLP)
- 原理:结合上下文计算答案的条件概率
- 适用于复杂度推理任务
- 模型配置中启动use_logprob=True
主流开源数据集⭐⭐⭐
OpenCompass内置超过70个数据集,覆盖五大能力维度:
知识类(Knowledge)
- C-Eval(中文考试题 Chinese Evaluation Benchmark)
- CMMLU(多语言知识问答 Chinese Massive Multi-task Language Understanding)
- MMLU(英文多选题 Massive Multitask Language Understanding)
推理类(Reasoning)
- GSM8K(数学推理 Grade School Math 8K)
- BBH(复杂推理链 BIG-Bench Hard)
语言类(Language)
- CLUE(中文理解 Chinese Language Understanding Evaluation Benchmark)
- AFQMC(语义相似度 Ant Financial Question Matching Corpus)
代码类(Coding)
- HumanEval(代码生成 Human Evaluation of Python Code)
- MBPP(编程问题 Mostly Basic Python Problems)
多模态类(Multimodal)
- MMBench(图像理解 Multi-Modal Benchmark)
- SEED-Bench(多模态问答 SEED Benchmark for Multimodal)
OpenCompass部署⭐⭐⭐
基础安装
# 使用conda准备opencompass运行环境 conda create --name opencompass python=3.10 -y # conda create --name opencompass_lmdeploy python=3.10 -y conda activate opencompass
安装OpenCompass
# pip安装(安装的是打包好的二进制分发包,源码会被编译/打包,通常无法直接查看或修改) # 支持绝大多数数据集及模型 pip install -U opencompass # 完整安装(支持更多数据集) pip install "opencompass[full]" # API 测试(例如 OpenAI、Qwen) pip install "opencompass[api]" # 可编辑安装(源码保持原始文件状态,修改立即生效) git clone https://github.com/open-compass/opencompass opencompass cd opencompass pip install -e . # -e:--editable
数据集准备
用开源数据集评估数据集评估模型的意义 微调之后的模型,对原模型能力的影响不能很明显(微调之后的模型是开放给别人使用的,模型的基本能力不能丧失),验证微调之后的模型的能力是否减弱 # OpenCompass支持三种数据集 Huggingface数据集 ModelScope数据集 自建以及第三方数据集 # OpenCompass提供的第三方数据集 在 OpenCompass 项目根目录下运行下面命令,将数据集准备至 ${OpenCompass}/data 目录下(直接解压会自行创建data目录) wget https://github.com/open-compass/opencompass/releases/download/0.2.2.rc1/OpenCompassData-core-20240207.zip unzip OpenCompassData-core-20240207.zip
配置评估任务
- 列出所有配置:python tools/list_configs.py
- 列出与llama和Qwen相关的所有配置:python tools/list_config.py llama Qwen
命令行(自定义HF模型):一次只能评估一个模型
python run.py \ --datasets demo_gsm8k_chat_gen demo_math_chat_gen \ # --datasets:评估数据集(python tools/list_configs.py 命令进行查看) --hf-type chat \ # --hf-type:HuggingFace模型类型(可选值为chat、base) --hf-path 本地模型的绝对路径/模型名(则会访问huggingface进行访问) \ # --hf-path:HuggingFace模型路径 --debug
命令行⭐⭐⭐⭐⭐
# 用户可以通过--models 和--datasets结合向测试的模型和数据集 python run.py \ --models hf_internlm2_chat_1_8b hf_qwen2_1_5b_instruct \ --datasets demo_gsm8k_chat_gen demo_math_chat_gen \ --debug # 如果使用的是本地的模型,需要配置模型配置文件的路径(该配置文件路径:/opencompass/opencompass/configs/model) from opencompass.models import HuggingFacewithChatTemplate models = [ dict( type=HuggingFacewithChatTemplate, # 使用带聊天模板的HF模型类 abbr='qwen1.5-0.5b-chat-hf', # 模型缩写(用于报告标识) # path='Qwen/Qwen1.5-0.5B-Chat', # 远程HF Hub路径(注释状态) path='/root/autodl-tmp/model/Qwen/Qwen1.5-0.5B-Chat', # 本地模型路径 max_out_len=1024, # 生成文本的最大长度 batch_size=8, # 推理批次大小 run_cfg=dict(num_gpus=1), # 运行时配置(使用1块GPU) stop_words=['</im_end>', '</im_start>'], # 停止词(Qwen聊天模板的特殊标记) ) ]
配置文件
from mmengine.config import read_base with read_base(): from .datasets.demo.demo_gsm8k_chat_gen import gsm8k_datasets from .datasets.demo.demo_math_chat_gen import math_datasets from .models.qwen.hf_qwen2_1_5b_instruct import models as hf_qwen2_1_5b_instruct_models from .models.hf_internlm.hf_internlm2_chat_1_8b import models as hf_internlm2_chat_1_8b_models datasets = gsm8k_datasets + math_datasets models = hf_qwen2_1_5b_instruct_models + hf_internlm2_chat_1_8b_models # 直接用python运行该配置文件 python run.py configs/eval_chat_demo.py --debug
使用推理框架加速评测⭐⭐⭐
LMDeploy加速测评(VLLM同理)
环境配置:已配置好的OpenCompass环境中安装lmdeploy(pip install lmdeploy)
# /opencompass/opencompass/configs/model/找到对应的以lmdeploy开头的模型 from opencompass.models import TurboMindModelwithChatTemplate models = [ dict( type=TurboMindModelwithChatTemplate, abbr='qwen-1.8b-chat-turbomind', # 模型缩写标识 # path='/home/cw/lims/Quen/Quen1.5-0.58-chat', # TurboMind格式模型路径 # path='/root/autodl-tmp/model/Qwen/Qwen1.5-0.5B-Chat' engine_config=dict( session_len=7168, # 支持的最大上下文长度 max_batch_size=16, # 动态批处理的最大批次 tp=1 # 张量并行度(需与GPU数量匹配) ), gen_config=dict( top_k=1, # 仅保留概率最高的token temperature=1e-6, # 抑制随机性的温度值(修正了 le-6 -> 1e-6) top_p=0.9, # 核采样阈值 max_new_tokens=1024 # 最大生成长度 ), max_seq_len=7168, # 输入+输出的最大总长度 max_out_len=1024, # 最大输出长度 batch_size=16, # 批次大小 run_cfg=dict(num_gpus=1),# 使用的GPU数量 stop_words=['<|im_end|>', '<|im_start|>'] # 终止标记(修正了中文引号) ) ] python run.py \ --models lmdeploy_qwen_1_8b_chat \ --datasets demo_gsm8k_chat_gen demo_math_chat_gen \ --debug
可视化评估结果
评估完成后,评估结果表格将打印如下:
dataset version metric mode qwen2-1.5b-instruct-hf internlm2-chat-1.8b-hf
---------- --------- -------- ------ ------------------------ ------------------------
demo_gsm8k 1d7fe4 accuracy gen 56.25 32.81
demo_math 393424 accuracy gen 18.75 14.06
所有运行输出将定向到 outputs/demo/
目录
outputs/default/
├── 20200220_120000
├── 20230220_183030 # 每个实验一个文件夹
│ ├── configs # 用于记录的已转储的配置文件。如果在同一个实验文件夹中重新运行了不同的实验,可能会保留多个配置
│ ├── logs # 推理和评估阶段的日志文件
│ │ ├── eval
│ │ └── infer
│ ├── predictions # 每个任务的推理结果
│ ├── results # 每个任务的评估结果
│ └── summary # 单个实验的汇总评估结果
├── ...
自定义数据集⭐⭐⭐
- 评估时每条输入独立处理,不涉及多轮对话的上下文关联性测试
- 评估关注模型的核心能力(如信息整合、逻辑推理、知识准确性),而非回答形式(如是否包含固定模板中的问候语、段落结构等)
- 对话模板影响的是模型的对话方式
数据集格式
选择题(mcq)
对于选择 (mcq
) 类型的数据,默认的字段如下:
-
question
: 表示选择题的题干 -
A
,B
,C
, …: 使用单个大写字母表示选项,个数不限定。默认只会从A
开始,解析连续的字母作为选项 -
answer
: 表示选择题的正确答案,其值必须是上述所选用的选项之一,如A
,B
,C
等
对于非默认字段,我们都会进行读入,但默认不会使用。如需使用,则需要在 .meta.json
文件中进行指定
.jsonl
格式样例如下:
{"question": "165+833+650+615=", "A": "2258", "B": "2263", "C": "2281", "answer": "B"} {"question": "368+959+918+653+978=", "A": "3876", "B": "3878", "C": "3880", "answer": "A"} {"question": "776+208+589+882+571+996+515+726=", "A": "5213", "B": "5263", "C": "5383", "answer": "B"} {"question": "803+862+815+100+409+758+262+169=", "A": "4098", "B": "4128", "C": "4178", "answer": "C"}
.csv
格式样例如下:
question,A,B,C,answer 127+545+588+620+556+199=,2632,2635,2645,B 735+603+102+335+605=,2376,2380,2410,B 506+346+920+451+910+142+659+850=,4766,4774,4784,C 504+811+870+445=,2615,2630,2750,B
问答题(qa)
对于问答 (qa
) 类型的数据,默认的字段如下:
-
question
: 表示问答题的题干 -
answer
: 表示问答题的正确答案。可缺失,表示该数据集无正确答案
对于非默认字段,我们都会进行读入,但默认不会使用。如需使用,则需要在 .meta.json
文件中进行指定
.jsonl
格式样例如下:
{"question": "752+361+181+933+235+986=", "answer": "3448"} {"question": "712+165+223+711=", "answer": "1811"} {"question": "921+975+888+539=", "answer": "3323"} {"question": "752+321+388+643+568+982+468+397=", "answer": "4519"}
.csv
格式样例如下:
question,answer
123+147+874+850+915+163+291+604=,3967
149+646+241+898+822+386=,3142
332+424+582+962+735+798+653+214=,4700
649+215+412+495+220+738+989+452=,4170
命令行列表
自定义数据集可直接通过命令行来调用开始评测
python run.py \ --models hf_llama2_7b \ --custom-dataset-path xxx/test_mcq.csv \ --custom-dataset-data-type mcq \ --custom-dataset-infer-method ppl python run.py \ --models hf_llama2_7b \ --custom-dataset-path xxx/test_qa.jsonl \ --custom-dataset-data-type qa \ --custom-dataset-infer-method gen
在绝大多数情况下, --custom-dataset-data-type 和 --custom-dataset-infer-method 可以省略,OpenCompass 会根据以下逻辑进行设置:
- 如果从数据集文件中可以解析出选项,如 A , B , C 等,则认定该数据集为 mcq ,否则认定为qa
- 默认 infer_method 为 gen