使用PyTorch DDP进行分布式训练 | AI生成和翻译

Home 2025.11

卡帕西解读概览

在YouTube视频《Let’s build GPT: from scratch, in code, spelled out》(约2小时58分处开始)中,安德烈·卡帕西深入讲解了使用PyTorch进行大语言模型分布式训练的方法。他重点演示了如何将单GPU训练循环扩展到多GPU(例如8个)而无需大幅修改代码。核心思想是在每个GPU上运行相同进程,各自处理数据集中互不重叠的分片,并通过梯度平均实现同步。这使得有效批次大小成为单GPU批次大小的倍数。他强调简化流程,使用PyTorch的DistributedDataParallel(DDP)模块,并逐步演示了类似GPT-2模型的代码实例。

卡帕西用了一个比喻:想象一组研究员(GPU)独立分析数据集的不同部分,但定期”比对笔记”(梯度平均)以保持解决方案一致。他使用torchrun --standalone --nproc_per_node=8 train_gpt2.py启动训练,该命令会自动设置RANKWORLD_SIZELOCAL_RANK等环境变量。

分布式训练

卡帕西将分布式训练解释为在保持核心前向/反向传播基本不变的前提下跨GPU并行化的方法:

他指出:”前向传播保持不变,反向传播也基本不变,我们只是附加了这个平均操作”

分布式数据并行(DDP)

DDP是卡帕西进行多GPU训练的首选,相比旧的DataParallel能更好处理梯度同步和多节点设置。按此方式包装模型:model = DDP(model, device_ids=[local_rank])

引述:”DDP的功能是…在反向传播结束后,它会调用所谓的全规约操作,基本上对所有秩的梯度进行平均,然后将这个平均值存放到每个秩上”

对于损失记录(由于梯度已平均),需对标量损失进行规约:使用all_reduce(op=ReduceOp.SUM)跨秩求和,然后在秩0上除以world_size

秩的概念

秩是每个进程的唯一整数ID(0到world_size - 1,例如8个GPU对应0-7),通过os.getenv('RANK')设置。它决定:

在评估阶段(例如H-SWAG数据集),每个秩计算本地计数(正确预测数、总样本数),全规约求和后由秩0计算准确率

卡帕西强调:确定性种子确保所有秩看到相同的乱序排列,但各秩会过滤出非重叠的分片

评估与实现补充说明

卡帕西演示了多选数据集(H-SWAG)的分布式评估:分片样本、计算本地准确率、全规约计数、由秩0打印结果。对于预测,选择每个样本平均损失最低(或概率最高)的选项,使用填充/掩码技术

实用技巧:

本节直接建立在先前单GPU代码基础上,展示了为扩展规模所需的最小改动

Let’s build GPT: from scratch, in code, spelled out


Back

x-ai/grok-4.1-fast

Donate