教材:10710周志遠教授平行程式 https://www.youtube.com/playlist?list=PLS0SUwlYe8cxqw70UHOE5n4Lm-mXFXbZT 20250919 筆記 內容可能有錯僅供參考 在這個章節開始投影片和10710周志遠教授平行程式有差異,接下來以 NTHU-PP-2021 (Chinese) 為主 [NTHU-PP-Chap12-Distributed Training-Part2](https://www.youtube.com/watch?v=yOZYl_hVnvM&list=PLQTDfc8kgjhMKtgumyK0gmEelnTtqJGsp&index=28&t=1564s) 進入到分散式深度學習部分,這部分是新的並沒有包含在 2018 年的影片 今日大綱 1.善用平行計算資源的策略 2.模型平行 3.資料平行 4.分散式訓練的平行化類型 5.效能優化策略 ### 一、 深度學習計算基礎 2. **深度學習計算方法** * 深度學習的計算方法是相當重要的。 * 核心演算法是 **梯度下降法 (gradient descent algorithm)**。 * 計算過程通常涉及: 1. **前向傳播 (forward propagation)**。 2. 計算梯度 (gradient)。 3. 使用 **後向傳播 (backward propagation)** 更新模型權重 (model weight)。 * 這是一個不斷重複的迭代計算過程,原則上是 **同步** 的。 ### 二、 善用平行計算資源的策略 面對大型平行計算系統或叢集 (cluster),有幾種方式可利用這些資源: 1. **多使用者資源共享 (Multi-user sharing)** * 大型系統通常由多人共用。 * 不同的使用者會有不同的計算工作(訓練自己的模型)。 * 資源可以透過多人的共享方式分配出去。 * 每個 Job 可以在獨立的 GPU 或 Node 上執行。 * **優點**:在計算上不需要做任何變動或平行化。 2. **超參數調校 (Hyperparameter Tuning)** * 模型訓練時有許多訓練參數(如學習率 (learning rate)、dropout、層數 (layer))可以調整。 * 這些參數會影響最終訓練結果,且其取值範圍和可選擇的值非常多。 * 為了找到最佳參數設定,可能需要反覆進行相同的模型訓練。 * 每次使用不同參數設定去重複訓練模型,這是一個獨立的計算工作。 * **利用平行資源**:可以一次將多組參數設定撒下去,讓它們同時訓練。 * **優點**:訓練的核心程式碼本身不需要做任何平行化。 3. **分散式訓練 (Distributed Training)** * 這是指使用多個 GPU 或 Node 去訓練 **單一模型**。 * 此訓練過程必須被 **平行化**。 * 通常目的是為了減少執行時間,在時間限制內完成模型訓練。 * 分散式訓練是一種平行計算的方式,探討如何將特定的運算 (演算法) 平行化,來利用平行計算能力。 ### 三、 分散式訓練的平行化類型 (Distributed Training Parallelism) 分散式訓練主要分為兩大類型:模型平行 (Model Parallelism) 和資料平行 (Data Parallelism)。 #### 1. 模型平行 (Model Parallelism) * **定義**:將神經網路模型 (計算圖/graph) 本身進行 **切分 (partition)**。 * **分配方式**:將圖切成數塊,每塊分配給一個機器/GPU。每塊包含圖上的一些節點(通常稱為 operator,例如 convolution、filter 等 function)。 * **計算負擔**:每台機器只需負責部分的計算。 * **優點**:可減少單機的計算量和計算時間。 * **資料流動**:所有資料必須流經所有機器,以完成前向和後向傳播的計算。 * **限制與挑戰**: * **資料依賴性 (Data Dependency)**:機器之間存在資料依賴性,取決於資料的流動。例如,Machine 1 的輸出需要餵給 Machine 2 和 Machine 3。 * **管線化 (Pipelining)**:雖然存在資料依賴,但深度學習可以透過 **管線化** 的方式(一筆一筆處理資料),讓機器之間仍能重疊計算時間。 * **溝通成本 (Communication Cost)**:完全取決於如何切分計算圖。切邊 (cutting edge) 的地方代表資料傳輸。若圖的邊 (edge) 太多、太複雜,或切得太零碎,會增加溝通的開銷。 * **程式碼複雜度**:需要插入溝通程式碼,插入位置取決於圖的切分方式,缺乏固定的規律。因此,寫出 Model Parallelism 的平行化程式碼相對複雜,不易自動化。 * **適用情境**: * **共享記憶體環境 (Shared Memory)**:Model Parallelism 較常見於共享記憶體環境(如單一節點,多張 GPU)。在這種情況下,溝通可透過記憶體參考 (memory reference) 實現,不需要額外插入 Send/Receive API。 * **溝通成本**:在單節點內,溝通成本較低(頂多是 Main memory 或 GPU-to-GPU 的 Peer-to-Peer 傳輸)。 * **模型過大 (Over-sized Model)**:當模型過大,無法載入單張 GPU 的記憶體時(GPU 記憶體有限,約 8G~32G),必須使用 Model Parallelism 將大模型切分,塞入個別 GPU 以完成訓練。 #### 2. 資料平行 (Data Parallelism) * **定義**:與 Model Parallelism 相反。 * **模型複製 (Replication)**:每個機器/GPU 都複製了一份完整的模型。 * **資料切分 (Partition)**:整個資料集被切分成多份,每台機器負責訓練其區域資料集。 * **計算過程**:機器使用其區域資料集訓練其區域模型。 * **溝通需求**:為了訓練出單一的模型,不能完全獨立訓練。在每次前向/後向傳播結束後,機器之間必須對梯度執行 **Reduce** 的動作。 * **模型同步**:機器獲得平均梯度後,各自獨立地根據此平均梯度更新其區域模型。由於是同步計算,最終所有機器的模型權重會是一致的。 * **溝通發生時機**:僅發生在梯度交換的部分,即在前向和後向傳播之間。 * **優點**: * 符合標準的 **Divide and Conquer** 平行計算方法。 * 非常適合 **跨 Node** 執行,因為溝通與計算可以完全切開,溝通的複雜度不會隨模型複雜度增加。 * 實作程式碼相對容易,只需在 Forward 之後呼叫一個 Communication API 即可。 * **限制**: * **模型大小限制**:模型必須能夠 **裝入單卡或單機的記憶體**。由於模型是複製的,它累積的記憶體大小會比 Model Parallelism 高。 * **溝通瓶頸**:溝通成本(由模型大小決定)仍然容易成為性能瓶頸。模型越大,要交換的參數越多,資料傳輸越大,開銷越高。 * 在模型很大但計算量相對少時,難以達到理想的加速比。 #### 3. 混合使用原則 * **單節點內 (Single Node)**:通常使用 **Model Parallelism**,因為共享記憶體環境有利於框架調度 (schedule) 任務到不同 GPU 上。 * **跨節點間 (Cross Node)**:通常使用 **Data Parallelism**。框架會提供 API 讓使用者/程式設計師呼叫,以實現跨機器的分散式訓練。 ### 四、 Data Parallelism 的實作與溝通優化 Data Parallelism 核心是處理參數交換 (parameter swap),即取得平均梯度並通知所有 Worker。 #### 1. 集中式 (Centralized) 溝通:參數伺服器 (Parameter Server) * **架構**:存在一個集中式的伺服器,通常在一個獨立的 Node 上,不參與訓練計算。 * **伺服器職責**:唯一的職責是維護權重/梯度。 * **流程**: 1. 計算 Worker 將其梯度交給 Parameter Server。 2. Server 收集所有梯度後取平均值,並更新模型權重。 3. Server 將更新好的權重廣播回到所有 Worker。 4. Worker 拿到相同的值後,更新區域權重,進行下一輪訓練。 * **缺點**:Parameter Server 容易成為性能瓶頸 (hotspot),尤其當 Worker 數量太多時。 * **去中心化 (Decentralization) 解決方案**:可以設立多個 Parameter Server。由於深度學習中每個參數的更新是完全獨立的,可以讓不同 Server 負責不同的參數子集。 * **去中心化挑戰**: * **數量控制**:Server 數量太少會導致平行度不足,過多則溝通成本可能超過平行化優勢。Worker 須送出的訊息數量與 Server 數量成正比,Server 越多,溝通效率越低。 * **負載平衡 (Load Balancing)**:很難做到完美的負載平衡。雖然可以確保每個 Server 負責相同數量的參數或 Tensor,但這些 Tensor 的大小 (dimension/size) 可能不同,導致資料傳輸量和網路頻寬使用不均,造成某些 Server 負載過高。 * **應用場景**:Parameter Server 架構具有支持 **非同步 (Asynchronous)** 溝通的優勢。在性能不穩定、資源異質性高或機器可能故障 (fail) 的計算環境(如雲端、AP device)下,Parameter Server 具有較大優勢。 #### 2. P2P 溝通:AllReduce * **架構**:完全分散式的做法,旨在確保每個 Worker 的工作負載完全相同,且不需額外的 Server。 * **機制**:使用 P2P 溝通模式實現集體溝通程式碼 (collective code)。 * **Ring AllReduce**:一種常見的實現方式。 * 將所有 Worker 或參與訓練的 Node 串成一個 **環 (Ring)**。 * 每個 Worker 同時將資訊(區域參數/梯度)單一方向傳輸給下一個 Worker。 * 資料遍歷環一圈後,基本上所有 Worker 都能得到所有人的資料,然後更新區域權重,完成參數交換。 * **優點**: * 每輪傳輸量完全相同,無熱點 (HP) 問題。 * 使用 pairwise 的頻寬,可利用所有 Worker 的連線 (link),因此性能和穩定性可能比 Server 更好。 * 目前 AllReduce 是分散式訓練中的 **主流** 方式,尤其在高頻寬、高性能的叢集系統中。 * **限制**: * **必須是同步 (Synchronous) 計算**:AllReduce 是一種集體程式碼,如果一個 Worker 計算速度太慢,會拖累所有人。 * **適用環境**:最適合高性能、穩定的 Supercomputer 或 HPC 叢集環境,確保機器效能和網路一致。 ### 五、 效能優化策略 除了溝通方式的選擇外,還有多種優化方法可以應用。 #### 1. Batch Size 控制 (Batch SGD) * **基礎概念**:標準 SGD 是一筆一筆處理資料,無法充分利用 GPU 的平行計算能力。Batch SGD 或 Mini-Batch SGD 是一次餵入一批 (batch) 記錄,讓 GPU 平行處理。 * **效能影響**:Batch Size 對效能有很大影響。 * **Batch Size 過小**:平行度低,硬體利用率下降,訓練時間變長。 * **Batch Size 過大**:收斂 (convergence) 效果變差。這是因為同一個 Batch 內計算出的梯度會被平均,重要的特徵點信號可能被平均掉。結果是需要更多的迭代次數才能達到收斂。 * **實務選擇**:Batch Size 的選擇通常是 **越大越好**,但會受到 GPU 記憶體大小的限制。 #### 2. 非同步 SGD (Asynchronous SGD, A-SGD) * **目的**:當 Worker 計算速度有差異時,避免被最慢的 Worker 拖累。 * **機制**:Worker 算完梯度後,立即根據其梯度更新權重,不需要等待其他 Worker 或取平均梯度。 * **後果**:訓練過程中,每個 Worker 區域模型 (local model) 的 **版本是不一致的**。 * **收斂影響**:版本不一致會導致錯誤的判斷,當 Worker 根據舊版本 (stale version) 算出的梯度進行更新時,可能覆寫 (overwrite) 掉前面版本的影響,造成不準確性。這會導致需要更多的迭代次數才能收斂。 * **優勢**:若同步延遲嚴重,A-SGD 可以縮短單次迭代時間,雖然總體需要更多迭代,但可能在最短時間內達到收斂。 * **適用性**:Parameter Server 支持 A-SGD。 #### 3. 延遲同步 SGD (Stale Synchronous SGD, S-SGD) * **定義**:實際應用中比純 A-SGD 更常見的折衷方案。 * **機制**:限制最快與最慢 Worker 之間的 **不一致程度(延遲/staleness)**。 * 不一致程度的定義是:最快 Worker 跑的步驟數 (step number) 與最慢 Worker 執行的步驟數之間的差距,必須被限制在一個範圍內。 * 若最快 Worker 達到差距上限,它必須停止下來等待慢速 Worker 追上。 * **實作**:S-SGD 較常被實現在現有的框架中,使用者可以調整參數來控制最大的容忍範圍。 #### 4. 資料壓縮與量化 (Quantization and Compression) * **目的**:減少傳輸資料量,直接降低溝通時間和網路頻寬消耗。 * **量化 (Quantization)**:使用更少的位元數 (bit) 來描述一個值,但希望計算結果不變。 * **One-bit compression)**:利用深度學習是迭代演算法,適合回饋控制迴路 (feedback control loop) 的特性。將要傳輸的數值(如梯度或權重)壓縮成 0 或 1,表示該值是比平均值小或大。 * 例如,將 32 bit 的 double precision 數值壓縮成 1 bit,可達到 32 倍壓縮,大幅減少傳輸量。 * **壓縮 (Compression)**:不同於量化,壓縮是針對一整筆資料(如影像壓縮技巧),減少資料冗餘。 #### 5. 任務放置與排程 (Task Placement and Scheduling) * **問題核心**:Scheduler 如何決定分散式訓練工作應放在哪一個 Node 上的哪一張 GPU 上運行。 * **溝通影響**:如果 Worker 距離太遠,傳輸延遲會變長,網路擁塞的風險會增加。 * **資源競爭**:分散式計算工作會競爭共用的傳輸頻寬,例如網路頻寬、Node 內部的 PCI bus 等,導致額外的資源競爭和性能干擾。 * **Trade-off**:在強調近距離放置 (減少溝通時間) 與利用率 (使用遠處閒置資源) 之間取得平衡。 * **深度學習特性**:分散式深度學習計算是規律的、迭代的固定行為,其傳輸量、溝通模式是可預測的。排程器可利用這些應用領域的資訊來設計更佳的決策方法。 * **主要排程策略**: * **集中放置 (Packing)**:強迫集中在同一個 Node 或非常鄰近的 Node 上。這會犧牲資源可用性,可能造成資源浪費和等待時間過長。 * **分散放置 (Spreading)**:故意盡量散落在不同的 GPU/Node 上。資源競爭問題較少,但溝通成本可能較高。 * 目前大多數系統傾向於使用 **集中放置 (Packing)** 策略。 --- 其他課程連結 [平行程式1C~2B Introduction parallel programming](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/Syxh3H7Kxe) [平行程式3A~3D The Latest Developments and Applications Using Parallel Programming](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/HJh7QFVKle) [平行程式4A~4B IO Parallel IO and Program Analysis](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/HJLMsuHFgg) [平行程式5A~5B The Latest Developments and Applications Using Parallel Programming](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/SJh57hIFle) [平行程式6A~6B Communication Routines and Parallel Function Code](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/r1X9kX_Fle) [平行程式 6C~6D Communication Routines and Parallel Function Code](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/S1DPjoYFlx) [平行程式 7A~8A Pthread:Synchronization Problem & Tools](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/HJu-_0tKge) [平行程式 8B~8D Synchronization Tools & Open Multi-Processing(OpenMP)](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/H1ki4E2Fee) [平行程式 9A~9B Synchronization Construct](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/BJTYMrpKlx) [平行程式 10A~10B Synchronization Tools & Open Multi-Processing Synchronization Construct](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/B1cY6M1qee) [平行程式 10C~10D Synchronization Tools & Open Multi-Processing Synchronization Construct](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/BkgFaNg5gg) [平行程式 11A~11B Parallel Work Pool and Termination / Parallel Sorting](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/H1hfOw-5xl) [平行程式 12A~12B Parallel Sorting and Pipelined Computations](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/Symo-zQ9eg) [平行程式 12C~12D Parallel Sorting and Pipelined Computations](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/BJYNKDVceg) [平行程式 13A-13B Sychronous Parallelism](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/HJ2UJ2Bqex) [平行程式 14A~14B Heterogeneous Computing](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/BksS4yP5eg) [平行程式 14C~14D Heterogeneous Computing](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/BJrfTUd9xx) [平行程式 15A~15B Parallel Programming Model on GPU](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/ByWnl-t5gg) [平行程式 16A~16B What is Compute Unified Device Architecture(CUDA)?](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/HyYpsjcqgl) [平行程式 17A~18A 平行運算的CUDA](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/H1dUeBT5lg) [平行程式 18B~19A 記憶體層級 / CUDA的優化](https://hackmd.io/@JuitingChen/HyF44e1jge) [平行程式 19B~19D 記憶體層級 / CUDA的優化 ](https://hackmd.io/@JuitingChen/ryPEu4lieg) [平行程式 20A~20B CUDA優化全域和區域記憶體/共享記憶體](https://hackmd.io/@JuitingChen/r1X659Zoxl) [平行程式 21A~21B Parallel Reduction / Distributed Computing Framework](https://hackmd.io/@JuitingChen/HyiOpozjxl) [平行程式 NTHU-PP-Chap10-Big Data-Part1 ](https://hackmd.io/@JuitingChen/Hyc-e3Golx) [平行程式 NTHU-PP-Chap10-Big Data-Part2 ](https://hackmd.io/@JuitingChen/ryC_QTXoxl) [平行程式 NTHU-PP-Chap11-MapReduce](https://hackmd.io/@JuitingChen/HJgBXJOsge) [平行程式 NTHU-PP-Chap12-Distributed Training-Part1](https://hackmd.io/@JuitingChen/ryh5hBtsge) [平行程式 NTHU-PP-Chap12-Distributed Training-Part2](https://hackmd.io/@JuitingChen/rJ2G7kdjxg) [平行程式 NTHU-PP-Chap12-Distributed Training-Part3](https://hackmd.io/@JuitingChen/HkA471dilx) [平行程式 NTHU-PP-Chap13-UCX-Part1](https://hackmd.io/@JuitingChen/rJbq103ieg) [平行程式 NTHU-PP-Chap13-UCX-Part2](https://hackmd.io/@JuitingChen/SJpNmk_ixl) [平行程式 NTHU-PP-Chap13-UCX-Part3](https://hackmd.io/@JuitingChen/HkIUYa13xe)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up