目录
简介
Parameter Server中文名称叫做参数服务器,是分布式机器学习框架中用来做参数同步的框架。
ps-lite是Paramter Server的实现的一个框架,其中参数处理具体相关策略需自己实现。
三种节点
节点分组
Scheduler节点只有一个,多个Worker和多个Server可以组成一个Group,因此有WorkerGroup和ServerGroup;还有Worker节点和Server节点。每个节点以及每一个Group都有唯一确定的ID。 Scheduler、ServerGroup、WorkerGroup节点ID确定如下:
static const int kScheduler = 1;
static const int kServerGroup = 2;
static const int kWorkerGroup = 4;
节点ID
1、2、4的二进制表示分别为:001、010、001。这样可以做Group之间的合并,例如要和ServerGroup和WorkerGroup发信息,只需要destination node id设为2+4=6。 1-7用来表示节点的组合。单个节点的ID从8开始。单个Server和单个Worker节点从自己的rank(0、1、2……)转换到其ID:
ID转换代码
rank到ID
static inline int WorkerRankToID(int rank) {
return rank * 2 + 9;
}
static inline int ServerRankToID(int rank) {
return rank * 2 + 8;
}
ID到rank
static inline int IDtoRank(int id) {
return std::max((id - 8) / 2, 0);
}
Postoffice中td::unordered_map
Scheduler
管理Worker节点和Server节点的状态
Server
管理Worker节点发送来的参数,并“合并”,之后供各个Worker使用
Worker
负责计算参数,并发参数push到Server,同时从Server pull参数回来
主要类及相互关系
Postoffice
Postoffice是全局管理类,单例模式创建。管理当前节点角色、其他节点的连接、心跳信息、配置信息。
Van
Van是负责通信的类,是Postoffice的成员。Van中std::unordered_map
Customer
Customer用来通信,跟踪request和response。每一个连接对应一个Customer实例,连接对方的id和Customer实例的id相同。
SimpleApp
SimpleApp是一个基类;提供了发送接收int型的head和string型的body消息,以及注册消息处理函数。它有2个派生类。
-
KVServer是SimpleApp的派生类,用来保存key-values数据。
-
KVWorker是SimpleApp的派生类,用来想Server Push/Pull key-value数据。
KVPairs
KVPairs封装了Key-Value结构,还包含了一个长度选项。
SArray
SArray是Shared array,像智能指针一样共享数据,接口类似vector。
Node
Node封装了节点的信息,例如角色、ip、端口、是否是恢复节点。
Control
Control封装了控制信息,例如命令类型、目的节点、barrier_group的id、签名。
Meta
Meta封装了元数据,发送者、接受者、时间戳、请求还是响应等。
Message
Message是要发送的信息,除了元数据外,还包括发送的数据。
相关函数和变量
ps::MyRank()
ps::kServerGroup
static const int kServerGroup = 2;