Transformer模型分布式并行通信量浅析

1.数据并行DP(朴素数据并行,Zero数据并行之后补充)

O ( h 2 ∗ l ) O(h^2*l) O(h2l)
每台机器做完自己的梯度后需要做一次All reduce操作来累积梯度,故一个batch计算发送的数据量为每层梯度大小 h 2 h^2 h2乘以层数 l l l

优点:运用简单,效率高,计算和通讯之间可以做异步。
缺点:有时候单个GPU无法容纳下整个大模型做训练。

流水线并行PP(Gpipe)

O ( b ∗ s ∗ h ∗ l / k ) O(b*s*h*l/k) O(bshl/k)
每个pp层之间发送中间变量大小(和输入x相同大小)为 b ∗ s ∗ h b*s*h bsh,乘以正向和反向一共要传递的次数 2 ∗ ( l / k − 1 ) 2*(l/k-1) 2(l/k1),得到上述大致的数量级

优点:通讯量小,数据无关。
缺点:要保证模型能均匀切分,否则会影响性能。需要用到重计算,来支持更大的批量 b b b,从而保证流水能发挥作用。反传之前需要等待所以微批量计算。

张量模型并行TMP

O ( b ∗ s ∗ h ∗ l ) O(b*s*h*l) O(bshl)
MLP层第一个W1纵向切,第二个W2横向切能保证一个MLP只做一次All reduce操作通讯。同理attn根据头数来切分投影层。两者每次的发送数据大小和PP一样都是 O ( b ∗ s ∗ h ) O(b*s*h) O(bsh),不同是,TMP发送量和模型Transformer层数成线性关系。

优点:能切分很大的Transformer模型。
缺点:通讯量大,且通信一般只在节点内部的多卡通讯,不做跨节点通讯。头数需要被GPU整除。

*一般而言 b ∗ s b*s bs略大于 h h h k k k l l l的1/10,故一般而言,通讯量TMP>DP>PP.在实际的工程中,一般TMP和PP都在节点内通讯,只有数据并行会做跨节点通讯。

  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Transformer模型在训练时需要大量的计资源。为了加速训练过程,可以使用分布式GPU进行并行训练。下面是使用PyTorch和Horovod库进行分布式GPU训练的示例代码: ```python import torch import torch.nn as nn import torch.optim as optim import horovod.torch as hvd from torch.utils.data import DataLoader # 初始化Horovod hvd.init() # 设置GPU设备 torch.cuda.set_device(hvd.local_rank()) # 定义模型和数据加载器 model = Transformer().cuda() data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True) # 将模型放到所有可用的GPU上 model = nn.parallel.DistributedDataParallel(model, device_ids=[hvd.local_rank()]) # 定义优化器和学习率调度器 optimizer = optim.Adam(model.parameters(), lr=0.001 * hvd.size()) scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10) # 将优化器与Horovod绑定 optimizer = hvd.DistributedOptimizer(optimizer, named_parameters=model.named_parameters()) # 开始训练 for epoch in range(num_epochs): for batch in data_loader: inputs, targets = batch inputs = inputs.cuda() targets = targets.cuda() optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, targets) loss.backward() optimizer.step() # 调整学习率 scheduler.step() # 在所有进程结束时进行反初始化 hvd.shutdown() ``` 在这个示例代码中,首先使用Horovod库初始化并设置GPU设备。然后将模型放到所有可用的GPU上,并使用Horovod库将优化器与模型绑定。训练过程中,每个进程都加载一个batch的数据进行计,并在所有进程结束时进行反初始化。需要注意的是,使用Horovod库进行分布式GPU训练时,需要将学习率乘以进程数量进行调整,以保证训练的稳定性。 以上是一个简单的示例代码,实际应用中还需要根据具体的情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值