DistributedDataParallel踩坑记录(rank怎么得到 init_process_group如何初始化。。。)

本文介绍了如何在PyTorch中进行单机多卡的分布式训练,重点讨论了rank的导入和init_process_group的设置,以及spawn方法启动多进程时rank的自动分配。通过环境变量设置MASTER_ADDR和MASTER_PORT,使用nccl作为后端进行GPU间的通信。代码示例展示了如何在两张卡上并行运行训练代码,实现模型参数的自动同步。
摘要由CSDN通过智能技术生成

之前看了很多例子,始终不明白rank是怎么导入进去的,现在跑通了,特此记录。具体代码和参考差不多。这里是单机多卡的使用经验,多机多卡的可以不用看了。下面的代码我给出的参考里都有,这里只记录跑的时候一些报错并更正的地方。

举例:我现在有两张卡,希望在两张卡上进行分布式训练。

rank:目前所用的卡

world_size :你有多少个进程,通常是一张卡一个进程

world_size = torch.cuda.device_count()

1.dist.init_process_group初始化

这步踩过的坑就是init_method不知道怎么设置。

 rank怎么来的后面说。这一步就是设定一个组,这个组里面设定你有几个进程(world size),现在是卡几(rank)。让pycharm知道你要跑几个进程,包装在组内,进行通讯这样模型参数会自己同步,不需要额外操作了。

import os
import torch.distributed as dist

def ddp_setup(rank,world_size):
    os.environ['MASTER_ADDR'] = 'localhost' #rank0 对应的地址
    os.environ['MASTER_PORT'] = '12355' #任何空闲的端口
    dist.init_process_group(
            backend='nccl',  #nccl Gloo #nvidia显卡的选择nccl
            world_size=world_size, 
            init_method='env://',
            rank=rank
        ) #初始化默认的分布进程组

    dist.barrier() #等到每块GPU运行到这再继续往下走

2.spawn启动(rank怎么来的)

rank是自动分配的。怎么分配呢?这里用的是spawn也就一行代码。

import torch.multiprocessing as mp
def main (rank:int,world_size:int,args):
    pass
    #你的训练代码 主函数


mp.spawn(main,args=(args.world_size,args), nprocs=args.world_size)

注意,我调用spawn的时候,没有输入main的其中一个参数rank。这行代表rank由代码自动分配。将你的代码复制两份在两张卡上同时跑,你可以print(rank),会发现输出 0 1。两份代码并行跑。

另外,nprocs=args.world_size。如果不这么写,我的代码会卡死在这,即不报错,也不停止。

参考:

1.多卡训练代码PyTorch单机多卡分布式训练(源代码讲解)_pytorch单机多卡训练_Wukongggg的博客-CSDN博客2

2.多卡训练B站教程:pytorch多GPU并行训练教程_哔哩哔哩_bilibili

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值