查看网站是否被k,零基础网络工程师培训,创建网站需要多少资金,wordpress 登陆后跳转Megatron模型并行研究
1. 技术调研
a. Megatron-LM
Megatron-LM针对的是特别大的语言模型#xff0c;使用的是模型并行的训练方式。但和普通的模型并行不同#xff0c;他采用的其实是张量并行的形式#xff0c;具体来说就是将一个层切开放到不同的GPU上#xff0c;属于层…Megatron模型并行研究
1. 技术调研
a. Megatron-LM
Megatron-LM针对的是特别大的语言模型使用的是模型并行的训练方式。但和普通的模型并行不同他采用的其实是张量并行的形式具体来说就是将一个层切开放到不同的GPU上属于层切的方法是一种层内的模型并行。
除了张量并行外Megatron-LM也提供了流水线并行的模型训练形式。流水线并行水平划分模型按照层对模型进行划分将大模型划分为一个个子模型不同的流水线并行组负责不同的小模型是一种层并行方式。
b. 模型简介GPT2-345m
GPT2是一种非常强大的自然语言处理模型广泛应用于各种自然语言处理任务中。其参数规模非常大这使得它能够处理更复杂的任务和生成更自然的文本。不同版本的GPT之间的差异在于参数数量和性能具体如下表所示。考虑到现有的实验环境带来的限制为了使得测试实验能够顺利进行我们在Megatron-LM单机并行实验中采用参数量较小的GPT2-345m模型进行预训练。 c. 数据集简介oscar
与用于有监督精调的数据格式不同用于预训练的oscar数据并不以问答对的形式出现。oscar的原始文本数据以JSONL格式每行一个JSON对象存储每个JSON对象包含了一个“id”字段和一个“text”字段。其中“id”字段存储一个样本编号“text”字段存储一段文本如下表所示。 2. Megatron-LM单机双卡的模型并行预训练实验
该实验基于gpt2的预训练进行的使用的虚拟环境为peft共跑通了两组模型并行实验分别为张量并行实验和流水线并行实验其模型并行度的设置如下
Tensor并行--tensor-model-parallel-size 2 \ --pipeline-model-parallel-size 1 \
Pipeline并行--tensor-model-parallel-size 1 \ --pipeline-model-parallel-size 2 \
a. 如何运行脚本文件
ⅰ. checkpoints文件的下载
输入以下命令即可下载wget --content-disposition https://api.ngc.nvidia.com/v2/models/nvidia/megatron_lm_345m/versions/v0.0/zip -O megatron_lm_345m_v0.0.zip。 然后将该文件存储并解压在checkpoints文件夹中但我在实验中并未用到该文件因为该文件对应的是单机单卡预训练模型生成的checkpoint文件与本实验中的模型并行度不匹配因此不可用。此外由于该文件夹太大因此git并未对该文件夹进行track也没有push到仓库中去需要用时需下载。
ⅱ. 数据预处理
下列代码中主要是下载了预训练所需要的数据所有相关数据都存储在data文件夹中。此处参考了CSDN上的教程Megatron-Deepspeed 预训练 GPT-小白踩坑与解决-CSDN博客该教程使用了OSCAR数据集作为预训练的原始数据。 数据下载完毕后使用preprocess_data.py进行数据预处理。在终端输入如下命令其中output-prefix是数据预处理生成文件的前缀在本文的例子中数据预处理后生成的文件被命名为my-gpt2_text_document.bin和my-gpt2_text_document.idx。
wget https://huggingface.co/bigscience/misc-test-data/resolve/main/stas/oscar-1GB.jsonl.xz
wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-vocab.json
wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-merges.txt
xz -d oscar-1GB.jsonl.xz
python tools/preprocess_data.py \
--input oscar-1GB.jsonl \
--output-prefix my-gpt2 \
--vocab-file gpt2-vocab.json \
--dataset-impl mmap \
--tokenizer-type GPT2BPETokenizer \
--merge-file gpt2-merges.txt \
--append-eod \
需要注意的是由于此外由于data文件夹太大因此git并未对该文件夹进行track也没有push到仓库中去需要用时需下载。
ⅲ. 修改pretrain_gpt_distributed_with_mp.sh
要对gpt2进行预训练只需对pretrain_gpt_distributed_with_mp.sh进行修改该文件位于/home/Megatron-LM-main/目录下。 需要修改GPUS_PER_NODE2NNODES1表示使用一台服务器两张卡。 需要修改以下内容。其中CHECKPOINT_PATH中并没有gpt2_2因此模型将不从任何先前保存的检查点checkpoint开始而是从随机初始化的参数开始训练。此外目前单机双卡的checkpoint文件重载没问题双机四卡的checkpoint重载有问题因此尽量从头开始训练。要注意DATA_PATH不包含之前数据预处理生成的文件my-gpt2_text_document.bin和my-gpt2_text_document.idx的后缀。
CHECKPOINT_PATHcheckpoints/gpt2_2
VOCAB_FILEdata/gpt2-vocab.json
MERGE_FILEdata/gpt2-merges.txt
DATA_PATHdata/my-gpt2_text_document还需要修改tensor模型并行和pipeline模型并行的相关参数在实验中我们并未启用数据并行因此只需要确保WORLD_SIZEtensor-model-parallel-size * pipeline-model-parallel-size。
--tensor-model-parallel-size 2 \
--pipeline-model-parallel-size 1 \
ⅳ. 直接在终端运行./pretrain_gpt_distributed_with_mp.sh即可。
b. 环境安装的相关问题
ⅰ. apex安装
首先不能直接pip下载否则会下载一个同名包apex那并不是Megatron-LM框架需要的
行不通从https://github.com/NVIDIA/apex下载压缩包.zip再进行解压安装
该压缩包代码和github上的最新版本有出入查看了setup.py文件才知道压缩包代码内根本没有关于构建fused_weight_gradient_mlp_cuda模块的部分因此后续会报错。
正确git clone https://github.com/NVIDIA/apex
git clone下载NVIDIA/apex可能会有超时问题可以通过以下命令解决超时问题
git clone超时git config --global url.https://github.com.insteadOf git://github.com
再执行一次git clone
然后cd apex
关键这个包的最新版本有很多问题比如安装时报错缺少模块packaging、torch此时这些模块需要重新使用conda命令安装但我们没必要这么做只需要回退到旧版本
git checkout 6943fd26e04c59327de32592cf5af68be8f5c44e这个版本是在issue里面找到的没有问题可以放心使用。
关键pip install -v --no-cache-dir --global-option--cpp_ext --global-option--cuda_ext ./这其中的一些选项其实是对将要要构建模块的一些选择。如果像网上那样用些python3 setup.py之类的命令来安装包构建出来的模块会少很多运行代码时各种报错比如amp_C模块的缺失。因此对于这种比较麻烦的包安装前需要查看README.md文件。 ⅱ. GPU架构问题报错nvcc fatal: Unsupported gpu architecture ‘compute_90‘
在Megatron-LM/megatron/fused_kernels/__init__.py注释掉以下三行即可
# if int(bare_metal_minor) 7:
# cc_flag.append(-gencode)
# cc_flag.append(archcompute_90,codesm_90)
c. 实验结果 d. 实验结论
从上表我们可以得出如下结论
张量并行的训练方式更加节省GPU显存的用量流水线并行相较于张量并行其通信开销要更小因此在单节点中每秒钟处理的样本数更多处理样本的效率更高。
3. Megatron-LM双机四卡的模型并行预训练实验
是以A服务器为主节点B服务器为副节点基于gpt2的预训练进行的使用的虚拟环境为peft张量并行度和流水线并行度设置如下
--tensor-model-parallel-size 2 \
--pipeline-model-parallel-size 2 \
a. 如何运行脚本文件
多机并行是在单机并行的基础上进行的因此要运行多机并行的脚本文件请先参考Megatron-LM模型并行研究的第2小节中的a完成其中的操作再配置接下来的部分。
ⅰ. NCCL环境变量的配置
多机并行需要在运行脚本.bash文件中加上下列NCCL相关环境变量的配置。与DeepSpeed实验中的的相关配置类似
export CUDA_DEVICE_MAX_CONNECTIONS1
export CUDA_DEVICE_ORDERPCI_BUS_ID
export NCCL_DEBUGINFO
export NCCL_SOCKET_IFNAMEeth1,eno2
ⅱ. 在运行脚本.bash文件中修改变量
主节点地址MASTER_ADDRip
节点数包含A和B两个节点NNODES2
两个节点中运行脚本的唯一不同A服务器作为主节点的NODE_RANK083服务器作为副节点的NODE_RANK1。
检查点的存储地址被命名为CHECKPOINT_PATHcheckpoints/gpt2_tp_2_pp_2表示以张量并行度为2流水线并行度为2对gpt2模型进行预训练。
ⅲ. 为验证主节点和副节点是否都参与了模型的预训练设置 --save-interval 1000 \观察checkpoint的保存情况。
ⅳ. 打开防火墙端口以便双机通信在终端输入以下命令
sudo firewall-cmd --zonepublic --add-port33000-65000/tcp --permanent
sudo firewall-cmd --reload
ⅴ. 为保证服务器安全实验结束后需要关闭端口在终端输入以下命令
sudo firewall-cmd --zonepublic --remove-port33000-65000/tcp --permanent
sudo firewall-cmd --reload
b. 模型并行图示 实验过程中共有两个节点参与实验分别为A和B其中A为主节点每个节点有2个GPU共计4个GPU。4个GPU的编号分别为Rank0、Rank1、Rank2、Rank3。在实验中设置流水线并行度为2张量并行度为2。流水线并行会将整个模型划分为2份这里称为sub_model_0和sub_model_1。每连续的2张GPU负责一个sub_model。即上图中相同颜色的GPU负责相同的sub_model。张量并行会针对流水线并行中的sub_model来进行张量的拆分。即Rank0负责一半sub_model_0Rank1负责另一半sub_model_0Rank2负责一半sub_model_1Rank3负责另一半sub_model_1。上图中绿色线条表示两个GPU都共同负责某个具体的sub_model。
c. 实验结果 d. 实验结论 增加模型的并行度能更加节省GPU显存的用量但由于模型并行度的提高会增加通信开销降低计算效率因此处理样本的效率大大下降了在模型能加载到GPU进行训练时尽量减少模型并行的GPU数量而应该利用数据并行增加batch size提高训练效率。