Pytorch分布式训练

Pytorch 分布式训练(DP/DDP) 1、分布式训练:模型并行和数据并行 分布式训练根据并行策略的不同,可以分为模型并行和数据并行。 模型并行:是网络太大,一张卡存不了,那么拆分,然后进行模型并行训练。 数据并行:多个显卡同时采用数据训练网络的副本。 模型并行不是这里的讨论重点 1.1、数据并行 数据并行的操作要求我们将数据划分成多份,然后发送给多个 GPU 进行并行的计算。 注意:多卡训练要考虑通信开销的,是个trade off的过程,不见得四块卡一定比两块卡快多少,可能是训练到四块卡的时候通信开销已经占了大头 下面是一个简单的 阅读详情

用单机单卡训练模型的时代已经过去,单机多卡已经成为主流配置。如何最大化发挥多卡的作用呢?本文介绍Pytorch中的DistributedDataParallel方法。

1. DataParallel

其实Pytorch早就有数据并行的工具DataParallel,它是通过单进程多线程的方式实现数据并行的。

简单来说,DataParallel有一个参数服务器的概念,参数服务器所在线程会接受其他线程传回来的梯度与参数,整合后进行参数更新,再将更新后的参数发回给其他线程,这里有一个单对多的双向传输。因为Python语言有GIL限制,所以这种方式并不高效,比方说实际上4卡可能只有2~3倍的提速。

2. DistributedDataParallel

Pytorch目前提供了更加高效的实现,也就是DistributedDataParallel。从命名上比DataParallel多了一个分布式的概念。首先 DistributedDataParallel是能够实现多机多卡训练的,但考虑到大部分的用户并没有多机多卡的环境,本篇博文主要介绍单机多卡的用法。

从原理上来说,DistributedDataParallel采用了多进程,避免了python多线程的效率低问题。一般来说,每个GPU都运行在一个单独的进程内,每个进程会独立计算梯度。

同时DistributedDataParallel抛弃了参数服务器中一对多的传输与同步问题,而是采用了环形的梯度传递,这里引用知乎上的图例。这种环形同步使得每个GPU只需要和自己上下游的GPU进行进程间的梯度传递,避免了参数服务器一对多时可能出现的信息阻塞。

3. DistributedDataParallel示例

下面给出一个非常精简的单机多卡示例,分为六步实现单机多卡训练。

第一步,首先导入相关的包。

import argparse
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP

第二步,加一个参数,local_rank。这比较好理解,相当于就是告知当前的程序跑在那一块GPU上,也就是下面的第三行代码。local_rank是通过pytorch的一个启动脚本传过来的,后面将说明这个脚本是啥。最后一句是指定通信方式,这个选nccl就行。

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

torch.cuda.set_device(args.local_rank)

dist.init_process_group(backend='nccl')

第三步,包装Dataloader。这里需要的是将sampler改为DistributedSampler,然后赋给DataLoader里面的sampler。

为什么需要这样做呢?因为每个GPU,或者说每个进程都会从DataLoader里面取数据,指定DistributedSampler能够让每个GPU取到不重叠的数据。

读者可能会比较好奇,在下面指定了batch_size为24,这是说每个GPU都会被分到24个数据,还是所有GPU平分这24条数据呢?答案是,每个GPU在每个iter时都会得到24条数据,如果你是4卡,一个iter中总共会处理24*4=96条数据。

train_sampler = torch.utils.data.distributed.DistributedSampler(my_trainset)

trainloader = torch.utils.data.DataLoader(my_trainset,batch_size=24,num_workers=4,sampler=train_sampler)

第四步,使用DDP包装模型。device_id仍然是args.local_rank。

model = DDP(model, device_ids=[args.local_rank])

第五步,将输入数据放到指定GPU。后面的前后向传播和以前相同。

for imgs,labels in trainloader:
        
    imgs=imgs.to(args.local_rank)
    labels=labels.to(args.local_rank)
    
    optimizer.zero_grad()
    output=net(imgs)
    loss_data=loss(output,labels)
    loss_data.backward()
    optimizer.step()

第六步,启动训练。torch.distributed.launch就是启动脚本,nproc_per_node是GPU数。

python -m torch.distributed.launch --nproc_per_node 2 main.py

通过以上六步,我们就让模型跑在了单机多卡上。是不是也没有那么麻烦,但确实要比DataParallel复杂一些,考虑到加速效果,不妨试一试。

4. DistributedDataParallel注意点

