当你自己微调训练好一个模型之后,直接拿来部署开用!显然不太稳妥,正确的做法应该是先测试模型的能力,那么如何评估到底调的好不好呢?这是一个很必要的操作,这篇文章就给大家介绍一个大模型评估框架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 自定义数据集
(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 |
|
HuggingFace 模型类型,一般不选框架会自动判断,可选值为 |
chat |
|
HuggingFace 模型路径 |
internlm/internlm2-chat-1_8b |
|
构建模型的参数 |
device_map=’auto’ |
|
HuggingFace tokenizer 路径(如果与模型路径相同,可以省略) |
internlm/internlm2-chat-1_8b |
|
构建 tokenizer 的参数 |
padding_side=’left’ truncation=’left’ trust_remote_code=True |
|
生成的参数 |
do_sample=True top_k=50 top_p=0.95 |
|
模型可以接受的最大序列长度 |
2048 |
|
生成的最大 token 数 |
100 |
|
生成的最小 token 数 |
1 |
|
批量大小 |
64 |
|
运行一个模型实例所需的 GPU 数量 |
1 |
|
停用词列表 |
‘<|im_end|>’ ‘<|im_start|>’ |
|
填充 token 的 ID |
0 |
|
(例如) LoRA 模型的路径 |
internlm/internlm2-chat-1_8b |
|
(例如) 构建 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 数据集名字

(时间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