相关文章推荐
坚强的鸵鸟  ·  docker ...·  11 月前    · 
高大的圣诞树  ·  VSCODE 安装Copilot ...·  1 年前    · 
  • 第二步,创建设备(device)
  • 第三步,将data和model放置到device上
  • 方法二 函数 set_device + 函数.cuda()
  • 单机多卡
  • 分布式 torch.distributed.launch 命令的用法(非常直观地讲解---单机多卡与多级多卡)
    • PyTorch默认使用从0开始的GPU,且默认只使用0号GPU。如果要使用其他编号的GPU或者使用多块GPU,则要设置。

    • pytorch并行后,假设batchsize设置为64,表示每张并行使用的GPU都使用batchsize=64来计算(单张卡使用时,使用batchsize=64比较合适时,多张卡并行时,batchsize仍为64比较合适,而不是64*并行卡数)。

    • DataParallel 会自动拆分数据,并将作业订单发送到多个GPU上的多个模型。 在每个模型完成它们的工作之后,DataParallel 在将结果返回给你之前收集和合并结果。

    有两种方法:

    方法一:环境变量 + device + to(device)

    第一步,指定 备选 的GPU

    有如下两种方法来指定需要备选的GPU。
    这些GPU 将在程序中可见(但不一定会使用,真正投入使用需要通过device()函数来再次选择和指定)

    使用环境变量CUDA_VISIBLE_DEVICES的方式,类似于tensorflow指定GPU的方式(http://www.cnblogs.com/darkknightzh/p/6591923.html)。

    直接终端中设定:
    CUDA_VISIBLE_DEVICES=1 
    
    python代码中设定:

    1、使用单卡

    import os
    os.environ["CUDA_VISIBLE_DEVICES"] = "2"
    

    2、使用多块卡的方法。
    例如,使用0号和1号GPU’

    import os
    os.environ["CUDA_VISIBLE_DEVICES"] = '0,1'
    

    第二步,创建设备(device)

    作用:将备选GPU进一步选择和指定,真正投入使用中。

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    # 注意如果 device = torch.device("cuda"),则环境变量CUDA_VISIBLE_DEVICES中指定的全部GPU都会被拿来使用。
    # 也可以通过 "cuda:0" 、"cuda:1"等指定环境变量CUDA_VISIBLE_DEVICES中指定的多块GPU中的某一块。
    

    注意对应关系。例如:

    import os
    os.environ["CUDA_VISIBLE_DEVICES"] = "2, 3, 4, 5"  # 将2, 3, 4, 5号GPU作为备选GPU
    # 这样cuda:0表示使用 2 号GPU
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    

    第三步,将data和model放置到device上

    # 如果他们已经在目标设备上则不会执行复制操作
    input = data.to(device)
    model = MyModule(...).to(device)
    

    注意:如果有多个GPU,则model还需要多做一个操作(模型并行化)
    第三步骤的多GPU版本如下:

    input = data.to(device)
    model = MyModule(...)
    #模型并行化
    if torch.cuda.device_count() > 1:
                print("Let's use", torch.cuda.device_count(), "GPUs!")
                model = nn.DataParallel(model)
    model = model.to(device)
    

    GPU环境变量只在第一次设置起作用,此后再设置不会有任何改变了
    运行下面代码,可以观察其作用机制

    import os
    import torch.backends.cudnn as cudnn
    print("The are ", torch.cuda.device_count(), "GPUs in all!")
    os.environ["CUDA_VISIBLE_DEVICES"] = "0"
    if not torch.cuda.is_available():
        device = torch.device('cpu')
    else:
        cudnn.benchmark = True
        cudnn.enabled = True
        device = torch.device("cuda:1,0")
        print("The environ has", torch.cuda.device_count(), "GPUs!")
    print(device)
    if torch.cuda.device_count() > 1:
        print("Let's use", torch.cuda.device_count(), "GPUs!")
    

    方法二 函数 set_device + 函数.cuda()

    不过官方建议使用CUDA_VISIBLE_DEVICES,不建议使用 set_device 函数。

    第一步,函数set_device设置device

    import torch
    gpu_id = [0, 1, 2]
    torch.cuda.set_device(gpu_id)
    

    第二部,函数.cuda()使用GPU

    data.cuda()
    model.cuda()
    

    当代研究生应当掌握的并行训练方法(单机多卡)

    分布式 torch.distributed.launch 命令的用法(非常直观地讲解—单机多卡与多级多卡)

    【pytorch记录】pytorch的分布式 torch.distributed.launch 命令在做什么呢
    在这里插入图片描述

    利用PyTorch,作者编写了不同加速库在ImageNet上的单机多卡使用示例,方便读者取用。 又到适宜划水的周五啦,机器在学习,人很无聊。在打开 b 站 “学习” 之前看着那空着一半的显卡决定写点什么喂饱它们~因此,从 V100-PICE/V100/K80 中各拿出 4 张卡,试验一下哪种分布式学习库速度最快!这下终于能把剩下的显存吃完啦,又是老师的勤奋好学生啦(我真是个小机灵鬼)! Take-Away 笔者使用 PyTorch 编写了不同加速库在 ImageNet 上的使用示例(单机多卡),需要的 常见多GPU使用方法 在训练模型中,为了加速训练过程,往往会使用多块GPU设备进行并行训练(甚至多机多卡的情况)。如下图所示,常见的多GPU的使用方法有以下两种(但不局限于以下方法): model parallel,当模型很大,单块GPU的显存不足以放下整个模型时,通常会将模型分成多个部分,每个部分放到不同的GUP设备中(下图左侧),这样就能将原本跑不了的模型利用多块GPU跑起来。但这种情况,一般不能加速模 简单方便的 nn.DataParallel DataParallel 可以帮助我们(使用单进程控)将模型和数据加载到多个 GPU 中,控制数据在 GPU 之间的流动,协同不同 GPU 上的模型进行并行训练(细粒度的方法有 scatter,gather 等等)。 DataParallel 使用起来非常方便,我们只需要用 DataParallel 包装模型,再设置一些参数即可。需要定义的参数包括:参与训练的 GPU 有哪些,device_ids=gpus;用于汇总梯度的 GPU 是哪个,output_dev Single-Machine Model Parallel Best Practiceshttps://pytorch.org/tutorials/intermediate/model_parallel_tutorial.html#pytorchGPU训练一般采用的是“数据并行”的方法,但它同样也支持“模型并行”。“模型并行”需要解决的首要问题就是模型太大,导致单张GPU无法完整的加载整个模型。由于数据并行方法模型会被复制(广播),面临这种情况时数据并行也无济于事,模型并行能够将模型拆分到各个... pytorchGPU并行训练介绍,参考我之前的博客:pytorch中使用多GPU并行训练。本文主要针对代码部分进行讲解。1. 首先判断有没有可用的GPU,如果没有的话,这边会报错提醒,因为我们的脚本对针对多GPU训练的场景的。2. 初始各进程环境。 pytorch并行处理是指将模型和相应的数据放在多个GPU机器上运行。 假如有4台GPU机器,那么会在每一个GPU机器上拷贝一个模型,然后把数据平均分成四份(若batch_size除不尽,会自动适配) self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") #获得所有GPU 本文转载自机器之心。选自arXiv作者:Shen Li等机器之心编译参与:小舟、杜伟PyTorch 在学术圈里已经成为最为流行的深度学习框架,如何在使用 PyTorch 时实现高效的并行... Pytorch 多卡并行训练教程 (DDP),关于使用DDP进行多开并行训练 网上有许多教程,而且很多对原理解析的也比较透彻,但是有时候看起来还是比较懵逼,再啃了许多相关的博客后,博主记录了一些自己对于使用torch.nn.DistributedDataParallel(DDP)进行单机多卡并行训练的一些体会,希望能对入门的小白有一定的帮助,不足之处也希望指出,大家一起交流学习。