大模型训练DeepSpeed

您所在的位置:网站首页 怎样打开feedback-hub 大模型训练DeepSpeed

大模型训练DeepSpeed

2023-04-22 09:08| 来源: 网络整理| 查看: 265

大模型训练入门实战

目录索引

▶︎allrunning... 第1章:DeepSpeed-Chat训练实战 1 DeepSpeed-Chat是什么? 2 开发环境安装 3 ChatGPT模型训练基本流程 4 代码与训练过程介绍 5 实战Step1:监督微调 6 实战Step2:Reward模型微调 7 实战Step3:RLHF训练 8 评价与测试 参考文献 第1章:DeepSpeed-Chat训练实战

本章内容介绍如何使用微软最新发布的 DeepSpeed Chat 来训练类 ChatGPT 的大模型。 通过本章内容,你将了解:

DS-Chat是什么? 如何准备运行环境 ChatGPT训练的基本知识 DS-Chat的使用方法

【观看视频解说】

1 DeepSpeed-Chat是什么?

【观看视频解说】

DeepSpeed-Chat是微软最新公布的一套工具,用于训练类ChatGPT模型。该工具基于微软的大模型训练工具DeepSpeed,使用它可以非常简单高效地训练自己的ChatGPT。该工具具有以下特点:

完整的训练类ChatGPT的代码:包括预训练模型下载、数据下载、InstructGPT训练过程和测试。 多种规模的模型:模型参数从1.3B到66B,即适合新手学习也可用于商用部署。 高效的训练:通过使用最新技术,如ZeRO和LoRA等技术改善训练过程,让训练过程更高效。例如,一个67亿(6.7B)参数的模型,使用8块A00只需要约5个小时就可以完成训练。 推理API:提供易于使用的推理API,方便进行对话式的交互测试。 2 开发环境安装

【观看视频解说】

前提条件:

推荐设置:Linux操作系统,GPU 24G以上显存,CUDA版本11.7 视频中的机器配置:Ubuntu 20.04, RTX 3090 24G, CUDA 11.7

安装步骤:

安装 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 运行环境 本实例中,使用基于Conda的运行环境来运行DS-Chat。下面的命令新建了名为Test01的运行环境,并在安装完成后使用 activate 命令激活此运行环境。最后,将运行环境的路径加入系统PATH和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 下载 DeepSpeedExamples 代码 DS-Chat 工具的代码位于 DeepSpeedExamples 仓库中。要下载其代码,请执行以下命令。如果尚未安装 git 命令,需要先安装 git。 下载完成后,切换到代码的目录下,使用pip命令安装所需要的开发库。 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

重新安装 pytorch(GPU版) 在我的环境中,按照上述步骤完成安装后,我得到的是 PyTorch 的 CPU 版本。然而,模型训练需要使用 GPU 版本。为了安装最新的 PyTorch 并指定 CUDA 版本为 11.7,可以执行以下命令: 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 版本编译通过。

3 ChatGPT模型训练基本流程

【观看视频解说】

ChatGPT 的训练过程共分为四个步骤:

a) 训练预训练模型,如 GPT-3.5 或 GPT-4; b) 监督微调(SFT:supervised finetuning)(对应 DS-Chat 中的 Step1); c) 奖励模型微调(RM:Reward model finetuning)(对应 DS-Chat 中的 Step2); d) 基于人类反馈的强化学习(RLHF:Reinforcement learning with human feedback)(对应 DS-Chat 中的 Step3)。

其中,阶段(a)的 GPT-3.5 或 GPT-4 预训练部分是计算量最大的阶段。这不仅需要大量的 GPU(几十到数百个),而且训练时间非常长(数月),因此通常只有大型企业才能进行训练。在本实例中,我们使用了 Facebook 公开的 opt 系列预训练模型,并主要针对 b、c、d 三个步骤进行训练。这三个步骤分别对应案例中的 Step 1、2、3。

4 代码与训练过程介绍

【观看视频解说】

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

主要参数 --step 1 2 3 --deployment-type single_gpu single_node multi_node 不同的type主要是参数的设置不同 --actor-model: "1.3b", "6.7b", "13b", "66b" 预训练模型,默认是1.3b的模型 --reward-model:使用的是 350m 的模型 其他参数,可以去参考train.py中的说明