DistributedDataParallel是多进程方式执行的,那么有些操作就需要小心了。如果你在代码中写了一行print,并使用4卡训练,那么你将会在控制台看到四行print。我们只希望看到一行,那该怎么做呢?

像下面一样加一个判断即可,这里的get_rank()得到的是进程的标识,所以输出操作只会在进程0中执行。

if dist.get_rank() == 0:
    print("hah")

你会经常需要dist.get_rank()的。因为有很多操作都只需要在一个进程里执行,比如保存模型,如果不加以上判断,四个进程都会写模型,可能出现写入错误;另外load预训练模型权重时,也应该加入判断,只load一次;还有像输出loss等一些场景。

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

 

Pytorch DDP原理及配置[最大限度提高GPU利用率] pytorch在单机多卡,多机多卡之间已经做了进一步的优化,最早之前可以使用net = torch.nn.DataParallel(net.cuda(), device_ids=range(torch.cuda.device_count()))来使用多显卡加速运行,但是会受到python GIL锁的限制,导致对CPU的使用率不高,进而导致多显卡之间的协调不足,出现利用率较低的情况。为了解决这个微博替,需要将原来的代码进行说为的修改,使用DDP的方式提高多卡的利用率。 阅读详情

相关推荐

PyTorch分布式训练

概览 PyTorch 是一个 Python 优先的深度学习框架,能够在强大的 GPU 加速基础上实现张量和动态神经网络。PyTorch的一大优势就是它的动态图计算特性。 License :MIT License 官网:http://pytorch.org/ GitHub:https://github.com/pytorch/pytorch Pytorch 是从Facebook孵化出来的,...

苦逼Sure的水逼生涯 3万+

Pytorch DistributedDataParallel 多卡训练

pytorch 多卡GPU训练 基础知识 常用方法 torch.cuda.is_available():判断 GPU 是否可用 torch.cuda.device_count():计算当前可见可用的 GPU 数 torch.cuda.get_device_name():获取 GPU 型号,如Tesla K80 torch.cuda.manual_seed():为当前 GPU 设置随机种子 torch.cuda.manual_seed_all():为所有可见可用 GPU 设置随机种子 tor.

健康工作每一天 1万+

PyTorch分布式训练简介

PyTorch分布式训练 分布式训练已经成为如今训练深度学习模型的一个必备工具,但pytorch默认使用单个GPU进行训练,如果想用使用多个GPU乃至多个含有多块GPU的节点进行分布式训练的时候,需要在代码当中进行修改,这里总结一下几种使用pytorch进行分布式训练的方式。 环境 本文使用的环境为: python =3.7 pytorch = 1.0 CUDA = 8.0 使用单个GPU p...

baidu_19518247的博客 2万+

pytorch的多GPU训练的两种方式

方法一:torch.nn.DataParallel 1. 原理 如下图所示:小朋友一个人做4份作业,假设1份需要60min,共需要240min。 这里的作业就是pytorch中要处理的data。 与此同时,他也可以先花3min把作业分配给3个同伙,大家一起60min做完。最后他再花3min把作业收起来,一共需要66min。 这个小朋友就是主GPU。他的过程是:分发 ->并行运算->结果回收。 这就是pytorch要使用的第一种并行方法:torch.nn.DataPa.

Mr_health的博客 1万+

PyTorch分布式训练:从入门到精通

本文全面介绍了PyTorch分布式训练的核心技术与实践方法。主要内容包括:1) 分布式训练基础(数据并行、模型并行、流水线并行);2) PyTorch核心概念(进程组、通信后端、训练模式);3) 数据并行实现(DataParallel与DistributedDataParallel对比);4) 模型并行与混合并行策略;5) 性能优化技巧(混合精度训练、梯度累积、通信优化);6) 实战案例(大规模语言模型训练)。

zzywxc787的博客 7945

PyTorch分布式训练方法

本期文章分享的,是如何使用起多张显卡,来加速你的AI模型。分布式训练技术逐渐成为AI从业者必备技能之一,这是从“小模型”走向“大模型”的必由之路。我们以 PyTorch 编写的ResNet训练为例,为大家展示不同的分布式训练方法及其效果。

weixin_66945478的博客 6118

pytorch 分布式训练

神经网络训练加速的最简单方法是使用GPU,对弈神经网络中常规操作(矩阵乘法和加法)GPU运算速度要倍超于CPU。随着模型或数据集越来越大,一个GPU很快就会变得不足。例如,BERT和GPT-2等大型语言模型是在数百个GPU上训练的。对于多GPU训练,需要一种在不同GPU之间对模型和数据进行切分和调度的方法。PyTorch是非常流行的深度学习框架,它在主流框架中对于灵活性和易用性的平衡最好。和。DataParallel更易于使用(只需简单包装单GPU模型)。

