大模型评测教程
随着人工智能技术的快速发展, 大规模预训练自然语言模型成为了研究热点和关注焦点。OpenAI 于 2018 年提出了第一代 GPT 模型,开辟了自然语言模型生成式预训练的路线。沿着这条路线,随后又陆续发布了 GPT-2 和 GPT-3 模型。与此同时,谷歌也探索了不同的大规模预训练模型方案,例如如 T5,Flan 等。OpenAI 在 2022 年 11 月发布 ChatGPT,展示了强大的问答能力,逻辑推理能力和内容创作能力,将模型提升到了实用水平,改变人们对大模型能力的认知。在 2023 年 4 月,OpenAI 发布了新升级的 GPT-4 模型,通过引入多模态能力,进一步拓展了大语言模型的能力边界,朝着通用人工智能更进一步。ChatGPT 和 GPT-4 推出之后,微软凭借强大的产品化能力迅速将其集成进搜索引擎和 Office 办公套件中,形成了 New Bing 和 Office Copilot 等产品。谷歌也迅速上线了基于自家大语言模型 PaLM 和 PaLM-2 的 Bard,与 OpenAI 和微软展开正面竞争。国内的多家企业和研究机构也在开展大模型的技术研发,百度,阿里,华为,商汤,讯飞等都发布了各自的国产语言大模型,清华,复旦等高校也相继发布了 GLM,MOSS 等模型。
为了准确和公正地评估大模型的能力,国内外机构在大模型评测上开展了大量的尝试和探索。斯坦福大学提出了较为系统的评测框架 HELM,从准确性,安全性,鲁棒性和公平性等维度开展模型评测。纽约大学联合谷歌和 Meta 提出了 SuperGLUE 评测集,从推理能力,常识理解,问答能力等方面入手,构建了包括 8 个子任务的大语言模型评测数据集。加州大学伯克利分校提出了 MMLU 测试集,构建了涵盖高中和大学的多项考试,来评估模型的知识能力和推理能力。谷歌也提出了包含数理科学,编程代码,阅读理解,逻辑推理等子任务的评测集 Big-Bench,涵盖 200 多个子任务,对模型能力进行系统化的评估。在中文评测方面,国内的学术机构也提出了如 CLUE,CUGE 等评测数据集,从文本分类,阅读理解,逻辑推理等方面评测语言模型的中文能力。
随着大模型的蓬勃发展,如何全面系统地评估大模型的各项能力成为了亟待解决的问题。由于大语言模型和多模态模型的能力强大,应用场景广泛,目前学术界和工业界的评测方案往往只关注模型的部分能力维度,缺少系统化的能力维度框架与评测方案。OpenCompass 提供设计一套全面、高效、可拓展的大模型评测方案,对模型能力、性能、安全性等进行全方位的评估。OpenCompass 提供分布式自动化的评测系统,支持对(语言/多模态)大模型开展全面系统的能力评估。
OpenCompass介绍
评测对象
本算法库的主要评测对象为语言大模型与多模态大模型。我们以语言大模型为例介绍评测的具体模型类型。
- 基座模型:一般是经过海量的文本数据以自监督学习的方式进行训练获得的模型(如 OpenAI 的 GPT-3,Meta 的 LLaMA),往往具有强大的文字续写能力。
- 对话模型:一般是在的基座模型的基础上,经过指令微调或人类偏好对齐获得的模型(如 OpenAI 的 ChatGPT、上海人工智能实验室的书生·浦语),能理解人类指令,具有较强的对话能力。
工具架构
- 模型层:大模型评测所涉及的主要模型种类,OpenCompass 以基座模型和对话模型作为重点评测对象。
- 能力层:OpenCompass 从本方案从通用能力和特色能力两个方面来进行评测维度设计。在模型通用能力方面,从语言、知识、理解、推理、安全等多个能力维度进行评测。在特色能力方面,从长文本、代码、工具、知识增强等维度进行评测。
- 方法层:OpenCompass 采用客观评测与主观评测两种评测方式。客观评测能便捷地评估模型在具有确定答案(如选择,填空,封闭式问答等)的任务上的能力,主观评测能评估用户对模型回复的真实满意度,OpenCompass 采用基于模型辅助的主观评测和基于人类反馈的主观评测两种方式。
- 工具层:OpenCompass 提供丰富的功能支持自动化地开展大语言模型的高效评测。包括分布式评测技术,提示词工程,对接评测数据库,评测榜单发布,评测报告生成等诸多功能。
能力维度
设计思路
为准确、全面、系统化地评估大语言模型的能力,OpenCompass 从通用人工智能的角度出发,结合学术界的前沿进展和工业界的最佳实践,提出一套面向实际应用的模型能力评价体系。OpenCompass 能力维度体系涵盖通用能力和特色能力两大部分。
通用能力涵盖学科综合能力、知识能力、语言能力、理解能力、推理能力、安全能力,共计六大维度构造立体全面的模型能力评价体系。
评测方法
OpenCompass 采取客观评测与主观评测相结合的方法。针对具有确定性答案的能力维度和场景,通过构造丰富完善的评测集,对模型能力进行综合评价。针对体现模型能力的开放式或半开放式的问题、模型安全问题等,采用主客观相结合的评测方式。
客观评测
针对具有标准答案的客观问题,我们可以我们可以通过使用定量指标比较模型的输出与标准答案的差异,并根据结果衡量模型的性能。同时,由于大语言模型输出自由度较高,在评测阶段,我们需要对其输入和输出作一定的规范和设计,尽可能减少噪声输出在评测阶段的影响,才能对模型的能力有更加完整和客观的评价。
为了更好地激发出模型在题目测试领域的能力,并引导模型按照一定的模板输出答案,OpenCompass 采用提示词工程 (prompt engineering)和语境学习(in-context learning)进行客观评测。
在客观评测的具体实践中,我们通常采用下列两种方式进行模型输出结果的评测:
- 判别式评测:该评测方式基于将问题与候选答案组合在一起,计算模型在所有组合上的困惑度(perplexity),并选择困惑度最小的答案作为模型的最终输出。例如,若模型在
问题?答案 1上的困惑度为 0.1,在问题?答案 2上的困惑度为 0.2,最终我们会选择答案 1作为模型的输出。 - 生成式评测:该评测方式主要用于生成类任务,如语言翻译、程序生成、逻辑分析题等。具体实践时,使用问题作为模型的原始输入,并留白答案区域待模型进行后续补全。我们通常还需要对其输出进行后处理,以保证输出满足数据集的要求。
主观评测
语言表达生动精彩,变化丰富,大量的场景和能力无法凭借客观指标进行评测。针对如模型安全和模型语言能力的评测,以人的主观感受为主的评测更能体现模型的真实能力,并更符合大模型的实际使用场景。
OpenCompass 采取的主观评测方案是指借助受试者的主观判断对具有对话能力的大语言模型进行能力评测。在具体实践中,我们提前基于模型的能力维度构建主观测试问题集合,并将不同模型对于同一问题的不同回复展现给受试者,收集受试者基于主观感受的评分。由于主观测试成本高昂,本方案同时也采用使用性能优异的大语言模拟人类进行主观打分。在实际评测中,本文将采用真实人类专家的主观评测与基于模型打分的主观评测相结合的方式开展模型能力评估。
在具体开展主观评测时,OpenComapss 采用单模型回复满意度统计和多模型满意度比较两种方式开展具体的评测工作。
快速开始
概览
在 OpenCompass 中评估一个模型通常包括以下几个阶段:配置 -> 推理 -> 评估 -> 可视化。
配置:这是整个工作流的起点。您需要配置整个评估过程,选择要评估的模型和数据集。此外,还可以选择评估策略、计算后端等,并定义显示结果的方式。
推理与评估:在这个阶段,OpenCompass 将会开始对模型和数据集进行并行推理和评估。推理阶段主要是让模型从数据集产生输出,而评估阶段则是衡量这些输出与标准答案的匹配程度。这两个过程会被拆分为多个同时运行的“任务”以提高效率,但请注意,如果计算资源有限,这种策略可能会使评测变得更慢。
可视化:评估完成后,OpenCompass 将结果整理成易读的表格,并将其保存为 CSV 和 TXT 文件。你也可以激活飞书状态上报功能,此后可以在飞书客户端中及时获得评测状态报告。
接下来,我们将展示 OpenCompass 的基础用法,展示书生浦语在 C-Eval 基准任务上的评估。它们的配置文件可以在 configs/eval_demo.py 中找到。
安装
根据本文文末附近作业部分的实验结果,我认为这次实验使用的配置至少是 A100(2/4),有更高的配置能申请到更好。配置低的话在推理测评过程里会出现显存不够然后好多测评数据上没结果。
面向GPU的环境安装
conda create --name opencompass --clone=/root/share/conda_envs/internlm-base
source activate opencompass
git clone https://github.com/open-compass/opencompass
cd opencompass
pip install -e .
远程开发机连不到 GitHub 的话用码云,具体怎么做不再赘述。
有部分第三方功能,如代码能力基准测试 Humaneval 以及 Llama格式的模型评测,可能需要额外步骤才能正常运行,如需评测,详细步骤请参考安装指南。
数据准备
# 解压评测数据集到 data/ 处
cp /share/temp/datasets/OpenCompassData-core-20231110.zip /root/opencompass/
unzip OpenCompassData-core-20231110.zip
# 将会在opencompass下看到data文件夹
查看支持的数据集和模型
# 列出所有跟 internlm 及 ceval 相关的配置
python tools/list_configs.py internlm ceval
将会看到
+--------------------------+--------------------------------------------------------+
| Model | Config Path |
|--------------------------+--------------------------------------------------------|
| hf_internlm2_20b | configs/models/hf_internlm/hf_internlm2_20b.py |
| hf_internlm2_7b | configs/models/hf_internlm/hf_internlm2_7b.py |
| hf_internlm2_chat_20b | configs/models/hf_internlm/hf_internlm2_chat_20b.py |
| hf_internlm2_chat_7b | configs/models/hf_internlm/hf_internlm2_chat_7b.py |
| hf_internlm_20b | configs/models/hf_internlm/hf_internlm_20b.py |
| hf_internlm_7b | configs/models/hf_internlm/hf_internlm_7b.py |
| hf_internlm_chat_20b | configs/models/hf_internlm/hf_internlm_chat_20b.py |
| hf_internlm_chat_7b | configs/models/hf_internlm/hf_internlm_chat_7b.py |
| hf_internlm_chat_7b_8k | configs/models/hf_internlm/hf_internlm_chat_7b_8k.py |
| hf_internlm_chat_7b_v1_1 | configs/models/hf_internlm/hf_internlm_chat_7b_v1_1.py |
| internlm_7b | configs/models/internlm/internlm_7b.py |
| ms_internlm_chat_7b_8k | configs/models/ms_internlm/ms_internlm_chat_7b_8k.py |
+--------------------------+--------------------------------------------------------+
+----------------------------+------------------------------------------------------+
| Dataset | Config Path |
|----------------------------+------------------------------------------------------|
| ceval_clean_ppl | configs/datasets/ceval/ceval_clean_ppl.py |
| ceval_gen | configs/datasets/ceval/ceval_gen.py |
| ceval_gen_2daf24 | configs/datasets/ceval/ceval_gen_2daf24.py |
| ceval_gen_5f30c7 | configs/datasets/ceval/ceval_gen_5f30c7.py |
| ceval_ppl | configs/datasets/ceval/ceval_ppl.py |
| ceval_ppl_578f8d | configs/datasets/ceval/ceval_ppl_578f8d.py |
| ceval_ppl_93e5ce | configs/datasets/ceval/ceval_ppl_93e5ce.py |
| ceval_zero_shot_gen_bd40ef | configs/datasets/ceval/ceval_zero_shot_gen_bd40ef.py |
+----------------------------+------------------------------------------------------+
启动评测
确保按照上述步骤正确安装 OpenCompass 并准备好数据集后,可以通过以下命令评测 InternLM-Chat-7B 模型在 C-Eval 数据集上的性能。由于 OpenCompass 默认并行启动评估过程,我们可以在第一次运行时以 --debug 模式启动评估,并检查是否存在问题。在 --debug 模式下,任务将按顺序执行,并实时打印输出。
python run.py --datasets ceval_gen --hf-path /share/temp/model_repos/internlm-chat-7b/ --tokenizer-path /share/temp/model_repos/internlm-chat-7b/ --tokenizer-kwargs padding_side='left' truncation='left' trust_remote_code=True --model-kwargs trust_remote_code=True device_map='auto' --max-seq-len 2048 --max-out-len 16 --batch-size 4 --num-gpus 1 --debug
命令解析
--datasets ceval_gen \
--hf-path /share/temp/model_repos/internlm-chat-7b/ \ # HuggingFace 模型路径
--tokenizer-path /share/temp/model_repos/internlm-chat-7b/ \ # HuggingFace tokenizer 路径(如果与模型路径相同,可以省略)
--tokenizer-kwargs padding_side='left' truncation='left' trust_remote_code=True \ # 构建 tokenizer 的参数
--model-kwargs device_map='auto' trust_remote_code=True \ # 构建模型的参数
--max-seq-len 2048 \ # 模型可以接受的最大序列长度
--max-out-len 16 \ # 生成的最大 token 数
--batch-size 2 \ # 批量大小
--num-gpus 1 \ # 运行模型所需的 GPU 数量
--debug
如果一切正常,您应该看到屏幕上显示 “Starting inference process”:
评测完成后,将会看到:
dataset version metric mode opencompass.models.huggingface.HuggingFace_model_repos_internlm-chat-7b
---------------------------------------------- --------- -------- ------ -------------------------------------------------------------------------
ceval-computer_network - - - -
ceval-operating_system - - - -
ceval-computer_architecture - - - -
ceval-college_programming 4ca32a accuracy gen 32.43
ceval-college_physics - - - -
ceval-college_chemistry e78857 accuracy gen 16.67
ceval-advanced_mathematics - - - -
ceval-probability_and_statistics - - - -
ceval-discrete_mathematics - - - -
ceval-electrical_engineer ae42b9 accuracy gen 35.14
ceval-metrology_engineer ee34ea accuracy gen 50.00
ceval-high_school_mathematics - - - -
ceval-high_school_physics - - - -
ceval-high_school_chemistry - - - -
ceval-high_school_biology - - - -
ceval-middle_school_mathematics - - - -
ceval-middle_school_biology - - - -
ceval-middle_school_physics - - - -
ceval-middle_school_chemistry - - - -
ceval-veterinary_medicine b4e08d accuracy gen 47.83
ceval-college_economics f3f4e6 accuracy gen 41.82
ceval-business_administration c1614e accuracy gen 33.33
ceval-marxism - - - -
ceval-mao_zedong_thought 51c7a4 accuracy gen 70.83
ceval-education_science 591fee accuracy gen 58.62
ceval-teacher_qualification 4e4ced accuracy gen 70.45
ceval-high_school_politics - - - -
ceval-high_school_geography - - - -
ceval-middle_school_politics - - - -
ceval-middle_school_geography - - - -
ceval-modern_chinese_history fc01af accuracy gen 73.91
ceval-ideological_and_moral_cultivation - - - -
ceval-logic - - - -
ceval-law a110a1 accuracy gen 25.00
ceval-chinese_language_and_literature 0f8b68 accuracy gen 30.43
ceval-art_studies 2a1300 accuracy gen 60.61
ceval-professional_tour_guide 4e673e accuracy gen 62.07
ceval-legal_professional ce8787 accuracy gen 39.13
ceval-high_school_chinese - - - -
ceval-high_school_history - - - -
ceval-middle_school_history - - - -
ceval-civil_servant 87d061 accuracy gen 53.19
ceval-sports_science - - - -
ceval-plant_protection - - - -
ceval-basic_medicine - - - -
ceval-clinical_medicine - - - -
ceval-urban_and_rural_planner 95b885 accuracy gen 45.65
ceval-accountant 002837 accuracy gen 26.53
ceval-fire_engineer bc23f5 accuracy gen 22.58
ceval-environmental_impact_assessment_engineer c64e2d accuracy gen 64.52
ceval-tax_accountant 3a5e3c accuracy gen 34.69
ceval-physician 6e277d accuracy gen 40.82
01/26 14:59:04 - OpenCompass - INFO - write summary to /root/opencompass/outputs/default/20240126_142302/summary/summary_20240126_142302.txt
01/26 14:59:04 - OpenCompass - INFO - write csv to /root/opencompass/outputs/default/20240126_142302/summary/summary_20240126_142302.csv
有关 run.py 支持的所有与 HuggingFace 相关的参数,请阅读 评测任务发起
除了通过命令行配置实验外,OpenCompass 还允许用户在配置文件中编写实验的完整配置,并通过 run.py 直接运行它。配置文件是以 Python 格式组织的,并且必须包括 datasets 和 models 字段。
示例测试配置在 configs/eval_demo.py 中。此配置通过 继承机制 引入所需的数据集和模型配置,并以所需格式组合 datasets 和 models 字段。
from mmengine.config import read_base
with read_base():
from .datasets.siqa.siqa_gen import siqa_datasets
from .datasets.winograd.winograd_ppl import winograd_datasets
from .models.opt.hf_opt_125m import opt125m
from .models.opt.hf_opt_350m import opt350m
datasets = [*siqa_datasets, *winograd_datasets]
models = [opt125m, opt350m]
运行任务时,我们只需将配置文件的路径传递给 run.py:
python run.py configs/eval_demo.py
OpenCompass 提供了一系列预定义的模型配置,位于 configs/models 下。以下是与 opt-350m(configs/models/opt/hf_opt_350m.py)相关的配置片段:
# 使用 `HuggingFaceCausalLM` 评估由 HuggingFace 的 `AutoModelForCausalLM` 支持的模型
from opencompass.models import HuggingFaceCausalLM
# OPT-350M
opt350m = dict(
type=HuggingFaceCausalLM,
# `HuggingFaceCausalLM` 的初始化参数
path='facebook/opt-350m',
tokenizer_path='facebook/opt-350m',
tokenizer_kwargs=dict(
padding_side='left',
truncation_side='left',
proxies=None,
trust_remote_code=True),
model_kwargs=dict(device_map='auto'),
# 下面是所有模型的共同参数,不特定于 HuggingFaceCausalLM
abbr='opt350m', # 结果显示的模型缩写
max_seq_len=2048, # 整个序列的最大长度
max_out_len=100, # 生成的最大 token 数
batch_size=64, # 批量大小
run_cfg=dict(num_gpus=1), # 该模型所需的 GPU 数量
)
使用配置时,我们可以通过命令行参数 --models 指定相关文件,或使用继承机制将模型配置导入到配置文件中的 models 列表中。
与模型类似,数据集的配置文件也提供在 configs/datasets 下。用户可以在命令行中使用 --datasets,或通过继承在配置文件中导入相关配置
下面是来自 configs/eval_demo.py 的与数据集相关的配置片段:
from mmengine.config import read_base # 使用 mmengine.read_base() 读取基本配置
with read_base():
# 直接从预设的数据集配置中读取所需的数据集配置
from .datasets.winograd.winograd_ppl import winograd_datasets # 读取 Winograd 配置,基于 PPL(困惑度)进行评估
from .datasets.siqa.siqa_gen import siqa_datasets # 读取 SIQA 配置,基于生成进行评估
datasets = [*siqa_datasets, *winograd_datasets] # 最终的配置需要包含所需的评估数据集列表 'datasets'
数据集配置通常有两种类型:'ppl' 和 'gen',分别指示使用的评估方法。其中 ppl 表示辨别性评估,gen 表示生成性评估。
此外,configs/datasets/collections 收录了各种数据集集合,方便进行综合评估。OpenCompass 通常使用 base_medium.py 进行全面的模型测试。要复制结果,只需导入该文件,例如:
python run.py --models hf_llama_7b --datasets base_medium
OpenCompass 通常假定运行环境网络是可用的。如果您遇到网络问题或希望在离线环境中运行 OpenCompass,请参阅 FAQ - 网络 - Q1 寻求解决方案。
可视化评估结果
评估完成后,评估结果表格将打印如下:
dataset version metric mode opt350m opt125m
--------- --------- -------- ------ --------- ---------
siqa e78df3 accuracy gen 21.55 12.44
winograd b6c7ed accuracy ppl 51.23 49.82
所有运行输出将定向到 outputs/demo/ 目录,结构如下:
outputs/default/
├── 20200220_120000
├── 20230220_183030 # 每个实验一个文件夹
│ ├── configs # 用于记录的已转储的配置文件。如果在同一个实验文件夹中重新运行了不同的实验,可能会保留多个配置
│ ├── logs # 推理和评估阶段的日志文件
│ │ ├── eval
│ │ └── infer
│ ├── predictions # 每个任务的推理结果
│ ├── results # 每个任务的评估结果
│ └── summary # 单个实验的汇总评估结果
├── ...
打印评测结果的过程可被进一步定制化,用于输出一些数据集的平均分 (例如 MMLU, C-Eval 等)。
关于评测结果输出的更多介绍可阅读 结果展示。
更多教程
想要更多了解 OpenCompass, 可以点击下列链接学习。
作业
基础作业
- 使用 OpenCompass 评测 InternLM2-Chat-7B 模型在 C-Eval 数据集上的性能
在做各种事情之前先把模型下载下来,下载模型的步骤和以前一样,找个镜像站
import os
# 设置环境变量
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
# 下载模型
os.system('huggingface-cli download --resume-download internlm/internlm2-chat-7b --local-dir /root/model/Shanghai_AI_Laboratory/internlm2-chat-7b')
根据上面的教程,在 configs 目录里找到对应的配置文件,找不到的话就自己写一大串配置。我找到一个 configs/eval_internlm2_chat_keyset.py,仔细看了一下和作业的要求不一样,那还是自己在执行命令的时候指定模型和数据集吧。运行下面这个代码,在 InternLM2-Chat-7B 模型上跑 C-Eval 数据集:
python run.py \
--datasets ceval_gen \
--hf-path /root/model/Shanghai_AI_Laboratory/internlm2-chat-7b/ \
--tokenizer-path /root/model/Shanghai_AI_Laboratory/internlm2-chat-7b/ \
--tokenizer-kwargs padding_side='left' truncation='left' trust_remote_code=True \
--model-kwargs trust_remote_code=True device_map='auto' \
--max-seq-len 2048 \
--max-out-len 16 \
--batch-size 4 \
--num-gpus 1 \
--debug
这个错误应该是加载本地模型,路径没对上?
01/30 14:33:02 - OpenCompass - INFO - time elapsed: 38.44s
01/30 14:33:03 - OpenCompass - DEBUG - Get class `OpenICLEvalTask` from "task" registry in "opencompass"
01/30 14:33:03 - OpenCompass - DEBUG - An `OpenICLEvalTask` instance is built from registry, and its implementation can be found in opencompass.tasks.openicl_eval
01/30 14:34:08 - OpenCompass - ERROR - /root/opencompass/opencompass/tasks/openicl_eval.py - _score - 236 - Task [opencompass.models.huggingface.HuggingFace_Shanghai_AI_Laboratory_internlm2-chat-7b/ceval-high_school_chemistry]: No predictions found.
直接看源码,定位问题
同时又看了一个 issue,里面建议的解决方法是用 intel 的设备。。。然后我看了一下开发机的状态
哇,真的没用上显卡的显存耶。。。
重新运行了好几次都是这样,最后反应过来了,自己之前没有仔细看命令运行的输出,于是又重新来了一次
通常来说这里会设置任务,然后有一个明显的大模型和测试数据加载过程,之后就是一个任务一个任务的信息往外冒,但是随后就有报错,之前输出太多滚屏了我以为这边没问题。。。
Traceback (most recent call last):
File "/root/opencompass/opencompass/tasks/openicl_infer.py", line 153, in <module>
inferencer.run()
File "/root/opencompass/opencompass/tasks/openicl_infer.py", line 65, in run
self.model = build_model_from_cfg(model_cfg)
File "/root/opencompass/opencompass/utils/build.py", line 25, in build_model_from_cfg
return MODELS.build(model_cfg)
File "/root/.local/lib/python3.10/site-packages/mmengine/registry/registry.py", line 570, in build
return self.build_func(cfg, *args, **kwargs, registry=self)
File "/root/.local/lib/python3.10/site-packages/mmengine/registry/build_functions.py", line 121, in build_from_cfg
obj = obj_cls(**args) # type: ignore
File "/root/opencompass/opencompass/models/huggingface.py", line 120, in __init__
self._load_tokenizer(path=path,
File "/root/opencompass/opencompass/models/huggingface.py", line 136, in _load_tokenizer
self.tokenizer = AutoTokenizer.from_pretrained(
File "/root/.local/lib/python3.10/site-packages/transformers/models/auto/tokenization_auto.py", line 774, in from_pretrained
return tokenizer_class.from_pretrained(pretrained_model_name_or_path, *inputs, **kwargs)
File "/root/.local/lib/python3.10/site-packages/transformers/tokenization_utils_base.py", line 2028, in from_pretrained
return cls._from_pretrained(
File "/root/.local/lib/python3.10/site-packages/transformers/tokenization_utils_base.py", line 2260, in _from_pretrained
tokenizer = cls(*init_inputs, **init_kwargs)
File "/root/.cache/huggingface/modules/transformers_modules/tokenization_internlm2_fast.py", line 131, in __init__
super().__init__(
File "/root/.local/lib/python3.10/site-packages/transformers/tokenization_utils_fast.py", line 114, in __init__
fast_tokenizer = convert_slow_tokenizer(slow_tokenizer)
File "/root/.local/lib/python3.10/site-packages/transformers/convert_slow_tokenizer.py", line 1336, in convert_slow_tokenizer
return converter_class(transformer_tokenizer).converted()
File "/root/.local/lib/python3.10/site-packages/transformers/convert_slow_tokenizer.py", line 459, in __init__
requires_backends(self, "protobuf")
File "/root/.local/lib/python3.10/site-packages/transformers/utils/import_utils.py", line 1276, in requires_backends
raise ImportError("".join(failed))
ImportError:
InternLM2Converter requires the protobuf library but it was not found in your environment. Checkout the instructions on the
installation page of its repo: https://github.com/protocolbuffers/protobuf/tree/master/python#installation and follow the ones
that match your environment. Please note that you may need to restart your runtime after installation.
ERROR:torch.distributed.elastic.multiprocessing.api:failed (exitcode: 1) local_rank: 0 (pid: 130711) of binary: /root/.conda/envs/opencompass/bin/python
Traceback (most recent call last):
File "/root/.conda/envs/opencompass/bin/torchrun", line 33, in <module>
sys.exit(load_entry_point('torch==2.0.1', 'console_scripts', 'torchrun')())
File "/root/.conda/envs/opencompass/lib/python3.10/site-packages/torch/distributed/elastic/multiprocessing/errors/__init__.py", line 346, in wrapper
return f(*args, **kwargs)
File "/root/.conda/envs/opencompass/lib/python3.10/site-packages/torch/distributed/run.py", line 794, in main
run(args)
File "/root/.conda/envs/opencompass/lib/python3.10/site-packages/torch/distributed/run.py", line 785, in run
elastic_launch(
File "/root/.conda/envs/opencompass/lib/python3.10/site-packages/torch/distributed/launcher/api.py", line 134, in __call__
return launch_agent(self._config, self._entrypoint, list(args))
File "/root/.conda/envs/opencompass/lib/python3.10/site-packages/torch/distributed/launcher/api.py", line 250, in launch_agent
raise ChildFailedError(
torch.distributed.elastic.multiprocessing.errors.ChildFailedError:
============================================================
/root/opencompass/opencompass/tasks/openicl_infer.py FAILED
------------------------------------------------------------
Failures:
<NO_OTHER_FAILURES>
------------------------------------------------------------
Root Cause (first observed failure):
[0]:
time : 2024-01-30_15:09:57
host : intern-studio
rank : 0 (local_rank: 0)
exitcode : 1 (pid: 130711)
error_file: <N/A>
traceback : To enable traceback see: https://pytorch.org/docs/stable/elastic/errors.html
============================================================
太长不看,省流:
protobuf 对应的包没找到,如果只是解决 python 的包问题,
$ pip install protobuf
安装完重新执行上面超长的那个命令
应该没什么问题了,
新的问题,显存不够了
老办法解决,再开一个开发机,配置能高则高。
等待平台给我分配开发机,漫长的过程。
显示有点问题,不过这才是正常运行并且任务跑在显卡上的情况。配置的话选择 A100(2/4) 就刚好够,前面显存不够是因为直接选择了 A100(1/4)
现在这样的结果看着就很舒心,等会应该没有 ERROR 了。
然后下面的输出是每一个测评的正确率
这个大模型和我一样,我在读高中的时候发现自己已经没法辅导在读初中的邻居家小孩了
最后的结果如下
01/31 03:21:25 - OpenCompass - DEBUG - An `DefaultSummarizer` instance is built from registry, and its implementation can be found in opencompass.summarizers.default
dataset version metric mode opencompass.models.huggingface.HuggingFace_Shanghai_AI_Laboratory_internlm2-chat-7b
---------------------------------------------- --------- ------------- ------ -------------------------------------------------------------------------------------
ceval-computer_network db9ce2 accuracy gen 47.37
ceval-operating_system 1c2571 accuracy gen 57.89
ceval-computer_architecture a74dad accuracy gen 42.86
ceval-college_programming 4ca32a accuracy gen 51.35
ceval-college_physics 963fa8 accuracy gen 36.84
ceval-college_chemistry e78857 accuracy gen 33.33
ceval-advanced_mathematics ce03e2 accuracy gen 15.79
ceval-probability_and_statistics 65e812 accuracy gen 27.78
ceval-discrete_mathematics e894ae accuracy gen 18.75
ceval-electrical_engineer ae42b9 accuracy gen 40.54
ceval-metrology_engineer ee34ea accuracy gen 58.33
ceval-high_school_mathematics 1dc5bf accuracy gen 44.44
ceval-high_school_physics adf25f accuracy gen 47.37
ceval-high_school_chemistry 2ed27f accuracy gen 52.63
ceval-high_school_biology 8e2b9a accuracy gen 26.32
ceval-middle_school_mathematics bee8d5 accuracy gen 26.32
ceval-middle_school_biology 86817c accuracy gen 66.67
ceval-middle_school_physics 8accf6 accuracy gen 57.89
ceval-middle_school_chemistry 167a15 accuracy gen 95
ceval-veterinary_medicine b4e08d accuracy gen 39.13
ceval-college_economics f3f4e6 accuracy gen 47.27
ceval-business_administration c1614e accuracy gen 51.52
ceval-marxism cf874c accuracy gen 84.21
ceval-mao_zedong_thought 51c7a4 accuracy gen 70.83
ceval-education_science 591fee accuracy gen 72.41
ceval-teacher_qualification 4e4ced accuracy gen 79.55
ceval-high_school_politics 5c0de2 accuracy gen 21.05
ceval-high_school_geography 865461 accuracy gen 47.37
ceval-middle_school_politics 5be3e7 accuracy gen 42.86
ceval-middle_school_geography 8a63be accuracy gen 58.33
ceval-modern_chinese_history fc01af accuracy gen 65.22
ceval-ideological_and_moral_cultivation a2aa4a accuracy gen 89.47
ceval-logic f5b022 accuracy gen 54.55
ceval-law a110a1 accuracy gen 41.67
ceval-chinese_language_and_literature 0f8b68 accuracy gen 56.52
ceval-art_studies 2a1300 accuracy gen 69.7
ceval-professional_tour_guide 4e673e accuracy gen 86.21
ceval-legal_professional ce8787 accuracy gen 43.48
ceval-high_school_chinese 315705 accuracy gen 68.42
ceval-high_school_history 7eb30a accuracy gen 75
ceval-middle_school_history 48ab4a accuracy gen 68.18
ceval-civil_servant 87d061 accuracy gen 55.32
ceval-sports_science 70f27b accuracy gen 73.68
ceval-plant_protection 8941f9 accuracy gen 77.27
ceval-basic_medicine c409d6 accuracy gen 63.16
ceval-clinical_medicine 49e82d accuracy gen 45.45
ceval-urban_and_rural_planner 95b885 accuracy gen 58.7
ceval-accountant 002837 accuracy gen 44.9
ceval-fire_engineer bc23f5 accuracy gen 38.71
ceval-environmental_impact_assessment_engineer c64e2d accuracy gen 45.16
ceval-tax_accountant 3a5e3c accuracy gen 51.02
ceval-physician 6e277d accuracy gen 51.02
ceval-stem - naive_average gen 44.33
ceval-social-science - naive_average gen 57.54
ceval-humanities - naive_average gen 65.31
ceval-other - naive_average gen 54.94
ceval-hard - naive_average gen 34.62
ceval - naive_average gen 53.55
01/31 03:21:25 - OpenCompass - INFO - write summary to /root/opencompass/outputs/default/20240131_023852/summary/summary_20240131_023852.txt
01/31 03:21:25 - OpenCompass - INFO - write csv to /root/opencompass/outputs/default/20240131_023852/summary/summary_20240131_023852.csv
(opencompass) root@intern-studio:~/opencompass#
底下提示的可以去这两个文件里找这些输出在命令行里的测评结果表格,内容是一样的,这里就不贴了。
可以看到高等数学正确率只有最多 16% 正确率,InternLM2-Chat-7B 还得练,如果我是校长,我会建议你家浦语去听听小谷数学课或者每次测评之前拿猴博士的视频微调一下,看看人家先天高斯圣体先天欧拉圣体是怎么学数学的。
如果有下一届大模型实战营,我会做一个项目,把上面这段话写在 prompt 里,同时做一个可以总结视频可以联网的应用,就让浦语天天跟着小孩儿姐小孩儿哥跟着猴博士不挂科嘎嘎猛学,然后再用最新的 opencompass 在中文大学高中初中小学考试相关的数据集上去测评。估计到时候就是浦语对着我比剪刀手念菜就多练了。
进阶作业
- 使用 OpenCompass 评测 InternLM2-Chat-7B 模型使用 LMDeploy 0.2.0 部署后在 C-Eval 数据集上的性能
这个进阶作业进阶在需要用 LMDeploy 来部署,之后再去测试性能。看题目的意思,顺便回顾一下上节课的内容,
第一步,把原来环境里的 LMDeploy 0.1.0 升级成 0.2.0
pip install 'lmdeploy[all]==v0.2.0'
直接用原来的版本是找不到新版本的大模型的
安装完之后再执行一次安装命令,所有依赖包都满足的时候是这样的
我们用离线转换的方式把原本的模型转换成 lmdeploy TurboMind 格式:
lmdeploy convert internlm2-chat-7b /root/model/Shanghai_AI_Laboratory/internlm2-chat-7b
注意,现在输出的模型是 fp16 的格式的,模型转完之后输出在当前文件夹里,不在大模型对应的文件夹里。
我在大模型对应的文件夹里发现 model/Shanghai_AI_Laboratory/internlm2-chat-7b/tokenizer.json 也被修改了,而且这里面有这样的东西
该不会 ChatGPT 的网页里宣传背景就是根据 tokenizer.json 里的这堆东西生成的吧。
OK,现在他们网站上还有一些东西我不知道,估计也是大模型训练过程中产生的文件里的只言片语
看着像群论里的乘法图,至于是什么现在真不知道。还有这样的,这就根本猜不出来了。
好了好了回归正题,我们是在 ~ 下面执行的模型转换命令,自然当前文件夹里的 workspace 文件夹才是我们要找的目标
weights 文件夹里存的是被拆成 32 层的权重文件。
大模型已经有了,之后参考原来的教程考虑再怎么让 opencompass 调用这个转换后的大模型
这里光自己硬写是不行的,还是要参考官方文档里的教程 评测 LMDEPLOY 模型
或者直接参考 opencompass/configs/eval_needleinahaystack_turbomind.py 这里的,反正要改配置
这样的话可以直接以这个文件为基础,进行修改,我们的配置文件 opencompass/configs/eval_internlm2_chat_7b_turbomind.py 如下:
from opencompass.models.turbomind import TurboMindModel
from mmengine.config import read_base
with read_base():
from .datasets.ceval.ceval_gen_5f30c7 import ceval_datasets
datasets = sum((v for k, v in locals().items() if k.endswith('_datasets')), [])
internlm_meta_template = dict(round=[
dict(role='HUMAN', begin='<|User|>:', end='\n'),
dict(role='BOT', begin='<|Bot|>:', end='<eoa>\n', generate=True),
],
eos_token_id=103028)
models = [
# config for internlm2-chat-7b-turbomind
dict(
type=TurboMindModel,
abbr='internlm2-chat-7b-turbomind',
path='/root/workspace',
engine_config=dict(session_len=2048,
max_batch_size=4,
rope_scaling_factor=1.0),
gen_config=dict(top_k=1,
top_p=0.8,
temperature=1.0,
max_new_tokens=100),
max_out_len=16,
max_seq_len=2048,
batch_size=4,
concurrency=1,
meta_template=internlm_meta_template,
run_cfg=dict(num_gpus=1, num_procs=1),
)
]
把大模型的位置替换成我们刚才的 workspace 文件夹,同时注意配置参数要和之前测试设置的尽量一样,不然没有对比的意义了。
之后就很简单了,前面的教程也提过
python run.py configs/eval_internlm2_chat_7b_turbomind.py --debug
怎么感觉这次的 debug 信息比之前还多,而且还不是彩色的,之后有时间的话研究研究这里 debug 输出信息要如何设置。而且有个小问题,之前 debug 输出没这么多的时候速度和现在一样慢,是不是只要 debug 模式输出不管显示到终端里还是不显示,都会写到输出流里,同时把输出流里的全部内容存到一个结果文件里。
转换了一下模型怎么效果还变好了,LMDeploy 这么厉害吗
01/31 05:24:09 - OpenCompass - DEBUG - An `DefaultSummarizer` instance is built from registry, and its implementation can be found in opencompass.summarizers.default
dataset version metric mode internlm2-chat-7b-turbomind
---------------------------------------------- --------- -------- ------ -----------------------------
ceval-computer_network db9ce2 accuracy gen 57.89
ceval-operating_system 1c2571 accuracy gen 57.89
ceval-computer_architecture a74dad accuracy gen 57.14
ceval-college_programming 4ca32a accuracy gen 64.86
ceval-college_physics 963fa8 accuracy gen 47.37
ceval-college_chemistry e78857 accuracy gen 33.33
ceval-advanced_mathematics ce03e2 accuracy gen 26.32
ceval-probability_and_statistics 65e812 accuracy gen 44.44
ceval-discrete_mathematics e894ae accuracy gen 31.25
ceval-electrical_engineer ae42b9 accuracy gen 43.24
ceval-metrology_engineer ee34ea accuracy gen 58.33
ceval-high_school_mathematics 1dc5bf accuracy gen 27.78
ceval-high_school_physics adf25f accuracy gen 42.11
ceval-high_school_chemistry 2ed27f accuracy gen 42.11
ceval-high_school_biology 8e2b9a accuracy gen 36.84
ceval-middle_school_mathematics bee8d5 accuracy gen 47.37
ceval-middle_school_biology 86817c accuracy gen 80.95
ceval-middle_school_physics 8accf6 accuracy gen 57.89
ceval-middle_school_chemistry 167a15 accuracy gen 95
ceval-veterinary_medicine b4e08d accuracy gen 47.83
ceval-college_economics f3f4e6 accuracy gen 50.91
ceval-business_administration c1614e accuracy gen 54.55
ceval-marxism cf874c accuracy gen 84.21
ceval-mao_zedong_thought 51c7a4 accuracy gen 70.83
ceval-education_science 591fee accuracy gen 79.31
ceval-teacher_qualification 4e4ced accuracy gen 77.27
ceval-high_school_politics 5c0de2 accuracy gen 89.47
ceval-high_school_geography 865461 accuracy gen 68.42
ceval-middle_school_politics 5be3e7 accuracy gen 76.19
ceval-middle_school_geography 8a63be accuracy gen 66.67
ceval-modern_chinese_history fc01af accuracy gen 73.91
ceval-ideological_and_moral_cultivation a2aa4a accuracy gen 84.21
ceval-logic f5b022 accuracy gen 50
ceval-law a110a1 accuracy gen 41.67
ceval-chinese_language_and_literature 0f8b68 accuracy gen 69.57
ceval-art_studies 2a1300 accuracy gen 72.73
ceval-professional_tour_guide 4e673e accuracy gen 79.31
ceval-legal_professional ce8787 accuracy gen 47.83
ceval-high_school_chinese 315705 accuracy gen 52.63
ceval-high_school_history 7eb30a accuracy gen 75
ceval-middle_school_history 48ab4a accuracy gen 81.82
ceval-civil_servant 87d061 accuracy gen 65.96
ceval-sports_science 70f27b accuracy gen 68.42
ceval-plant_protection 8941f9 accuracy gen 77.27
ceval-basic_medicine c409d6 accuracy gen 63.16
ceval-clinical_medicine 49e82d accuracy gen 50
ceval-urban_and_rural_planner 95b885 accuracy gen 63.04
ceval-accountant 002837 accuracy gen 46.94
ceval-fire_engineer bc23f5 accuracy gen 54.84
ceval-environmental_impact_assessment_engineer c64e2d accuracy gen 45.16
ceval-tax_accountant 3a5e3c accuracy gen 48.98
ceval-physician 6e277d accuracy gen 57.14
01/31 05:24:09 - OpenCompass - INFO - write summary to /root/opencompass/outputs/default/20240131_045220/summary/summary_20240131_045220.txt
01/31 05:24:09 - OpenCompass - INFO - write csv to /root/opencompass/outputs/default/20240131_045220/summary/summary_20240131_045220.csv
(opencompass) root@intern-studio:~/opencompass#
输出文件里的内容和上面一样,就不粘贴了。
备注:由于进阶作业较难,完成基础作业之后就可以先提交作业了,在后续的大作业项目中使用这些技术将作为重要的加分点!
整体实训营项目:
时间周期:即日起致课程结束
即日开始可以在班级群中随机组队完成一个大作业项目,一些可提供的选题如下:
- 人情世故大模型:一个帮助用户撰写新年祝福文案的人情事故大模型
- 中小学数学大模型:一个拥有一定数学解题能力的大模型
- 心理大模型:一个治愈的心理大模型
- 工具调用类项目:结合 Lagent 构建数据集训练 InternLM 模型,支持对 MMYOLO 等工具的调用
其他基于书生·浦语工具链的小项目都在范围内,欢迎大家充分发挥想象力。