深度學習-分布式訓練機制

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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81178.shtml
英文地址,請注明出處:http://en.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會對任…