深入解析分布式訓練基石:ps-lite源碼實現原理

分布式機器學習框架是現代推薦、廣告和搜索系統的核心支撐。面對海量訓練數據和高維稀疏特征,參數服務器(Parameter Server, PS) 架構應運而生。作為早期經典實現的ps-lite因其簡潔性和完整性,成為理解PS原理的絕佳切入點。本文將深入分析ps-lite的核心設計與源碼實現。


一、PS架構的必要性

傳統分布式計算(如Hadoop/Spark)在推薦場景下面臨兩大挑戰:

  1. 參數爆炸:特征空間動輒上億,單Master節點無法存儲全部參數。
  2. 帶寬瓶頸:每次迭代廣播全部參數,網絡開銷無法承受。

PS架構通過以下設計解決這些問題:

  1. 分布式存儲:參數分散在多臺Server節點存儲。
  2. 按需通信:Worker只拉取當前Batch所需的特征參數(如Embedding),大幅減少數據傳輸量。

關鍵洞察:推薦數據高度稀疏,單個Batch僅涉及少量特征,這是PS高效性的基礎。


二、ps-lite核心概念

1. 節點角色
static const int kScheduler = 1;  // 調度器
static const int kServerGroup = 2; // Server組
static const int kWorkerGroup = 4; // Worker組
  • Scheduler:負責節點管理和跨節點同步
  • Server:分布式存儲部分參數(鍵值數據庫)
  • Worker:計算梯度,與Server交互
2. 核心通信組件
// 示例:Worker向Server發送請求
KVWorker<float> kv(0, customer_id); 
kv.Push(keys, vals); 
  • PostOffice:單例全局通信管理器(每個進程唯一)
  • Van:實際網絡通信模塊(支持ZMQ/IBVerbs等實現)
  • Customer:消息處理中介(Worker/Server的業務代理)
3. 數據容器
struct KVPairs {SArray<Key> keys;SArray<Val> vals;SArray<int> lens; // 變長數據支持
};
  • SArray:智能數組,支持零拷貝和自動內存回收
  • KVPairs:數據傳輸載體(如feature_id為Key,embedding為Val)

三、通信層深度解析(PostOffice與Van)

1. 節點管理流程
Worker節點 Scheduler Server節點 All ADD_NODE(注冊) ADD_NODE(注冊) 廣播節點列表 Worker節點 Scheduler Server節點 All

關鍵代碼:

// Van::ProcessAddNodeCommand
if (is_scheduler_) {// 收集所有節點信息nodes->control.node.push_back(my_node_); // 廣播全量節點列表for (int r : GetNodeIDs(kWorkerGroup+kServerGroup)) {Send(back);}
}
2. 同步機制(Barrier)
// PostOffice::Barrier
void Barrier(int customer_id, int node_group) {// 發送同步請求給Schedulerreq.meta.control.cmd = Control::BARRIER;van_->Send(req);// 阻塞等待同步完成barrier_cond_.wait(ulk, [this] { return barrier_done_[customer_id]; });
}

關鍵點:Scheduler統計到達Barrier的節點數,當數量等于目標組節點總數時廣播解鎖信號。

3. 消息路由
控制消息
數據消息
Van接收消息
消息類型?
ProcessBarrierCommand
ProcessDataMsg
查找對應Customer
Customer->Accept入隊

四、業務層實現(Customer/Worker/Server)

