04718c0309c52e5213f900d98f35e625
从零实现机器学习参数服务器框架(一)

简介

大数据时代里,面对着大量用户数据的各个公司迫不及待的想要高效、快速的从海量的数据中寻找出用户的偏好,以便将公司的收益在已有的基础上最大化。

数据分析、数据挖掘等是最早被作为数据处理的常用技术,然而随着数据的量、多样性等因素的提升,再加上计算机CPU, GPU, TPU等算力的进步,机器学习算法慢慢成为一种被各个公司采用的数据处理技术。常见的垃圾邮件判定、内容推荐、图像识别正是典型的机器学习算法的应用。

然而随着数据的数量、种类的提升,想要在短时间内完成数据的处理以便达到更多的收益成为了每个人都要解决的难点。最简单的方案莫过于替换算力更加强劲的GPU与TPU,然而随着硬件发展的瓶颈,利用分布式计算来替代单机计算称为了加速数据处理的主要手段。

Hadoop MapReduce曾经在谷歌被用于大规模网页数据计算的主要框架,随着时间的推移慢慢被采用DAG设计理念的Flume替代,直到现在已经很少有人去直接使用Hadoop MapReduce,反观高效的Spark使用内存计算技术在数据处理上慢慢被各大互联网大厂采用。

然而对于现阶段的机器学习,大多数算法的设计理念在于构建合适的损失函数后,利用链式法则进行求导以计算出"梯度",随后使用递归的方式循环更新已有的参数。这样的算法常常也被称为"特征学习",这些特征又被一个个独立的参数来表示。当机器学习算法模型逐渐被设计的越来越复杂时,参数的数量越逐渐的上升。例如近来名声大噪的深度学习卷积神经网络,当网络的层数越来越深时,参数的个数随之也在上升。

当参数的数量越来越多时,直到普通的单机内存已经不足以存储整个模型的参数时,这时候就需要使用到参数服务器(Parameter Server)的设计了。参数服务器究其本质,是使用到了模型并行的理念,将模型参数分布式缓存在不同的机器节点,同时使用数据并行的理念,使用不同的机器节点进行计算,在计算出"梯度"后,使用它来更新参数。

从零实现参数服务器框架

从这篇文章开始,我将从零开始带着大家实现一个参数服务器框架,使用这个框架可以进行常见的机器学习算法训练。主要的功能及写作顺序如下:

序号 名称 简介
1 框架架构 介绍整体框架架构、涉及模块
2 模型、数据计算并行 实现参数服务器中的Worker与Server
3 节点间通信接口 实现应用常用接口,使用ZeroMQ实现节点间通信
4 一致性控制 在Server端实现常见的一致性控制模式:BSP/ASP/SSP
5 容错实现 使用CheckPoint Rollback、心跳监测等方式实现计算容错
6 Yarn资源管理系统支持 编写Yarn Application以使用Yarn进行资源分配
7 机器学习算法实现 实现Logistic Regression与KMeans两种算法

框架架构

当我们在谈及参数服务器时,最广为人知的一个版本是李沐的Scaling Distributed Machine Learning with the Parameter Server,它的设计及架构在之前的文章中我也有介绍。

这里详细介绍下我们要从零实现的参数服务器框架设计,我会在接下来的几篇文章中进行分批实现。代码已经push到我的Github上:MiniPs,详细的Report也可在A Distributed Computing Framework for Machine Learning Applications进行阅读、下载。

主要涉及的模块有:

architecture

architecture

序号 名称 简介
1 Engine 也称Manager、Controller,用来全局管理、协调其它模块进行通信
2 WorkerThread 对应着参数服务器中的Worker,通过梯度下降法计算出"梯度"后,Push到Parameter Server
3 ServerThread 对应着参数服务器中的Server,负责接收"梯度"并进行更新参数
4 KVClientTable 对应着参数的分布式缓存表,是Server在Worker端的代理抽象
5 BSP/ASP/SSP 对应着三种不同的一致性控制模式
6 SenderThread/Mailbox 用于不同机器节点底层通信
7 MapStorage/VectorStorage 参数数据存储容器

还有一些次要的模块:

序号 名称 简介
1 ProgressTracker 记录当前集群训练过程,为一致性控制模式提供基本功能
2 HDFSManager 在从HDFS中读取数据时,提供数据读取接口,支持多线程并发读取大规模数据
3 Master 用于实现容错功能的主节点,主要用于各节点的心跳记录
4 Message 节点间通信信息的抽象
5 IdMapper 为集群中不同Worker与Server分配id

整体类图:

class diagram

class diagram

top Created with Sketch.