【教程】PyTorch多機多卡分布式訓練的參數說明 | 附通用啟動腳本

轉載請注明出處:小鋒學長生活大爆炸[xfxuezhagn.cn]

如果本文幫助到了你,歡迎[點贊、收藏、關注]哦~

目錄

torchrun

一、什么是 torchrun

二、torchrun 的核心參數講解

三、torchrun 會自動設置的環境變量

四、torchrun 啟動過程舉例

機器 A(node_rank=0)上運行

機器 B(node_rank=1)上運行

五、小結表格

PyTorch

一、背景回顧

二、init_process_group

三、腳本中通常的典型寫法

通用啟動腳本


torchrun 與 torch.multiprocessing.spawn 的對比可以看這篇:

【知識】torchrun 與 torch.multiprocessing.spawn 的對比

torchrun

一、什么是 torchrun

torchrun 是 PyTorch 官方推薦的分布式訓練啟動器,它的作用是:

  • 啟動 多進程分布式訓練(支持多 GPU,多節點)

  • 自動設置每個進程的環境變量

  • 協調節點之間建立通信

二、torchrun 的核心參數講解

torchrun \--nnodes=2 \--nproc_per_node=2 \--node_rank=0 \--master_addr=192.168.5.228 \--master_port=29400 \xxx.py

🔹 1. --nnodes(Number of Nodes)

  • 表示參與訓練的總機器數

  • 你有幾臺服務器,就寫幾。

  • 在分布式訓練中,一個 node 就是一臺物理或虛擬的主機。

  • node的編號從0開始。

? 例子:你用 2 臺機器 → --nnodes=2


🔹 2. --nproc_per_node(Processes Per Node)

  • 表示每臺機器上要啟動幾個訓練進程。

  • 一個進程對應一個 GPU,因通常設置為你機器上要用到的GPU數。

  • 因此,整個分布式環境下,總訓練進程數 = nnodes * nproc_per_node

? 例子:每臺機器用了?2 張 GPU → --nproc_per_node=2


🔹 3. --node_rank

  • 表示當前機器是第幾臺機器

  • 從 0 開始編號,必須每臺機器都不同!

? 例子:

機器 IPnode_rank
192.168.5.2280
192.168.5.2291

🔹 4. --master_addr--master_port

  • 指定主節點的 IP 和端口,用于 rendezvous(進程對齊)和通信初始化。

  • 所有機器必須填寫相同的值!

? 建議:

  • master_addr 就是你指定為主節點的那臺機器的 IP

  • master_port 選一個未被占用的端口,比如 29400

三、torchrun 會自動設置的環境變量

當用 torchrun 啟動后,它會自動給每個進程設置這些環境變量

環境變量含義
RANK當前進程在全局中的編號(0 ~ world_size - 1)
LOCAL_RANK當前進程在本機中的編號(0 ~ nproc_per_node - 1)
WORLD_SIZE總進程數 = nnodes * nproc_per_node

你可以在訓練腳本里用 os.environ["RANK"] 來讀取這些信息:

import os
rank = int(os.environ["RANK"])
local_rank = int(os.environ["LOCAL_RANK"])
world_size = int(os.environ["WORLD_SIZE"])

示例分配圖:

四、torchrun 啟動過程舉例

假設:

  • 有 2 臺機器

  • 每臺機器有 2 個 GPU

  • 總共會啟動 4 個進程

機器 A(node_rank=0)上運行

torchrun \--nnodes=2 \--nproc_per_node=2 \--node_rank=0 \--master_addr=192.168.5.228 \--master_port=29400 \xxx.py

機器 B(node_rank=1)上運行

torchrun \--nnodes=2 \--nproc_per_node=2 \--node_rank=1 \--master_addr=192.168.5.228 \--master_port=29400 \xxx.py

torchrun 給每個進程編號的順序(分配 RANK / LOCAL_RANK)

torchrun 按照每臺機器上 node_rank 的順序,并在每臺機器上依次啟動 LOCAL_RANK=0, 1, ..., n-1,最后合成 RANK。

RANK = node_rank × nproc_per_node + local_rank

Step 1:按 node_rank 升序處理(node 0 → node 1)

Step 2:每個 node 內部從 local_rank=0 開始遞增


本質上:torchrun 是主從結構調度的

  • 所有 node 啟動后,都會和 master_addr 通信。

  • master 會統一收集所有 node 的狀態。

  • 每個 node 根據你給的 node_rank 自行派生 local_rank=0~n-1

  • 所有節點通過 RANK = node_rank * nproc_per_node + local_rank 得到自己的全局編號。

