汇量科技在Spark上 构建推荐算法Pipeline的实践

简介: 内容简要:一、关于汇量科技二、一个典型的推荐算法实验流程三、问题和挑战四、在Spark上构建推荐算法Pipeline

内容简要:

一、关于汇量科技

二、一个典型的推荐算法实验流程

三、问题和挑战

四、在Spark上构建推荐算法Pipeline

 

 

一、关于汇量科技Mobvista

汇量科技是:

• 一站式的移动广告服务和数据统计分析服务

• 日均千亿次的在线广告个性化匹配

• 全流量 DNN 模型排序

• 构建了一站式机器学习平台MindAlpha

 

 

二、一个典型的推荐算法实验流程

推荐算法的数据部分较为复杂,而语音图像数据集是一个静态的数据集

 

推荐算法试验流程解析:

1)  数据准备

数据进行处理结合

2)  特征样本生成

将数据进行特征拼接、Label拼接;

3)  特征存储

存储特征样本,包含在线学习样本和离线学习样本;

4)  模型训练

对样本进行模型训练,包括模型迭代、参数调优;

5)  在线评估

进行线上评估,如果发现问题返回之前的流程。例如参数优化问题则返回模型调优数据问题则返回第一步数据准备,从头开始。

 

 

三、问题和挑战

推荐算法广告搜索类似,首先解决数据的问题,然后解决法的问题。

推荐算法主要存在以下四个问题:

1.数据源多,特征处理流程繁琐

比如有实时特征、离线特征等。

2.离线学习、在线学习转换

在线学习与离线学习之间做无缝的转换

3.模型训练与数据处理的衔接

数据源有很多不同类型的存储,算法需要适配,所以需要模型训练与数据处理的衔接。

4.上下游依赖多且频繁变动

线上算法有很多流量并行的实验,整个上下游的依赖比较繁琐这方面出错的造成的问题比较严重

 

 

四、在Spark上构建推荐算法 Pipeline

(一)Why Spark?

l  选择Spark的原因:

1)数据处理功能强大;

2)支持多种离线、实时数据源;

3DataFrame的抽象;

4)支持多种调度系统和硬件;

5PySpark

 

 

(二)特征工程数据流

在解决特征数据流的问题上,最开始没有构建排版,业务算法工程师们一般是自己做数据拼接。这种拼接没有规范,直接拷贝代码输出数据源,在Spark里面进行 Join每个实验形成一个数据集

这种特征数据流存在许多问题:

• 多个实验各自产出数据

• 99% 的列是重复的

• 极大计算和存储浪费

• 一小时的数据无法在一小时内处理完

 

根据上面的问题,我们总结出特征数据流的解决方案与存储方案。

 

1.特征数据流的解决方案:

统一列存储;

将同样的数据进行归置避免多次计算

基础共用特征列

特征列共用,包括标签

各实验的特征列

每个实验添加自己的特征列共用作业直接产出,其他作业只产出自己实验所需数据。

模型训练通过列名配置读取DataFrame

实验数据产出后做模拟训练,通过列名配置,从数据源里读取DataFrame

 

2.存储方案选型

l  Kudu 实时更新

Online Learning

l 天级 ORC 备份

离线实验

 

目前选用的是Kudu,含行级别和列级别,可以实时插入,近似于流式地写入Kudu。写完可以根据用户设定的调度周期,当时间窗口累计完成,触发一个训练任务,这就是Online Learning准实时学习的方案

Kudu更新之后天级ORC备份,将Kudu一天的数据备份到 OSS上。这里有两个目的,第一是备份,第二是缓Kudu本身的压力

Kudu本地磁盘搭建,本地磁盘存在成本大与性能瓶颈的问题。将数据存放到云存储上,可以借用云存储的服务能力离线实验,实验时可以选择Kudu数据,也可以直接在OSS读历史数据。

 

(三)打通大数据和算法框架

1.Parameter Server on PySpark

l 为什么重新实现一套 Parameter Server

l Python First API

n 与 Spark 调度集成

l 与 DataFrame 集成

 

1Python First API

Python First API做大规模离散深度学习训练时,需要解决Embedding参数稀疏的问题。

Embedding定义了几种Python接口,再向下可以分装成Embedding操作的API对稀疏参数更新的问题,传统解决方法是放在Front Server节点上计算。

做Online Learning的时候,特征的个数是未知的,希望直接用原始的字符串或者用哈希值的方式做特征索引,特征的大小无法提前固定, Tenderflow框架不支持。

我们支持之后做内部转换,将每段哈希值映射到一个连续范围内,使得分片比较小的范围内,它的索引最大不会超过分片总长度,使得可以直接用于各种接口。

 

2.与 Spark 调度集成

对于Parameter Server来说两个部分,一个是Server节点,一个Work节点Spark从2.4开始有Rdd.barrier接口,接口的定义所有的Excutor进程要么不起要么全起。

Spark存在猜测执行的机制,开启Rdd.barrier模式后,不会重复执行已有的进程,将原本大数据处理的方式机器学习方式。

Rdd.barrier可以用于起Parameter Server作业,要起ServerWorker两个节点。通过上述操作,完成了调度集成。

 

3.DataFrame 集成

学习框架完成后开始训练,传统方法是使用UDF读取数据,Spark2.3版本后提供了Pandas UDF以Batch的形式数据直接传到Python,然后转成Pandas的Data Frame。

由上图可看到,训练的代码均为UDF执行训练直接调UDF,将Spark Columns传进去即可。  

下面举例一个更复杂更全面的Demo,功能是在离线实时预估一致性监控On Spark Streaming

