目录

简介

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> node_ids_保存了Node/NodeGroup与连接节点集合的对应关系。

Scheduler

管理Worker节点和Server节点的状态

Server

管理Worker节点发送来的参数,并“合并”,之后供各个Worker使用

Worker

负责计算参数,并发参数push到Server,同时从Server pull参数回来

主要类及相互关系

Postoffice

Postoffice是全局管理类,单例模式创建。管理当前节点角色、其他节点的连接、心跳信息、配置信息。

Van

Van是负责通信的类,是Postoffice的成员。Van中std::unordered_map senders_保存了node_id到连接的映射。Van只是定义了接口,具体实现是依赖ZMQ实现的ZMQVan。

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;

ps::NumServers()

参考