【自然语言处理与大模型】用OpenCompass评估自己微调的模型

发布于:2025-05-01 ⋅ 阅读:(24) ⋅ 点赞:(0)

        当你自己微调训练好一个模型之后,直接拿来部署开用!显然不太稳妥,正确的做法应该是先测试模型的能力,那么如何评估到底调的好不好呢?这是一个很必要的操作,这篇文章就给大家介绍一个大模型评估框架OpenCompass。OpenCompass 是一个开源的大模型评测平台,由上海人工智能实验室推出。

        OpenCompass的评估支持超过70个数据集,覆盖五大能力维度:知识类、推理类、语言类、代码类和多模态类。在 OpenCompass 中评估一个模型通常包括以下几个阶段:配置推理 ,评估可视化。那么后面我们按照这四个阶段展开介绍。

〇、快速安装

        经过我的测试,我推荐使用源码可编译安装的方式,这种方法可以安装最新的版本的同时解决包依赖报错,下面给出快速安装命令:

# 第一步:创建一个单独的opencompass环境
conda create -n opencompass python=3.10 -y
conda activate opencompass

# 第二步:下载源码仓库
git clone https://github.com/open-compass/opencompass opencompass
cd opencompass
pip install -e .
快速安装过程演示

一、配置模型和数据集

        配置是整个工作流程的起点。在此阶段,您需要配置整个评估过程,包括选择待评估的模型和数据集。主要有两种方式:命令行和配置文件。此外,还可以指定评估策略、计算后端,并确定结果展示的方式。这一初始化步骤为后续的分析与优化奠定了基础。

(1)数据集的分类

        OpenCompass将评估所用的数据集分为两类分别用于生成式评估和困惑度评估。

  • 生成式评估数据集(用_gen后缀): 这类数据集主要用于评估模型生成文本的质量。它们通常包含一系列的问题或提示,以及对应的参考答案或期望输出。通过这些数据集,可以测试模型生成连贯、相关且准确内容的能力。生成式评估数据集适用于需要模型创造新内容的任务,如摘要生成、故事创作等。评估时,会考量生成文本与给定上下文的一致性、逻辑性和语法正确性等方面。

  • 困惑度评估数据集(用_ppl后缀): 困惑度(Perplexity, PPL)是衡量语言模型预测下一个词的能力的一个指标,常用于评估模型的语言建模能力。困惑度越低,表示模型对文本的预测越准确,即模型对给定文本的理解越好。这类数据集通常包含大量的连续文本段落,用于计算模型在整个文档上的平均困惑度。它对于理解模型在处理自然语言时的表现特别有用,尤其是在语言流畅性和词汇选择方面。

查看OpenCompass支持的模型和数据集

        上图中的路径下列出所有OpenCompass支持的数据集。如果你想在你自己构建的数据集上进行评估,OpenCompass还支持自定义数据集,允许用户根据特定应用场景的需求创建和注册新的数据集,详细参考官方文档链接:OpenCompass 自定义数据集

(2)使用命令行直接配置

一次评估一个模型(最常用):对于 HuggingFace 模型,用户可以通过命令行直接设置模型参数,无需额外的配置文件,命令如下。

python run.py \
    --datasets demo_gsm8k_chat_gen demo_math_chat_gen \
    --hf-type chat \
    --hf-path 模型绝对路径
    --debug

参数解释表格如下,重要的标红:

命令行参数

描述

样例数值

--datasets 指定评估数据集 demo_math_chat_gen
--custom-datasets-path 指定自定义数据集的绝对路径 xxx/test_mcp.jsonl 或者 xxx/test_mcp.csv

--hf-type

HuggingFace 模型类型,一般不选框架会自动判断,可选值为 chat 或 base

chat

--hf-path

HuggingFace 模型路径

internlm/internlm2-chat-1_8b

--model-kwargs

构建模型的参数

device_map=’auto’

--tokenizer-path

HuggingFace tokenizer 路径(如果与模型路径相同,可以省略)

internlm/internlm2-chat-1_8b

--tokenizer-kwargs

构建 tokenizer 的参数

padding_side=’left’ truncation=’left’ trust_remote_code=True

--generation-kwargs

生成的参数

do_sample=True top_k=50 top_p=0.95

--max-seq-len

模型可以接受的最大序列长度

2048

--max-out-len

生成的最大 token 数

100

--min-out-len

生成的最小 token 数

1

--batch-size

批量大小

64

--hf-num-gpus

