:“在你辉煌的时刻,让我为你唱首歌,我的好兄弟,心里有苦你对我说。”
计算机
:“哥啊,那我可就说了,我是真的苦啊,现在一个模型动辄好几亿参数,数据集也是大的吓人,兄弟我内存都快被掏空了,实在训练不动了呀。”
工程师
:“前方大路一起走,哪怕是河也一起过…”
计算机
:“你怎么还唱啊,兄弟我真的坚持不住了。”
工程师
:“担心啥,哥有的是办法救你,就这招吧——分布式训练之参数服务器!”
计算机
:“分布式训练?参数服务器?真的很好用吗?”
工程师
:“好吧,接下来我们就来看看什么是分布式训练参数服务器功能。”
什么是分布式训练
何谓分布式训练呢?大家想想《火影忍者》中鸣人搓螺旋丸的方法,要知道鸣人一个人可搓不出来,他是怎么做的呢?对!影分身,再变出两个分身来帮他一起搓丸子,分布式训练其实用的是相同的原理。通俗的讲就是把原先交给一台计算机上完成的训练任务改为交由多台计算机完成。每台计算机上都会有一个或多个计算单元,例如CPU、GPU、AI芯片等,合作的计算机越多,参与训练的计算单元也就越多。可想而知那速度肯定是噌噌的!
什么是参数服务器
如图1所示,参数服务器是分布式训练领域普遍采用的编程架构,主要包含Server和Worker两个部分,其中Server负责参数的存储和更新,而Worker负责训练。飞桨的参数服务器功能也是基于这种经典的架构进行设计和开发的,同时在这基础上进行了SGD(Stochastic Gradient Descent)算法的创新(Geometric Stochastic Gradient Descent)。当前经过大量的实验验证,最佳的方案是每台机器上启动Server和Worker两个进程,而一个Worker进程中可以包含多个用于训练的线程。
图1 参数服务器架构示意图
飞桨参数服务器功能支持三种模式,分别是同步训练模式、异步训练模式和GEO异步训练模式:
图2 同步训练模式示意图
图3 异步训练模式示意图
图4 异步训练模式示意图
经过上述介绍,我想小伙伴们应该对飞桨的参数服务器功能有了一定了解,可是这个参数服务器不仅包括了三种模式,还一会儿Worker一会儿Server的,用起来应该会很复杂吧?这个请放心,这个用起来其实非常简单,甚至比鸣人结手印召唤影分身还要简单!
十行代码单机转分布式
参数服务器模式
飞桨的分布式训练功能确实是比较复杂,其不仅包含参数服务器(同步、异步、GEO)模式,还包含collective、hybrid等其它模式。为了能让开发者们方便得使用这些功能,飞桨的工程师们非常贴心的专门为分布式训练设计了一套FleetAPI接口。如图5所示,使用FleetAPI可以轻松的将原先的单机训练转换为分布式参数服务器模式:
图5 FleetAPI功能示意图
具体操作方法请参见下面的代码示例。
如下为模型单机训练的代码,为了简化说明,这里省略了模型网络定义和数据读取等部分的代码。
exe = Executor(place)
optimizer = optimizer.Adam(learning_rate=0.001)
optimizer.minimize(avg_cost)
exe.run(default_startup_program())
for batch_id, data in enumerate(train_reader()):
avg_loss_value, auc_value = exe.run(main_program(), feed=feeder.feed(data))
用户只需要加入十行代码即可将上面的单机训练过程转换为分布式训练:
exe = Executor(place)
#设置节点角色
role = role_maker.PaddleCloudRoleMaker()
fleet.init(role)
optimizer = optimizer.Adam(learning_rate=0.001)
#配置策略
strategy = StrategyFactory.create_sync_strategy()
optimizer = fleet.distributed_optimizer(optimizer, strategy)
optimizer.minimize(avg_cost)
# 初始化并运行Server进程
if fleet.is_server():
fleet.init_server()
fleet.run_server()
# 初始化并运行Worker进程
if fleet.is_worker():
fleet.init_worker()
exe.run(fleet.startup_program)
for batch_id, data in enumerate(train_reader()):
avg_loss_value, auc_value = exe.run(fleet.main_program, feed=feeder.feed(data))
# 通知Server停止监听Worker请求
fleet.stop_worker()
性能远超业界同类最优产品!
在训练效果相同的情况下,飞桨的参数服务器训练模式在训练速度上有很大优势。相比于业界同类最优产品,参数服务器训练模式在相同机器数量和硬件配置条件下能够大幅提升模型训练速度。
如图6所示,在词向量Word2Vector模型上,采用GEO训练模式的飞桨分布式训练的训练速度能够超越同类最优产品 18倍。
图6 Word2Vector模型性能示意图
在CTR-DNN模型上,如图7所示,采用全异步训练的训练模式也能够有6倍的速度提升。此外飞桨的推荐模型库还提供有包括DeepFM、Deep Cross Network、Gru4Rec等一系列经典个性化推荐类模型,方便开发者选择使用。
图7 CTR-DNN模型性能示意图
相关工具组件简介
飞桨参数服务器功能在提供巨大性能优势的同时,也进一步支持了分布式训练相关的工具组件给用户使用。
业务应用示例
飞桨参数服务器模式如今已经在百度公司内外得到了普遍的应用,包括信息流、搜索等业务。下面以视频推荐场景为例介绍飞桨参数服务器的几种模式在业务中的具体应用。
图8 视频推荐系统示意图
如图8所以,视频推荐系统采用了漏斗模型,即召回->粗排->精排->融合的架构:
经过实际业务验证,飞桨参数服务器功能可以轻松应对千万级用户数量、百亿特征规模的业务场景。
本文分享自 PaddlePaddle 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!