多gpu计算策略

总结自视频(吴恩达大模型入门课):14_03_optional-video-efficient-multi-gpu-compute-strategies_哔哩哔哩_bilibili

1. 分布式数据并行(DDP,distributed data parallel)

适合模型不大,要求单个模型也可以加载并训练。原理如下图所示。

其核心思想是:

  • 模型复制:将同一模型复制到每个GPU或计算节点。

  • 数据分片:将训练数据划分为多个子集,每个GPU处理不同的数据子集。

  • 梯度同步:所有GPU独立计算梯度后,通过通信同步梯度并更新模型参数,确保模型一致性。

1.1 工作原理

  • 初始化

    • 每个GPU(或节点)加载相同的模型副本。

    • 数据加载器通过分布式采样器(如DistributedSampler)为每个GPU分配唯一的数据子集。

  • 前向传播

    • 每个GPU使用本地数据计算损失和梯度。

  • 梯度同步

    • 所有GPU的梯度通过高效的通信库(如NCCL)进行全局平均(AllReduce操作)。

  • 参数更新

    • 每个GPU使用同步后的梯度独立更新模型参数(因初始参数相同,梯度也相同,更新后仍保持一致)。

1.2 代码实现(pytorch为例)

import torch
import torch.distributed as dist
import torch.multiprocessing as mp
from torch.nn.parallel import DistributedDataParallel as DDP

def train(rank, world_size):
    # 初始化进程组
    dist.init_process_group("nccl", rank=rank, world_size=world_size)
    
    # 创建模型并移至当前GPU
    model = Model().to(rank)
    ddp_model = DDP(model, device_ids=[rank])
    
    # 配置分布式数据采样器
    dataset = MyDataset()
    sampler = DistributedSampler(dataset, num_replicas=world_size, rank=rank)
    dataloader = DataLoader(dataset, batch_size=64, sampler=sampler)
    
    # 训练循环
    for inputs, labels in dataloader:
        outputs = ddp_model(inputs.to(rank))
        loss = loss_fn(outputs, labels.to(rank))
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()

if __name__ == "__main__":
    world_size = 4  # GPU数量
    mp.spawn(train, args=(world_size,), nprocs=world_size)

2. 与其他并行策略对比

策略数据并行(DDP)模型并行(MP)管道并行(PP)
核心思想复制模型,拆分数据拆分模型,数据完整传递模型分阶段,数据流水线处理
适用场景模型可单卡容纳,数据量大模型参数过大无法单卡存放超大规模模型(如千亿参数)
通信开销梯度同步(AllReduce)层间激活值传递阶段间激活和梯度传递
实现复杂度低(框架原生支持)高(需手动拆分模型)中高(需设计流水线)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值