运行一个模型实例所需的 GPU 数量

1

--stop-words

停用词列表

‘<|im_end|>’ ‘<|im_start|>’

--pad-token-id

填充 token 的 ID

0

--peft-path

(例如) LoRA 模型的路径

internlm/internlm2-chat-1_8b

--peft-kwargs

(例如) 构建 LoRA 模型的参数

trust_remote_code=True

--models 指定多个模型的缩写,这个缩写和配置文件是一一对应的,对应关系可以tools/list_configs.py 列出映射表 hf_internlm2_chat_1_8b hf_qwen2_1_5b_instruct

(3)写配置文件进行配置

一次评估多个模型:通过--models参数来指定使用配置文件来评估,并且可以一次指定多个模型来进行评估,命令如下。

python run.py \
    --models hf_internlm2_chat_1_8b hf_qwen2_1_5b_instruct \
    --datasets demo_gsm8k_chat_gen demo_math_chat_gen \
    --debug

【注】--models 参数后面接的是大模型的配置文件名

        所以首先我们要去找到对应模型所在的配置文件,上面的图“查看OpenCompass支持的模型和数据集”中已经说明了模型配置文件的路径。

        找到配置文件后,就可以进行比较丰富的配置了,但最终要的还是修改模型的路径,改成我们自己本地的模型路径。

二、推理和评估

(1)直接命令行评估

python run.py \
    --datasets demo_gsm8k_chat_gen demo_math_chat_gen \
    --hf-type chat \
    --hf-path 模型绝对路径
    --debug

 一开始如果没有评估数据集,它会自己去下载,下图中INFO里面可以看到它加载了哪些数据和模型。 你跑几次就会发现,评估的时间还挺长的。待会儿介绍使用推理框架来加速评估。

开始评估的过程演示

【注】如果你报这个错 ModuleNotFoundError: No module named 'sentencepiece'  完全不慌,直接pip install sentencepiece 即可解决。

评估结果展示

从评估结果的得分来看,我选的这个书生蒲语的模型在数学推理上面能力不太行,满分是100分。 

(2)使用配置文件评估

python run.py \
    --models hf_internlm2_chat_1_8b \
    --datasets demo_gsm8k_chat_gen demo_math_chat_gen \
    --debug

最后会得到下面这样一个可视化评估结果表格: 

dataset version metric mode internlm2-chat-1.8b-hf
demo_gsm8k 1d7fe4 accuracy gen 31.25
demo_math 393424 accuracy gen 14.06

可以能看到评估结果中有个“metric”评估指标列,我整理列出了OpenCompass 框架的所有评估指标,帮助理解各指标的具体含义和它们所评估的方面。

序号 评估指标 描述
1 准确率(Accuracy) 衡量模型输出与标准答案匹配的程度。
2 困惑度(PPL) 评估模型对文本的预测能力,值越低表示模型对文本的预测越准确。
3 生成质量(GEN) 通过生成文本提取答案,并结合后处理脚本解析输出的质量。
4 文本相似度(ROUGE/LCS) 统计生成文本与参考答案之间的重叠率,用于评估生成文本的质量。不同的ROUGE指标衡量不同类型的重叠。
5 条件对数概率(CLP) 结合上下文计算答案的条件概率,适用于复杂推理任务,有助于评估模型在理解上下文方面的能力。

(3)使用推理框架来加速评估

        如果你觉得评估的也太慢了,OpenCompass框架支持vLLM和LMDeploy来加速评估过程。使用方法也很简单,就是将hf配置文件,换成用vllm或lmdeploy的配置文件来推理评估就行,官方指南有点过时了,建议直接看本文,但我还是给出链接供大家对比:使用 VLLM 或 LMDEPLOY 来一键式加速评测推理

① 用lmdeploy加速评估

# 在我们创建的opencompass虚拟环境下安装lmdeploy
pip install lmdeploy==0.7.1

找到llmdeploy的评估配置文件。

然后修改对应配置,主要修改path路径和batch_size

最后只需执行命令即可:

python run.py \
    --models lmdeploy_internlm2_chat_1_8b \
    --datasets demo_math_chat_gen \
    --debug

使用加速后,我用示例中的数据集和模型,这次评估只花了32秒。速度可以说是提升相当明显!

② 用vllm加速评估

        先说结论,vllm加速评估还没能测试成功。但步骤如下,大家可以尝试一下看能否成功。 建议是单独创建一个vllm的conda虚拟环境,然后在这个虚拟环境下,重新安装一次opencompass,再进行评估。

