DistributedDataParallel后台单机多卡训练

2024-03-05 17:48

本文主要是介绍DistributedDataParallel后台单机多卡训练,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

后台单机多卡训练

文章目录

      • 后台单机多卡训练
        • 参考链接
        • 如何单机多卡
          • DistributedDataParallel
        • 如何后台训练
          • screen ......
          • nohup train.sh .....

参考链接
  • Pytorch分布式训练(单机多卡)
  • Linux screen命令
  • Linux使用screen执行长时间运行的任务
如何单机多卡
  • 一种是torch.nn.DataParallel,但是这种会有内存分配不平衡的弊端,因此这里采用的是官方推荐的torch.nn.parallel.DistributedDataParallel,下面介绍的也是DistributedDataParallel
DistributedDataParallel
  • 这里就用这位老哥的例子:Pytorch分布式训练(单机多卡),代码可以稍微浏览一下,主要关注几个注释的地方,就是指出需要配置的东西

  • # distributedDataParallel.py 
    import torch
    import torch.nn as nn
    from torch.autograd import Variable
    from torch.utils.data import Dataset, DataLoader
    import os
    from torch.utils.data.distributed import DistributedSampler
    # 1) 初始化
    torch.distributed.init_process_group(backend="nccl")input_size = 5
    output_size = 2
    batch_size = 30
    data_size = 90# 2) 配置每个进程的gpu
    local_rank = torch.distributed.get_rank()
    torch.cuda.set_device(local_rank)
    device = torch.device("cuda", local_rank)class RandomDataset(Dataset):def __init__(self, size, length):self.len = lengthself.data = torch.randn(length, size).to('cuda')def __getitem__(self, index):return self.data[index]def __len__(self):return self.lendataset = RandomDataset(input_size, data_size)
    # 3)使用DistributedSampler
    rand_loader = DataLoader(dataset=dataset,batch_size=batch_size,sampler=DistributedSampler(dataset))class Model(nn.Module):def __init__(self, input_size, output_size):super(Model, self).__init__()self.fc = nn.Linear(input_size, output_size)def forward(self, input):output = self.fc(input)print("  In Model: input size", input.size(),"output size", output.size())return outputmodel = Model(input_size, output_size)# 4) 封装之前要把模型移到对应的gpu
    model.to(device)if torch.cuda.device_count() > 1:print("Let's use", torch.cuda.device_count(), "GPUs!")# 5) 封装model = torch.nn.parallel.DistributedDataParallel(model,device_ids=[local_rank],output_device=local_rank)
    for data in rand_loader:if torch.cuda.is_available():input_var = dataelse:input_var = dataoutput = model(input_var)print("Outside: input size", input_var.size(), "output_size", output.size())
    
  • 主要的步骤如下:

    • # 1) 初始化
      torch.distributed.init_process_group(backend="nccl")
      # 2) 配置每个进程的gpu
      local_rank = torch.distributed.get_rank()
      torch.cuda.set_device(local_rank)
      device = torch.device("cuda", local_rank)
      # 3)使用DistributedSampler
      rand_loader = DataLoader(dataset=dataset,batch_size=batch_size,sampler=DistributedSampler(dataset))
      # 4) 封装之前要把模型移到对应的gpu
      model.to(device)
      # 5) 封装model = torch.nn.parallel.DistributedDataParallel(model,device_ids=[local_rank],output_device=local_rank)
      
  • 运行的话需要如下命令:

    • CUDA_VISIBLE_DEVICES=1,3 python -m torch.distributed.launch --nproc_per_node=2 YOUR_FILE.py
    • 这里需要注意的是CUDA_VISIBLE_DEVICES必须在命令中指定,而不能在代码中指定(一般我们用的os.environ["CUDA_VISIBLE_DEVICES"] = '1,3'在这里是失效的)
    • 20220123这里修正一下,os.environ["CUDA_VISIBLE_DEVICES"] = '1,3'不是失效,这是有用的,CUDA_VISIBLE_DEVICES=1,3最大的作用是告诉系统要用多卡了,看了一眼mmdetection的代码好像可以不加,但是需要在哪里设置一下才行的
    • 另外, --nproc_per_node=2表示使用GPU的张数,这里设置的是2,如果有多台则改改就行
  • 结果大致如下:

    • image-20220123113558311