Billie使劲学的博客 4170

【PyTorch实战:分布式训练】15、PyTorch分布式训练指南:让模型训练速度翻倍

摘要: 分布式训练通过多GPU协作解决单卡算力瓶颈,适用于大模型、大数据场景。核心策略包括数据并行(拆分数据到多GPU,同步梯度)和模型并行(拆分模型层,适合超大规模模型)。数据并行实现简单、效率高,是PyTorch的首选方案;模型并行通信开销大,仅用于单卡无法容纳的大模型(如GPT-3)。实战前需检测GPU环境,掌握设备迁移方法,并理解Rank、World Size等分布式概念。本文将从原理到代码详解PyTorch的DataParallel与DistributedDataParallel实现,帮助开发者高

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1559

PyTorch分布式训练简明教程

文章目录DistributedDataParallel内部机制实例讲解普通单卡训练分布式训练混合精度训练(采用apex)题外话参考 神经网络训练加速的最简单方法是使用GPU,对弈神经网络中常规操作(矩阵乘法和加法)GPU运算速度要倍超于CPU。随着模型或数据集越来越大,一个GPU很快就会变得不足。例如,BERT和GPT-2等大型语言模型是在数百个GPU上训练的。对于多GPU训练,需要一种在不同GP...

小白将 1万+

GPD源码分析

gpd使用示例 先看下面一段代码,为标准gpd算法的使用方法,可以看到输入为点云,cloud_camera_; 输入:std::unique_ptr<gpd::util::Cloud> cloud_camera_ 输出: std::vector<std::unique_ptr<gpd::candidate::Hand>> grasps; // detect grasp poses gpd对象:std::unique_ptr<gpd::GraspDetect.

weixin_41003113的博客 2331

基于DNN、CNN与SVM的串联电弧故障智能检测:从原理到嵌入式部署

在电气安全与工业物联网领域,时间序列分类是处理传感器信号、实现状态监测与故障诊断的核心技术。其原理在于从连续的信号数据中提取有效特征,并利用机器学习模型识别异常模式。这项技术的核心价值在于能够实现设备预测性维护、提升系统安全性并降低运维成本,广泛应用于智能电表、电机健康监测、电力设备保护等场景。本文聚焦于电气安全中的一个具体且危险的隐患——串联电弧故障的检测。针对这一隐蔽性强、传统方法误报率高的问题,项目深入实践了三种主流AI模型:深度神经网络、卷积神经网络和支持向量机。通过对比DNN的通用特征学习能力、C

weixin_31860973的博客 412

pytorch 分布式训练 distributed parallel 笔记

此文章仅供学习使用,请勿用作商业用途。 在GPU上进行训练 查看自己的GPU并赋值device device = torch.device(&quot;cuda:0&quot; if torch.cuda.is_available() else &quot;cpu&quot;) net.to(device) inputs, labels = inputs.to(device), labels.to(device) 多GPU并行编程 普...

JPZ的各种笔记 6万+

FPGA_adc采样并通过以太网发送到上位机

本项目使用FPGA-ZYNQ-7020采集8通道ADC数据,通过以太网上传到上位机显示波形PL部分包括数据的获取与处理,数据从PL传递到PSPS部分包括以太网的发送,由PL到PS的中断触发本文章不详细讲解背后原理 但保证每一步足够详细,跟着就能实现。本人FPGA平台 大磊FPGA7020开发板 vivado2020.2 vitis2020.2 匿名上位机公开版

weixin_42304868的博客 5623

PyTorch 分布式训练

分布式训练是指将模型训练过程划分到多个计算设备(通常是多个 GPU,甚至是多台机器)上进行协同处理,目标是加速训练速度和扩展模型容量。数据并行(Data Parallelism):每个 GPU 处理不同的数据子集,同步梯度。模型并行(Model Parallelism):将模型拆成多个部分,分别部署到不同的 GPU。混合并行(Hybrid Parallelism):结合模型并行和数据并行。流水线并行(Pipeline Parallelism):按层切分模型,不同 GPU 处理不同阶段。变量名。

handsomeboysk的博客 1154

不同比例尺地质数据共享

包含20w、25w、100w、250w比例尺地质数据共享。

sinat_38828898的博客 2305

YOLOv8交通监控全方案:精准车辆计数+违章(闯红灯/压线)识别,拿来就落地!