实现监控的主要步骤:

1事件的回流

2)特征的回流;

3)做WindowGroupBy

 

 

(四)解决数据上下游调度关系

完成数据、算法与训练后,最后要解决数据上下游调度关系。

在算法场景下的数据上下游调度与传统大数据调度有一定区别,存在以下两个问题:

问题一,最开始解决特征工程数据流时,共享部分拆一个作业,由实验自己产出每个实验自己产出额外需要的部分,此时会发现,其他实验需要依赖共用处于最上游的特征作业

问题二,假设最没有实验,线上是Baseline基线模型。算法工程师做实验例如加一个特征,就会基于Baseline的数据,再加入工程师自己的数据,两个数据之间自然就有上下游关系。后续基于这个Baseline又有其他实验,这样就有许多分支再往后如果有一个实验效果不错,成为新的Baseline,后续新实验就要基于新的Baseline重新进行实验,下图为分支管理方式

实验依赖关系自动化

l  每个时刻,总是有一个Baseline (基线) 模型以及若干小流量模型(Master + 多个Branch);

l  小流量模型可能升级为基线模型(Merge);

l  此时各个实验数据依赖上游需要调整(Rebase);

l  基于Airflow

l  通过一个配置文件自动生成Airflow DAG

l  支持ForkMergeRebase等操作。

 

基于上下游关系,我们将它们做成上下游的管理机制每一个人做实验的时候,会去更新配置文件,描述实验的上游是谁然后配置文件会自动刷新,刷新出来之后生成新的配置文件,就是上下游调度关系。

 

(五)未来方向

• PS on PySpark 2021 Q1开源

• Server/Worker异构资源分配(#SPARK-27495)

• 在 PS on PySpark上支持GNN

相关文章
|
2月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
67 4
|
2月前
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
68 0
|
7天前
|
机器学习/深度学习 人工智能 算法
深入解析图神经网络:Graph Transformer的算法基础与工程实践
Graph Transformer是一种结合了Transformer自注意力机制与图神经网络(GNNs)特点的神经网络模型,专为处理图结构数据而设计。它通过改进的数据表示方法、自注意力机制、拉普拉斯位置编码、消息传递与聚合机制等核心技术,实现了对图中节点间关系信息的高效处理及长程依赖关系的捕捉,显著提升了图相关任务的性能。本文详细解析了Graph Transformer的技术原理、实现细节及应用场景,并通过图书推荐系统的实例,展示了其在实际问题解决中的强大能力。
77 30
|
11天前
|
存储 算法
深入解析PID控制算法:从理论到实践的完整指南
前言 大家好,今天我们介绍一下经典控制理论中的PID控制算法,并着重讲解该算法的编码实现,为实现后续的倒立摆样例内容做准备。 众所周知,掌握了 PID ,就相当于进入了控制工程的大门,也能为更高阶的控制理论学习打下基础。 在很多的自动化控制领域。都会遇到PID控制算法,这种算法具有很好的控制模式,可以让系统具有很好的鲁棒性。 基本介绍 PID 深入理解 (1)闭环控制系统:讲解 PID 之前,我们先解释什么是闭环控制系统。简单说就是一个有输入有输出的系统,输入能影响输出。一般情况下,人们也称输出为反馈,因此也叫闭环反馈控制系统。比如恒温水池,输入就是加热功率,输出就是水温度;比如冷库,
70 15
|
16天前
|
机器学习/深度学习 算法 Python
随机森林算法是一种强大的集成学习方法,通过构建多个决策树并综合其结果进行预测。
随机森林算法是一种强大的集成学习方法,通过构建多个决策树并综合其结果进行预测。本文详细介绍了随机森林的工作原理、性能优势、影响因素及调优方法,并提供了Python实现示例。适用于分类、回归及特征选择等多种应用场景。
42 7
|
1月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
18天前
|
JSON 算法 数据挖掘
基于图论算法有向图PageRank与无向图Louvain算法构建指令的方式方法 用于支撑qwen agent中的统计相关组件
利用图序列进行数据解读,主要包括节点序列分析、边序列分析以及结合节点和边序列的综合分析。节点序列分析涉及节点度分析(如入度、出度、度中心性)、节点属性分析(如品牌、价格等属性的分布与聚类)、节点标签分析(如不同标签的分布及标签间的关联)。边序列分析则关注边的权重分析(如关联强度)、边的类型分析(如管理、协作等关系)及路径分析(如最短路径计算)。结合节点和边序列的分析,如子图挖掘和图的动态分析,可以帮助深入理解图的结构和功能。例如,通过子图挖掘可以发现具有特定结构的子图,而图的动态分析则能揭示图随时间的变化趋势。这些分析方法结合使用,能够从多个角度全面解读图谱数据,为决策提供有力支持。
|
2月前
|
机器学习/深度学习 算法 Python
探索机器学习中的决策树算法:从理论到实践
【10月更文挑战第5天】本文旨在通过浅显易懂的语言,带领读者了解并实现一个基础的决策树模型。我们将从决策树的基本概念出发,逐步深入其构建过程,包括特征选择、树的生成与剪枝等关键技术点,并以一个简单的例子演示如何用Python代码实现一个决策树分类器。文章不仅注重理论阐述,更侧重于实际操作,以期帮助初学者快速入门并在真实数据上应用这一算法。
|
2月前
|
机器学习/深度学习 人工智能 Rust
MindSpore QuickStart——LSTM算法实践学习
MindSpore QuickStart——LSTM算法实践学习
45 2
|
2月前
|
机器学习/深度学习 算法 数据建模
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
33 0