Megatron模型并行研究

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_NODE=2,NNODES=1,表示使用一台服务器,两张卡。 需要修改以下内容。其中CHECKPOINT_PATH中并没有gpt2_2,因此模型将不从任何先前保存的检查点(checkpoint)开始,而是从随机初始化的参数开始训练。此外,目前单机双卡的checkpoint文件重载没问题,双机四卡的checkpoint重载有问题,因此尽量从头开始训练。要注意DATA_PATH不包含之前数据预处理生成的文件my-gpt2_text_document.bin和my-gpt2_text_document.idx的后缀。

CHECKPOINT_PATH=checkpoints/gpt2_2

VOCAB_FILE=data/gpt2-vocab.json

MERGE_FILE=data/gpt2-merges.txt

DATA_PATH=data/my-gpt2_text_document还需要修改tensor模型并行和pipeline模型并行的相关参数,在实验中我们并未启用数据并行,因此只需要确保WORLD_SIZE=tensor-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('arch=compute_90,code=sm_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_CONNECTIONS=1

export CUDA_DEVICE_ORDER="PCI_BUS_ID"

export NCCL_DEBUG=INFO

export NCCL_SOCKET_IFNAME=eth1,eno2

ⅱ. 在运行脚本.bash文件中修改变量

主节点地址:MASTER_ADDR="ip";

节点数(包含A和B两个节点):NNODES=2;

两个节点中运行脚本的唯一不同:A服务器作为主节点的NODE_RANK=0,83服务器作为副节点的NODE_RANK=1。

检查点的存储地址被命名为CHECKPOINT_PATH=checkpoints/gpt2_tp_2_pp_2,表示以张量并行度为2,流水线并行度为2对gpt2模型进行预训练。

ⅲ. 为验证主节点和副节点是否都参与了模型的预训练,设置 --save-interval 1000 \,观察checkpoint的保存情况。

ⅳ. 打开防火墙端口以便双机通信,在终端输入以下命令:

sudo firewall-cmd --zone=public --add-port=33000-65000/tcp --permanent

sudo firewall-cmd --reload

ⅴ. 为保证服务器安全,实验结束后需要关闭端口,在终端输入以下命令:

sudo firewall-cmd --zone=public --remove-port=33000-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_0,Rank1负责另一半sub_model_0;Rank2负责一半sub_model_1,Rank3负责另一半sub_model_1。上图中,绿色线条表示两个GPU都共同负责某个具体的sub_model。

c. 实验结果

d. 实验结论

增加模型的并行度能更加节省GPU显存的用量;但由于模型并行度的提高会增加通信开销,降低计算效率,因此处理样本的效率大大下降了;在模型能加载到GPU进行训练时,尽量减少模型并行的GPU数量,而应该利用数据并行增加batch size,提高训练效率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/238997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中升级属性复制转换功能

前言 在java中,经常碰到bean之间的转换,诸如Entity转VO,Entity转DTO等等,这时,经常会碰到这样一种情况,VO和DTO里面有一个字段都是来源于Entity里面,但是属性名称和属性类型都不一样,虽然转换逻辑一致但是我们还是只能手动转换,这时如果我在代码中手动转换会出现很多多…

基于SSM的旅游网站设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

设计模式:循序渐进走入工厂模式

文章目录 前言一、引入二、简单工厂模式1.实现2.优缺点3.扩展 三、工厂方法模式1.实现2.优缺点 四、抽象工厂模式1.实现2.优缺点3.使用场景 五、模式扩展六、JDK源码解析总结 前言 软件设计模式之工厂模式。 一、引入 需求:设计一个咖啡店点餐系统。 设计一个咖啡类…

设计模式-门面模式

设计模式专栏 模式介绍模式特点应用场景门面模式和代理模式的区别代码示例Java实现门面模式Python实现门面模式 门面模式在spring中的应用 模式介绍 门面模式是一种常用的软件设计模式,也称为外观模式。它提供了一个高层次的接口,将一个子系统的外部与内…

卡通动漫AI绘画视频风格化AI智能PR插件StyleX免费下载

带有AI的视频风格化工具PR AI智能绘画插件。将视频转换为卡通、绘图、绘画、半色调和许多其他风格。 性能高度依赖GPU,一些旧的GPU卡(2012年之前)不受支持。 StyleX是一款先进的视频风格化工具,采用AI技术,它不仅可以将…

代码随想录第三十八天(一刷C语言)|零钱兑换II组合总数和 IV

创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。 一、零钱兑换II 思路:参考carl文档 1、确定dp数组以及下标的含义:凑成总金额j的货币组合数为dp[j]。 2、确定递推公式:dp[j] 就是所有的dp[j - coins[i…

仿悬赏猫任务平台源码 悬赏任务系统源码 带支付接口

源码介绍 最新仿悬赏猫任务平台源码 悬赏任务系统源码 带支付接口, 全新开发悬赏任务系统,功能齐全,包含接任务,发布任务, 店铺关注,置顶推荐,排行榜,红包大厅,红包抽奖…

深信服AF防火墙升级步骤(简单粗暴)

设备当前版本:AF8.0.75 升级升级后版本:AF8.0.85 官方发行:内容比较多,找设备当前版本在不在支持升级的列表即可 8.0.75是可以直接升到8.0.85的 升级前注意事项: 升级是需要重启设备的,会断网&#xff…

两种方法解决win10开机慢,经验分享

方法一: 1、按快捷键“winR”打开 运行窗口。 2、这时候输入“msconfig”后 ,点击“确定”或者按“ENTER”键。 3、这时候会打开一个名为“系统配置”的窗口, 在“常规”选项框下 勾选“有选择的启动”下的“加载系统服务”和“加载启动项”。…

C语言的scanf输入函数的介绍分享

各位少年: 我来分享一个输入函数,scanf函数 是输入的函数,scanf(“参数1”,参数2);好,我们接着看代码的例子 int main() { int score0; printf("请输入成绩:"); scanf("%d",&sco…

Android应用-flutter使用Positioned将控件定位到底部中间

文章目录 场景描述示例解释 场景描述 要将Positioned定位到屏幕底部中间的位置,你可以使用MediaQuery来获取屏幕的高度,然后设置Positioned的bottom属性和left或right属性,一般我们left和right都会设置一个值让控制置于合适的位置&#xff0…

【Amazon 实验②】Amazon WAF功能增强之使用Cloudfront、Lambda@Edge阻挡攻击

文章目录 一、方案介绍二、架构图三、部署方案1. 进入Cloud9 编辑器,新打开一个teminal2. 克隆代码3. 解绑上一个实验中Cloudfront 分配绑定的防火墙4. 使用CDK部署方案5. CDK部署完成6. 关联LambdaEdge函数 四、方案效果 一、方案介绍 采用 LambdaEdge DynamoDB 架…

第一部分 数理逻辑

目录 什么是命题 注意: 例1 下列句子中那些是命题? 联结词 例2 将下列命题符号化. 注意: 例4 设 p:天冷,q:小王穿羽绒服,将下列命题符号化 例5 求下列复合命题的真值 例如 真值表: 例&#xff1…

OpenHarmony 4.0 Release发布,同步升级API 10

不久之前,OpenHarmony 正式发布了4.0 版本,开发套件也同步升级到 API 10。相比 3.2 Release 版本,4.0 版本新增 4000 多个 ArkTS API,应用开发能力更加丰富;HDF 新增 200 多个 HDI 接口,硬件适配更加便捷&a…

深度学习数据处理(一)

在PyTorch中,torch.Tensor是存储和变换数据的主要工具。如果你之前用过NumPy,你会发现Tensor和NumPy的多维数组非常类似。然而,Tensor提供GPU计算和自动求梯度等更多功能,这些使Tensor更加适合深度学习。 张量(tensor&…

基于ssm+jsp理发店管理系统源码和论文

随着信息化时代的到来,管理系统都趋向于智能化、系统化,理发店管理系统也不例外,但目前国内的市场仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,人工管理显然已无法应对时代的变化&#xff0…

【万能技巧】IP知识速通与小技巧~

本文目录 前言一、网络代理IP简介二、IPIDEA 优势2.1 多种类型IP代理2.2 海量纯净代理池2.3 稳定高效数据收集架构 三、IP实操小Tips3.1 查看本地网络IP3.2 使用浏览器IP3.3 使用IPIDEA进行爬虫实操 前言 各位友友,大家好,马上就到2024年了,…

[Angular] 笔记 6:ngStyle

ngStyle 指令: 用于更新 HTML 元素的样式。设置一个或多个样式属性&#xff0c;用以冒号分隔的键值对指定。键是样式名称&#xff0c;带有可选的 .<unit> 后缀&#xff08;如 ‘top.px’、‘font-style.em’&#xff09;&#xff0c;值为待求值的表达式&#xff0c;得到…

【泛型中K T V E? Object等分别代表什么含 义】

✅ 泛型中K T V E? Object等分别代表什么含义 ✅ 典型解析✅代码示例 ✅ 典型解析 E - Element (在集合中使用&#xff0c;因为集合中存放的是元素) T-Type (Java 类) K- Key (键) V - Value (值) N - Number (数值类型) ? - 表示不确定的iava类型 (无限制通配符类型) …

鸿蒙和各大厂合作,是不是要火起来

今年9月底&#xff0c;在华为秋季全场景新品发布会上&#xff0c;华为常务董事、终端BG CEO余承东宣布&#xff0c;鸿蒙原生应用全面启动&#xff0c;HarmonyOS NEXT开发者预览版将在2024年第一季度开放。 近日&#xff0c;腾讯、阿里、美团、网易&#xff0c;外包大厂中软国际…