作为深耕计算机视觉落地的开发者,我见过太多交通监控的“伪智能”——传统系统要么车辆计数不准(漏计/重复计数),要么违章识别滞后(靠人工回看录像),甚至连“闯红灯、压线”这类常见违章都无法实时判定,完全满足不了实际交通管理需求。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 646

pytorch分布式训练

分布式训练

xx_xjm的博客 7216

Python二级考试题目及答案解析(含刷题软件)

答案:A 解析:print()函数可以在屏幕上输出指定的字符串或变量,input()函数用于从键盘获取用户输入,int()函数可以将指定的字符串或浮点数转换为整数,float()函数可以将指定的字符串或整数转换为浮点数。答案:A 解析:int()函数可以将字符串转换为整数,float()函数可以将字符串转换为浮点数,str()函数可以将任意类型的变量转换为字符串,bool()函数可以将任意类型的变量转换为布尔值。

YOLO 1万+

Pytorch分布式训练指南(详细)

pytorch分布式训练指北 作者:高彬 g00471741 第一章节的部分是简单的科普,想看如何在本地跑pytorch分布式的直接看第二章。 1、pytorch分布式代码基础 1.1、如何写pytorch的分布式代码 这个部分大概讲一下如何写分布式的Pytorch代码,首先,官方pytorch(v1.0.10)在分布式上给出的api有这么两个非常重要的 ,需要使用的: torch.nn....

gbyy42299的博客 1万+

C#中通过Mapster实现轻量级高效对象映射器:从零到精通

本文介绍了.NET生态中高性能对象映射库Mapster的完整使用指南。从基础安装(通过NuGet包)到快速入门示例,展示了如何实现简单对象映射。进一步讲解了自定义映射规则、命名不一致属性的处理方式,以及如何在ASP.NET Core中集成Mapster服务。针对复杂场景,详细解析了嵌套对象映射的配置技巧,并提供了性能优化方案(如预编译映射器)和调试技巧(启用调试模式、捕获映射异常)。通过完整的代码实践,帮助开发者高效解决从基础到高级的对象映射需求。

墨夶的博客 741

SAP UI5 主题设置全解析:从启动参数到运行时切换、跨域白名单与事件监听

SAP UI5主题体系深度解析:从配置到切换的完整指南 摘要:SAP UI5主题机制远不止CSS换肤,其工程化实践涵盖启动配置、运行时API切换、跨库路径映射及安全管控等关键环节。通过bootstrap标签或URL参数设置初始主题,运行时可用Theming.setTheme无刷新切换。自定义主题需配置theme-roots路径,跨域加载需声明sap-allowed-theme-origins白名单。主题切换完成后会触发applied事件,适合执行视觉同步操作。该体系支持多品牌适配、集中式主题管理,在Fior

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 325

PyTorch分布式训练深度指南

《PyTorch分布式训练深度指南》摘要:本文系统介绍PyTorch分布式训练技术体系,涵盖数据并行(DDP)、模型并行(包括Tensor和Pipeline并行)等核心策略,详细解析混合精度训练(AMP)、梯度聚合优化等关键实现。通过ResNet-152实战案例展示多GPU集群配置与性能调优方法,包括通信重叠、梯度分桶等优化技巧。特别探讨弹性训练容错机制及3D并行等前沿技术,提供从单机多卡到大规模分布式训练的全套解决方案,帮助开发者实现线性加速比。

zzywxc787的博客 967

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

分布式训练:(Pytorch)

数据加载:使用多个进程来并行加载和预处理数据,通过流水线处理减少数据加载的延迟。数据传输:利用 CUDA 流优化从固定内存到 GPU 的数据传输。数据并行性:使用数据并行和 NCCL 等通信库实现高效的梯度同步和模型参数更新,优化训练过程。这种方法结合了数据加载、数据传输和数据并行处理的优化,能够显著提升深度学习模型的训练效率和速度。dataset,num_workers=4, # 使用 4 个子进程加载数据pin_memory=True # 将数据转移到固定内存# 模型训练代码# ...

qq_55794606的博客 2625

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

pytorch 分布式训练_使用分布式数据并行在pytorch中进行分布式模型训练

pytorch 分布式训练Cutting edge deep learning models are growing at an exponential rate: where last year’s GPT-2 had ~750 million parameters, this year’s GPT-3 has 175 billion. GPT is a somewhat extreme exa...

weixin_26750481的博客 3469

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 慢 SQL 分析与优化
下一篇: 羡慕呀!我同事靠这篇Java面试八股文,成功跳槽现在33k+。
Java5658
博客等级 码龄4年 169粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值