【知识】torchrun 与 torch.multiprocessing.spawn 的对比
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn]
如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~
来自ChatGPT、DeepSeek
有点干,可仅做了解。
torchrun 和 torch.multiprocessing.spawn 都是在 PyTorch 中用于并行化和分布式训练的工具,但它们在使用场景和实现方式上有所不同。
1. 用途和功能
-
torchrun:- 主要用于分布式训练,特别是在多机或多卡训练时。
torchrun是 PyTorch 提供的一个命令行工具,它自动启动分布式训练环境并启动多个进程。通常用于在多个节点(例如,多个GPU或多个机器)上启动并行训练。- 它是
torch.distributed.launch的替代品,提供更简洁的配置和更好的支持。
-
torch.multiprocessing.spawn:- 是一个 Python API,用于在单个机器(或单个进程)上启动多个子进程。这些子进程通常是用于在每个进程上运行不同的模型副本或进行数据并行。
spawn是在单机多卡(multi-GPU)环境下进行训练时常用的工具,特别适用于分布式数据并行(torch.nn.DataParallel或torch.nn.parallel.DistributedDataParallel)。- 它允许你控制每个进程的启动,并且能确保每个进程有独立的 GPU 资源。
2. 实现方式
torchrun:
- 它基于
torch.distributed,通常通过传递命令行参数来配置分布式环境。你只需指定 GPU 数量、节点数量、主节点等配置。 - 它会自动配置并启动各个训练进程,并且处理进程间的通信。
- 命令行调用的示例:
# script.py
import torch
import torch.distributed as distdef main():dist.init_process_group(backend="nccl")rank = dist.get_rank()# 训练逻辑if __name__ == "__main__":main()
torchrun --nnodes=1 --nproc_per_node=8 --rdzv_id=1234 --rdzv_backend=c10d --master_addr="localhost" --master_port=29500 script.py
torch.multiprocessing.spawn:
- 通过 Python 代码调用,每个进程都是通过
multiprocessing.spawnAPI 启动的。每个子进程可以执行不同的任务。 - 它通常用来启动多个进程,并在每个进程上执行模型训练代码,能够在单机环境下利用多个 GPU。
- 代码示例:
import torch
import torch.distributed as dist
from torch.multiprocessing import spawndef train_fn(rank, world_size, args):dist.init_process_group(backend="nccl",init_method="env://",world_size=world_size,rank=rank)# 训练逻辑if __name__ == "__main__":world_size = 4spawn(train_fn, args=(world_size, {}), nprocs=world_size)
3. 进程间通信
-
torchrun:- 自动设置进程间的通信和同步。它是基于 NCCL(NVIDIA Collective Communications Library)或 Gloo 进行通信,适合大规模分布式训练。
-
torch.multiprocessing.spawn:- 你需要手动设置通信(如使用
torch.nn.parallel.DistributedDataParallel或torch.distributed来进行多进程间的数据同步和梯度更新)。 - 更加灵活,但也需要开发者更细致的配置。
- 你需要手动设置通信(如使用
4. 跨节点支持
-
torchrun:- 支持跨节点训练,可以设置多个机器上的进程,适合大规模多机训练。
-
torch.multiprocessing.spawn:- 通常用于单机多卡训练,不直接支持跨节点训练,更多的是集中在本地多个 GPU 上。
5. 效率影响
在 PyTorch 分布式训练中,torchrun 和 torch.multiprocessing.spawn 的底层通信机制(如 NCCL、Gloo)是相同的,因此两者的训练效率(如单步迭代速度)在理想配置下通常不会有显著差异。然而,它们的设计差异可能间接影响实际训练效率,尤其是在环境配置、资源管理和容错机制上。
1. 效率核心因素:无本质差异
-
通信后端相同:无论是
torchrun还是spawn,底层均依赖 PyTorch 的分布式通信库(如 NCCL、Gloo),数据传输效率由后端实现决定,与启动工具无关。 -
计算逻辑一致:模型前向传播、反向传播的计算逻辑完全由用户代码控制,与启动工具无关。
2. 间接影响效率的场景
场景 1:环境初始化效率
-
torch.multiprocessing.spawn:-
需要手动初始化分布式环境(如
init_process_group),若配置错误(如端口冲突、IP 错误)可能导致进程启动延迟或失败。 -
单机多卡场景下简单直接,但多机场景需手动同步
MASTER_ADDR和MASTER_PORT,易出错且耗时。
-
-
torchrun:-
自动设置环境变量(如
RANK,WORLD_SIZE,MASTER_ADDR等),减少配置错误风险。 -
在多机训练中,通过参数(如
--nnodes,--node_rank)快速配置,显著降低初始化时间。
-
结论:torchrun 在复杂环境(多机)下初始化更高效,减少人为错误导致的延迟。
场景 2:资源管理与进程调度
-
torch.multiprocessing.spawn:-
父进程直接管理子进程,若某个子进程崩溃,整个训练任务会直接终止(无容错)。
-
资源分配完全由用户代码控制,缺乏动态调整能力。
-
-
torchrun:-
支持弹性训练(需结合
torch.distributed.elastic),进程崩溃后可自动重启并恢复训练(需用户实现检查点逻辑)。 -
提供更精细的进程监控和资源分配策略(如动态调整
WORLD_SIZE),减少资源闲置。
-
结论:torchrun 在容错和资源利用率上更优,尤其在长时训练或不稳定环境中,能减少因故障导致的总时间浪费。
场景 3:日志与调试效率
-
torch.multiprocessing.spawn:-
各进程日志独立输出,需手动聚合分析(如使用
torch.distributed的日志工具)。 -
错误堆栈可能分散,调试复杂。
-
-
`torchrun``:
-
提供统一的日志输出格式,自动聚合错误信息。
-
支持通过
--redirect参数重定向日志,便于定位问题。
-
结论:torchrun 的日志管理更友好,减少调试时间,间接提升开发效率。
6. 选择建议
如果是单机多卡训练,可以考虑使用 torch.multiprocessing.spawn。如果是分布式训练(尤其是跨节点),则推荐使用 torchrun,它能够简化配置和进程管理。
相关文章:
【知识】torchrun 与 torch.multiprocessing.spawn 的对比
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 来自ChatGPT、DeepSeek 有点干,可仅做了解。 torchrun 和 torch.multiprocessing.spawn 都是在 PyTorch 中用于并行化和分布式训练的工具&a…...
深入了解 K-Means 聚类算法:原理与应用
引言 在数据科学和机器学习的世界中,聚类是一项非常重要的技术,它帮助我们根据数据的相似性将数据划分为不同的组或簇。聚类算法在许多领域中得到了广泛的应用,如图像处理、市场细分、基因研究等。K-Means 聚类算法作为最常见的无监督学习算…...
Rust ~ Collect
背景 Transforms an iterator into a collection 将一个迭代器转换为一个集合 collect() 可以处理任何可迭代的对象,并将其转换为相关的集合 collect() 最基本模式是将一个集合转换为另一个集合: 先获取一个集合,对其调用 iter 方法&#x…...
C# 类型转换
C# 类型转换 引言 在C#编程语言中,类型转换是一种将一个数据类型的变量转换成另一个数据类型的操作。类型转换是编程中常见的操作,特别是在处理不同数据类型的变量时。本文将详细探讨C#中的类型转换,包括隐式转换和显式转换,以及…...
[IP] DDR_FIFO(DDR3 用户FIFO接口)
IP(DDR_FIFO)将DDR3 IP的用户侧复杂接口修改为简易的FIFO接口,用户侧更加简易例化使用MIG 核 IP介绍 c0_xx (连接DDR app接口) 此IP 仅需根据MIG配置进行有限修改,即可使用! 关于IP详细使用说明,参考IP datasheet! 示…...
第三百七十二节 JavaFX教程 - JavaFX HTMLEditor
JavaFX教程 - JavaFX HTMLEditor HTMLEditor控件是一个富文本编辑器,具有以下功能。 粗体斜体下划线删除线字体系列字体大小前景色背景颜色缩进项目符号列表编号列表对齐水平线复制文本片段粘贴文本片段 HTMLEditor类返回HTML字符串中的编辑内容。 创建HTML编辑器…...
蓝桥杯试题:DFS回溯
一、题目要求 输入一个数组n,输出1到n的全排列 二、代码展示 import java.util.*;public class ikun {static List<List<Integer>> list new ArrayList<>();public static void main(String[] args) { Scanner sc new Scanner(System.in);…...
Lua | 每日一练 (4)
💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Lua | 每日一练 (4)题目参考答案线程和协程调度方式上…...
每日一题——接雨水
接雨水问题详解 问题描述 给定一个非负整数数组 height,表示每个宽度为 1 的柱子的高度图。计算按此排列的柱子,下雨之后能接多少雨水。 示例 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释&#…...
java常见面试01
为什么重写 equals 还要重写 hashcode 🌈 核心原因: 当两个对象通过equals()判断为相等时,它们的hashCode()必须返回相同的整数值!这是Java世界的交通规则哦~(交警曼波敬礼.jpg) 🧩 具体场景…...
算法-二叉树篇27-把二叉搜索树转换为累加树
把二叉搜索树转换为累加树 力扣题目链接 题目描述 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提…...
C语言:51单片机 基础知识
一、单片机概述 单片机的组成及其特点 单片机是指在一块芯片上集成了CPU、ROM、RAM、定时器/计数器和多种I/O接口电路等,具有一定规模的微型计算机。 特点: 1、单片机的存储器以ROM、RAM严格分工。 2、采用面向控制的指令系统。 3、单片机的I/O口引脚通…...
olmOCR:使用VLM解析PDF
在PDF解析中,目前主流的开源工具包括Minuer、GOT OCR等。主要都是通过飞桨等OCR套件组装的一套pipeline,或者直接通过VLM解析图像。 #一、 olmOCR是使用VLM进行的端到端的PDF文档解析 二、document-anchoring 与上述的不同在于,olmOCR使用…...
数据结构(初阶)(七)----树和二叉树(堆,堆排序)
八,树与二叉树 树 概念与结构 树是⼀种⾮线性的数据结构,它是由 n(n>0) 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。 • 有⼀…...
图像分类项目1:基于卷积神经网络的动物图像分类
一、选题背景及动机 在现代社会中,图像分类是计算机视觉领域的一个重要任务。动物图像分类具有广泛的应用,例如生态学研究、动物保护、农业监测等。通过对动物图像进行自动分类,可以帮助人们更好地了解动物种类、数量和分布情况,…...
Kali Linux 2024.4版本全局代理(wide Proxy)配置,适用于浏览器、命令行
1. 网络拓扑介绍(不使用虚拟机直接跳到2) 虚拟机:VMware 17 Pro,为本机开启桥接模式。 我的究极套娃网络:手机V2rayNG代理端口为10808,开热点 -> 电脑连接wifi -> 虚拟机中运行kali 2. kali 配置…...
[Windows] 批量为视频或者音频生成字幕 video subtitle master 1.5.2
Video Subtitle Master 1.5.2 介绍 Video Subtitle Master 1.5.2 是一款功能强大的客户端工具,能够批量为视频或音频生成字幕,还支持批量将字幕翻译成其他语言。该工具具有跨平台性,无论是 mac 系统还是 windows 系统都能使用。 参考原文&a…...
不要升级,Flutter Debug 在 iOS 18.4 beta 无法运行,提示 mprotect failed: Permission denied
近期如果有开发者的 iOS 真机升级到 18.4 beta,大概率会发现在 debug 运行时会有 Permission denied 的相关错误提示,其实从 log 可以很直观看出来,就是 Dart VM 在初始化时,对内核文件「解释运行(JIT)」时…...
介绍 torch-mlir 从 pytorch 生态到 mlir 生态
一、引言 The Torch-MLIR project provides core infrastructure for bridging the PyTorch ecosystem and the MLIR ecosystem. For example, Torch-MLIR enables PyTorch models to be lowered to a few different MLIR dialects. Torch-MLIR does not attempt to provide a…...
upload
(上传一句话木马,用蚁剑链接验证是否成功/传有回显的:<?php phpinfo();?>) 学看代码 #function checkfile(){}:定义了一个名叫checkfile的函数 #var file方法.(获取名为‘upload_file’的元素)[获取哪些&…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