這個機制是 可預測、可控、可復現 的。


📦 node_rank=0 (機器 1)
? ? ├── local_rank=0 → RANK=0
? ? └── local_rank=1 → RANK=1

📦 node_rank=1 (機器 2)
? ? ├── local_rank=0 → RANK=2
? ? └── local_rank=1 → RANK=3

最終分配:

Node RankLocal RankGlobal Rank (RANK)使用 GPU
0000
0111
1020
1131

五、小結表格

參數作用設置方式
--nnodes總節點數你寫在命令里
--nproc_per_node每臺節點的進程數(= GPU 數)你寫在命令里
--node_rank當前機器編號(0開始)每臺機器唯一
--master_addr主節點 IP(所有節點需一致)你設置
--master_port主節點端口(所有節點需一致)你設置
RANK當前進程在所有進程中的編號torchrun 自動設置
LOCAL_RANK當前進程在本節點上的編號torchrun 自動設置
WORLD_SIZE總進程數 = nnodes * nproc_per_node自動設置

PyTorch

PyTorch 的分布式通信是如何通過 init_process_grouptorchrun 生成的環境變量配合起來工作的。

一、背景回顧

你已經用 torchrun 啟動了多個訓練進程,并且 torchrun 為每個進程自動設置了這些環境變量:

變量名含義
RANK當前進程的全局編號(從 0 開始)
LOCAL_RANK本機上的編號(一般等于 GPU ID)
WORLD_SIZE總進程數
MASTER_ADDR主節點的 IP
MASTER_PORT主節點用于通信的端口

那么 這些變量是如何參與進程通信初始化的? 這就涉及到 PyTorch 的核心函數:


二、init_process_group

torch.distributed.init_process_group?是 PyTorch 初始化分布式通信的入口:

torch.distributed.init_process_group(backend="nccl",  # 或者 "gloo"、"mpi"init_method="env://",  # 通過環境變量讀取設置
)

關鍵點:

  • backend="nccl":推薦用于 GPU 分布式通信(高性能)

  • init_method="env://":表示通過環境變量來初始化


你不需要自己設置 RANK / WORLD_SIZE / MASTER_ADDR,只要寫:

import torch.distributed as distdist.init_process_group(backend="nccl", init_method="env://")

PyTorch 會自動去環境中讀這些變量:

  • RANK → 當前進程編號

  • WORLD_SIZE → 總進程數

  • MASTER_ADDRMASTER_PORT → 主節點 IP 和端口

然后就能正確初始化所有通信進程。

三、腳本中通常的典型寫法

import os
import torch# 初始化 PyTorch 分布式通信環境
torch.distributed.init_process_group(backend="nccl", init_method="env://")# 獲取全局/本地 rank、world size
rank = int(os.environ.get("RANK", -1))
local_rank = int(os.environ.get("LOCAL_RANK", -1))
world_size = int(os.environ.get("WORLD_SIZE", -1))# 設置 GPU 顯卡綁定
torch.cuda.set_device(local_rank)
device = torch.device("cuda")# 打印綁定信息
print(f"[RANK {rank} | LOCAL_RANK {local_rank}] Using CUDA device {torch.cuda.current_device()}: {torch.cuda.get_device_name(torch.cuda.current_device())} | World size: {world_size}")

這段代碼在所有進程中都一樣寫,但每個進程啟動時帶的環境變量不同,所以最終 ranklocal_rankworld_size 就自然不同了。

通用啟動腳本

