首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于Spark的大规模机器学习在微博的应用

基于Spark的大规模机器学习在微博的应用

作者头像
CSDN技术头条
发布于 2018-02-13 01:40:13
发布于 2018-02-13 01:40:13
1.5K0
举报
文章被收录于专栏:CSDN技术头条CSDN技术头条

众所周知,自2015年以来微博的业务发展迅猛。如果根据内容来划分,微博的业务有主信息(Feed)流、热门微博、微博推送(Push)、反垃圾、微博分发控制等。每个业务都有自己不同的用户构成、业务关注点和数据特征。庞大的用户基数下,由用户相互关注衍生的用户间关系,以及用户千人千面的个性化需求,要求我们用更高、更大规模的维度去刻画和描绘用户。大体量的微博内容,也呈现出多样化、多媒体化的发展趋势。

一直以来,微博都尝试通过机器学习来解决业务场景中遇到的各种挑战。本文为新浪微博吴磊在CCTC 2017云计算大会Spark峰会所做分享《基于Spark的大规模机器学习在微博的应用》主题的一部分,介绍微博在面对大规模机器学习的挑战时,采取的最佳实践和解决方案。

Spark Mllib

针对微博近百亿特征维度、近万亿样本量的模型训练需求,我们首先尝试了Apache Spark原生实现的逻辑回归算法。采用该方式的优点显而易见,即开发周期短、试错成本低。我们将不同来源的特征(用户、微博内容、用户间关系、使用环境等)根据业务需要进行数据清洗、提取、离散化,生成Libsvm格式的可训练样本集,再将样本喂给LR算法进行训练。在维度升高的过程中,我们遇到了不同方面的问题,并通过实践提供了解决办法。

Stack overflow

栈溢出的问题在函数嵌套调用中非常普遍,但在我们的实践中发现,过多Spark RDD的union操作,同样会导致栈溢出的问题。解决办法自然是避免大量的RDD union,转而采用其他的实现方式。

AUC=0.5

在进行模型训练的过程中,曾出现测试集AUC一直停留在0.5的尴尬局面。通过仔细查看训练参数,发现当LR的学习率设置较大时,梯度下降会在局部最优左右摇摆,造成训练出来的模型成本偏高,拟合性差。通过适当调整学习率可以避免该问题的出现。

整型越界

整型越界通常是指给定的数据值过大,超出了整形(32bit Int)的上限。但在我们的场景中,导致整型越界的并不是某个具体数据值的大小,而是因为训练样本数据量过大、HDFS的分片过大,导致Spark RDD的单个分片内的数据记录条数超出了整型上限,进而导致越界。Spark RDD中的迭代器以整数(Int)来记录Iterator的位置,当记录数超过32位整型所包含的范围(2147483647),就会报出该错误。解决办法是在Spark加载HDFS中的HadoopRDD时,设置分区数,将分区数设置足够大,从而保证每个分片的数据量足够小,以避免该问题。可以通过公式(总记录数/单个分片记录数)来计算合理的分区数。

Shuffle fetch failed

分布式计算中,Shuffle阶段不可避免,在Shuffle的Map阶段,Spark会将Map输出缓存到本机的本地文件系统。当Map输出的数据较大,且本地文件系统存储空间不足时,会导致Shuffle中间文件的丢失,这是Shuffle fetch failed错误的常见原因。但在我们的场景中,我们手工设置了spark.local.dir配置项,将其指向存储空间足够、I/O效率较高的文件系统中,但还是碰到了该问题。通过仔细查对日志和Spark UI的记录,发现有个别Executor因任务过重、GC时间过长,丢失了与Driver的心跳。Driver感知不到这些Executor的心跳,便主动要求Yarn的Application master将包含这些Executor的Container杀掉。皮之不存、毛之焉附,Executor被杀掉了,存储在其中的Map输出信息自然也就丢了,造成在Reduce阶段,Reducer无法获得属于自己的那份Map输出。解决办法是合理地设置JVM的GC设置,或者通过将spark.network.timeout的时间(默认60s)设置为120s,该时间为Driver与Executor心跳通信的超时时间,给Executor足够的响应时间,让其不必因处理任务过重而无暇与Driver端通信。

