简介
序号 |
名称 |
简介 |
1 |
框架架构 |
介绍整体框架架构、涉及模块 |
2 |
模型、数据计算并行 |
实现参数服务器中的Worker与Server |
3 |
节点间通信接口 |
实现应用常用接口,使用ZeroMQ实现节点间通信 |
4 |
一致性控制 |
在Server端实现常见的一致性控制模式:BSP/ASP/SSP |
5 |
容错实现 |
使用CheckPoint Rollback、心跳监测等方式实现计算容错 |
6 |
Yarn资源管理系统支持 |
编写Yarn Application以使用Yarn进行资源分配 |
7 |
机器学习算法实现 |
实现Logistic Regression与KMeans两种算法 |
前面三篇文章介绍了Worker/Server线程以及它们之间通信方法的实现,然而对于参数服务器的训练过程来说,各个节点在进行迭代计算时常常又需要控制迭代的一致性,以便使梯度下降法在分布式的环境下达到指定的效果。在这一节我将实现BSP/ASP/SSP三种不同的一致性控制模式,它们底层的是通过依赖ProgressTracker
来实现的。
一致性控制模式
最常见的一致性控制模式分为三种:BSP/ASP/SSP。这其中单个迭代的过程又分为这几个阶段:
- 当前迭代进行计算
- 完成计算后进行网络通信
- 等待其它节点完成计算
server/abstract_model.hpp
class AbstractModel {
public:
// 进行一致性控制
virtual void Clock(Message &msg) = 0;
// 更新参数
virtual void Add(Message &msg) = 0;
// 获取参数
virtual void Get(Message &msg) = 0;
...
virtual ~AbstractModel() {}
每个一致性控制都继承了上面的AbstractModel
,Clock
方法是最主要的方法。
BSP

BSP
BSP是最常用的一种模式,它强调的是集群中每个节点的迭代次序完全一致。优点在于简单有效,缺点在于容易受部分滞后节点影响,导致整个集群处理变慢。
server/consistency/bsp_model.cpp
void BSPModel::Clock(Message &msg) {
int updated_min_clock = progress_tracker_.AdvanceAndGetChangedMinClock(msg.meta.sender);
// 先从ProgressTracker中获取迭代进度
int progress = GetProgress(msg.meta.sender);
CHECK_LE(progress, progress_tracker_.GetMinClock() + 1);
// 各个节点的迭代进度一致后,才对这些请求进行回应
if (updated_min_clock != -1) {
for (auto add_req : add_buffer_) {
storage_->Add(add_req);
}
add_buffer_.clear();
for (auto get_req : get_buffer_) {
reply_queue_->Push(storage_->Get(get_req));
}
get_buffer_.clear();
storage_->FinishIter();
}
}
可以看到BSP内部的实现采用了get_buffer_
的缓存队列来阻塞其它节点的Get请求,只有在所有节点的迭代次数达到一致后才会对这些被缓存的Get请求一个个进行处理。
ASP

ASP
ASP是与BSP截然相反的一种模式,对比BSP的严格控制各节点迭代同步,ASP让每个节点都独立的进行训练,不同的节点不需要互相等待对方。
server/consistency/asp_model.cpp
```cpp
void ASPModel::Clock(Message &msg) {
progress_tracker_.AdvanceAndGetChangedMinClock(msg.meta.sender);
}
void ASPModel::Get(Message &msg) {
简介
序号 |
名称 |
简介 |
1 |
框架架构 |
介绍整体框架架构、涉及模块 |
2 |
模型、数据计算并行 |
实现参数服务器中的Worker与Server |
3 |
节点间通信接口 |
实现应用常用接口,使用ZeroMQ实现节点间通信 |
4 |
一致性控制 |
在Server端实现常见的一致性控制模式:BSP/ASP/SSP |
5 |
容错实现 |
使用CheckPoint Rollback、心跳监测等方式实现计算容错 |
6 |
Yarn资源管理系统支持 |
编写Yarn Application以使用Yarn进行资源分配 |
7 |
机器学习算法实现 |
实现Logistic Regression与KMeans两种算法 |
前面三篇文章介绍了Worker/Server线程以及它们之间通信方法的实现,然而对于参数服务器的训练过程来说,各个节点在进行迭代计算时常常又需要控制迭代的一致性,以便使梯度下降法在分布式的环境下达到指定的效果。在这一节我将实现BSP/ASP/SSP三种不同的一致性控制模式,它们底层的是通过依赖ProgressTracker
来实现的。
一致性控制模式
最常见的一致性控制模式分为三种:BSP/ASP/SSP。这其中单个迭代的过程又分为这几个阶段:
- 当前迭代进行计算
- 完成计算后进行网络通信
- 等待其它节点完成计算
server/abstract_model.hpp
class AbstractModel {
public:
// 进行一致性控制
virtual void Clock(Message &msg) = 0;
// 更新参数
virtual void Add(Message &msg) = 0;
// 获取参数
virtual void Get(Message &msg) = 0;
...
virtual ~AbstractModel() {}
每个一致性控制都继承了上面的AbstractModel
,Clock
方法是最主要的方法。
BSP

BSP
BSP是最常用的一种模式,它强调的是集群中每个节点的迭代次序完全一致。优点在于简单有效,缺点在于容易受部分滞后节点影响,导致整个集群处理变慢。
server/consistency/bsp_model.cpp
void BSPModel::Clock(Message &msg) {
int updated_min_clock = progress_tracker_.AdvanceAndGetChangedMinClock(msg.meta.sender);
// 先从ProgressTracker中获取迭代进度
int progress = GetProgress(msg.meta.sender);
CHECK_LE(progress, progress_tracker_.GetMinClock() + 1);
// 各个节点的迭代进度一致后,才对这些请求进行回应
if (updated_min_clock != -1) {
for (auto add_req : add_buffer_) {
storage_->Add(add_req);
}
add_buffer_.clear();
for (auto get_req : get_buffer_) {
reply_queue_->Push(storage_->Get(get_req));
}
get_buffer_.clear();
storage_->FinishIter();
}
}
可以看到BSP内部的实现采用了get_buffer_
的缓存队列来阻塞其它节点的Get请求,只有在所有节点的迭代次数达到一致后才会对这些被缓存的Get请求一个个进行处理。
ASP

ASP
ASP是与BSP截然相反的一种模式,对比BSP的严格控制各节点迭代同步,ASP让每个节点都独立的进行训练,不同的节点不需要互相等待对方。
server/consistency/asp_model.cpp
```cpp
void ASPModel::Clock(Message &msg) {
progress_tracker_.AdvanceAndGetChangedMinClock(msg.meta.sender);
}
void ASPModel::Get(Message &msg) {
简介
序号 |
名称 |
简介 |
1 |
框架架构 |
介绍整体框架架构、涉及模块 |
2 |
模型、数据计算并行 |
实现参数服务器中的Worker与Server |
3 |
节点间通信接口 |
实现应用常用接口,使用ZeroMQ实现节点间通信 |
4 |
一致性控制 |
在Server端实现常见的一致性控制模式:BSP/ASP/SSP |
5 |
容错实现 |
使用CheckPoint Rollback、心跳监测等方式实现计算容错 |
6 |
Yarn资源管理系统支持 |
编写Yarn Application以使用Yarn进行资源分配 |
7 |
机器学习算法实现 |
实现Logistic Regression与KMeans两种算法 |
前面三篇文章介绍了Worker/Server线程以及它们之间通信方法的实现,然而对于参数服务器的训练过程来说,各个节点在进行迭代计算时常常又需要控制迭代的一致性,以便使梯度下降法在分布式的环境下达到指定的效果。在这一节我将实现BSP/ASP/SSP三种不同的一致性控制模式,它们底层的是通过依赖ProgressTracker
来实现的。
一致性控制模式
最常见的一致性控制模式分为三种:BSP/ASP/SSP。这其中单个迭代的过程又分为这几个阶段:
- 当前迭代进行计算
- 完成计算后进行网络通信
- 等待其它节点完成计算
server/abstract_model.hpp
class AbstractModel {
public:
// 进行一致性控制
virtual void Clock(Message &msg) = 0;
// 更新参数
virtual void Add(Message &msg) = 0;
// 获取参数
virtual void Get(Message &msg) = 0;
...
virtual ~AbstractModel() {}
每个一致性控制都继承了上面的AbstractModel
,Clock
方法是最主要的方法。
BSP

BSP
BSP是最常用的一种模式,它强调的是集群中每个节点的迭代次序完全一致。优点在于简单有效,缺点在于容易受部分滞后节点影响,导致整个集群处理变慢。
server/consistency/bsp_model.cpp
void BSPModel::Clock(Message &msg) {
int updated_min_clock = progress_tracker_.AdvanceAndGetChangedMinClock(msg.meta.sender);
// 先从ProgressTracker中获取迭代进度
int progress = GetProgress(msg.meta.sender);
CHECK_LE(progress, progress_tracker_.GetMinClock() + 1);
// 各个节点的迭代进度一致后,才对这些请求进行回应
if (updated_min_clock != -1) {
for (auto add_req : add_buffer_) {
storage_->Add(add_req);
}
add_buffer_.clear();
for (auto get_req : get_buffer_) {
reply_queue_->Push(storage_->Get(get_req));
}
get_buffer_.clear();
storage_->FinishIter();
}
}
可以看到BSP内部的实现采用了get_buffer_
的缓存队列来阻塞其它节点的Get请求,只有在所有节点的迭代次数达到一致后才会对这些被缓存的Get请求一个个进行处理。
ASP

ASP
ASP是与BSP截然相反的一种模式,对比BSP的严格控制各节点迭代同步,ASP让每个节点都独立的进行训练,不同的节点不需要互相等待对方。
server/consistency/asp_model.cpp
```cpp
void ASPModel::Clock(Message &msg) {
progress_tracker_.AdvanceAndGetChangedMinClock(msg.meta.sender);
}
void ASPModel::Get(Message &msg) {