#!/bin/bash# 設置基本參數
MASTER_ADDR=192.168.5.228           # 主機IP
MASTER_PORT=29400                   # 主機端口
NNODES=2                            # 參與訓練的總機器數
NPROC_PER_NODE=2                    # 每臺機器上的進程數# 所有網卡的IP地址,用于篩選
ALL_LOCAL_IPS=$(hostname -I)
# 根據本機 IP 配置通信接口
if [[ "$ALL_LOCAL_IPS" == *"192.168.5.228"* ]]; thenNODE_RANK=0                       # 表示當前機器是第0臺機器IFNAME=ens1f1np1  mytorchrun=~/anaconda3/envs/dglv2/bin/torchrun
elif [[ "$ALL_LOCAL_IPS" == *"192.168.5.229"* ]]; thenNODE_RANK=1                       # 表示當前機器是第1臺機器IFNAME=ens2f1np1mytorchrun=/opt/software/anaconda3/envs/dglv2/bin/torchrun
elseexit 1
fi# 設置 RDMA 接口
export NCCL_IB_DISABLE=0            # 是否禁用InfiniBand
export NCCL_IB_HCA=mlx5_1           # 使用哪個RDMA接口進行通信
export NCCL_SOCKET_IFNAME=$IFNAME   # 使用哪個網卡進行通信
export NCCL_DEBUG=INFO              # 可選:調試用
export GLOO_IB_DISABLE=0            # 是否禁用InfiniBand
export GLOO_SOCKET_IFNAME=$IFNAME   # 使用哪個網卡進行通信
export PYTHONUNBUFFERED=1           # 實時輸出日志# 啟動分布式任務
$mytorchrun \--nnodes=$NNODES \--nproc_per_node=$NPROC_PER_NODE \--node_rank=$NODE_RANK \--master_addr=$MASTER_ADDR \--master_port=$MASTER_PORT \cluster.py## 如果想獲取準確報錯位置,可以加以下內容,這樣可以同步所有 CUDA 操作,錯誤不會“延遲觸發”,你會看到確切是哪一行代碼出了問題:
## CUDA_LAUNCH_BLOCKING=1 torchrun ...

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76906.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76906.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76906.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機視覺——基于 Yolov8 目標檢測與 OpenCV 光流實現目標追蹤

1. 概述 目標檢測(Object Detection)和目標追蹤(Object Tracking)是計算機視覺中的兩個關鍵技術,它們在多種實際應用場景中發揮著重要作用。 目標檢測指的是在靜態圖像或視頻幀中識別出特定類別的目標對象&#xff0…

MySQL——流程控制

一、IF條件語句 語法 IF condition THENstatements; ELSEIF condition THENstatements; ELSEstatements; END IF; 判斷成績等級 # 判斷成績等級 # 輸入學生的編號,取出學生的第一門課,然后判斷當前的課程的等級 drop procedure if exists p2; delimiter $$ crea…

C# + Python混合開發實戰:優勢互補構建高效應用

