大模型训练入门实战
目录索引
本章内容介绍如何使用微软最新发布的 DeepSpeed Chat 来训练类 ChatGPT 的大模型。
通过本章内容,你将了解:
DeepSpeed-Chat是微软最新公布的一套工具,用于训练类ChatGPT模型。该工具基于微软的大模型训练工具DeepSpeed,使用它可以非常简单高效地训练自己的ChatGPT。该工具具有以下特点:
前提条件:
安装步骤:
安装 conda
下载地址:https://www.anaconda.com/products/distribution
安装方法的视频介绍(Linux版):https://www.youtube.com/watch?v=lOVObb9MGBc&t=16s
配置 CUDA 环境
确认你的CUDA安装路径,比如/usr/local/cuda-11.7
,在命令行终端执行以下命令,设置CUDA环境:
export CUDA_HOME=/usr/local/cuda-11.7
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
conda create -n Test01 python=3.10 anaconda
conda activate Test01
# 将conda环境加入PATH和LD_LIBRARY_PATH中,从而可以优先利用conda安装的程序
export LD_LIBRARY_PATH=~/anaconda3/envs/Test01/lib/:$LD_LIBRARY_PATH
export PATH=~/anaconda3/envs/Test01/bin:$PATH
conda install git
git clone https://github.com/microsoft/DeepSpeedExamples.git
cd DeepSpeedExamples/applications/DeepSpeed-Chat/
# 安装依赖
pip install -r requirements.txt
最近这个开发库更新得非常频繁,所以你下载的最新版本可能与我在视频中介绍的内容不一致。以下是视频中所使用的版本:
https://github.com/TechDIYLife/DeepSpeedExamples20230415.git
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
常见问题:
Q/A 1. 第一步(Step1)编译不通过,提示 GCC 和 G++ 版本问题:
如果你使用的是 CUDA 10.2(不推荐,因为 Step3 无法通过编译),可以选择将 GXX 的版本降到 8.5.0:
conda install -c conda-forge gxx==8.5.0
Q/A 2. 第三步(Step3)编译不通过:
这很可能是因为你的 CUDA 版本较旧。建议升级 PyTorch 和 CUDA。在我的环境中,PyTorch 1.12.1 + CUDA 10.2 时编译失败,而 PyTorch 2.0 和 CUDA 11.7 版本编译通过。
Q/A 3. 如何检查PyTorch是GPU还是CPU版?
可以参考使用以下命令:
python
>>> import torch
>>> torch.cuda.is_available()
True
>>> torch.cuda.device_count()
1
>>> torch.cuda.current_device()
0
>>> torch.cuda.device(0)
<torch.cuda.device at 0x7efce0b03be0>
>>> torch.cuda.get_device_name(0)
'GeForce GTX 950M'
Q/A 4. Step1第一次运行时,出现GCC版本过低的问题
错误信息:
Your compiler (c++ 4.8.5) may be ABI-incompatible with PyTorch!
Please use a compiler that is ABI-compatible with GCC 5.0 and above.
See https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html.
解决方法:
conda install -c conda-forge gxx==10.3.0 # 我安装时,要求版本不能高于11
Q/A 5. RuntimeError: Ninja is required to load C++ extensions
解决方法,安装ninja
安装方法: pip install ninja #安装快, 推荐
也可以参考: conda install -c conda-forge ninja
分布式训练时,需要确认是否真的将PATH,LD_LIBRARY_PATH,CUDA_HOME等环境便利传递到其他节点
如何还有问题,可以清除缓存后再试:删除 ~/.cache/torch_extensions
目录下的缓存文件
Q/A 5. 如何使用mpirun启动程序
DeepSpeed支持多种的多节点的训练启动方式,可以参考安装以下工具:
conda install -c conda-forge mpi4py
conda install -c conda-forge openmpi
conda install -c anaconda openmpi
conda install -c pkgs/main openmpi
**Q/A 6. Conda安装库时出现inconsistent问题
conda update -n YOUR_ENV_NAME -c defaults anaconda --force
参考:https://github.com/conda/conda/issues/8490
ChatGPT 的训练过程共分为四个步骤:
其中,阶段(a)的 GPT-3.5 或 GPT-4 预训练部分是计算量最大的阶段。这不仅需要大量的 GPU(几十到数百个),而且训练时间非常长(数月),因此通常只有大型企业才能进行训练。在本实例中,我们使用了 Facebook 公开的 opt 系列预训练模型,并主要针对 b、c、d 三个步骤进行训练。这三个步骤分别对应案例中的 Step 1、2、3。
DS-chat代码位于 applications/DeepSpeed-Chat 目录下,下面是主要程序的结构,详细解释请观看视频中的解说:
- train.py # 入口程序
- training # 训练脚本
- step1_supervised_finetuning # 第一步训练
- evaluation_scripts # 第一步训练完成后评价用
- training_scripts # 模型训练脚本
- README.md # 说明文档
- main.py # 主程序,训练过程的实现细节
- prompt_eval.py # 评价主程序
- step2_reward_model_finetuning # 第二步训练
- 省略
- step3_rlhf_finetuning # 第三步训练
- 省略
- utils 模型训练,评价的相关函数库
- inference # 测试,评价代码
模型训练调用过程(以1.3b模型为例)
入口程序: train.py
配置脚本:training/step1_supervised_finetuning/training_scripts/single_node/run_1.3b.sh
训练程序:training/step1_supervised_finetuning/main.py
核心训练脚本,主要功能如下:
评价与测试用程序:prompt_eval.py
用于测试训练后的模型,并提供了微调前后的对比。
Facebook opt系列模型
本实例中使用的预训练模型是 facebook opt系列模型,根据OPT论文介绍,OPT-175B模型与GPT-3有类似的性能。
OPT:Open Pre-trained Transformer Language Models
论文地址:https://arxiv.org/abs/2205.01068
模型在Huggingface上的地址:
https://huggingface.co/facebook/opt-125m
https://huggingface.co/facebook/opt-350m
https://huggingface.co/facebook/opt-1.3b
https://huggingface.co/facebook/opt-6.7b
https://huggingface.co/facebook/opt-13b
https://huggingface.co/facebook/opt-30b
https://huggingface.co/facebook/opt-66b
如果要使用最大的175B的模型,需要申请,获得授权后才能使用。
申请地址:https://forms.gle/dag8g7nKiR4o4VZq5
任务说明: 使用标定的数据对预训练模型进行微调。
启动训练:
通过执行下面的命令,就可以开启模型的训练。 在执行以下命令以开始模型训练之前,请确保设置了 CUDA 并激活了 conda 运行环境(请参考【2 开发环境安装】)。
python3 train.py --step 1 --deployment-type single_gpu #单GPU训练
python3 train.py --step 1 --deployment-type single_node #多GPU训练
python3 train.py --step 1 --deployment-type multi_node #多Node训练
在上述三种方式中,single_gpu 只适合训练较小的模型,而 single_node 和 multi_node 更适合训练较大的模型。第一次运行时,建议使用 single_gpu,因为在这种模式下,输出的错误信息会更详细。如果遇到 GPU 内存不足的问题,可以尝试使用 single_node 和 multi_node 来训练。如果问题仍然存在,需要手动调整 batch-size。
此步骤主要进行:
~/.cache/huggingface/hub/models--facebook--opt-1.3b
Dahoas/rm-static # 对话(prompt,response,chosen,rejected)
Dahoas/full-hh-rlhf # 对话(prompt,response,chosen,rejected)
Dahoas/synthetic-instruct-gptj-pairwise #对话(prompt,chosen,rejected)
yitingxie/rlhf-reward-datasets # 对话(prompt,chosen,rejected)
openai/webgpt_comparisons # 带人工打分的数据,comparisons with human feedback,19,578 comparisons)
stanfordnlp/SHP # 18个领域的385k 人类标注数据
评价与测试:
打开文件 run_prompt.sh
添加 baseline 模型,和 finetune 后的模型:
export CUDA_VISIBLE_DEVICES=0
python prompt_eval.py \
--model_name_or_path_baseline facebook/opt-1.3b \
--model_name_or_path_finetune ../../output/actor-models/1.3b
评价程序会调用 prompt_eval.py
来分别输出 baseline 和 finetune 后模型的结果。
要执行此代码,需要切换到 step1_supervised_finetuning 目录下。
cd training/step1_supervised_finetuning
bash evaluation_scripts/run_prompt.sh
常见问题:
export CUDA_VISIBLE_DEVICES=0,1 # 2块GPU
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 # 8块GPU
export MASTER_ADDR=127.0.0.1 # 多node时,需要设置为主node的IP或者机器名
export MASTER_PORT=29701
以上设置,也可以在 run1.3b.sh
文件中进行设置,例如:
CUDA_VISIBLE_DEVICES=0,1 deepspeed --master_addr=127.0.0.1 --master_port=29701 main.py
原因是由于模型被finetune以后,Token对应的词典数量发生了变化,导致输入数据维度变化了(这应该是个bug,在输入端应尽量保持与预训练模型一致)。应对方法,打开文件 prompt_eval.py,增加新的 config 读取脚本,并把来源模型从 baseline 模型中修改为finerune后的模型:
config = AutoConfig.from_pretrained(args.model_name_or_path_finetune) # 新增
model_fintuned = get_model(config, args.model_name_or_path_finetune, tokenizer)
chat.py
命令(需要移动到 DeepSpeed-Chat 目录下),执行方式如下:python chat.py --path output/actor-models/1.3b
任务介绍: 在第三步(Step3)中,强化学习阶段需要使用奖励模型。奖励模型会对模型生成的答案进行打分,Step3 的强化训练会根据这些分数对模型进行优化,从而使最终模型生成更高分的答案。奖励模型同样基于预训练模型进行训练,在这里我们使用了 350M 的 opt 模型。
启动训练:
启动训练方法与前面类似:
python3 train.py --step 2 --deployment-type single_gpu #单GPU训练
python3 train.py --step 2 --deployment-type single_node #多GPU训练
python3 train.py --step 2 --deployment-type multi_node #多Node训练
训练数据:
Dahoas/rm-static
Dahoas/full-hh-rlhf
Dahoas/synthetic-instruct-gptj-pairwise
yitingxie/rlhf-reward-datasets
openai/webgpt_comparisons
stanfordnlp/SHP
评价与测试:
步骤如下:
--model_name_or_path
参数。step2_reward_model_finetuning
下bash evaluation_scripts/run_eval.sh
常见错误:
任务介绍:
RLHF 是基于人类反馈的强化学习的缩写。根据官方介绍,此步训练面临两个主要挑战:
在此实例中,通过将 DeepSpeed 训练和推理功能整合为一个统一的混合引擎(Hybrid Engine)来应对这些挑战。更多详细信息可以参考官方说明。
在此步骤首次运行时,会安装并编译新的工具(transformer_inference)。如果编辑过程出现问题,建议升级 PyTorch 和 CUDA 版本。在我的环境下,使用 PyTorch 2.0 和 CUDA 11.7 下可以成功编译。
启动训练:
python3 train.py --step 3 --deployment-type single_gpu #单GPU训练
python3 train.py --step 3 --deployment-type single_node #多GPU训练
python3 train.py --step 3 --deployment-type multi_node #多Node训练
此步训练后的模型被存储在 output/step3-models/1.3b/
下。
常见问题:
--per_device_train_batch_size 8 --per_device_mini_train_batch_size=8
使用 chat.py
命令(需要移动到 DeepSpeed-Chat 目录下)进行评价与测试。 执行方式如下:
python chat.py --path output/step3-models/1.3b/actor
上面的程序可以启动13b的模型,但是66b的模型无法成功运行。
备注:
这套工具刚刚发布不久,最近作者和贡献者们还在频繁的更新中。
更多的信息,请关注其github仓库中的动态。