1. Worker的Pull/Push流程
// KVWorker::ZPull 零拷貝拉取
int ZPull(const SArray<Key>& keys, SArray<Val>* vals) {int ts = AddPullCB(keys, vals, ...); // 注冊回調Send(ts, false, true, cmd, kvs);    // 發送請求return ts;
}// KVWorker::Process 響應處理
void Process(const Message& msg) {recv_kvs_[ts].push_back(kvs); // 緩存數據if (AllResponsesReceived(ts)) {MergeResponses(ts);       // 聚合多Server響應RunCallback(ts);          // 觸發回調}
}
2. Server請求處理
// KVServerDefaultHandle示例
void operator()(const KVMeta& meta, const KVPairs<Val>& data) {for (size_t i = 0; i < n; ++i) {if (meta.push) store[key] += data.vals[i]; // 累加梯度if (meta.pull) res.vals[i] = store[key];   // 返回參數}server->Response(meta, res); // 回復Worker
}
3. 關鍵設計亮點
  1. 異步流水線:Worker發送請求后立即繼續計算,通過Wait()等待IO完成。
  2. 請求分片(Slicer):自動將Keys按Server分片路由。
  3. 回調機制:支持異步通知(如Pull完成后觸發計算)。

五、ps-lite的局限與現代演進

作為早期實現,ps-lite存在一些限制:

  1. 功能局限:主要支持LR/FM,缺乏DNN優化(如AllReduce同步)
  2. 無高級特性:缺少特征準入/逐出、混合通信等現代優化

但其核心設計被后續框架繼承發展:

  • 騰訊Angel:擴展支持圖計算和深度學習
  • 阿里XDL:引入Embedding多級存儲和動態分區
  • 字節BytePS:優化通信層支持RDMA

學習價值:通過ps-lite可深入理解分布式通信、參數同步、一致性模型等核心概念。


結語:經典設計的啟示

ps-lite的優雅在于用簡潔架構解決了分布式訓練的核心問題:

  1. 分布式KV存儲:突破單點內存限制
  2. 稀疏通信優化:大幅減少網絡開銷
  3. 異步流水線:計算與通信重疊提升效率

其模塊化設計(PostOffice/Van/Customer)仍是現代分布式框架的參考典范。理解這些底層機制,對于調優生產環境中的PS系統和設計新架構至關重要。

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

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

相關文章

IDEA 插件開發:Internal Actions 與 UI Inspector 快速定位 PSI

在開發 IntelliJ 平臺插件的過程中&#xff0c;你常常需要搞清楚 某個 IDE 彈框背后是如何操作 PSI&#xff08;Program Structure Interface&#xff09; 的。下面這篇筆記將介紹如何通過 Internal Actions、UI Inspector 以及調試技巧快速定位 PSI 調用鏈。 1. 啟用 Internal…

26考研|數學分析:多元函數微分學

前言 本章我們將進行多元函數微分學的學習&#xff0c;多元函數微分學與一元函數微分學相對應&#xff0c;涉及到可微性、中值定理、泰勒公式等諸多問題的探討與研究&#xff0c;本章難度較大&#xff0c;在學習過程中需要進行深度思考與分析&#xff0c;才能真正掌握這一章的…

數星星--二分

https://www.matiji.net/exam/brushquestion/17/4498/F16DA07A4D99E21DFFEF46BD18FF68AD 二分思路不難&#xff0c;關鍵的區間內個數的確定 #include<bits/stdc.h> using namespace std; #define N 100011 #define inf 0x3f3f3f3f typedef long long ll; typedef pair&…

Oracle/PostgreSQL/MSSQL/MySQL函數實現對照表

函數列表清單 函數作用OraclePOSTGRESQLMSSQLMYSQL求字符串長度LENGTH(str)LENGTH(str)LEN(str)LENGTH(str)字符切割SUBSTR(str,index,length)SUBSTR(str,index,length)SUBSTRING(str,index,length)SUBSTRING(str,index,length)字符串連接str1||str2||str3...strNstr1||str2||…

pycharm客戶端安裝教程

二、 pycharm客戶端安裝 打開pycharm官網&#xff1a;https://www.jetbrains.com/pycharm/download/?sectionwindows 選擇其他版本 選擇2018社區版本&#xff0c;點擊下載 雙擊下載的安裝程序(第一個彈框允許)&#xff0c;選擇下一步 更改安裝路徑&#xff0c;在pycah…

博圖SCL語言中用戶自定義數據類型(UDT)使用詳解

博圖SCL語言中用戶自定義數據類型&#xff08;UDT&#xff09;使用詳解 一、UDT概述 用戶自定義數據類型&#xff08;UDT&#xff09;是TIA Portal中強大的結構化工具&#xff0c;允許將多個相關變量組合成單一數據結構。UDT本質是可重用的數據模板&#xff0c;具有以下核心優…

Vscode自定義代碼快捷方式

首選項>配置代碼片段 >新建全局代碼片段 (也可以選擇你的語言 為了避免有的時候不生效 選擇全局代碼) {"console.log": { //名字"prefix": "log",//prefix 快捷鍵 &#xff1a; log"body": ["console.log($1);", //b…

ESP32 008 MicroPython Web框架庫 Microdot 實現的網絡文件服務器

以下是整合了所有功能的完整 main.py(在ESP32 007 MicroPython 適用于 Python 和 MicroPython 的小型 Web 框架庫 Microdot基礎上)&#xff0c;實現了&#xff1a; Wi?Fi 自動連接&#xff08;支持靜態 IP&#xff09;&#xff1b;SD 卡掛載&#xff1b;從 /sd/www/ 讀取 HTML…

Mcp-git-ingest Quickstart

目錄 配置例子 文檔github鏈接&#xff1a;git_ingest.md 配置 {"mcpServers": {"mcp-git-ingest": {"command": "uvx","args": ["--from", "githttps://github.com/adhikasp/mcp-git-ingest", "…

(LeetCode 面試經典 150 題) 27.移除元素

目錄 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 思路詳解&#xff1a; 樣例模擬&#xff1a; 代碼&#xff1a; C代碼&#xff1a; Java代碼&#xff1a; 題目&#xff1a; 題目描述&#xff1a; 題目鏈接…

MySQL之事務原理深度解析

MySQL之事務原理深度解析 一、事務基礎&#xff1a;ACID特性的本質1.1 事務的定義與核心作用1.2 ACID特性的內在聯系 二、原子性與持久性的基石&#xff1a;日志系統2.1 Undo Log&#xff1a;原子性的實現核心2.2 Redo Log&#xff1a;持久性的保障2.3 雙寫緩沖&#xff08;Dou…

JUC:5.start()與run()

這兩個方法都可以使線程進行運行&#xff0c;但是start只能用于第一次運行線程&#xff0c;后續要繼續運行該線程需要使用run()方法。如果多次運行start()方法&#xff0c;會出現報錯。 初次調用線程使用run()方法&#xff0c;無法使線程運行。 如果你對一個 Thread 實例直接調…

微服務中解決高并發問題的不同方法!

如果由于流量大而在短時間內幾乎同時發出請求&#xff0c;或者由于服務器不穩定而需要很長時間來處理請求&#xff0c;并發問題可能會導致數據完整性問題。 示例問題情況 讓我們假設有一個邏輯可以檢索產品的庫存并將庫存減少一個&#xff0c;如上所述。此時&#xff0c;兩個請…

【2025CCF中國開源大會】OpenChain標準實踐:AI時代開源軟件供應鏈安全合規分論壇重磅來襲!

點擊藍字 關注我們 CCF Opensource Development Committee 在AI時代&#xff0c;軟件供應鏈愈發復雜&#xff0c;從操作系統到開發框架&#xff0c;從數據庫到人工智能工具&#xff0c;開源無處不在。AI 與開源生態深度融合&#xff0c;在為軟件行業帶來前所未有的創新效率的同…

[Java實戰]springboot3使用JDK21虛擬線程(四十)

[Java實戰]springboot3使用JDK21虛擬線程(四十) 告別線程池爆滿、內存溢出的噩夢!JDK21 虛擬線程讓高并發連接變得觸手可及。本文將帶你深入實戰,見證虛擬線程如何以極低資源消耗輕松應對高并發壓測。 一、虛擬線程 傳統 Java 線程(平臺線程)與 OS 線程 1:1 綁定,創建和…

SpringBoot 中使用 @Async 實現異步調用?

? ? SpringBoot 中使用 Async 實現異步調用 一、Async 注解的使用場合?二、Async 注解的創建與調試?三、Async 注解的注意事項?四、總結? 在高并發、高性能要求的應用場景下&#xff0c;異步處理能夠顯著提升系統的響應速度和吞吐量。Spring Boot 提供的 Async 注解為開…

CMOS SENSOR HDR場景下MIPI 虛擬端口的使用案例

CMOS SENSOR HDR場景下MIPI 虛擬端口的使用案例 文章目錄 CMOS SENSOR HDR場景下MIPI 虛擬端口的使用案例?? **一、HDR模式下的虛擬通道核心作用**?? **二、典型應用案例****1. 車載多目HDR系統****2. 工業檢測多模態HDR****3. 手機多攝HDR合成**?? **三、實現關鍵技術點…

RJ45 以太網與 5G 的原理解析及區別

一、RJ45 以太網的原理 1. RJ45 接口與以太網的關系 RJ45 是一種標準化的網絡接口&#xff0c;主要用于連接以太網設備&#xff08;如電腦、路由器&#xff09;&#xff0c;其物理形態為 8 針模塊化接口&#xff0c;適配雙絞線&#xff08;如 CAT5、CAT6 網線&#xff09;。以…

valkey之sdscatrepr 函數優化解析

一、函數功能概述 sds sdscatrepr(sds s, const char *p, size_t len)函數的核心功能是將字符串p追加到字符串s中。在追加過程中&#xff0c;它會對字符串p中的字符進行判斷&#xff0c;使用isprint()函數識別不可打印字符&#xff0c;并對這些字符進行轉義處理&#xff0c;確…

MyBatis 緩存機制詳解

MyBatis 緩存機制詳解 MyBatis 提供了強大的緩存機制來提高數據庫訪問性能&#xff0c;主要包括一級緩存和二級緩存兩種。 一級緩存 (Local Cache) 特性&#xff1a; 默認開啟&#xff0c;作用域為 SqlSession 級別同一個 SqlSession 中執行相同的 SQL 查詢時&#xff0c;會…