深度学习-分布式训练机制

1、分布式训练时,包括train.py的全部的代码都会在每个gpu上运行吗?

  • 在分布式训练(如使用 PyTorch 的 DistributedDataParallel,DDP)时,每个 GPU 上运行的进程会执行 train.py 的全部代码,但通过分布式机制(如 rank、world_size、torch.distributed 等)控制不同进程的行为,确保它们协作完成训练任务。
  • 每个 GPU 对应一个独立的进程,每个进程都会从头到尾完整执行 train.py 的代码(包括数据加载、模型初始化、前向/反向传播等)。但通过条件判断和分布式通信,不同进程会执行不同的逻辑分支(例如:仅 rank=0 的进程保存模型、打印日志等)。
    2、解释下面分布式训练的启动代码
CONFIG=$1
GPUS=$2
PORT=${PORT:-28651}PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \
python3 -m torch.distributed.launch --nproc_per_node=$GPUS --master_port=$PORT \$(dirname "$0")/train.py $CONFIG --launcher pytorch ${@:3}

这段代码是一个用于启动分布式训练的 Bash 脚本,通常用于 PyTorch 的 DistributedDataParallel (DDP) 训练。它通过 torch.distributed.launch 启动多个进程(每个 GPU 一个进程),并传递必要的参数。
3、torch.distributed.launch后面接的train.py的位置可以任意吗?
Python 解释器在执行脚本时,会根据提供的路径(绝对路径、相对路径或模块名)动态定位文件,只要路径有效即可。torch.distributed.launch 只是将 train.py 的路径传递给 Python 解释器,由解释器负责加载文件,因此路径格式只需符合 Python 的规则即可。
torch.distributed.launch 后面接的训练脚本名称 可以是任意有效的 Python 脚本文件名,只需满足以下条件:
后缀必须是 .py:因为 torch.distributed.launch 最终会调用 Python 解释器执行该文件。
文件名允许任意命名:如 train.py、main.py、custom_script.py 均可,只需文件内容符合训练逻辑。
4、解释下面分布式训练的初始化代码

dist_params = dict(backend="nccl")
init_dist(args.launcher, timeout=timedelta(seconds=3600), **cfg.dist_params)
  • 指定启动器为pytorch,指定gpu间的通信为"nccl",设置通信超时为1小时,定义一个字典 dist_params,指定分布式训练的后端通信库为 NCCL(NVIDIA Collective Communications Library)。“nccl” 指定分布式训练使用的通信后端,nccl 是 NVIDIA GPU 间高效通信的库,适用于多 GPU 训练。
  • 底层实现(PyTorch 分布式核心)
    init_dist 函数内部通常会调用 PyTorch 的 torch.distributed.init_process_group,关键逻辑如下:
import torch.distributed as dist
def init_dist(launcher, **kwargs):if launcher == "pytorch":dist.init_process_group(**kwargs)  # 实际初始化分布式环境elif launcher == "slurm":# SLURM 集群的特殊处理...