通过各种优化,我们将模型的维度提升至千万维。当模型维度冲击到亿维时,因Spark Mllib LR的实现为非模型并行,过高的模型维度会导致海森矩阵呈指数级上涨,导致内存和网络I/O的极大开销。因此我们不得不尝试其他的解决方案。

基于Spark的参数服务器

在经过大量调研和初步的尝试,我们最终选择参数服务器方案来解决模型并行问题。参数服务器通过将参数分片以分布式形式存储和访问,将高维模型平均分配到参数服务器集群中的每一台机器,将CPU计算、内存消耗、存储、磁盘I/O、网络I/O等负载和开销均摊。典型的参数服务器采用主从架构,Master负责记录和维护每个参数服务器的心跳和状态;参数服务器则负责参数分片的存储、梯度计算、梯度更新、副本存储等具体工作。图1是我们采用的参数服务器方案。

图1 微博参数服务器架构图

蓝色文本框架即是采用主从架构的参数服务器集群,以Yarn应用的方式部署在Yarn集群中,为所有应用提供服务。在参数服务器的客户端,也是通过Yarn应用的方式,启动Spark任务执行LR分布式算法。在图中绿色文本框中,Spark模型训练以独立的应用存在于Yarn集群中。在模型训练过程中,每个Spark Executor以数据分片为单位,进行参数的拉取、计算、更新和推送。

在参数服务器实现方面,业界至少有两种实现方式,即全同步与全异步。全同步的方式能够在理论层面保证模型收敛,但在分布式环境中,鉴于各计算节点的执行性能各异,加上迭代中需要彼此间相互同步,容易导致过早执行完任务的节点等待计算任务繁重的节点,引入通信边界,从而造成计算资料的浪费和开销。全异步方式能够很好地避免这些问题,因节点间无需等待和同步,可以充分利用各个节点的计算资源。虽然从理论上无法验证模型一定收敛,但是通过实践发现,模型每次的迭代速度会更快,AUC的加速度会更高,实际训练出的模型效果可以满足业务和线上的要求。

在通过参数服务器进行LR模型训练时,我们总结了影响执行性能的关键因素,罗列如下:

Batch size

即Spark数据分片大小。前文提到,每个Spark Executor以数据分片为单位,进行参数的拉取和推送。分片的大小直接决定本次迭代需要拉取和通信的参数数量,而参数数量直接决定了本地迭代的计算量、通信量。因此分片大小是影响模型训练执行性能的首要因素。过大的数据分片会造成单次迭代任务过重,Executor不堪重负;过小的分片虽然能够充分利用网络吞吐,但是会造成很多额外的开销。因此,选择合理的Batch size,将会令执行性能的提升事半功倍。下文将以Batch size为例,对比不同设置下模型训练执行性能的差异。

PS server数量

参数服务器的数量,决定了模型参数的存储容量。通过扩展参数服务器集群,理论上可以无限扩展存储容量。但是当集群大小达到瓶颈值时,过多的参数服务器带来的网络开销反而会令整体执行性能趋于平缓甚至下降。

特征稀疏度

根据需要可以将原始业务特征(用户、微博内容、用户间关系、使用环境等)通过映射函数映射到高维模型,以这种方式提炼出区分度更佳的特征。特征稀疏度结合每次迭代数据分片的数据分布,决定了该分片本次迭代需要拉取和推送的参数数量,进而决定了本次迭代所需的计算资源和网络开销。

PS分区策略

分区策略决定了模型参数在参数服务器的分布,好的分区策略能够使模型参数的分布更均匀,从而均摊每个节点的计算和通信负载。

Spark内存规划

在PS的客户端,Spark Executor需要保证有足够的内存容纳本次迭代分片所需的参数向量,才能完成后续的参数计算、更新任务。

