汇量科技在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月前
|
机器学习/深度学习 人工智能 搜索推荐
从零构建短视频推荐系统:双塔算法架构解析与代码实现
短视频推荐看似“读心”,实则依赖双塔推荐系统:用户塔与物品塔分别将行为与内容编码为向量,通过相似度匹配实现精准推送。本文解析其架构原理、技术实现与工程挑战,揭秘抖音等平台如何用AI抓住你的注意力。
616 7
从零构建短视频推荐系统:双塔算法架构解析与代码实现
机器学习/深度学习 算法 自动驾驶
508 0
|
2月前
|
算法 API 数据安全/隐私保护
深度解析京东图片搜索API:从图像识别到商品匹配的算法实践
京东图片搜索API基于图像识别技术,支持通过上传图片或图片URL搜索相似商品,提供智能匹配、结果筛选、分页查询等功能。适用于比价、竞品分析、推荐系统等场景。支持Python等开发语言,提供详细请求示例与文档。
|
2月前
|
机器学习/深度学习 算法 搜索推荐
从零开始构建图注意力网络:GAT算法原理与数值实现详解
本文详细解析了图注意力网络(GAT)的算法原理和实现过程。GAT通过引入注意力机制解决了图卷积网络(GCN)中所有邻居节点贡献相等的局限性,让模型能够自动学习不同邻居的重要性权重。
461 0
从零开始构建图注意力网络:GAT算法原理与数值实现详解
|
4月前
|
存储 监控 算法
企业上网监控场景下布隆过滤器的 Java 算法构建及其性能优化研究
布隆过滤器是一种高效的数据结构,广泛应用于企业上网监控系统中,用于快速判断员工访问的网址是否为违规站点。相比传统哈希表,它具有更低的内存占用和更快的查询速度,支持实时拦截、动态更新和资源压缩,有效提升系统性能并降低成本。
175 0
|
5月前
|
监控 算法 安全
公司电脑监控软件关键技术探析:C# 环形缓冲区算法的理论与实践
环形缓冲区(Ring Buffer)是企业信息安全管理中电脑监控系统设计的核心数据结构,适用于高并发、高速率与短时有效的多源异构数据处理场景。其通过固定大小的连续内存空间实现闭环存储,具备内存优化、操作高效、数据时效管理和并发支持等优势。文章以C#语言为例,展示了线程安全的环形缓冲区实现,并结合URL访问记录监控应用场景,分析了其在流量削峰、关键数据保护和高性能处理中的适配性。该结构在日志捕获和事件缓冲中表现出色,对提升监控系统效能具有重要价值。
162 1
|
5月前
|
存储 机器学习/深度学习 监控
公司电脑上网监控中滑动窗口算法的理论构建与工程实现
本文提出一种基于滑动窗口算法的实时网络流量监控框架,旨在强化企业信息安全防护体系。系统采用分层架构设计,包含数据采集、处理与分析决策三大模块,通过 Java 实现核心功能。利用滑动窗口技术动态分析流量模式,结合阈值检测与机器学习模型识别异常行为。实验表明,该方案在保证高检测准确率的同时支持大规模并发处理,为企业数字化转型提供可靠保障。
144 0
|
6月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
182 17
|
6月前
|
存储 算法 安全
如何控制上网行为——基于 C# 实现布隆过滤器算法的上网行为管控策略研究与实践解析
在数字化办公生态系统中,企业对员工网络行为的精细化管理已成为保障网络安全、提升组织效能的核心命题。如何在有效防范恶意网站访问、数据泄露风险的同时,避免过度管控对正常业务运作的负面影响,构成了企业网络安全领域的重要研究方向。在此背景下,数据结构与算法作为底层技术支撑,其重要性愈发凸显。本文将以布隆过滤器算法为研究对象,基于 C# 编程语言开展理论分析与工程实践,系统探讨该算法在企业上网行为管理中的应用范式。
192 8
|
6月前
|
存储 监控 算法
基于 C# 时间轮算法的控制局域网上网时间与实践应用
在数字化办公与教育环境中,局域网作为内部网络通信的核心基础设施,其精细化管理水平直接影响网络资源的合理配置与使用效能。对局域网用户上网时间的有效管控,已成为企业、教育机构等组织的重要管理需求。这一需求不仅旨在提升员工工作效率、规范学生网络使用行为,更是优化网络带宽资源分配的关键举措。时间轮算法作为一种经典的定时任务管理机制,在局域网用户上网时间管控场景中展现出显著的技术优势。本文将系统阐述时间轮算法的核心原理,并基于 C# 编程语言提供具体实现方案,以期深入剖析该算法在局域网管理中的应用逻辑与实践价值。
173 5