7-OpenCompass 大模型评测实战
知识篇
OpenCompass简介
工具主页:https://hub.opencompass.org.cn/home
上海人工智能实验室科学家团队正式发布了大模型开源开放评测体系 “司南” (OpenCompass2.0),用于为大语言模型、多模态模型等提供一站式评测服务。其主要特点如下:
- 开源可复现:提供公平、公开、可复现的大模型评测方案
- 全面的能力维度:五大维度设计,提供 70+ 个数据集约 40 万题的的模型评测方案,全面评估模型能力
- 丰富的模型支持:已支持 20+ HuggingFace 及 API 模型
- 分布式高效评测:一行命令实现任务分割和分布式评测,数小时即可完成千亿模型全量评测
- 多样化评测范式:支持零样本、小样本及思维链评测,结合标准型或对话型提示词模板,轻松激发各种模型最大性能
- 灵活化拓展:想增加新模型或数据集?想要自定义更高级的任务分割策略,甚至接入新的集群管理系统?OpenCompass 的一切均可轻松扩展!
目前opencompass已经应用头部大模型企业和科研机构
支持任务切分和并行,最大化利用计算资源
能力维度
opencompass同时也自建数据集,覆盖更多的场景。
共建行业生态
为何要做大模型评测
大模型评测的挑战
如何评测
需要评测的内容包括了基座模型和对话模型
包括了客观评测(包括如客观回答题、选择题)和主观评测(偏开放式的问答)
还有对问题的提示词优化,以便能够让评测问题更明确,更能区分出不同模型的优势。
对长文本的评测
实战
本次实战依然在internStudio完成,选择50%的A100.
创建虚拟环境
studio-conda -o internlm-base -t opencompass
拉取仓库项目
conda activate opencompass
git clone -b 0.2.4 https://github.com/open-compass/opencompass
安装组件
cd opencompass
pip install -e .
# 需要再执行如下,不然其他的组件没安装,后续执行要安装一堆东西
pip install -r requirements.txt
准备评测数据
cp /share/temp/datasets/OpenCompassData-core-20231110.zip /root/opencompass/
unzip OpenCompassData-core-20231110.zip
查看支持的模型和数据集
列出所有跟 InternLM 及 C-Eval 相关的配置
python tools/list_configs.py internlm ceval
# 不带参数是列出可以支持的模型和数据的清单及其配置
python tools/list_configs.py
安装protobuf
# 如果环境中没有该组件,那么请安装,否则运行评测脚本会报错
pip install protobuf
没有安装protobuf会报类似如下错误:
执行评测
export MKL_SERVICE_FORCE_INTEL=1
cd /root/opencompass
python run.py --datasets ceval_gen --hf-path /share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b --tokenizer-path /share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b --tokenizer-kwargs padding_side='left' truncation='left' trust_remote_code=True --model-kwargs trust_remote_code=True device_map='auto' --max-seq-len 1024 --max-out-len 16 --batch-size 2 --num-gpus 1 --debug
评测推理过程
推理结果
评测推理结果:
评测结果也写入到txt和CSV两个文件中
可以直接查看评测结果的写入文件:
自定义数据集
注:以下的根目录是/root/opencompass。
准备配置
在configs/datasets下创建bankrisk目录,生成banklist_gen_2024.py bankrisk_gen.py两个文件
bankrisk_gen.py
from mmengine.config import read_base
with read_base():
#从当前目录下的bankrisk_gen_2024文件导入bankrisk_datasets变量
from .bankrisk_gen_2024 import bankrisk_datasets
bankrisk_gen_2024.py
from opencompass.openicl.icl_prompt_template import PromptTemplate
from opencompass.openicl.icl_retriever import FixKRetriever
from opencompass.openicl.icl_inferencer import GenInferencer
from opencompass.openicl.icl_evaluator import AccEvaluator
from opencompass.datasets import BankRiskDataset
from opencompass.utils.text_postprocessors import first_capital_postprocess
bankrisk_subject_mapping = {
'bank_risk': ['risk', '银行风险', 'STEM'],
}
bankrisk_all_sets = list(bankrisk_subject_mapping.keys())
bankrisk_datasets = []
for _split in ["val", "test"]:
for _name in bankrisk_all_sets:
_ch_name = bankrisk_subject_mapping[_name][1]
bankrisk_infer_cfg = dict(
ice_template=dict(
type=PromptTemplate,
template=dict(
begin="</E>",
round=[
dict(
role="HUMAN",
prompt=
f"以下是关于{_ch_name}考试的单项选择题,请选出其中的正确答案。\n{{question}}\nA. {{A}}\nB. {{B}}\nC. {{C}}\nD. {{D}}\n答案: "
),
dict(role="BOT", prompt="{answer}"),
]),
ice_token="</E>",
),
retriever=dict(type=FixKRetriever, fix_id_list=[0, 1, 2, 3, 4]),
inferencer=dict(type=GenInferencer),
)
bankrisk_eval_cfg = dict(
evaluator=dict(type=AccEvaluator),
pred_postprocessor=dict(type=first_capital_postprocess))
bankrisk_datasets.append(
dict(
type=BankRiskDataset,
path="./data/bankrisk",
name=_name,
# abbr="bankrisk-" + _name if _split == "val" else "bankrisk-test-" +
# _name,
reader_cfg=dict(
input_columns=["question", "A", "B", "C", "D"],
output_column="answer",
train_split="dev",
test_split=_split),
infer_cfg=bankrisk_infer_cfg,
eval_cfg=bankrisk_eval_cfg,
))
del _split, _name, _ch_name
在opencompass中创建bankrisk.py文件,内容为:
import csv
import os.path as osp
from datasets import Dataset, DatasetDict
from opencompass.registry import LOAD_DATASET
from .base import BaseDataset
@LOAD_DATASET.register_module()
class BankRiskDataset(BaseDataset):
"""
class BankRiskDataset
"""
@staticmethod
def load(path: str, name: str):
dataset = {}
for split in ['dev', 'val']:
filename = osp.join(path, split, f'{name}_{split}.csv')
with open(filename, encoding='utf-8') as f:
reader = csv.reader(f)
header = next(reader)
for row in reader:
item = dict(zip(header, row))
item.setdefault('explanation', '')
item.setdefault('answer', '')
dataset.setdefault(split, []).append(item)
dataset = {i: Dataset.from_list(dataset[i]) for i in dataset}
return DatasetDict(dataset)
修改./opencompass下的__ini__.py,加入如下内容:
from .bankrisk import *
准备数据
创建 data/bankrisk/val,data/bankrisk/dev
data/bankrisk/val/bank_risk_val.csv
多复制了几条数据,:)
id,question,A,B,C,D,answer
0,近20日内亿元以上授信业务到期共涉及19户,信贷余额34.56亿元,经逐户调度,到期均能够正常还款,不会形成逾期。,A.信用风险,B.声誉风险,C.反洗钱风险,D.操作风险,A
1,异常交易监测中发现,个人客户吕*、姬*账户交易异常,疑似利用账户归集过渡诈骗资金,A.信用风险,B.声誉风险,C.反洗钱风险,D.操作风险,C
2,异常交易监测中发现,个人客户吕*、姬*账户交易异常,疑似利用账户归集过渡诈骗资金,A.信用风险,B.声誉风险,C.反洗钱风险,D.操作风险,C
3,异常交易监测中发现,个人客户吕*、姬*账户交易异常,疑似利用账户归集过渡诈骗资金,A.信用风险,B.声誉风险,C.反洗钱风险,D.操作风险,C
4,异常交易监测中发现,个人客户吕*、姬*账户交易异常,疑似利用账户归集过渡诈骗资金,A.信用风险,B.声誉风险,C.反洗钱风险,D.操作风险,C
5,异常交易监测中发现,个人客户吕*、姬*账户交易异常,疑似利用账户归集过渡诈骗资金,A.信用风险,B.声誉风险,C.反洗钱风险,D.操作风险,C
6,异常交易监测中发现,个人客户吕*、姬*账户交易异常,疑似利用账户归集过渡诈骗资金,A.信用风险,B.声誉风险,C.反洗钱风险,D.操作风险,C
7,异常交易监测中发现,个人客户吕*、姬*账户交易异常,疑似利用账户归集过渡诈骗资金,A.信用风险,B.声誉风险,C.反洗钱风险,D.操作风险,C
8,异常交易监测中发现,个人客户吕*、姬*账户交易异常,疑似利用账户归集过渡诈骗资金,A.信用风险,B.声誉风险,C.反洗钱风险,D.操作风险,C
bank_risk_dev.csv
多复制了几条数据,:)
id,question,A,B,C,D,answer,explanation
0,异常交易监测中发现,客户王*账户交易异常,疑似为购物平台虚假刷单,扰乱市场正常经营秩序。具体交易特征:交易模式主要为集入散出,资金由支付宝提现、个人银行卡集中转入,单笔金额主要为千元级别,分散为百元级别转出至拼多多支付-拼多多平台商户。相同或相近金额重复出现,有悖于正常消费习惯。次日大量退款,客户疑似职业“刷手”,以买家身份虚假购买与评价平台商户商品,以吸引客流。,A.信用风险,B.声誉风险,C.反洗钱风险,D.操作风险,C,
1,异常交易监测中发现,客户辛**账户交易异常,疑似利用理财产品户过渡资金。具体交易特征:尽职调查多次电话联系客户均无人接听,账户活跃,预留手机却无人接听,疑似使用临时号码开户,开户后手机号码弃用。,A.信用风险,B.声誉风险,C.反洗钱风险,D.操作风险,C,
2,2023年4月22日,云南万达地产开发有限公司在我行固定资产贷款分期还款计划逾期,涉及分期还款资金650万元,目前在我行贷款余额3950万元。,A.信用风险,B.声誉风险,C.反洗钱风险,D.操作风险,A,
3,检查发现,在为胜达机械有限公司办理资本金和结汇业务时存在以下问题:一是业务受理环节,未凭《资本项目账户资金支付函》办理资本金结汇支付业务。,A.合规风险,B.声誉风险,C.反洗钱风险,D.操作风险,A,
4,检查发现,在为胜达机械有限公司办理资本金和结汇业务时存在以下问题:一是业务受理环节,未凭《资本项目账户资金命令函》办理资本金结汇支付业务。,A.合规风险,B.声誉风险,C.反洗钱风险,D.操作风险,A,
5,检查发现,在为胜达机械有限公司办理资本金和结汇业务时存在以下问题:一是业务受理环节,未凭《资本项目账户资金命令函》办理资本金结汇支付业务。,A.合规风险,B.声誉风险,C.反洗钱风险,D.操作风险,A,
6,检查发现,在为胜达机械有限公司办理资本金和结汇业务时存在以下问题:一是业务受理环节,未凭《资本项目账户资金命令函》办理资本金结汇支付业务。,A.合规风险,B.声誉风险,C.反洗钱风险,D.操作风险,A,
7,检查发现,在为胜达机械有限公司办理资本金和结汇业务时存在以下问题:一是业务受理环节,未凭《资本项目账户资金命令函》办理资本金结汇支付业务。,A.合规风险,B.声誉风险,C.反洗钱风险,D.操作风险,A,
查看数据集
运行评测与结果
python run.py --datasets bankrisk_gen --hf-path /share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b --tokenizer-path /share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b --tokenizer-kwargs padding_side='left' truncation='left' trust_remote_code=True --model-kwargs trust_remote_code=True device_map='auto' --max-seq-len 1024 --max-out-len 16 --batch-size 2 --num-gpus 1 --debug
有点牛,100分 :)
提交数据集
参考
提交地址:https://hub.opencompass.org.cn/dataset-submit?lang=[object%20Object]
提交指南:https://mp.weixin.qq.com/s/_s0a9nYRye0bmqVdwXRVCg