表1所示为不同的Batch size下,各执行性能指标对比。Parameter(MB)表示一次迭代所需参数个数;Tx(MB)表示一次迭代的网络吞吐;Pull(ms)和Push(ms)分别表示一次迭代的拉取和推送时间消耗;Time(s)为一次迭代的整体执行时间。从表1中可见,参数个数与分片大小成正比、网络吞吐与分片大小成反比。分片越小,需要通信、处理的参数越少,但PS客户端与PS服务器通信更加频繁,因而网络吞吐更高。但是当分片过小时,会产生额外的开销,造成参数拉取、推送的平均耗时和任务的整体耗时上升。

表1 模型训练执行性能指标在不同Batch size下的对比

通过参数服务器的解决方案,我们解决了微博机器学习平台化进程中的大规模模型训练问题。众所周知,在机器学习流中,模型训练只是其中耗时最短的一环。如果把机器学习流比作烹饪,那么模型训练就是最后翻炒的过程,烹饪的大部分时间实际上都花在了食材、佐料的挑选,洗菜、择菜,食材再加工(切丁、切块、过油、预热)等步骤。在微博的机器学习流中,原始样本生成、数据处理、特征工程、训练样本生成、模型后期的测试、评估等步骤所需要投入的时间和精力,占据了整个流程的80%之多。如何能够高效地端到端进行机器学习流的开发,如何能够根据线上的反馈及时地选取高区分度特征,对模型进行优化,验证模型的有效性,加速模型迭代效率,满足线上的要求,都是我们需要解决的问题。在接下来的《weiflow——微博机器学习流统一计算框架》一文中,我们将为你一一解答。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSDN技术头条 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
干货 | 大规模机器学习框架的四重境界
1.背景 自从google发表著名的GFS、MapReduce、BigTable三篇paper以后,互联网正式迎来了大数据时代。大数据的显著特点是大,哪里都大的大。本篇主要针对volume大的数据时,使用机器学习来进行数据处理过程中遇到的架构方面的问题做一个系统的梳理。 有了GFS我们有能力积累海量的数据样本,比如在线广告的曝光和点击数据,天然具有正负样本的特性,累积一两个月往往就能轻松获得百亿、千亿级的训练样本。这样海量的样本如何存储?用什么样的模型可以学习海量样本中有用的pattern?这些问题不止是工
AI科技评论
2018/03/14
7550
干货 | 大规模机器学习框架的四重境界
五万字 | Spark吐血整理,学习与面试收藏这篇就够了!
一、Spark 基础 二、Spark Core 三、Spark SQL 四、Spark Streaming 五、Structured Streaming 六、Spark 两种核心 Shuffle 七、Spark 底层执行原理 八、Spark 数据倾斜 九、Spark 性能调优 十、Spark 故障排除 十一、Spark大厂面试真题
五分钟学大数据
2021/09/22
4.8K0
大规模机器学习框架的四重境界(下)
张红林
2017/08/31
2.6K0
大规模机器学习框架的四重境界(下)
大规模机器学习框架的四重境界
导语 :随着大数据时代的来临,使用机器学习算法对大规模数据处理逐渐成为各个业务的核心场景。如何利用相对廉价的机器搭建分布式超大规模机器学习集群是一件非常复杂的事情,对工程和算法都有极高的要求,本文尝试
张红林
2017/08/30
2.9K3
大规模机器学习框架的四重境界
【万字长文】Spark最全知识点整理(内含脑图)
Spark有以下四种部署方式,分别是:Local,Standalone,Yarn,Mesos
857技术社区
2022/05/17
3.1K2
【万字长文】Spark最全知识点整理(内含脑图)
【重磅】新一代 Angel 正式开源,性能超越 XGBoost 和 Spark
本文介绍了Angel的架构和性能,以及它在机器学习和深度学习领域的应用。Angel是一个开源的高性能机器学习框架,由腾讯开发。它采用了协程、多GPU、多线程等技术,支持多种机器学习框架,性能超越Spark和XGBoost。Angel的GBDT、LDA、LR等算法在多个数据集上获得了出色的性能,并支持Spark、PyTorch等深度学习框架。
腾讯大数据
2017/08/24
1.6K0
【重磅】新一代 Angel 正式开源,性能超越 XGBoost 和 Spark
独孤九剑-Spark面试80连击(上)
场景描述:这是一个Spark的面试题合集。是我自己作为面试者和作为面试官都会被问到或者问到别人的问题,这个总结里面有大量参考了网上和书上各位老师、大佬的一些原文答案,只是希望可以给出更好的回答,一般上我都会把原文链接贴上,如有侵权请联系删除!
王知无-import_bigdata
2019/09/03
1.3K0
独孤九剑-Spark面试80连击(上)
Spark 以及 spark streaming 核心原理及实践
本文主要介绍了如何基于Spark、Hadoop、HBase、Hive、Spark Streaming和Kafka等分布式计算技术,结合Java、Scala、Python和R等编程语言,实现大数据平台搭建、数据处理和机器学习等应用。包括Spark生态、原理、架构、编程范式和调优技巧等方面的内容。
蒋专
2017/04/26
4.8K0
Spark  以及 spark streaming 核心原理及实践
面向高维度的机器学习的计算框架-Angel
简介 为支持超大维度机器学习模型运算,腾讯数据平台部与香港科技大学合作开发了面向机器学习的分布式计算框架——Angel 1.0。 Angel是使用Java语言开发的专有机器学习计算系统,用户可以像用Spark, MapReduce一样,用它来完成机器学习的模型训练。Angel已经支持了SGD、ADMM优化算法,同时我们也提供了一些常用的机器学习模型;但是如果用户有自定义需求,也可以在我们提供的最优化算法上层比较容易地封装模型。 Angel应用香港科技大学的Chukonu 作为网络解决方案, 在高维度机器学习
腾讯大数据
2018/01/26
1.1K0
【技术分享】Spark机器学习的加速器:Spark on Angel
Spark的核心概念是RDD,而RDD的关键特性之一是其不可变性,来规避分布式环境下复杂的各种并行问题。这个抽象,在数据分析的领域是没有问题的,它能最大化的解决分布式问题,简化各种算子的复杂度,并提供高性能的分布式数据处理运算能力。
腾讯云TI平台
2019/09/26
1.1K0
腾讯Angel 1.0正式版发布:基于Java与Scala的机器学习高性能计算平台
机器之心报道 Tencent 深度学习是近些年来人工智能技术发展的核心,伴随而来的机器学习框架平台也层出不穷。到现在,一家科技巨头没有一个主导的机器学习平台都不好意思跟人打招呼,比如谷歌有 TensorFlow、微软有 CNTK、Facebook 是 Torch 的坚定支持者、IBM 强推 Spark、百度开源了 PaddlePaddle、亚马逊则是 MXNet 的支持者。而为了尽可能地获得开发者支持和抢占发展先机,很多平台都选择了开源。 在去年 12 月 18 日的腾讯大数据技术峰会暨 KDD China
机器之心
2018/05/08
1K0
腾讯Angel 1.0正式版发布:基于Java与Scala的机器学习高性能计算平台
【大数据分析 | 机器学习】分布式机器学习
  机器学习方法是计算机利用已有的数据生成某种模型,并利用此模型预测的一种方法。在确定模型结构之后,根据已知模型寻找模型参数的过程就是训练,训练过程中不断依据训练数据来迭代调整模型的参数值,从而使模型的预测结果更为准确。在现实应用中,要达到好的效果,训练数据集可能很大,模型参数量剧增,会带来很多性能和算法设计问题,单台机器难以胜任,需要分布式的机器学习架构。本文主要介绍分布式机器学习基础知识,并介绍主流的分布式机器学习框架,结合实例介绍一些机器学习算法。