如何后台训练
  • 一般我后台训练用的是nohup命令,但是如果是直接运行DistributedDataParallel的话会报错,于是需要转换思路
    • nohup CUDA_VISIBLE_DEVICES=1,3 python -m torch.distributed.launch --nproc_per_node=2 test_multi.py >log/nohuplog/test_multiGPU.log 2>& 1&
    • image-20220123122123010
screen …
  • 在screen 中运行有个好处就是退出终端了程序也不会停止,只需要 screen -r Name即可重新进入,这样的话就可以避免nohup执行失败了

  • 具体的screen命令参考这位老哥的博客Linux使用screen执行长时间运行的任务,这里用到的是:

    • # screen -S docker-d    新建一个名叫docker-d的session,并马上进入
      # screen -dmS docker-d  新建一个名叫docker-d的session,但暂不进入,可用于系统启动脚本里
      # screen -ls            列出当前所有session
      # screen -r docker-d    恢复到zhouxiao这个session,前提是已经是断开状态(-d可以远程断开会话)
      # screen -x docker-d    连接到离线模式的会话(多窗口同步演示)# screen ./rsync.sh     screen创建一个执行脚本的单窗口会话,可以attach进程ID
      # screen -wipe          检查目前所有的screen作业,并删除已经无法使用的screen作业
      
  • image-20220123123304718

nohup train.sh …
  • 后来我发现nohup也不是不能用,只需要把命令扔到.sh文件执行就可以了,这样也能避免nohup执行错误
  • image-20220123122440893

这篇关于DistributedDataParallel后台单机多卡训练的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/777321

相关文章

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

SigLIP——采用sigmoid损失的图文预训练方式

SigLIP——采用sigmoid损失的图文预训练方式 FesianXu 20240825 at Wechat Search Team 前言 CLIP中的infoNCE损失是一种对比性损失,在SigLIP这个工作中,作者提出采用非对比性的sigmoid损失,能够更高效地进行图文预训练,本文进行介绍。如有谬误请见谅并联系指出,本文遵守CC 4.0 BY-SA版权协议,转载请联系作者并注

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的

多云架构下大模型训练的存储稳定性探索

一、多云架构与大模型训练的融合 (一)多云架构的优势与挑战 多云架构为大模型训练带来了诸多优势。首先,资源灵活性显著提高,不同的云平台可以提供不同类型的计算资源和存储服务,满足大模型训练在不同阶段的需求。例如,某些云平台可能在 GPU 计算资源上具有优势,而另一些则在存储成本或性能上表现出色,企业可以根据实际情况进行选择和组合。其次,扩展性得以增强,当大模型的规模不断扩大时,单一云平

adb shell 执行后台程序后断开adb后台进程被结束的解决办法

环境:Android 版本 Android8 通常让程序后台执行就是在命令 最后加上 &即可,但是在Android 8上实验发现,程序的确后台了,但是拔掉USB线再连接上发现进程已结束。不确定Android早期版本是否存在此问题。 参考网上一些Linux方法,如加nohup 仍然无效,还是会结束。看来Android adb shell 与 Linux shell 还是有一定区别。 后来在网上

用ajax json给后台action传数据要注意的问题

必须要有get和set方法   1 action中定义bean变量,注意写get和set方法 2 js中写ajax方法,传json类型数据 3 配置action在struts2中

Marsview这么好用?快速搭建后台不是梦

Marsview竟然这么好用?快速搭建后台不是梦! 还在为项目开发而焦头烂额吗?别再纠结了,Marsview来了!这个面向后台管理系统的低代码平台,不仅让你轻松搭建项目,还能让你成为团队中的“流量担当”。本文将带你了解 Marsview 的核心功能、技术架构,以及如何快速上手。 软件简介 Marsview 是一款专为中后台管理系统设计的低代码可视化平台,能够帮助开发者快速完成项目搭建和

通过Ajax请求后台数据,返回JSONArray(JsonObject),页面(Jquery)以table的形式展示

点击“会商人员情况表”,弹出层,显示一个表格,如下图: 利用Ajax和Jquery和JSONArray和JsonObject来实现: 代码如下: 在hspersons.html中: <!DOCTYPE html><html><head><meta charset="UTF-8"><title>会商人员情况表</title><script type="text/javasc