深度学习推荐系统的工程实现(概要)

从工程的角度来看推荐系统,可以分为两大部分:数据部分和模型部分。

  • 数据部分主要是指推荐系统所需数据流的相关工程实现;
  • 模型部分指推荐模型的相关工程实现,根据模型应用阶段不同,可分为离线训练和线上服务部分。

1.推荐系统的数据流

大数据平台主要有批处理、流计算、Lambda、Kappa4种架构模式。

1.1 批处理大数据架构

在大数据平台诞生之前,传统数据库很难处理海量数据的存储和计算问题。
由此诞生的”分布式存储+Map Reduce"架构,但是此架构只能批量处理已经落盘的静态数据,无法在数据采集、传输等数据流动的过程中处理数据,因此被称为批处理大数据架构。

批处理大数据架构示意图

1.2 流处理大数据架构

流计算大数据架构在数据流产生及传递的过程中流式地消费并处理数据。

流计算大数据架构示意图
流计算架构中,在每个“窗口”内部,数据被短暂缓存并消费,在完成一个窗口的数据处理后,流计算平台滑动到下一个窗口进行新一轮的数据处理。
因此理论上,流计算平台的延迟仅与滑动窗口的大小有关。
知名开源流计算平台包括Storm、Spark Streaming\Flink等,读将数据均看做“流”。

1.3 Lambda架构

Lambda架构是大数据领域非常重要的架构。

Lambda架构的数据通道从最开始的数据收集阶段裂变成两条分支:实时流和离线处理。

  • 实时流部分保持流计算架构,保障数据的实时性;
  • 离线处理部分则以批处理的方式为主,保障了数据的最终一致性,为系统提供更多数据处理选择。

流计算为保障数据实时性更多是以增量计算为主,而批处理部分则对数据进行全量计算,保障其最终的一致性即最终推荐系统的丰富性。

lambda架构示意图

1.4 Kappa架构

Kappa架构是为了解决Lambda架构的代码冗余而产生的。

在原有数据流处理的框架上加上两个新的通路"原始数据存储"和"数据重播"。原始数据存储将未经流处理的数据或者日志原封不动地保存到分布式文件系统中,“数据重播"将这些原始数据按照时间顺序进行重播,并用同样流处理框架进行处理,从而完成离线状态下的数据批处理。kappa架构示意图

1.5 大数据平台与推荐系统的整合

大数据平台与推荐系统的关系是非常紧密的。
具体来讲:大数据平台与推荐系统的整合主要体现在:

  • 训练数据的处理
  • 特征的预计算

实际上无论采用哪种大数据架构,大数据平台在推荐系统中的主要任务都是对特征和训练样本的处理。根据业务场景不同,完成特征处理之后,样本和特征数据最终流向两个方向:

  • 以HDFS为代表的的离线海量数据存储平台,主要负责存储离线训练用的训练样本。
  • 以Redis为代表的在线实时特征数据库,主要负责模型的在线服务提供实时特征。

在这里插入图片描述

2.推荐模型离线训练之Spark MLlib

在推荐、广告、搜索等互联网场景下,动辄TB甚至PB级的数据量导致几乎不可能在传统单机环境下完成机器学习模型的训练,分布式机器学习训练成为唯一的选择。

2.1 Spark的分布式计算原理

所谓分布式,指的是计算节点之间不共享内存,需要通过网络通信的方式交换数据。

Spark 程序由 Manager Node(管理节点)进行调度组织,由 Worker Node(工作节点)进行具体的计算任务执行,最终将结果返回给 Drive Program(驱动程序)。在物理的 Worker Node 上,数据还会分为不同的 partition(数据分片),可以说 partition 是 Spark 的基础数据单元。
Spark架构图
在 Spark 平台上处理这个任务的时候,会将这个任务拆解成一个子任务 DAG(Directed Acyclic Graph,有向无环图),再根据 DAG 决定程序各步骤执行的方法。从图 2 中我们可以看到,这个 Spark 程序分别从 textFile 和 hadoopFile 读取文件,再经过一系列 map、filter 等操作后进行 join,最终得到了处理结果。

在这里插入图片描述
其中,最关键的过程是我们要理解哪些是可以纯并行处理的部分,哪些是必须 shuffle(混洗)和 reduce 的部分。

这里的 shuffle 指的是所有 partition 的数据必须进行洗牌后才能得到下一步的数据,最典型的操作就是图 2 中的 groupByKey 操作和 join 操作。以 join 操作为例,我们必须对 textFile 数据和 hadoopFile 数据做全量的匹配才可以得到 join 后的 dataframe(Spark 保存数据的结构)。而 groupByKey 操作则需要对数据中所有相同的 key 进行合并,也需要全局的 shuffle 才能完成。

与之相比,map、filter 等操作仅需要逐条地进行数据处理和转换,不需要进行数据间的操作,因此各 partition 之间可以完全并行处理。
此外,在得到最终的计算结果之前,程序需要进行 reduce 的操作,从各 partition 上汇总统计结果,随着 partition 的数量逐渐减小,reduce 操作的并行程度逐渐降低,直到将最终的计算结果汇总到 master 节点(主节点)上。可以说,shuffle 和 reduce 操作的触发决定了纯并行处理阶段的边界。

在这里插入图片描述
用一句话总结 Spark 的计算过程:Stage 内部数据高效并行计算,Stage 边界处进行消耗资源的 shuffle 操作或者最终的 reduce 操作。

2.2 Spark MLlib的模型并行训练原理

2.3 Spark MLlib并行训练的局限性

  • 采用全局广播的方式,在每轮迭代前广播全部模型参数
  • 采用阻断式的梯度下降方式,每轮梯度下降由最慢的节点决定
  • Spark MLlib并不支持复杂深度学习网络结构和大量可调超参

3.推荐模型离线训练之Parameter Server

在这里插入图片描述
Parameter Server的并行梯度下降流程中最关键的两个操作是push 和 pull。

  • push操作:worker节点利用本节点上的训练数据,计算好局部梯度,上传给server节点
  • pull操作: 为了进行下一轮的梯度计算,worker节点从server节点拉取最新的模型参数到本地。

概括整个Parameter Server的分布式训练流程如下:

  • 1.每个worker载入一部分数据
  • 2.worker 节点从server节点拉取最新的相关模型参数
  • 3.worker 节点利用本节点数据计算梯度
  • 4.worker 节点将梯度推送到server节点
  • 5.server节点汇总梯度更新模型
  • 6.跳转到第二步,直到迭代次数达到上限或模型收敛。

4.推荐模型离线训练之Tensorflow

4.1 Tensorflow的基本原理

即根据深度学习模型架构构建一个有向图,让数据以张量的形式在其中流动起来。

5.深度学习推荐模型的上线部署

6.工程与理论的权衡

参考:深度学习推荐系统,王喆

猜你喜欢

转载自blog.csdn.net/weixin_44127327/article/details/112861002