分布式机器学习框架是现代推荐、广告和搜索系统的核心支撑。面对海量训练数据和高维稀疏特征,参数服务器(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;会…