文章目錄 前言🥏一、典型應用場景1. 桌面應用智能化2. 服務端性能優化3. 自動化運維工具 二、四大技術實現方案方案1:進程調用(推薦指數:★★★★☆)方案2:嵌入Python解釋器(推薦指數&#xff1…

MLflow 入門

官方主頁 MLflow | MLflow官方文檔 MLflow: A Tool for Managing the Machine Learning Lifecycle | MLflow 0. 簡介 MLflow 是一個開源平臺,專門為了幫助機器學習的從業者和團隊處理機器學習過程中的復雜性而設計。MLflow 關注機器學習項目的完整生命周期&#x…

【藍橋杯選拔賽真題101】Scratch吐絲的蜘蛛 第十五屆藍橋杯scratch圖形化編程 少兒編程創意編程選拔賽真題解析

目錄 scratch吐絲的蜘蛛 一、題目要求 1、準備工作 2、功能實現 二、案例分析 1、角色分析 2、背景分析 3、前期準備 三、解題思路 四、程序編寫 五、考點分析 六、推薦資料 1、scratch資料 2、python資料 3、C++資料 scratch吐絲的蜘蛛 第十五屆青少年藍橋杯s…

智譜最新模型GLM4是如何練成的

寫在前面 這篇博客將基于《ChatGLM: A Family of Large Language Models from GLM-130B to GLM-4 All Tools》,深入剖析 GLM-4 系列在**模型架構設計、預訓練、后訓練(對齊)、以及關鍵技術創新(如長上下文處理、Agent 能力構建)**等環節的實現邏輯與設計考量,帶你全面了…

第二屆電氣技術與自動化工程國際學術會議 (ETAE 2025)

重要信息 2025年4月25-27日 中國廣州 官網: http://www.icetae.com/ 部分 征稿主題 Track 1:電氣工程 輸配電、電磁兼容、高電壓和絕緣技術、電氣工程、電氣測量、電力電子及其應用、機電一體化、電路與系統、電能質量和電磁兼容性、電力系統及其自…

設備調試--反思與總結

最近回顧項目, 發現:在調試過程中最耽誤時間的可能不是技術難度,而是慣性思維; 例如: 我寫can通信濾波器的時候,可能是不過濾的;是接收所有的id報文,然后用業務邏輯過濾&#xff08…

C++項目:高并發內存池_下

目錄 8. thread cache回收內存 9. central cache回收內存 10. page cache回收內存 11. 大于256KB的內存申請和釋放 11.1 申請 11.2 釋放 12. 使用定長內存池脫離使用new 13. 釋放對象時優化成不傳對象大小 14. 多線程環境下對比malloc測試 15. 調試和復雜問題的調試技…

深度學習入門:神經網絡的學習

目錄 1 從數據中學習1.1 數據驅動1.2 訓練數據和測試數據 2損失函數2.1 均方誤差2.2 交叉熵誤差2.3 mini-batch學習2.4 mini-batch版交叉熵誤差的實現2.5 為何要設定損失函數 3 數值微分3.1 數值微分3.3 偏導數 4 梯度4.1 梯度法4.2 神經網絡的梯度 5 學習算法的實現5.1 2層神經…

【第45節】windows程序的其他反調試手段上篇

目錄 引言 一、通過窗口類名和窗口名判斷 二、檢測調試器進程 三、父進程是否是Explorer 四、RDTSC/GetTickCount時間敏感程序段 五、StartupInfo結構的使用 六、使用BeingDebugged字段 七、 PEB.NtGlobalFlag,Heap.HeapFlags,Heap.ForceFlags 八、DebugPort:CheckRem…

Golang|select

文章目錄 多路監聽超時控制 多路監聽 如果selcet外面沒有for循環,則只會監聽一次,要實現一直監聽的話要加for循環但是如果要設置退出條件的話,break語句只會退出這個select而不會退出for循環 select也可以有default,用于不用等cha…

無人機的群體協同與集群控制技術要點!

一、技術要點 通信技術 高效可靠的通信鏈路:無人機集群需要穩定、低延遲的通信網絡,以實現實時數據傳輸和指令交互。通信方式包括無線自組織網絡(Ad Hoc)、蜂窩網絡、衛星通信等,需根據任務場景選擇合適的通信技術。…

新手小白如何給個人電腦安裝Deepseek?

準備工作:Ollama安裝包、Chatbox安裝包 一、安裝Ollama 官網下載: 在 Windows 上下載 Ollama:https://ollama.com/download/windows 下載較慢,大家可以自行搜索資源下載,直接雙擊安裝即可。 安裝完畢后,…

Redis之RedLock算法以及底層原理

自研redis分布式鎖存在的問題以及面試切入點 lock加鎖關鍵邏輯 unlock解鎖的關鍵邏輯 使用Redis的分布式鎖 之前手寫的redis分布式鎖有什么缺點?? Redis之父的RedLock算法 Redis也提供了Redlock算法,用來實現基于多個實例的分布式鎖。…

【控制學】控制學分類

【控制學】控制學分類 文章目錄 [TOC](文章目錄) 前言一、工程控制論1. 經典控制理論2. 現代控制理論 二、生物控制論三、經濟控制論總結 前言 控制學是物理、數學與工程的橋梁 提示:以下是本篇文章正文內容,下面案例可供參考 一、工程控制論 1. 經典…

Android 15 中 ApnPreferenceController 的 onStart 和 onStop 調用失效

背景 AOSP對APN入口(Access Point Name)實現中,overried了 onStart 和 onStop ,但實際執行中根本不會進入這兩個接口的邏輯。 Q:MobileNetworkSettings (APN入口Preference所在的界面Fragement承載,TAG是NetworkSettings)的生命周期和ApnPreference 有什么關系? Not…

React 在組件間共享狀態

在組件間共享狀態 有時候,你希望兩個組件的狀態始終同步更改。要實現這一點,可以將相關 state 從這兩個組件上移除,并把 state 放到它們的公共父級,再通過 props 將 state 傳遞給這兩個組件。這被稱為“狀態提升”,這…

階段性使用總結-通義靈碼

序言 前段時間用通義靈碼,參加了下數字中國閩江流域的比賽。https://www.dcic-china.com/competitions/10173 最后成績一般般,106名,大概有2000多人參加這題目,估計有一堆小號。 按照下面這個思路建模的,迭代了大概15…

游戲引擎學習第228天

對上次的內容進行回顧,并為今天的開發環節做鋪墊。 目前大部分功能我們已經完成了,唯一剩下的是一個我們知道存在但目前不會實際觸發的 bug。這個 bug 的本質是在某些線程仍然訪問一個已經被銷毀的游戲模式(mode)之后的狀態&…