yuanxiaojiang
人的放纵是本能,自律才是修行

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: 表示选择题的题干

  • ABC, …: 使用单个大写字母表示选项,个数不限定。默认只会从 A 开始,解析连续的字母作为选项

  • answer: 表示选择题的正确答案,其值必须是上述所选用的选项之一,如 ABC 等

对于非默认字段,我们都会进行读入,但默认不会使用。如需使用,则需要在 .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 
posted on 2025-04-13 20:56  猿小姜  阅读(728)  评论(0)    收藏  举报

levels of contents