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

相关推荐
Stream_Silver18 分钟前
【Agent学习笔记3:使用Python开发简单MCP服务】
笔记·python
LOnghas121120 分钟前
电动汽车充电接口自动识别与定位_yolo13-C3k2-Converse_六种主流充电接口检测分类
人工智能·目标跟踪·分类
编码小哥21 分钟前
OpenCV图像滤波技术详解:从均值滤波到双边滤波
人工智能·opencv·均值算法
穿过锁扣的风22 分钟前
零基础入门 Python 爬虫:从基础到实战,爬取虎扑 / 豆瓣 / 图片全掌握
开发语言·爬虫·python
阿杰学AI24 分钟前
AI核心知识78——大语言模型之CLM(简洁且通俗易懂版)
人工智能·算法·ai·语言模型·rag·clm·语境化语言模型
Stream_Silver27 分钟前
【Agent学习笔记2:深入理解Function Calling技术:从原理到实践】
笔记·python
新缸中之脑35 分钟前
氛围编程一个全栈AI交易应用
人工智能
码云数智-大飞38 分钟前
Oracle RAS:AI时代守护企业数据安全的智能盾牌
数据库·人工智能·oracle
余俊晖39 分钟前
Qwen3-VL-0.6B?Reyes轻量化折腾:一个从0到1开始训练的0.6B参数量的多模态大模型
人工智能·自然语言处理·多模态
zuozewei43 分钟前
7D-AI系列:DeepSeek Engram 架构代码分析
人工智能·架构