PyTorch单机多卡训练(无废话)

目前大家基本都在使用DistributedDataParallel(简称DDP)用来训练,该方法主要用于分布式训练,但也可以用在单机多卡。

第一步:初始化分布式环境,主要用来帮助进程间通信

复制代码
torch.distributed.init_process_group(backend='nccl')

第二步:负责创建 args.local_rank 变量,并接受 torch.distributed.launch 注入的值

归根到底是创建一个变量,来接收torch.distributed.launch 注入。

目前代码中常见的两种方式:

复制代码
local_rank = int(os.environ["LOCAL_RANK"])   # 这种是从自定义config文件中获取LOCAL_RANK

另外一种是parser:

复制代码
parser = argparse.ArgumentParser()
parser.add_argument("--local_rank", type=int, default=-1)
args = parser.parse_args()

第三步:每个进程根据自己的local_rank设置应该使用的GPU

复制代码
torch.cuda.set_device(args.local_rank)
torch.manual_seed(hps.train.seed)   # 非必要,尽可能固定种子

第四步:分布式数据和模型

复制代码
# 分布式数据
train_sampler = DistributedSampler(train_dataset)
train_loader = torch.utils.data.DataLoader(train_dataset, sampler=train_sampler, batch_size=batch_size) 
# 分布式模型
model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank], output_device=args.local_rank)

第五步:运行

nproc_per_node表示每个node有多少个进程,每个GPU对应一个进程。

nnodes表示使用几个节点,一个节点对应一台电脑。

复制代码
python -m torch.distributed.launch --nproc_per_node=2 --nnodes=1 train.py 

解释

  1. torch.distributed.launch参数解析(终端运行命令的参数)

    --> python -m torch.distributed.launch --help

    usage: launch.py [-h] [--nnodes NNODES] [--node_rank NODE_RANK]
    [--nproc_per_node NPROC_PER_NODE] [--master_addr MASTER_ADDR] [--master_port MASTER_PORT]
    [--use_env] [-m] [--no_python] [--logdir LOGDIR]
    training_script ...

  • nnodes:节点的数量,通常一个节点对应一个主机,方便记忆,直接表述为主机
  • node_rank:节点的序号,从0开始
  • nproc_per_node:一个节点中显卡的数量
  • master_addr:master节点的ip地址,也就是0号主机的IP地址,该参数是为了让 其他节点 知道0号节点的位,来将自己训练的参数传送过去处理
  • master_port:master节点的port号,在不同的节点上master_addr和master_port的设置是一样的,用来进行通信
  1. torch.ditributed.launch相关环境变量解析(代码中os.environ中的参数)
  • WORLD_SIZE:os.environ["WORLD_SIZE"]所有进程的数量
  • LOCAL_RANK:os.environ["LOCAL_RANK"]每张显卡在自己主机中的序号,从0开始
  • RANK:os.environ["RANK"]进程的序号,一般是1个gpu对应一个进程
  1. 一般WORLD_SIZE和RANK和LOCAL_RANK在一起声明

    rank = dist.get_rank()
    local_rank = int(os.environ["LOCAL_RANK"])
    n_gpus = dist.get_world_size()

  2. 多机和单机的一些概念问题

  • rank
    多机多卡:代表某一台机器
    单机多卡:代表某一块GPU
  • world_size
    多机多卡:代表有几台机器
    单机多卡:代表有几块GPU
  • local_rank
    多机多卡:代表某一块GPU的编号
    单机多卡:代表某一块GPU的编号

参考文献

1.https://pytorch.org/docs/stable/generated/torch.nn.parallel.DistributedDataParallel.html#torch.nn.parallel.DistributedDataParallel

  1. https://github.com/jia-zhuang/pytorch-multi-gpu-training

  2. https://blog.csdn.net/weixin_44966641/article/details/121872773

  3. https://blog.csdn.net/magic_ll/article/details/122359490

相关推荐
美狐美颜sdk2 小时前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
DeepSeek-大模型系统教程2 小时前
推荐 7 个本周 yyds 的 GitHub 项目。
人工智能·ai·语言模型·大模型·github·ai大模型·大模型学习
郭庆汝2 小时前
pytorch、torchvision与python版本对应关系
人工智能·pytorch·python
小雷FansUnion4 小时前
深入理解MCP架构:智能服务编排、上下文管理与动态路由实战
人工智能·架构·大模型·mcp
资讯分享周4 小时前
扣子空间PPT生产力升级:AI智能生成与多模态创作新时代
人工智能·powerpoint
思则变5 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
叶子爱分享5 小时前
计算机视觉与图像处理的关系
图像处理·人工智能·计算机视觉
鱼摆摆拜拜5 小时前
第 3 章:神经网络如何学习
人工智能·神经网络·学习
一只鹿鹿鹿5 小时前
信息化项目验收,软件工程评审和检查表单
大数据·人工智能·后端·智慧城市·软件工程
张较瘦_6 小时前
[论文阅读] 人工智能 | 深度学习系统崩溃恢复新方案:DaiFu框架的原位修复技术
论文阅读·人工智能·深度学习