Francek Chen
2025/01/22
1870
【大数据分析 | 机器学习】分布式机器学习
TalkingData大规模机器学习的应用
摘要:TalkingData目前提供应用统计分析、游戏运营分析、移动广告监测、移动数据DMP平台、移动行业数据分析等。随着各项业务快速发展,数据规模也越来越大,带来很大的挑战。本文将简要介绍我们应对这些挑战的一些经验。 TalkingData诞生于2011年,目前提供应用统计分析、游戏运营分析、移动广告监测、移动数据DMP平台、移动行业数据分析和洞察,以及企业级移动数据分析和挖掘的解决方案等产品和服务。随着各项业务快速发展,需要机器学习支撑的需求也越多越多,数据规模也越来越大,带来很大的挑战。而且Talki
用户1737318
2018/06/05
6940
Hadoop与Spark等大数据框架介绍[通俗易懂]
海量数据的存储问题很早就已经出现了,一些行业或者部门因为历史的积累,数据量也达到了一定的级别。很早以前,当一台电脑无法存储这么庞大的数据时,采用的解决方案是使用NFS(网络文件系统)将数据分开存储。但是这种方法无法充分利用多台计算机同时进行分析数据。
全栈程序员站长
2022/08/10
1.7K0
Hadoop与Spark等大数据框架介绍[通俗易懂]
Spark学习笔记
Apache Spark是一个开源集群运算框架,最初是由加州大学柏克莱分校AMPLab所开发。相对于Hadoop的MapReduce会在运行完工作后将中介数据存放到磁盘中,Spark使用了存储器内运算技术,能在数据尚未写入硬盘时即在存储器内分析运算。Spark在存储器内运行程序的运算速度能做到比Hadoop MapReduce的运算速度快上100倍,即便是运行程序于硬盘时,Spark也能快上10倍速度。[1]Spark允许用户将数据加载至集群存储器,并多次对其进行查询,非常适合用于机器学习算法。
gigiwangs
2020/06/16
1.2K0
Spark学习笔记
横向对比三大分布式机器学习平台:Spark、PMLS、TensorFlow
来源:机器之心 作者:Murat Demirbas 本文长度为3149字,建议阅读5分钟 本文为你介绍分布式机器学习平台所用的设计方法及未来研究方向。 [ 导读 ]分布式机器学习是机器学习领域的一大主要研究方向。近日纽约州立大学布法罗分校计算机科学与工程教授、Petuum Inc. 顾问 Murat Demirbas 和他的两位学生一起发表了一篇对比现有分布式机器学习平台的论文,对 Spark、PMLS 和 TensorFlow 等平台的架构和性能进行了比较和介绍。Murat Demirbas 教授在论
数据派THU
2018/01/29
2K0
横向对比三大分布式机器学习平台:Spark、PMLS、TensorFlow
ANGEL:一个新型的分布式机器学习系统
引自:http://www.ccf.org.cn/c/2017-08-16/603621.shtml
用户7886150
2021/04/21
1K0
Spark重要知识汇总
RDD(Resilient Distributed Dataset)弹性分布式数据集,是Spark中最基本的数据抽象,代表一个不可变、可分区、里面的元素可并行计算的集合。
Lansonli
2024/08/02
4580
Spark重要知识汇总
spark面试题目_面试提问的问题及答案
1.Spark master使用zookeeper进行HA的,有哪些元数据保存在Zookeeper? 答:spark通过这个参数spark.deploy.zookeeper.dir指定master元数据在zookeeper中保存的位置,包括Worker,Driver和Application以及Executors。standby节点要从zk中,获得元数据信息,恢复集群运行状态,才能对外继续提供服务,作业提交资源申请等,在恢复前是不能接受请求的。另外,Master切换需要注意2点 1)在Master切换的过程中,所有的已经在运行的程序皆正常运行!因为Spark Application在运行前就已经通过Cluster Manager获得了计算资源,所以在运行时Job本身的调度和处理和Master是没有任何关系的! 2) 在Master的切换过程中唯一的影响是不能提交新的Job:一方面不能够提交新的应用程序给集群,因为只有Active Master才能接受新的程序的提交请求;另外一方面,已经运行的程序中也不能够因为Action操作触发新的Job的提交请求; 2.Spark master HA 主从切换过程不会影响集群已有的作业运行,为什么? 答:因为程序在运行之前,已经申请过资源了,driver和Executors通讯,不需要和master进行通讯的。 3.Spark on Mesos中,什么是的粗粒度分配,什么是细粒度分配,各自的优点和缺点是什么? 答:1)粗粒度:启动时就分配好资源, 程序启动,后续具体使用就使用分配好的资源,不需要再分配资源;好处:作业特别多时,资源复用率高,适合粗粒度;不好:容易资源浪费,假如一个job有1000个task,完成了999个,还有一个没完成,那么使用粗粒度,999个资源就会闲置在那里,资源浪费。2)细粒度分配:用资源的时候分配,用完了就立即回收资源,启动会麻烦一点,启动一次分配一次,会比较麻烦。 4.如何配置spark master的HA? 1)配置zookeeper 2)修改spark_env.sh文件,spark的master参数不在指定,添加如下代码到各个master节点 export SPARK_DAEMON_JAVA_OPTS=”-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=zk01:2181,zk02:2181,zk03:2181 -Dspark.deploy.zookeeper.dir=/spark” 3) 将spark_env.sh分发到各个节点 4)找到一个master节点,执行./start-all.sh,会在这里启动主master,其他的master备节点,启动master命令: ./sbin/start-master.sh 5)提交程序的时候指定master的时候要指定三台master,例如 ./spark-shell –master spark://master01:7077,master02:7077,master03:7077 5.Apache Spark有哪些常见的稳定版本,Spark1.6.0的数字分别代表什么意思? 答:常见的大的稳定版本有Spark 1.3,Spark1.6, Spark 2.0 ,Spark1.6.0的数字含义 1)第一个数字:1 major version : 代表大版本更新,一般都会有一些 api 的变化,以及大的优化或是一些结构的改变; 2)第二个数字:6 minor version : 代表小版本更新,一般会新加 api,或者是对当前的 api 就行优化,或者是其他内容的更新,比如说 WEB UI 的更新等等; 3)第三个数字:0 patch version , 代表修复当前小版本存在的一些 bug,基本不会有任何 api 的改变和功能更新;记得有一个大神曾经说过,如果要切换 spark 版本的话,最好选 patch version 非 0 的版本,因为一般类似于 1.2.0, … 1.6.0 这样的版本是属于大更新的,有可能会有一些隐藏的 bug 或是不稳定性存在,所以最好选择 1.2.1, … 1.6.1 这样的版本。 通过版本号的解释说明,可以很容易了解到,spark2.1.1的发布时是针对大版本2.1做的一些bug修改,不会新增功能,也不会新增API,会比2.1.0版本更加稳定。 6.driver的功能是什么? 答: 1)一个Spark作业运行时包括一个Driver进程,也是作业的主进程,具有main函数,并且有SparkContext的实例,是程序的人口点;2)功能:负责向集群申请资源,向master注册信息,负责了作业的调度,,负责作业的解析、生成Stage并调度Task到E
全栈程序员站长
2022/11/16
1.9K0
Spark入门必读:核心概念介绍及常用RDD操作
导读:Spark是由加州大学伯克利分校AMP实验室开源的分布式大规模数据处理通用引擎,具有高吞吐、低延时、通用易扩展、高容错等特点。Spark内部提供了丰富的开发库,集成了数据分析引擎Spark SQL、图计算框架GraphX、机器学习库MLlib、流计算引擎Spark Streaming。
IT阅读排行榜
2019/05/10
7430
Spark入门必读:核心概念介绍及常用RDD操作
相关推荐
干货 | 大规模机器学习框架的四重境界
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档