Pytorch DDP原理及配置[最大限度提高GPU利用率]

2023-11-04

前言:

pytorch在单机多卡,多机多卡之间已经做了进一步的优化,最早之前可以使用

net = torch.nn.DataParallel(net.cuda(), device_ids=range(torch.cuda.device_count()))来使用多显卡pytorch 多GPU训练总结(DataParallel的使用)_两只蜡笔的小新的博客-CSDN博客

加速运行,但是会受到python GIL锁的限制,Python GIL锁_两只蜡笔的小新的博客-CSDN博客导致对CPU的使用率不高,进而导致多显卡之间的协调不足,出现利用率较低的情况。为了解决这个微博替,需要将原来的代码进行说为的修改,使用DDP的方式提高多卡的利用率。

基本原理:

关于python线程的问题情况这篇博客Python GIL锁_两只蜡笔的小新的博客-CSDN博客,大致说的是,多线程会受到GIL锁的能影响,其实质上是一个时间段只有一个线程得到GIL,系统均分每个线程获得的时间,交替实现多线程,这是pytorch传统的DP训练模式。

而DDP,则是通过创建进程来协调多GPU之间的关系,每个进程之间的GIL锁不互相影响,pytorch在这方面已经做了api接口,较方便的可以使用【其实通过创建多进程的方式也存在很多诟病,这里不一一介绍,详细参见上篇博客】

下面介绍一些PyTorch分布式编程的基础概念。【[原创][深度][PyTorch] DDP系列第一篇:入门教程 - 知乎

基本概念

在16张显卡,16的并行数下,DDP会同时启动16个进程。下面介绍一些分布式的概念。

group

即进程组。默认情况下,只有一个组。这个可以先不管,一直用默认的就行。

world size

表示全局的并行数,简单来讲,就是2x8=16。

# 获取world size,在不同进程里都是一样的,得到16
torch.distributed.get_world_size()

rank

表现当前进程的序号,用于进程间通讯。对于16的world sizel来说,就是0,1,2,…,15。
注意:rank=0的进程就是master进程。

# 获取rank,每个进程都有自己的序号,各不相同
torch.distributed.get_rank()

local_rank

又一个序号。这是每台机子上的进程的序号。机器一上有0,1,2,3,4,5,6,7,机器二上也有0,1,2,3,4,5,6,7

# 获取local_rank。一般情况下,你需要用这个local_rank来手动设置当前模型是跑在当前机器的哪块GPU上面的。
torch.distributed.local_rank()

修改你的代码,让它运行在DDP模式

1.修改模型加载方式

import argparse
from tqdm import tqdm
import torch
import torchvision
import torch.nn as nn
import torch.nn.functional as F
# 新增:
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP


### 1. 初始化我们的模型、数据、各种配置  ####
# DDP:从外部得到local_rank参数
parser = argparse.ArgumentParser()
parser.add_argument("--local_rank", default=-1, type=int)
FLAGS = parser.parse_args()
local_rank = FLAGS.local_rank

# DDP:DDP backend初始化
torch.cuda.set_device(local_rank)
dist.init_process_group(backend='nccl')  # nccl是GPU设备上最快、最推荐的后端

# 构造模型
model = yourmodel().to(local_rank)
# DDP: Load模型要在构造DDP模型之前,且只需要在master上加载就行了。
ckpt_path = None
if dist.get_rank() == 0 and ckpt_path is not None:
    model.load_state_dict(torch.load(ckpt_path))
# DDP: 构造DDP model
model = DDP(model, device_ids=[local_rank], output_device=local_rank)

2. 修改dataloader数据加载方式

    train_sampler = torch.utils.data.distributed.DistributedSampler(my_trainset)
    # DDP:需要注意的是,这里的batch_size指的是每个进程下的batch_size。
    #      也就是说,总batch_size是这里的batch_size再乘以并行数(world_size)。
    trainloader = torch.utils.data.DataLoader(my_trainset, 
        batch_size=16, num_workers=2, sampler=train_sampler)

注意:上面数据的初始化方法的两句代码,要在DDP初始化之后进行,【dist.init_process_group(backend='nccl')】这一句之后。

3.保存模型参数

    # DDP:
    # 1. save模型的时候,和DP模式一样,有一个需要注意的点:保存的是model.module而不是model。
    #    因为model其实是DDP model,参数是被`model=DDP(model)`包起来的。
    # 2. 只需要在进程0上保存一次就行了,避免多次保存重复的东西。
    if dist.get_rank() == 0:
        torch.save(model.module.state_dict(), "%d.ckpt" % epoch)

4.终端运行启动方式

## Bash运行
# 假设我们只在一台机器上运行,可用卡数是8
python -m torch.distributed.launch --nproc_per_node 8 main.py

[原创][深度][PyTorch] DDP系列第一篇:入门教程 - 知乎

[原创][深度][PyTorch] DDP系列第二篇:实现原理与源代码解析 - 知乎
[原创][深度][PyTorch] DDP系列第三篇:实战与技巧 - 知乎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pytorch DDP原理及配置[最大限度提高GPU利用率] 的相关文章