init_process_group 的关键参数
backend:通信后端(如 “nccl”)。
init_method:进程组初始化方式(如 “env://” 表示通过环境变量自动发现)。
world_size:全局进程数(通常由启动器自动设置)。
rank:当前进程的全局编号(由启动器自动设置)。
进程组操作的超时时间(timeout) 是指分布式进程组(Process Group)在执行集体通信操作(如梯度同步、数据广播等)时的最大等待时间。如果操作在指定时间内未完成,会触发超时错误(torch.distributed.DistBackendError)。
5、梯度同步
梯度同步的基本流程
(1) 前向传播
每个 GPU 独立处理自己分配到的数据(一个 mini-batch 的子集),计算 本地损失(local loss)。
注意:每个 GPU 的损失是基于其本地数据计算的,不是全局所有数据的平均损失。
(2) 反向传播
每个 GPU 根据本地损失计算 本地梯度(即对模型参数的偏导数)。
此时各 GPU 的梯度可能不同(因数据不同)。
(3) 梯度同步(关键步骤)
通过 All-Reduce 操作(通常是求和或平均)将所有 GPU 的梯度同步,得到全局一致的梯度。
同步后的梯度 = 所有 GPU 本地梯度的均值(若使用 平均)或总和(若使用 求和)。
(4) 参数更新
所有 GPU 使用同步后的全局梯度更新模型参数(保证所有 GPU 的模型始终保持一致)。

6、既然每个gpu独立计算本地损失,那每次训练迭代后,可视化的损失是如何计算的
在分布式训练中,可视化的损失值通常是通过对多个 GPU 的本地损失进行聚合计算得到的。具体计算方式和实现逻辑如下:
损失计算的基本流程
在分布式训练(如 PyTorch 的 DistributedDataParallel)中,每个 GPU 独立处理一部分数据(batch_size / num_gpus),并按以下步骤计算损失:
前向传播:
每个 GPU 用当前模型参数计算其本地数据的预测结果。
计算 本地损失(如交叉熵、MSE),假设为 loss_local。
反向传播:
根据本地损失计算梯度(loss_local.backward())。
通过 All-Reduce 同步梯度(梯度取平均或求和,取决于配置)。
损失聚合:
为了可视化或日志记录,需要将所有 GPU 的本地损失聚合为 全局损失。
2. 损失聚合的常见方法
(1) 直接求平均(默认推荐)
公式:
global_loss=1N∑i=1Nloss_locali
global_loss=N1​i=1∑N​loss_locali​
NN 是 GPU 数量(world_size)。
物理意义:所有 GPU 本地损失的均值,等价于单卡使用全局 batch 计算的损失。
PyTorch 实现:

import torch.distributed as dist
# 计算本地损失(每个 GPU 的 batch 是总 batch 的一部分)
loss_local = criterion(output, target)
# 聚合所有 GPU 的损失(求平均)
dist.all_reduce(loss_local, op=dist.ReduceOp.SUM)  # 先求和
global_loss = loss_local / dist.get_world_size()    # 再除以 GPU 数量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/81178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yarn的介绍

### Yarn 的基本概念 Yarn 是 Hadoop 生态系统中的一个重要组成部分,它是一种分布式资源管理框架,旨在为大规模数据处理提供高效的资源管理和调度能力。以下是关于 Yarn 的一些核心概念: #### 1. **Yarn 的定义** Yarn 是一个资源调度平台&a…

Spring-messaging-MessageHandler接口实现类ServiceActivatingHandler

ServiceActivatingHandler实现了MessageHandler接口,所以它是一个MessageHandler,在spring-integration中,它也叫做服务激活器(Service Activitor),因为这个类是依赖spring容器BeanFactory的,所…

快速入门深度学习系列(2)----损失函数、逻辑回归、向量化

针对深度学习入门新手目标不明确 知识体系杂乱的问题 拟开启快速入门深度学习系列文章的创作 旨在帮助大家快速的入门深度学习 写在前面: 本系列按照吴恩达系列课程顺序发布(说明一下为什么不直接看原笔记 因为内容太多 没有大量时间去阅读 所有作者需要一次梳理…

KingBase问题篇

安装环境 操作系统:CentOS7 CPU:X86_64架构 数据库:KingbaseES_V008R006C009B0014_Lin64_install.iso 项目中遇到的问题 Q1. 执行sql中有字符串常量,且用双引号包裹,执行报错 A1. 默认KingBase不认双引号&#xff0…

濒危仙草的重生叙事:九仙尊米斛花节如何以雅集重构中医药文化IP

五月的霍山深处,层峦叠翠之间,中华仙草霍山米斛迎来一年一度的花期。九仙尊以“斛韵雅集,春野茶会”为主题,举办为期半月的米斛花文化节,融合中医药文化、东方美学与自然体验,打造一场跨越古今的沉浸式文化盛宴。活动涵盖古琴雅集、书法创作、茶道冥想、诗歌吟诵、民族歌舞等多…

LeetCode100.1 两数之和

今天晚上看了许多关于未来计算机就业的视频,有种正被贩卖焦虑的感觉,翻来覆去下决定先做一遍leetcode100给自己降降温,打算每周做四题,尽量尝试不同的方法与不同的语言。 一开始想到的是暴力解法,两层循环。数据量为1e…

python制造一个报错

以下是用Python制造常见错误的示例及解析,涵盖不同错误类型,便于理解调试原理: 一、语法错误 (SyntaxError) # 错误1:缺少冒号 if Trueprint("这行不会执行")# 错误2:缩进错误 def func(): print("未对…

idea整合maven环境配置

idea整合maven 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】:每个知识点,都是写出代码…

Node.js中那些常用的进程通信方式

文章目录 1 什么是子进程?2 核心方法详解2.1 `child_process.spawn(command, [args], [options])`2.2 `child_process.exec(command, [options], callback)`2.3 `child_process.execFile(file, [args], [options], callback)`2.4 `child_process.fork(modulePath, [args], [op…

Vue3吸顶导航的实现

吸顶导航实现 【实现目标】: 在Layout页面中,浏览器上下滚动时,距离顶部距离大于80px吸顶导航显示,小于则隐藏。 【实现过程】: 通过layout接口获取分类列表内容并使用categorystore进行状态管理,获取到…

双向长短期记忆网络-BiLSTM

5月14日复盘 二、BiLSTM 1. 概述 双向长短期记忆网络(Bi-directional Long Short-Term Memory,BiLSTM)是一种扩展自长短期记忆网络(LSTM)的结构,旨在解决传统 LSTM 模型只能考虑到过去信息的问题。BiLST…

2025年Flutter项目管理技能要求

在2025年,随着Flutter技术的广泛应用和项目复杂度的提升,项目管理的重要性愈发凸显。Flutter项目管理不仅需要技术能力,还需要良好的沟通、协调、规划和执行能力。本文将详细探讨2025年Flutter项目管理应具备的技能要求,帮助项目管…

OpenCV CUDA模块中逐元素操作------数学函数

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在OpenCV的CUDA模块中,确实存在一系列用于执行逐元素数学运算的函数,包括指数、对数、平方根等。这些函数对于高级图像处…

PhpStudy | PhpStudy 工具安装 —— Kali Linux 系统安装 PhpStudy

🌟想了解这个工具的其它相关笔记?看看这个:[网安工具] 服务器环境配置工具 —— PhpStudy 使用手册 笔者备注:演示虽然是 Kali Linux,但其实 Linux 系列都可以参考此流程完成安装。 在前面的章节中,笔者简…

第6讲、全面拆解Encoder、Decoder内部模块

全面拆解 Transformer 架构:Encoder、Decoder 内部模块解析(附流程图小测验) 关键词:Transformer、Encoder、Decoder、Self-Attention、Masked Attention、位置编码、残差连接、多头注意力机制 Transformer 自 2017 年诞生以来&am…

游戏引擎学习第283天:“让‘Standing-on’成为一个更严谨的概念

如果同时使用多个OpenGL上下文,并且它们都有工作负载,GPU或GPU驱动程序如何决定调度这些工作?我注意到Windows似乎优先处理活动窗口的OpenGL上下文(即活动窗口表现更好),挺有意思的…… 当多个OpenGL上下文…

深度学习让鱼与熊掌兼得

通常,一个大的复杂的模型的loss会低,但是拟合方面不够,小的模型在拟合方面更好,但是loss高,我们可以通过深度学习来得到一个有着低loss的小模型 我们之前学过,peacewise linear可以用常数加上一堆这个阶梯型函数得到,然后因为peacewise linear可以逼近任何function,所以理论上…

如何在 AWS 上构建支持 AVIF 的前端图片优化方案

一、为什么使用 AVIF 图片格式? 优势点 说明 高压缩率 在相似质量下,AVIF 文件比 JPEG/PNG/WebP 更小,能有效节省带宽和存储空间。 更高画质 即使在低码率下也能保持清晰细节,减少压缩带来的马赛克或模糊问题。 支持透明度 …

C++中的std::allocator

C中的std::allocator 文章目录 C中的std::allocator1.std::allocator1.1C中的placement new 和operator new1.2一个custom allocator的实现1.3使用std::allocator_traits实现allocator 1.std::allocator C中的std::allocator默默工作在CSTL中的所有容器的内存分配上&#xff0…

CodeBuddy编程新范式

不会写?不想写? 腾讯推出的CodeBuddy彻底解放双手。 示例 以下是我对CodeBuddy的一个小体验。 我只用一行文字对CodeBuddy说明了一下我的需求,剩下的全部就交给了CodeBuddy,我需要做的就是验收结果即可。 1.首先CodeBuddy会对任…