乐趣区

关于flink:京东搜索排序在线学习的-Flink-优化实践

本文由京东搜索算法架构团队分享,次要介绍 Apache Flink 在京东商品搜寻排序在线学习中的利用实际。文章的次要纲要如下:

1、背景

2、京东搜寻在线学习架构

3、实时样本生成

4、Flink Online Learning

5、监控零碎

6、布局总结

一、背景

在京东的商品搜寻排序中,常常会遇到搜寻后果多样性有余导致系统非最优解的问题。为了解决数据马太效应带来的模型商品排序多样性的有余,咱们利用基于二项式汤普森采样建模,然而该算法仍存在对所有用户采纳统一的策略,未无效思考用户和商品的个性化信息。基于该现状,咱们采取在线学习,使深度学习和汤普森采样交融,实现个性化多样性排序计划,实时更新模型的关参数。

在该计划中,Flink 次要利用于实时样本的生成和 online learning 的实现。在在线学习过程中,样本是模型训练的基石,在超大规模样本数据的解决上,咱们比照了 Flink、Storm 和 Spark Streaming 之后,最终抉择用 Flink 作为实时样本流数据的生产以及迭代 online learning 参数的框架。在线学习的整体链路特地长,波及在线端特色日志、流式特色解决、流式特色与用户行为标签关联、异样样本解决、模型动静参数实时训练与更新等环节,online learning 对样本解决和参数状态解决的准确性和稳定性要求较高,任何一个阶段都有可能呈现问题,为此咱们接入京东的 observer 体系,领有残缺的全链路监控零碎,保障各个阶段数据的稳定性和完整性;上面咱们首先介绍一下京东搜寻在线学习架构。

二、京东搜寻在线学习架构

京东搜寻的排序模型零碎架构次要包含以下几个局部:

1、Predictor 是模型预估服务,在 load 模型中分为 static 局部和 dynamic 局部,static 局部由离线数据训练失去,次要学习 user 和 doc 的浓密特色示意,dynamic 局部次要蕴含 doc 粒度的权重向量,这部分由实时的 online learning 工作实时更新。
2、Rank 次要包含一些排序策略,在排序最终后果确定之后,会实时落特色日志,将 doc 的特色按程序写入特色数据流,作为后续实时样本的数据源 (feature)。
3、Feature Collector 的工作是承接在线预估零碎收回的特色数据,对上游屏蔽缓存、去重、筛选等在线零碎特有逻辑,产出 Query+Doc 粒度的特色流。
4、Sample join 的工作将下面的 feature 数据、曝光、点击、加购、下单等用户行为标签数据作为数据源,通过 Flink 的 union + timer 数据模型关联成为合乎业务要求的样本数据,算法可依据指标需要抉择不同的标签作为正负样本标记。
5、Online learning  工作负责生产上游生成的实时样本做训练,负责更新 model 的 dynamic 局部。

三、实时样本生成

Online Learning 对于在线样本生成的时效性和准确性都有很高的要求,同时也对作业的稳定性有很高的要求。在海量用户日志数据实时涌入的状况下,咱们不仅要保障作业的数据延时低、样本关联率高且工作稳固,而且作业的吞吐不受影响、资源使用率达到最高。

京东搜寻排序在线样本的次要流程如下:

1、数据源大抵有曝光流、feature 流和用户行为流等作为实时样本的数据源,对立以 JDQ 管道流的模式,由京东实时计算平台提供平台撑持。
2、接到 feature 流和曝光流、label 流后,进行数据荡涤,失去工作须要的数据格式。
3、拿到各个规范流后,对各个流进行 union 操作,之后进行 keyby。
4、咱们在 process function 外面增加 Flink timer 定时器,作为样本生成的实时窗口。
5、将生成的样本实时落入 jdq 和 HDFS,jdq 能够用作前面的 online learning 的 input,HDFS 长久存储样本数据,用于离线训练、增量学习和数据分析。

在线样本工作优化实际:

京东搜寻样本数据吞吐量每秒达到 GB 规模,对分布式解决分片、超大状态和异样解决提出很高的优化要求。

1、数据歪斜

应用 keyby 的时候,难免会有数据歪斜的状况,这里咱们假如 key 设计正当、shuffle 形式抉择正确、工作没有反压且资源足够应用,因为工作 parallelism 设置导致的数据歪斜的状况。咱们先看 Flink 外面 key 是如何被散发到 subtask 下面的。

keygroup = assignToKeyGroup(key, maxParallelism)
subtaskNum = computeOperatorIndexForKeyGroup(maxParallelism, parallelism, keyGroupId)

假如咱们的并发设置的是 300,那么 maxParallelism 就是 512,如此设计,必然导致有的 subtask 散布 1 个 keygroup 有的调配两个,同时也导致了数据天然歪斜。针对上述问题,有两个解决方案:

● 设置并行度为 2 的 n 次方;
● 设置最大并行度为 并行度的 n 倍。

如果应用计划 1,调整并发的话只能调整 2 的幂次,倡议应用计划 2,且如果 parallelism 为 300,maxParallelism 设置为 1200 的状况下如果数据还是有歪斜,能够再相应的把 maxParallelism 设置大一些保障每个 keygroup 的 key 少一些,如此也能够升高数据歪斜的产生。

2、large checkpoint

在线样本用到了 Flink 的 state,咱们之前默认将 state 放到了内存外面,然而随着放量的减少,state 数据量激增,发现 GC 工夫特地长,之后扭转策略,将 state 放入了 RocksDB,GC 问题得以解决。咱们针对 checkpoint 做了如下配置:

