6.824-lecture4

6.824 讲座14:参数服务器案例研究

使用参数服务器扩展分布式机器学习
Li,Andersen,Park,Smola,Ahmed,Josifovski,Long,Shekita,Su
OSDI 2014

如今:分布式机器学习
案例研究:参数服务器
我们为什么要阅读这篇论文?
有影响力的设计
宽松的一致性
不同类型的计算

机器学习入门
模型是函数逼近器
真正的函数是未知的,所以我们从数据中学到一个近似值
例如:-f(用户个人资料)->广告点击的可能性
-f(图片)->图片可能包含一只猫
-f(文档中的单词)->文档的主题/搜索字词
功能通常是非常高维的
两个阶段:训练和推理
在训练期间,将模型暴露给许多数据示例
监督下:知道正确答案,然后检查模型响应
无监督:正确答案未知,以不同方式衡量模型质量
在推理过程中,应用训练有素的模型来获得看不见数据的预测
参数服务器将使培训阶段高效

功能与参数
功能:可向算法提供信号的输入数据的属性
本文没有讨论如何选择它们;自己的整个ML子字段
例如:计算机视觉算法可以检测晶须形状的存在
如果存在,则提供强烈的信号(=重要参数)该图片是猫
相反,蓝天没有信号(=不重要的参数)
我们希望系统了解晶须比蓝天更重要
即,“晶须存在”参数应收敛到高权重
参数紧凑:单个浮点数或整数(权重)
但其中有很多(百万/十亿)
例如:广告中的字词=>可能点击的参数
许多独特的组合,有些是常见的(“二手车”),有些不是(“ OSDI 2014”)
形成一个巨大的数字向量
训练迭代数千次以增量调整参数值
流行的算法:梯度下降,可生成“梯度更新”
训练,计算变更,应用更新,再次训练
迭代非常短(不到一秒或几秒钟,尤其是使用GPU / TPU)

用于培训的分布式架构
需要很多工人
因为一台机器的训练数据太大
平行加速
参数可能也不适合在一台计算机上
所有工人都需要访问参数
计划:在多台机器上分配参数和训练数据
分区训练数据,在分区上并行运行
只有交互是通过参数更新
每个工作者都可以访问* any *参数,但通常只需要一小部分
cf. 图3
由训练数据分区确定
我们如何更新参数?

稻草人1:广播工人之间的广播参数变化
在训练迭代结束时,工人交换他们的参数更改
当所有更改都收到后,再应用它们
类似于MapReduce风格的洗牌
问:可能有什么问题?
答:1)全部广播交换=>荒谬的网络流量
2)需要等待所有其他工人才能继续=>空闲时间

Strawman 2:单一协调员收集并分发更新
在培训迭代结束时,工作人员将其更改发送给协调员
协调器收集,汇总并将汇总的更新发送给工作人员
工人修改本地参数
问:可能有什么问题?
答:1)单个协调器充斥着更新
2)单个协调器是单点故障
3)如果工人需要读取它没有的参数怎么办?

稻草人3:使用Spark
每次迭代的参数均为RDD(params_i)
在.map()转换中运行工作者端计算
然后执行reduceByKey()来随机化参数更新并应用
问:可能有什么问题?
答:1)效率很低!需要等待每个工作者完成迭代
2)如果工人需要读取它没有的参数怎么办?正常
具有狭窄依赖性的直接分区不适用

参数服务器操作
[图:参数服务器,工人;RM,任务计划程序,培训数据]
开始:在PS初始化参数,推送给工作人员
在每次迭代中:将培训任务分配给工人
工人计算参数更新
工作人员可能会为同一迭代完成更多的培训任务
worker将参数更新推送到负责的参数服务器
参数服务器通过用户定义的功能更新参数
可能汇总来自多个工作人员的参数更改
参数服务器复制更改
然后确认工人
完成后,工作人员将提取新的参数值
键值界面
参数通常抽象为z参数的大向量w [0,…,z]
实际上可能存储不同的内容(例如,哈希表)
在PS中,每个逻辑向量位置存储(键,值)
可以按键索引
例如:(功能ID,重量)
但仍可以将(键,值)参数视为向量
例如,做向量加法
瓶颈资源是什么?
worker:CPU(训练计算>参数更新计算)
参数服务器:网络(与许多工作人员交谈)

