ChatGPT复现总结

复现ChatGPT的难点与平替
复现和使用GPT-3/ChatGPT,我们应该注意什么?

1.3B的模型+RLHF就可以很强,在真正的落地中,训一个for单一生成任务的定制化ChatGPT不再那么遥不可及,一两张A100和十万级别的数据就可以了——《追赶ChatGPT的难点与平替》

在人力、算力、时间有限的情况下,效率最优的路径是直接在1.3B模型上迭代,大概10万标注数据,复现一个低配小型ChatGPT,验证整个流程的有效性,再去做175B的模型。——《追赶ChatGPT的难点与平替

LLM 资源

预训练语料库的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

这一阶段是对语言模型进行指令微调,使语言模型能够更好地遵循指令;

https://github.com/zhilizju/Awesome-instruction-tuning

以下是英文的【指令+答案】数据集

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
2
3
4
5
6
7
nohup python -u run_clm_no_trainer.py --train_file data/all_instances_82K.csv  --model_name_or_path /data/voiceprint2/FlexGen-main/opt-iml-max-1.3b  --block_size 512 --per_device_train_batch_size 2 --per_device_eval_batch_size 2 --num_train_epochs 4 --output_dir opt_1b3_Selfdata_epoch4 --learning_rate 2e-5 > logs/finetune_onSelfInstruct_opt1b3.log &

# 添加梯度累计
python -u run_clm_no_trainer.py --train_file data/all_instances_82K.csv --model_name_or_path /data/voiceprint2/FlexGen-main/opt-iml-max-1.3b --block_size 512 --per_device_train_batch_size 2 --per_device_eval_batch_size 2 --num_train_epochs 4 --output_dir opt_1b3_Selfdata_epoch4 --learning_rate 2e-5 --gradient_accumulation_steps 15

# Lora (SFT效果会变差?)
CUDA_VISIBLE_DEVICES=2 nohup python train_sft.py --dataset data/gpt3_generations.csv --strategy naive --model opt --pretrain /data/voiceprint2/FlexGen-main/opt-iml-max-1.3b --max_epochs 4 --batch_size 8 --lora_rank 16 > logs/finetune_onSelfInstruct_opt1b3.log &

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
2
3
4
5
6
7
8
nohup python -u train_reward_model.py --strategy naive --pretrain facebook/opt-125m --model opt --dataset Anthropic/hh-rlhf --save_path no_lora_rm_opt125m.pth --loss_fn log_sig --max_epochs 4 --batch_size 8 > logs/opt_rm.log &

# 分布式训练要先切换编译器
scl enable devtoolset-7 bash
source ~/.bashrc
source activate xxenv

CUDA_VISIBLE_DEVICES=0,1 nohup torchrun --standalone --nproc_per_node 2 train_reward_model.py --strategy colossalai_zero2 --pretrain facebook/opt-350m --dataset Anthropic/hh-rlhf --save_path no_lora_rm_opt350m.pth --loss_fn log_sig --max_epochs 2 --batch_size 8 > logs/opt_rm.log &

注意:

①可能遇到如下问题。原因是我们 reward model 任务是一个回归任务,,而我们加载的是预训练语言模型 PLM(_AutoModelForCausalLM是在一系列token之后预测token的任务_),所以会提示我们加载模型的时候扔掉了一些不匹配/未使用的神经网络参数(比如:PLM 的预测 head 被扔掉了,同时随机初始化了一个回归任务的预测 head)https://zhuanlan.zhihu.com/p/403496010

1
Some weights of the model checkpoint at facebook/opt-125m were not used when initializing OPTModel: ['lm_head.weight']

②卡到No pre-built kernel is found, build and load the cpu_adam kernel during runtime now
的时候 删除这个/home/lhadmin/.cache/colossalai 文件夹就行

③单机多卡进行分布式(gemini)训练时会遇到错误,导致无法保存!改为zero2

1
2
3
4
5
# torch.save(trainer.model)

NotImplementedError
WARNING:torch.distributed.elastic.multiprocessing.api:Sending process 17278 closing signal SIGTERM
ERROR:torch.distributed.elastic.multiprocessing.api:failed (exitcode: 1) local_rank: 1 (pid: 17279) of binary: /usr/local/anaconda3/envs/nlp_env39/bin/python

④ 测试 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
10
nohup 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 里面去用,需要自行解决。


ChatGPT复现总结
http://example.com/2023/03/02/2023-03-02-ChatGPT复现总结/
作者
Ning Shixian
发布于
2023年3月2日
许可协议