● 开启增量 checkpoint;
● 正当设置 checkpoint 的超时工夫、间隔时间和最小暂停工夫。

● 让 Flink 本人治理 RocksDB 占用的内存,对 RocksDB 的 blockcache、writebuffer 等进行调优。
● 优化 state 的数据应用,将 state 数据放入多个 state object 外面应用,升高序列化 / 反序列化的代价。

在工作调优的时候咱们发现咱们的工作拜访 RocksDB 的工夫十分长,查看 jstack 发现,很多线程都在期待数据的序列化和反序列化,随着算法特色的逐步增多,样本中的特色个数超过 500 个,使得每条数据的量级越来越大。然而在做样本关联的时候其实是不须要特色关联的,只须要相应的主键关联就能够了,因而,咱们用 ValueState 存储主键,用 MapState/ListState 存储特色等值。当然了还能够将这些特征值存储到内部存储外面,这里就须要对网络 io 和 本地 io 之间的抉择做一个取舍。

● failure recovery 的时候开启本地复原。

因为咱们的 checkpoint 数据达到了 TB 级别,一旦工作产生 failover,不论是针对 HDFS 还是针对工作自身,压力都十分大,因而,咱们优先应用本地进行 recovery,这样,不仅能够升高 HDFS 的压力还能够减少 recovery 的速度。

四、Flink Online Learning

对于 online learning,咱们先介绍一下伯努利汤普森采样算法,假如每个商品的 reward 概率遵从 Beta 散布,因而给每个商品保护两个参数胜利次数 si 及失败次数 fi,及所有商品的公共先验参数胜利次数 α 和失败次数 β。

每次依据商品相应的 Beta 散布采样为最优商品的冀望 reward: Q(at) = θi,并抉择冀望 reward 最大的商品展示给用户。最初依据环境给出实在 reward,更新模型相应的参数达到 online learning 的成果。该参数代表一个商品特色,用一个 n 维向量示意,该向量由原始特色通过 MLP 网络预测失去。原始特色通过 DNN 网络失去一个 N 维向量作为该商品的个性化表征,采纳 Logistic Regression 函数建模似然函数,利用 Flink 构建该表征和实时反馈所组成的实时样本,用于一直迭代近似更新参数散布。

1、数据有序性保障

从 jdq 接过实时样本之后,因为之前并没有保证数据的有序性,这里采纳 watermark 机制保证数据的有序性。

2、样本数据处理

把只曝光无行为的商品看做负样本,有点击及后续行为的商品看做正样本,当窗口将达到肯定正负比例或数据量时进行一次 batch 训练,迭代出新的参数向量,将商品 embedding 数据放到 Flink 的 state 外面,之后作为 model 的 dynamic 局部更新参数。

3、同步迭代、异步迭代

个性化 ee 参数在线学习采纳异步更新形式的时候,存在参数更新程序错乱问题,这会升高在线学习模型收敛速度,从而造成了流量的节约,因而,参数异步更新形式更改为同步更新形式,防止参数读写错乱问题。在同步更新的形式下,存储在 status 中的参数向量须要在下一次训练迭代时应用,若参数产生失落会使该商品的迭代过程中断,为避免零碎危险造成参数失落,设计了参数双重保障。个别的工作异样或重启后参数可从 checkpoint 或 savepoint 中复原,如果意外状况下参数无奈复原,从近程在线服务中取回上一版参数并记录到 state。

4、多试验版本反对

在线学习工作应用同一个 Flink 工作来反对多个版本模型在不同试验桶下进行 AB 试验,通过版本号辨别不同的 AB 流量桶,对应的实时样本以 docid+version 作为 key 进行解决,迭代过程互不影响。

5、custom serialization

为了进步带宽利用率以及性能的需要,咱们外部采纳 pb 格局传输数据,通过调研,pb 的传输格局优于 Flink 的兜底的 general class 的 kryo 序列化形式,因而咱们采纳了 Flink 的 custom serialization 解决方案,间接用 pb 格局在 op 之间传输数据。

五、监控零碎

这里咱们辨别业务全链路监控和工作稳定性相干监控,具体情况上面将具体介绍。

1、全链路监控

整个零碎应用京东外部的 observer 平台来实现业务全链路监控,次要包含 predictor 服务相干的监控、feature dump 的 QPS 监控、特色和标签品质监控、关联状况监控、train 相干的监控以及 AB 指标相干的一些监控,如下:

2、工作稳定性监控

工作稳定性监控这里次要是指 Flink 的工作稳定性监控,链路吞吐量达 GB/ s 规模,特色音讯 QPS 达 10W 规模,且 online learning 的不可间断性,不论对于在线样本工作还是 online learning 的工作,相干监控报警都是必不可少的。

■ 容器的内存、cpu 监控、thread 个数,gc 监控

■ 样本相干业务监控

六、布局总结

Flink 在实时数据处理方面有优良的性能、容灾、吞吐等体现、算子丰盛易上手应用、天然反对批流一体化,且目前已有在线学习的框架开源,做在线学习是个不二的抉择,随着机器学习数据规模的扩充和对数据时效性、模型时效性要求的晋升,在线学习不仅仅作为离线模型训练的补充,更成为模型零碎效率倒退的趋势。为此咱们做的布局如下:

作者致谢:感激实时计算研发部、搜寻排序算法团队的反对。

退出移动版