范围优化
PS对键范围而不是单个参数应用操作(推/拉/更新)
为什么?批处理可大大提高效率!
摊销较小更新的开销
例如,系统调用,数据包头,中断
想想如果我们发送单个参数的更新会发生什么
(功能ID,权重)参数有16个字节
IP标头:至少20个字节,TCP标头:dito
40个字节的标头可存储16个字节的数据-2.5倍的开销
syscall:〜2us,数据包传输:〜5ns,10 Gbit / s-400x开销
因此一次发送整个范围以提高吞吐量
进一步改进:
跳过不变的参数
跳过范围中数据值为零的键
也可以使用阈值删除不重要的更新
组合具有相同值的键

API
在纸上不是超级清晰!
push(range,dest)/ pull(range,dest)发送更新和pull参数
程序员实现了WorkerIterate和ServerIterate方法(参见方法1)
可以多次推/拉并响应控制流
每个WorkerIterate调用都是一个“任务”
异步运行-调用pull()/ push()时不会阻塞
相反,请运行另一个任务,然后在RPC返回时返回到该任务
程序员可以声明任务之间的显式依赖关系
细节不清楚

一致的哈希
无需单个查找目录即可找到参数位置
与早期的PS迭代不同,后者使用了memcached
哈希键确定的参数位置:H(k)=圆上的点
通过哈希服务器标识符(即H’(S))分配给服务器的圆上的范围
H和H’的域必须相同(但哈希函数不能相同)
每个服务器在其哈希点和下一个哈希点之间拥有密钥
众所周知的技术(将在Dynamo的Chord中再次出现)

容错能力
如果工人崩溃了怎么办?
在另一台机器上重启;加载训练数据,提取参数,继续
或只是删除它-只会丢失训练数据集的一小部分
通常不会对结果产生太大影响,否则培训可能需要更长的时间
如果参数服务器崩溃怎么办?
丢失所有存储在那里的参数
在多个服务器上复制参数
使用一致的哈希环来决定在哪里
每个服务器存储相邻的逆时针键范围
更新时,先更新副本,然后回复工作程序
没有性能问题,因为工作人员异步,同时执行其他任务
发生故障时,相邻备份将接管关键范围
已经复制了参数
工人现在与新主人交谈

宽松的一致性
许多ML算法在训练中可以忍受过时的参数
直觉:如果参数仅改变了一点,那么使用旧参数还不错
不会出现严重错误(例如,猫的可能性是85%,而不是91%)
仍然收敛到一个体面的模型
尽管可能需要更长的时间(由于更高的错误,所以需要更多的训练迭代)
权衡:等待(和闲置)与继续使用过时的参数
由用户指定(通过任务依赖性)

矢量时钟
需要一种同步机制
当需要强一致性时
即使保持宽松的一致性:有些工人可能会非常缓慢
想要避免其他人先行一步,并且某些参数变得过时
即,工作人员需要了解其他人和服务器之间的距离
每个键的矢量时钟
每个“时钟”指示该键的其他机器在何处
[示例图:带有N个节点的时间条目的向量]
仅在PS使用范围时才有效!
向量时钟为O(N)大小,N = 1,000+
如果PS为每个密钥存储一个向量时钟,那么开销将会是荒谬的
但范围允许摊销
PS始终一次更新整个范围的矢量时钟

性能
规模:数十亿个参数,10-100k个核(图1)
很少的空闲时间(图10)
网络流量优化可以提供帮助,尤其是在服务器上(图11)
宽松的一致性有助于达到一定程度(图13)

实际使用
TensorFlow,其他学习框架
高性能:两个PS可以轻松饱和5-10 GBit / s
有影响力的设计,尽管API有所不同
讨论区
ML是经常可以解决不一致问题的应用程序示例
允许进行不同且可能更有效的设计

参考文献

  • TensorFlow中的PS实施:https://www.tensorflow.org/deploy/distributed
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值