关于pytorch多机多卡参数的说明

在多机多卡训练中,涉及到的参数主要有这些

os.environ['CUDA_VISIBLE_DEVICES']='1'
os.environ['RANK'] = '1'
os.environ['WORLD_SIZE'] = '2'
os.environ['MASTER_ADDR'] = '127.0.0.1'
os.environ['MASTER_PORT'] = '29501'

首先强调,world_size 代表着进程的总数量。无论是用mp.spawn()创建,还是手动跑两个,得保证进程总数等于world_size。

  • 比如在同一个机器上,跑两个进程
os.environ['CUDA_VISIBLE_DEVICES']='0'
os.environ['RANK'] = '0'
os.environ['WORLD_SIZE'] = '2'
os.environ['MASTER_ADDR'] = '127.0.0.1'
os.environ['MASTER_PORT'] = '29501'
和
os.environ['CUDA_VISIBLE_DEVICES']='1'
os.environ['RANK'] = '1'
os.environ['WORLD_SIZE'] = '2'
os.environ['MASTER_ADDR'] = '127.0.0.1'
os.environ['MASTER_PORT'] = '29501'
  • 或者在两台机器上,各跑一个
主机1
os.environ['CUDA_VISIBLE_DEVICES']='0'
os.environ['RANK'] = '0'
os.environ['WORLD_SIZE'] = '2'
os.environ['MASTER_ADDR'] = '127.0.0.1'
os.environ['MASTER_PORT'] = '29501'
主机2
os.environ['CUDA_VISIBLE_DEVICES']='1'
os.environ['RANK'] = '1'
os.environ['WORLD_SIZE'] = '2'
os.environ['MASTER_ADDR'] = '主机1的ip'
os.environ['MASTER_PORT'] = '29501'

这两者的效果是等效的,但进程数必须和world_size相等,才能执行,进程数=机器数*每个机器上的进程数


关于rank,的定义比较混乱,有人说是机器的编号,有人说是进程的编号,反正是一团乱。这里声明一下,rank就是进程的编号,机器的编号是node_rank

比如2个8卡机,world_size=16,(有人说world_size=2,但这是混淆的,实际就是16,等于2的那个是nnodes),此时得在0号机器上创建rank为0-7,local_rank为0-7的进程,在1号机器上创建rank为1-15,local_rank为0-7的进程,才能执行。而且主机ip都要设置成0号机器的ip。数据传输时,用DDP(model, device=local_rank)。


torchrun帮我们解决了这一麻烦。

torchrun --nproc_per_node=8 --nnodes=... --node_rank=... --master_addr=... --master_port=... train.py

这里nproc_per_node=8表示每个机器上使用8张卡,他会自动创建8个进程,为每一个进程分配一个local_rank,已经不需要我们手动设置RANK,WORD_SIZE。
nnodes表示主机的数量,node_rank表示主机的编号。
非要说的话,这里
world_size=nnodes*nproc_per_node,
rank=node_rank*nproc_per_node+local_rank

参考
https://blog.csdn.net/qq_44289607/article/details/123332574
https://blog.csdn.net/qq_40676033/article/details/126695722?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172010202416800182175257%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=172010202416800182175257&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-4-126695722-null-null.142v100pc_search_result_base7&utm_term=word_size%E6%98%AF%E4%B8%BB%E6%9C%BA%E6%95%B0%E9%87%8F%E8%BF%98%E6%98%AF%E6%98%BE%E5%8D%A1%E6%95%B0%E9%87%8F&spm=1018.2226.3001.4187
https://zhuanlan.zhihu.com/p/373395654
https://www.cnblogs.com/qizhou/p/16770143.html
https://coderlemon17.github.io/posts/2022/02-14-ddp/

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch支持多机多卡的训练,可以使用`torch.nn.DataParallel`或`torch.nn.DistributedDataParallel`来实现。这些模块可以帮助你在多个GPU或多台机器上进行并行计算。 使用`torch.nn.DataParallel`,你只需要将你的模型包装在这个模块中,并指定需要使用的GPU设备。例如: ```python import torch import torch.nn as nn from torch.nn.parallel import DataParallel model = nn.Linear(10, 5) # 一个简单的线性模型 # 将模型包装在DataParallel中,指定需要使用的GPU设备 model = DataParallel(model, device_ids=[0, 1]) # 在GPU 0和1上并行计算 input = torch.randn(20, 10) # 输入数据 output = model(input) # 并行计算输出 ``` 使用`torch.nn.DistributedDataParallel`,你需要使用`torch.distributed.launch`来启动多进程训练,并设置好分布式配置。例如: ```python import torch import torch.nn as nn import torch.distributed as dist from torch.nn.parallel import DistributedDataParallel # 初始化分布式训练环境 dist.init_process_group(backend='nccl') model = nn.Linear(10, 5) # 一个简单的线性模型 # 将模型包装在DistributedDataParallel中 model = DistributedDataParallel(model) input = torch.randn(20, 10) # 输入数据 output = model(input) # 分布式计算输出 ``` 以上是简单的示例代码,你可以根据你的具体需求进行修改和扩展。需要注意的是,多机多卡训练需要配置好分布式环境,并且确保每个GPU上的数据和模型参数都能正确同步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值