本文是李沐大神的Parameter Server论文的学习笔记,李沐大神在OSDI和NIPS上都发过文章,其中OSDI版本偏向于系统设计,而NIPS版本偏向于算法层面,本文显然是OSDI的文章。算法
本文提出了“参数服务器”的分布式架构来支持分布式机器学习。分布式机器学习主要面临如下挑战:缓存
而本文中的框架给开发者带来两点优点:服务器
本系统主要有如下五个特色:网络
系统的这些特性都是经过选择正确的系统技术,运用在机器学习算法中,以及修改机器学习适应系统来实现。在系统实现过程当中,主要面临如下挑战:架构
机器学习须要从训练数据中学习模型,主要包含三个要素:特征提取、目标函数和学习。特征提取将原始训练数据转换为特征向量,不在本文赘述。学习的过程就是最小化目标函数从而得到模型。另外,在分布式机器学习任务中,训练数据量也一般是很是巨大的。框架
监督学习就是风险最小化的过程,例如最小化预测偏差。若是有个训练样本,每一个样本的特征向量为
,对应的标签为
,模型的参数为
,目标函数为机器学习
其中为损失函数,定义了预测值和真实值之间的偏差,
为正则化项,用来防止模型过拟合。在参数服务器框架中能够采用分布式子梯度降低对目标函数进行最小优化异步
在分布式子梯度降低算法中,每一个工做节点只须要计算分配到的参数工做集对应的梯度,而后由服务节点完成聚合。模型的完整参数
可能会十分巨大,工做节点在使用的时候会面临很大的负担,可是能够经过只保存用到的参数值便可。分布式
另一种机器学习的形式为无监督学习,一般用来学习数据的自身结构。比较典型的就是话题模型:给一些文档,推断出每一个文档包含的话题。主题模型的挑战就是:关于当前文档如何生成的参数必须被共享。解决方法就是每一个工做节点只保存分配到的文档出现的词有关的参数便可。函数
参数服务器系统由一个服务节点组和多个工做节点组构成。服务节点之间互相通讯来备份和迁移参数,服务管理节点负责维护服务节点元数据之间的一致性。一组工做节点运行一个应用程序,工做节点组中的调度节点负责任务的分配和监控。
参数服务器以命名空间的方式组织参数,模型的参数采用键值的形式保存。不一样的应用程序可能会共享命名空间,例如一个应用程序负责模型训练,另外一个应用程序负责模型推断。
为提升带宽利用率,系统支持范围推送和拉取。令为键范围,那么
w.push(R,dest)
将w.pull(R,dest)
从dest拉去服务节点除了从工做节点聚合数据以外,也能够执行用户定义函数。这样一来,用户能够实现能够实现一些更加高级的优化算法。
任务都是异步执行的:调用者发起一个任务以后,能够立刻执行其余运算。为了提升模型收敛率,能够设置某个任务执行完成后运行的依赖关系,设置任务依赖关系能够保证算法的逻辑。
工做节点能够并行执行分配的任务,可是可能会对学习算法的收率产生影响。系统效率和一致性之间的权衡关系取决于算法对于不一致的敏感程程度以及系统硬件能力,本框架提供了三种模式供设计者选择:
用户能够定义用户定义过滤器选择性地同步部分参数,例如用户能够之推送那些对模型参数有影响的梯度。
为了支持任务依赖图和快速恢复,每一个键值对须要一个时钟。若是每一个个参数每一个参数都保存一个时间,若是有
个节点,那么一共须要
空间,更合理的方式是保存范围的时间。
系统中传递的消息有多个在键范围内的键值对以及对应的向量时钟:
消息可能并无包含范围内所有的键值对,可是那些缺失的键值对的时钟照常更新。
若是每次迭代,工做节点的训练数据没有变化,那么键应该是不变的,那么可让接收放保存键缓存,而工做节点只须要发送值和键列表的哈希便可。另外,使用用户自定义过滤器能够进一步减小须要发送的键值对数量。
服务节点组中的节点使用分布式哈希表来保存模型参数。为了简化设计,系统使用直接映射,由服务管理节点统一管理。
每一个服务节点保存了逆时针方向k个邻居键范围内的参数的副本,做为这些副本的从节点。副本更新的方式能够是
当一个服务节点加入服务节点组以后:
新节点从某节点拉取范围
内的参数的过程能够分为两步:
当节点N收到节点添加消息后,须要:
在某个服务节点下线后,服务管理节点须要把该节点管理的参数分配给其余节点。
当一个新的工做节点被加入工做节点组后:
当一个工做节点离线以后,能够选择从新分配或者无视,系统将这个选项交给设计者,由于: