导读: 微博作为国内比较主流的社交媒体平台,目前拥有2.22亿日活用户和5.16亿月活用户。如何为用户实时推荐优质内容,背后离不开微博的大规模机器学习平台。本文由微博机器学习研发中心高级算法工程师于茜老师分享,主要内容包含以下四部分:
微博2008年上线,是目前国内比较主流的社交媒体平台,拥有2.22亿日活用户和5.16亿月活用户,为用户提供在线创作、分享和发现优质内容的服务;目前微博的大规模机器学习平台可以支持千亿参数和百万QPS。
接下来介绍一下微博机器学习平台,即WML的总览;机器学习平台 ( WML ) 为CTR、多媒体等各类机器学习和深度学习算法提供从样本处理、模型训练、服务部署到模型预估的一站式服务。
1. 总览
上方是WML的一个整体架构图,共分为六层,从下至上依次介绍:
2. 开发模式
接下来介绍一下开发模式,有两层 DAG 的设计:
3. CTR 模型
介绍一下 CTR 模型在微博迭代的情况,经过几年的研究和探索,目前支撑的参数规模达千亿级,服务峰值达百万 QPS,模型更新的周期大概在 10 分钟左右;现在是 Weilearn6.0 版本,可以看到 WeiLearn 在不断完善更新自己的算法:
下面介绍 Flink 在微博机器学习平台 WML 中的架构
1. 概览
上图为实时计算平台的整体情况,接下来详细介绍一下各模块:
接下来看一下 Flink 在 ETL 的 Pipeline 中的概览:之前是有两个 Pipeline,一个为在线的,以前是使用 Storm 进行的处理,目前正在往 Flink 迁移,两套现在处于并行状态,处理流程是从消息队列中获取数据进行处理,然后给到在线训练模块 ( Flink 和 Spark Streaming 并行 ),最后提供模型服务给推荐系统调用;一个为离线的,和在线类似,首先写入到 HDFS 交给 Hive 或 Spark 进行处理,再次落到 HDFS 中交给离线训练使用,最后提供模型服务给推荐系统调用。因为有两类 ETL 的 Pipeline,使用不同的框架,需要维护两套代码,维护成本较高。
目前做的就是将两套融合成一套,进行批流统一的处理,此处可能会用到 FlinkSQL,然后将 ETL 后的数据输出到实时消息队列或者 HDFS 中,交给在线和离线模型训练,最后提供模型服务给推荐系统调用。
2. 样本服务
介绍一下样本生成服务,上图为该服务的整体架构图,包含样本数据的处理和计算等,除了一些生成的离线和实时数据外,还需要一些已经生成好的特征的引用,通过普通计算、多流 Join、深度学习等处理方式生成样本,最后存储到样本库中供模型训练来调用。
这个是样本服务任务提交的方式,可以通过之前提到的 WeiClient 命令行方式提交,也可以通过 WAIC UI 方式指定样本 ID 以及 UDF 的 class name 和要拼接的特征 ID,通过一种统一的方式将作业提交到集群上;之后是通过 Twinkle 或 VVP 的方式提交到 Flink 集群,然后会对作业状态进行管理,通过 Grafana 进行监控和报警,将历史作业信息存储到 HDFS 中。
3. 多流 Join
这是微博目前的一个主流场景,多数据流 Join 场景 ( 大部分是大于等于 3 ):有 N 个数据源,通过过滤和映射的处理后按照 Key 进行分发,在 Joining Window 中进行 join 后 ( 此处后面会详细讲 ),会再进行一次过滤和映射以及添加特征,最后输出到样本库中。
接下来看一下刚刚讲到的拼接窗口的实现方式,这是和业务比较相关的,对于 CTR 场景来说日志有很多种 ( 多个行为日志 ),但是到达的时间并不完全一致,比如点击这种行为日志可能会比曝光日志到的晚一些;这样就会需要一个时间窗口,以 10 分钟为例,如果某种日志先到了,就会将对应的 key 和 value 存储到 State 中,状态存储这块是基于 RocksDB 和 HDFS 做的;经过这个十分钟窗口之后,拼接好的样本数据会输到实时流中;此处基于 Flink 做了一些优化:
4. 多媒体特征生成
介绍一下 Flink 在多媒体特征生成场景的应用,此处主要是依赖离线计算的深度学习模型,因此整体的模型训练走的是离线的 Pipeline,将数据在离线的 GPU 集群进行分布式的模型训练,然后将模型部署到 GPU 上面供在线推理的时候调用;在线推理模块接收到图片流、文本流和视频流这些实时数据之后,首先会通过 RPC 调用 GPU 上的模型,然后将多媒体特征结果写入到数据中台,由业务方去读取结果来使用,因为这块是一个实时的任务作业,服务稳定性需要一定的保障 ( 4 个 9 的成功率、秒级延迟、配置化开发模式 ),下面会对服务保障做详细介绍。
针对实时任务的服务保障做了如下的工作:
最后分享一下使用 Fllink 的下一步计划:
1. 实时数仓
目前已经通过 Flink SQL 的方式实现了开发,但是实时和离线表的注册还有元数据存储是有一定差异的,希望可以抽象出一层 API 用统一的方式来进行实时和离线表的注册以及元数据的存储。
2. 基于 Flink 的 DL
我们希望可以将离线的深度学习完全迁移到在线深度学习来做,这样的话就需要用到 TensorFlow on Flink,这样就可以保证不管是模型训练还是在线推理都可以使用同样一套框架去完成,这样就需要把离线训练的全量模型也可以通过实时样本进行增量训练的一些校正,后面的步骤和之前基本上是保持一致的,这样就可以将离线深度学习的这条 Pipeline 优化一些。
本次的分享就到这里,谢谢大家。
作者介绍:
于茜,微博机器学习研发中心高级算法工程师。多年来致力于使用 Flink 构建实时数据处理和在线机器学习框架,有丰富的社交媒体应用推荐系统的开发经验。
本文来自 DataFunTalk
原文链接:
领取专属 10元无门槛券
私享最新 技术干货