第一步:找到你想评估的模型的vllm加速评估的配置文件路径

第二步:修改这个配置文件 

 第三步:执行命令就可以用vllm来推理加速评估了

python run.py \
    --models vllm_internlm2_chat_1_8b \
    --datasets demo_cmmlu_chat_gen \
    --debug

【注】models后面跟的是模型缩写,一般是模型配置文件不要.py后缀。且可以指定多个模型的缩写,这个缩写和配置文件是一一对应的,对应关系可以通过 list_configs.py 列出映射表。

# 列出你想查询的模型或者数据集对应的配置文件所在路径
python tools/list_configs.py 模型名字
python tools/list_configs.py 数据集名字
列出qwen2.5的所有配置文件

(时间4月27日)按照这个方法目前vllm会报错,目前还不知道怎么解决。

ERROR 04-27 04:32:37 [core.py:387] EngineCore hit an exception: Traceback (most recent call last): ERROR 04-27 04:32:37 [core.py:387] File "/root/miniconda3/envs/vllm/lib/python3.10/site-packages/vllm/v1/engine/core.py", line 378, in run_engine_core ERROR 04-27 04:32:37 [core.py:387] engine_core = EngineCoreProc(*args, **kwargs) ERROR 04-27 04:32:37 [core.py:387] File "/root/miniconda3/envs/vllm/lib/python3.10/site-packages/vllm/v1/engine/core.py", line 320, in __init__ ERROR 04-27 04:32:37 [core.py:387] super().__init__(vllm_config, executor_class, log_stats) ERROR 04-27 04:32:37 [core.py:387] File "/root/miniconda3/envs/vllm/lib/python3.10/site-packages/vllm/v1/engine/core.py", line 67, in __init__ ERROR 04-27 04:32:37 [core.py:387] self.model_executor = executor_class(vllm_config) ERROR 04-27 04:32:37 [core.py:387] File "/root/miniconda3/envs/vllm/lib/python3.10/site-packages/vllm/executor/executor_base.py", line 52, in __init__ ERROR 04-27 04:32:37 [core.py:387] self._init_executor() ERROR 04-27 04:32:37 [core.py:387] File "/root/miniconda3/envs/vllm/lib/python3.10/site-packages/vllm/executor/uniproc_executor.py", line 46, in _init_executor ERROR 04-27 04:32:37 [core.py:387] self.collective_rpc("init_device") ERROR 04-27 04:32:37 [core.py:387] File "/root/miniconda3/envs/vllm/lib/python3.10/site-packages/vllm/executor/uniproc_executor.py", line 56, in collective_rpc ERROR 04-27 04:32:37 [core.py:387] answer = run_method(self.driver_worker, method, args, kwargs) ERROR 04-27 04:32:37 [core.py:387] File "/root/miniconda3/envs/vllm/lib/python3.10/site-packages/vllm/utils.py", line 2378, in run_method ERROR 04-27 04:32:37 [core.py:387] return func(*args, **kwargs) ERROR 04-27 04:32:37 [core.py:387] File "/root/miniconda3/envs/vllm/lib/python3.10/site-packages/vllm/worker/worker_base.py", line 604, in init_device ERROR 04-27 04:32:37 [core.py:387] self.worker.init_device() # type: ignore ERROR 04-27 04:32:37 [core.py:387] File "/root/miniconda3/envs/vllm/lib/python3.10/site-packages/vllm/v1/worker/gpu_worker.py", line 103, in init_device ERROR 04-27 04:32:37 [core.py:387] torch.cuda.set_device(self.device) ERROR 04-27 04:32:37 [core.py:387] File "/root/miniconda3/envs/vllm/lib/python3.10/site-packages/torch/cuda/__init__.py", line 476, in set_device ERROR 04-27 04:32:37 [core.py:387] torch._C._cuda_setDevice(device) ERROR 04-27 04:32:37 [core.py:387] File "/root/miniconda3/envs/vllm/lib/python3.10/site-packages/torch/cuda/__init__.py", line 305, in _lazy_init ERROR 04-27 04:32:37 [core.py:387] raise RuntimeError( ERROR 04-27 04:32:37 [core.py:387] RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the 'spawn' start method ERROR 04-27 04:32:37 [core.py:387] CRITICAL 04-27 04:32:37 [core_client.py:359] Got fatal signal from worker processes, shutting down. See stack trace above for root cause issue. Killed


网站公告

今日签到

点亮在社区的每一天
去签到