配置脚本:training/step1_supervised_finetuning/training_scripts/single_node/run_1.3b.sh

train.py 程序会调用 run_1.3b.sh 来执行模型训练 un_1.3b.sh 中可以设置参数,并调用对应的 main.py 来开始模型训练

训练程序: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

5 实战Step1:监督微调

【观看视频解说】

任务说明: 使用标定的数据对预训练模型进行微调。

启动训练: 通过执行下面的命令,就可以开启模型的训练。 在执行以下命令以开始模型训练之前,请确保设置了 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 人类标注数据 模型训练: 模型训练完成之后会被存储在 output/actor-models/1.3b 下面。你可以通过 training.log 文件来查看训练的进度。

评价与测试: 打开文件 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

常见问题:

Q/A 1. 训练过程,无法找到GPU,或者GPU调用错误,可以尝试使用如下设置: export CUDA_VISIBLE_DEVICES=0,1 # 2块GPU export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 # 8块GPU Q/A 2. 训练过程,出现端口被占用的问题 通过以下命令来设置 MASTER_ADDR 和 MASTER_PORT,尤其是使用多个node来训练时, 必需要设置 MASTER_ADDR。 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 Q/A 3. 评价过程, 出现模型参数不匹配问题: model.decoder.embed_tokens.weight: found shape torch.Size([50272, 2048]) in the checkpoint and torch.Size([50265, 2048]) in the model ...

原因是由于模型被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) Q/A 4. 评价过程,出现 RuntimeError: CUDA out of memory 当对比较大的模型评价时,可能会碰到此问题。比如在32G GPU上使用13b的模型时,就曾出现此问题。 建议尝试使用 chat.py 命令(需要移动到 DeepSpeed-Chat 目录下),执行方式如下:python chat.py --path output/actor-models/1.3b 6 实战Step2:Reward模型微调

【观看视频解说】

任务介绍: 在第三步(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训练

训练数据:

单GPU训练时只使用了 Dahoas/rm-static 数据 多GPU训练使用了更多的数据: Dahoas/rm-static Dahoas/full-hh-rlhf Dahoas/synthetic-instruct-gptj-pairwise yitingxie/rlhf-reward-datasets openai/webgpt_comparisons stanfordnlp/SHP

评价与测试:

步骤如下:

打开文件 run_eval.sh 设置 --model_name_or_path 参数。 转移到目录 step2_reward_model_finetuning 下 执行:bash evaluation_scripts/run_eval.sh

常见错误:

Q/A 1. 与上面类似,通常会出现GPU内存不足错误 需要调整batch-size或者使用更多GPU训练。比如:在 run_350m.sh 文件中添加参数 --per_device_train_batch_size 8 将默认batch size从16修改为8,如果问题依然存在,可以进一步调小。 7 实战Step3:RLHF训练

【观看视频解说】

任务介绍: RLHF 是基于人类反馈的强化学习的缩写。根据官方介绍,此步训练面临两个主要挑战:

同时使用多个模型的内存消耗问题:此步训练不仅使用被训练的主模型,还使用奖励模型进行评分,因此会占用更多的 GPU 内存。 如何有效地生成答案:在 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/ 下。

常见问题:

Q/A 1. GPU内存不足时,在sh脚本中增加如下设置,调整batch size: --per_device_train_batch_size 8 --per_device_mini_train_batch_size=8 8 评价与测试

【观看视频解说】

使用 chat.py 命令(需要移动 DeepSpeed-Chat 目录下)进行评价与测试。 执行方式如下:

python chat.py --path output/step3-models/1.3b/actor

上面的程序可以启动13b的模型,但是66b的模型无法成功运行。

备注: 这套工具刚刚发布不久,最近作者和贡献者们还在频繁的更新中。 更多的信息,请关注其github仓库中的动态。

参考文献 [1] https://github.com/microsoft/DeepSpeedExamples [2] https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-chat/chinese [3] OPT论文: https://arxiv.org/abs/2205.01068


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3