随机推荐

  • elasticsearch 脚本排序

    elasticsearch 脚本排序主要用于复杂场景的综合排序 脚本语言有 java painless groovy 目前调研的为painless kibana 脚本创建mapping DELETE ksc metadata PUT ksc
  • nacos支持配置文件热部署(@RefreshScope注解)

    nacos支持配置文件热部署 1 原理 RefreshScope注解实现的原理 是刷新bean 2 定义的变量 在代码中用变量来接 直接在代码块里面使用 示例 1 在配置文件定义一个share config的属性 share config
  • Ajax简单异步上传图片并回显

    前台代码 上传图片按钮 a href 选择图片 a 隐藏的文件选择器
  • C语言内功修炼---指针详讲(初阶)

    前言 都说会用一门语言几个礼拜就可以了 这句话我不敢苟同 至少在我学习C语言指针之后就不这么觉得了 不信 来上才艺 代码1 void 0 代码2 void signal int void int int 这两行代码出自 C陷阱和缺陷 我相信
  • react ant-design Select组件下拉框map不显示问题

    问题描述 在使用Select Option下拉组件时 map遍历后不显示下拉框 错误写法 dataList dataList map item gt
  • 洛谷P1010 [NOIP1998 普及组] 幂次方题解

    数论递归 题目描述 任何一个正整数都可以用2的幂次方表示 例如137 27 23 20 同时约定方次用括号来表示 即ab可表示为 a b 由此可知 137可表示为2 7 2 3 2 0 进一步 7 22 2 20 21用2表示 并且3 2
  • idea快捷键和leetCode快捷键

    idea替换字符串快捷键 Ctrl r idea批量重命名 shift F6 project structure F4打开 构造方法 重写方法快捷键 Alt insert 设置字体 File settings editor font Ctr
  • Python网络爬虫:50行代码爬取CSDN博客文章列表 并将点赞评论等数据存储到Excel表格

    hello 大家好 我是wangzirui32 今天我们来学习如何爬取CSDN博客文章列表 并将数据存储到Excel里 开始学习吧 Tips 本节课有点复杂 请耐心学习 学习目录 前言 1 网页代码分析 2 编写代码 写在最后 前言 最近
  • Yolov5项目在RK3588s设备上的部署(RMYC2023技术分享)

    前言 跟作者比赛有关 可以选择略过 在RMYC以往的赛季当中大多数队伍使用到的视觉技术都依赖于RoboMaster官方给的AI人工智能教育套件 但是随着比赛难度的增加 比赛对各种技术的要求AI教育套件可能已经无法满足 同时因AI教育套件的价
  • Laravel利用redis和定时任务实现活跃用户统计

    最近在Summer的 Laravel教程 Web开发实战进阶 学到很多东西 以前只会看文档 大概了解Laravel的内容而在实际运用中确不知道该怎样做 碰到一个需求不会立马联想到 这个东西可以用 实现 不是有句话 实践是检验真理的唯一标准
  • PCB设计中电容电阻的基本常识

    目录 电容的单位换算 电容上标的含义 电阻的单位换算 电阻上标的含义 常用的贴片封装 封装后面字母的含义 电容的单位换算 电容的常见单位有 f mf uf nf pf 1f 1000mf 1mf 1000uf 电容上标的含义 eg1 104
  • background-position 实现背景定位 ie用属性background-position-x

    实现背景图片的定位 如下图分别取各个银行的图标 HTML代码及CSS样式 添加背景图
  • Spring4.1新特性——静态资源处理增强

    Spring 4 1对静态资源处理进行了细化 ResourceHttpRequestHandler细分为两大部分 ResourceResolver和ResourceTransformer Java代码 public interface Re
  • 全球 26 个主流视频网站高清视频下载全搞定,包括 P 站!

    阅读本文大概需要 3 分钟 大家在视频网站上观看视频的时候 有时候需要把一个视频下载下载 却不知道怎么弄 因为目前 99 的网站 都没有现成的下载方法 或者要收费 今天我就来安利一个特别特别香的开源神器 annie 目前已经收获 star
  • response.sendRedirect 传递参数的问题

    原文地址为 response sendRedirect 传递参数的问题 response sendRedirect是通过浏览器来做转向的 假设在A jsp页面设置request setAttribute username admin 那么在
  • LVGL笔记11--lv_btn按钮

    LVGL笔记11 lv btn按钮 lv btn是非常常用的控件 除了能显示文本 主要用途是用来和用户交互 实际上lv btn按钮就是lv cont容器的复杂变体 另外加上可选的子对象 最常用的是lv label标签 共同构成了按钮控件 按
  • Greenplum table 之 appendonly表

    一 压缩表 1 appendonly压缩表的数据视图为pg appendonly 2 appendonly在Greenplum后也可更新与删除 转载于 https www cnblogs com xibuhaohao p 11127443
  • nginx反向代理CSS、JS无法加载

    虽然期末要考试了 昨天晚上看见solo更新了 然后今天准备更新一下我的solo 结果出现了个意外 因为原来是挂在8080端口 现在准备换一下 结果出错了 具体就是 通过Nginx反向代理solo 的时候 通过域名访问出现了网页无法加载CSS
  • 计算机在微表情的应用,一种有效的微表情自动识别方法

    一种有效的微表情自动识别方法 专利摘要 本发明公开了一种有效的微表情自动识别方法 包括 微表情帧序列预处理 微表情信息数据学习和微表情识别 微表情帧序列预处理的方法为 检测获取的微表情序列的帧数 提取每帧图像的数据进行灰度化处理 采用线性插
  • Pytorch DDP原理及配置[最大限度提高GPU利用率]

    前言 pytorch在单机多卡 多机多卡之间已经做了进一步的优化 最早之前可以使用 net torch nn DataParallel net cuda device ids range torch cuda device count 来使