ChatGPT复现总结
1.3B的模型+RLHF就可以很强,在真正的落地中,训一个for单一生成任务的定制化ChatGPT不再那么遥不可及,一两张A100和十万级别的数据就可以了——《追赶ChatGPT的难点与平替》
在人力、算力、时间有限的情况下,效率最优的路径是直接在1.3B模型上迭代,大概10万标注数据,复现一个低配小型ChatGPT,验证整个流程的有效性,再去做175B的模型。——《追赶ChatGPT的难点与平替》
LLM 资源
- GPT-3 和 PaLM,这两个模型都不是公开的
- OPT 和 Bloom 是公开模型,基于GPT架构,但是效果达不到GPT-3;
- OPT只支持英文,Bloom支持中英;
- OPT-IML (OPT + Instruction Meta-Learning) is a set of instruction-tuned versions of OPT, ①OPT-IML trained on 1500 tasks with several tasks held-out for purposes of downstream evaluation, and ②OPT-IML-Max trained on all ~2000 tasks
- bigscience/bloom-1b1、
- facebook/opt-350m、facebook/opt-125m、facebook/opt-iml-max-1.3b
- 另外还有 mT5、GLM、LLAMA 等不基于 GPT 架构;
预训练语料库的token数 | 在预训练过程能看到的token数 | |
---|---|---|
PaLM | 780B | 770B |
GPT-3 | 500B | 300B |
OPT | 180B | 300B |
BLOOM | 341B | 366B |
LLAMA | >1T | >1T |
平替方案
ColossalAI框架,提供了在单张 GPU 上即可尝试的 ChatGPT 训练流程
- 对于基于 1.2 亿参数小模型的 ChatGPT 训练,最低仅需 1.62GB 显存,任意单张消费级 GPU 即可满足
- ChatGPT 提供了开源基础模型 GPT,OPT 和 BLOOM
预训练数据要求:
- 通过数据筛选以得到高质量数据。一个用更少但质量更高的数据集训练的预训练模型,可以在性能上超过另一个用更多的混合质量数据集训练的模型。
- 通过数据去重避免记忆和过拟合。去重有助于避免预训练模型多次面对相同的数据后记住它们或者在其上过拟合,因此有助于提高模型的泛化能力。
- 保证数据多样性以确保LLM的泛化性。包括领域多样性、格式多样性(例如:文本、代码和表格)和语言多样性。
训练三部曲:
- 阶段 1:监督微调 (SFT,也可以叫 Instruction tuning)解锁知识和涌现能力
- 收集各种NLP数据集,构造【指令+回复】语料;
- 使用构造的数据监督微调一个大模型,如 opt 1.3B、bloom 1.1B(中文);
阶段 2:训练奖励模型(RM do not with lora),评价文本生成的好坏
Second, given the fine-tuned model and a prompt, the model will generate several model outputs. A labeler gives the desired score and ranks the output to compose a comparison dataset, which is used to train the reward model.
给定微调模型和采样Prompts,预测生成多个模型输出,然后需要人工打分排序,以组成比较数据集,该数据集用于训练奖励模型。
- Prompts 的收集是个难题!可以考虑中英互译、爬虫知乎问答、已有 prompts 自己写答案…
- 阶段 3:通过强化学习让模型去拟合人的偏好
- Finally, the fine-tuned model (ChatGPT) is optimized against the reward model using the Proximal Policy Optimization (PPO) RL algorithm
- 最后,使用 PPO 针对训练有素的奖励模型对大模型进行微调,以使 LLM 与人类偏好保持一致
1、Instruction-tuning → SFT
这一阶段是对语言模型进行指令微调,使语言模型能够更好地遵循指令;
以下是英文的【指令+答案】数据集:
Modified from Traditional NLP | ||
---|---|---|
Datasets | Number of Tasks | Number of Instances |
Unnatural Inst. ⭐️75 | 117 | 64 k |
core_data.jsonl,包含 64k 个【指令-输入-输出】三元组,以及 full_data.jsonl,包含完整的240,670个不自然指令示例。 | ||
Super-Natural Inst. | 1613 | 5M |
Natural Inst v1.0 | 61 | 620 k |
Flan 2021 | 62 | 4.4M |
P3 | 62 | 12M |
UnifiedQA | 46 | 750k |
tatsu-lab/Alpaca | ||
gururise/Cleaned Alpaca |
Generated by LLMs | ||
---|---|---|
Datasets | Number of Tasks | Number of Instances |
GPT-3 Self-Instruct ⭐️180 | 41 k | 82 k |
data/gpt3-generations/batch_221203/all_instances_82K.jsonl:一共包含41K条指令,82K个实例输入和输出配对,调整重点是多轮对话、问答、分类、提取和摘要等几个任务data/finetuning/self_instruct_221203:干净的GPT3微调格式 (prompt + completion) ,这种格式是用于训练GPT3模型的一种特定的JSONL文件格式 | ||
alpaca_data | En | 52 k |
ColossalChat InstructionWild | En Zh | 104 k |
一阶段训练代码如下:
1 |
|
ps:机器为4卡,GPU型号是Tesla V100-PCIE 4卡 32G
ps:block_size相当于序列长度至多 512 否则 OOM,batch-size最大至多 3,学习率默认是 5e-5;
ps:训练 4 个 epoch
2、Reward Model Training
以下是用于训练奖励模型的英文数据集:
- Dataset Card for H4 Stack Exchange Preferences Dataset
- 来自 Stack Exchange 的1000多万个问题的问答数据集,带多个答案以及评分;
- Anthropic/hh-rlhf
- features: [‘chosen’, ‘rejected’]
- 160800 条训练数据, 8553 条测试数据
- —dataset Anthropic/hh-rlhf
- Dahoas/rm-static
- features: [‘prompt’, ‘response’, ‘chosen’, ‘rejected’]
- 76256 条训练数据,5103 条测试数据
- —dataset Dahoas/rm-static
1 |
|
注意:
①可能遇到如下问题。原因是我们 reward model 任务是一个回归任务,,而我们加载的是预训练语言模型 PLM(_AutoModelForCausalLM是在一系列token之后预测token的任务_),所以会提示我们加载模型的时候扔掉了一些不匹配/未使用的神经网络参数(比如:PLM 的预测 head 被扔掉了,同时随机初始化了一个回归任务的预测 head)https://zhuanlan.zhihu.com/p/403496010
1 |
|
②卡到No pre-built kernel is found, build and load the cpu_adam kernel during runtime now
的时候 删除这个/home/lhadmin/.cache/colossalai 文件夹就行
③单机多卡进行分布式(gemini)训练时会遇到错误,导致无法保存!改为zero2
1 |
|
④ 测试 reward model 效果,所有 input 的预测得分都一样?
解决:将opt350m 改为opt125m + 增大batch_size=8
3、PPO 训练
ColossalAI使用Hugging Face 的awesome-chatgpt-prompts作为训练数据,因此将此prompts.csv下载到工作文件夹。该测试使用一个小数据集,大约 100 个提示。1
2
3
4
5
6
7
8
9
10nohup python train_prompts.py data/prompts.csv --strategy naive --lora_rank 16 --model opt --pretrain opt_1b3_Selfdata_epoch4 --rm_path no_lora_rm_opt350m.pth --max_epochs 5 > logs/opt1b3Actor_RM_opt_ep5_Lora16_RL.log &
# 分布式训练要先切换编译器
scl enable devtoolset-7 bash
source ~/.bashrc
source activate xxenv
CUDA_VISIBLE_DEVICES=1,2 torchrun --standalone --nproc_per_node 2 train_prompts.py data/prompts.csv --strategy colossalai_zero2 --lora_rank 16 --model opt --pretrain opt_1b3_Selfdata_epoch4 --rm_path no_lora_rm_opt350m.pth --max_epochs 5
#rm_path lora_rm_model.pth是前一步训练好的reward model 地址 必须指定正确才能正常工作
- OPTActor.model = OPTForCausalLM
- OPTCritic.model = OPTModel OPTCritic.value_head = nn.Linear
- OPTRM.model = OPTModel OPTRM.value_head = nn.Linear
注意 1:ColossalAI的 ChatGPT 复现不包括 SFT 的训练部分。另外训练好的 Reward 模型暂时还不支持放到 RL 里面去用,需要自行解决。