B站推荐模型数据流的一致性架构

01 背景

推荐系统的模型,通过学习用户历史行为来达到个性化精准推荐的目的,因此模型训练依赖的样本数据,需要包括用户特征、服务端推荐的视频特征,以及用户在推荐视频上是否有一系列的消费行为。

推荐模型数据流,即为推荐模型提供带特征和优化目标的训练样本,包括两个模块,一是Label Join模块,负责用户行为的采集。二是feature extract模块,从原始日志中抽取特征,并基于用户行为计算模型优化的目标label。

在B站早期的推荐模型数据流架构中,如下图所示,采样两阶段特征补齐设计。Label Join模块除了完成用户行为的采集,还需要查询实时特征,补齐训练样本依赖的部分原始特征数据,一般是秒级更新的实时特征,存储在Redis中。而Feature Extract模块在计算样本之前,补齐另外一部分原始特征数据,一般是批量更新的特征数据,存储在KFC中(B站自研的KV系统)

图片

02 问题分析

上述的推荐模型数据流架构,存在“不一致”问题,包括“数据不一致”和“计算不一致”

2.1 数据不一致

在这种自反馈系统中,推理输入的特征版本和训练输入的特征版本,如果有差异的话,会影响模型的准确性。数据不一致有3个原因:

  • 访问时间差异。推理服务和Label Join/Feature Extract模块访问同一个特征的时间是不一样的。特别是秒级更新的实时特征,这种数据差异会被放的更大

  • 新稿件问题。在线推理服务有稿件服务可获取新稿件的特征。而离线没有这个服务,所以离线缺少新稿件的特征,导致新稿件的推荐不准确

  • 特征穿越问题。LabelJoin有N分钟的固定时间窗,所以Feature Extract在查询批量特征的时候,可能批量特征版本已经更新,查到的是最新版本特征,从而导致特征穿越。一般需要有经验的算法工程师,在离线批量特征更新上加上时间延迟,规避穿越问题。但这种规避可能会进一步加剧数据不一致

2.2 计算不一致

这里“计算”指的是从原始数据,生成特征的过程。特征可以用于在线推理和离线训练。特征计算有3个地方:

  • 在线推理,一个c++的服务。特征计算使用c++实现

  • Online Feature Extract,实时的样本计算,基于FLINK,特征计算使用java实现

  • Offline Feature Extract,离线样本回溯,基于Spark,特征计算使用python实现

此外这3个地方的数据格式也是不一样的,不是简单的语言之间的转换。需要用户开发3种特征计算逻辑,并且要很小心的对齐

03.  一致性架构

为了解决上述的“数据不一致”和“计算不一致”,我们将B站推荐模型数据流升级成一致性架构:

  • 数据一致性:将在线推理的原始特征现场snapshot,dump到近线。近线基于snapshot做Label Join和Feature Extract。因为在离线用的同一份数据,可保证数据完全一致

  • 计算一致性:特征计算逻辑算子化,基于tenforflow实现一个c++ lib。推理服务直接调用特征抽取lib,离线Feature Extract通过java JNI调用c++ lib。特征计算都基于同一个c++ lib,用户只需要定义一次,可保证计算完全一致

3.1 整体架构

-推荐服务,将推理的原始特征现场,打包成snapshot,通过数据集成工具,从在线服务同步到近线Kafka

-在近线,基于flink latency join功能,实现Label Join,为每条请求join用户在稿件上的各种行为label,e.g. 点击、播放、后验等

-Label Join任务输出Shitu,同时写到kafka和hive

-在近线,基于flink实现实时样本计算,消费kafka Shitu,产出训练样本,写到kafka,再接入实时训练。产出模型用于线上推理

-在离线,基于flink/spark实现的批量样本计算,从hive表load Shitu,产出样本写到hive。训练任务依赖hive表作批量的模型训练

图片

3.2 Label Join

Label Join,使用flink letency join(延时拼接)功能,完成每个请求稿件上的用户行为采集。用户行为作为训练样本的label,即模型的优化目标。

flink letency join基于时间驱动,以一个固定时间窗做数据下发。e.g.固定时间窗是N分钟,即每条请求数据到flink任务后,等待N分钟后输出数据

在最新的一致性数据流上,我们在Label Join上增加了事件驱动,增加数据下发的时效性,将数据流的时效性提升60%

  • 定义下发事件:原则上按用户不会再看到视频作下发规则。对用户连续请求,按时间排序。如果最新的请求是清屏请求,那这次请求前的所有请求都可以下发。如果是普通请求,那这次请求往前第5个请求可以下发

  • 采用事件驱动+时间驱动的数据下发方式,优先事件驱动下发,没有被事件触发的请求,走时间驱动,超时下发

图片

3.3 样本计算

样本计算是基于Label Join产出的Shitu数据,计算训练样本,分两种模式:

-online extract:实时的样本计算,flink streaming计算引擎,读kafka写kafka

-offline extract:离线的批量样本计算,支持flink batch/spark batch两种计算引擎。offline extract支持两种样本计算模式:1) 无新增特征的样本计算,直接读Shitu hive table产也训练样本。2) 有新增特征的样本计算,用户挖掘的新特征,不在Shitu里。训练样本依赖Shitu和新挖掘特征

目前一致性的样本计算框架支持两种模型:

(1)直接计算:一般用于精排模型。整个样本计算过程抽象成几个算子:

-selector:数据筛选。过滤请求或者稿件

-calculate label : 通过用户行为label,计算每个视频的train label

-刷内item采样:在一刷请求内,对稿件进行采样,e.g. 按正负例

-pyfe:调用fealib,生成模型特征

每个算子,都可以支持算法同学根据业务需求自定义

图片

(2)有外部采样的样本计算:一般在召回模型上使用

-calculate label : 通过用户行为label,计算每个视频的train label

-外接一个采样稿件候选池,根据稿件的train label,进行采样。采样逻辑按算法需求可定制

-从KFC查询采样稿件的特征,并组装一条完整的snapshot

-pyfe:调用fealib,生成模型特征

图片

3.4 BackFill

BackFill特征回填,指的是算法同学调研新特征在模型上的收益,流程如下:

  • 对于NoDelta模式,直接读Base Shitu,生成全量的训练样本

  • 对HasDelta模式,用户挖掘一批新增的特征(delta snapshot)

  • 基线Shitu join delta snapshot,生成一份新Shitu

  • 基于新Shitu,作全量的特征计算,生成全量训练样本

  • 模型训练样本并评估auc,效果不符合预期重新设计数据和特征

同时我们提供了一套python sdk,支持用户在镜像或者jupyter上自己订制特征回填特征的逻辑和流程

图片

3.5 基于protobuf wireformat的partial decode优化

对于在线推理现场snapshot,采用了protobuf组织数据,包含了模型特征需要所有原始数据,单条数据超过250KB,有上千个字段。在样本计算阶段,对snapshot有两个处理逻辑:

调用protobuf ParseFrom接口,将snapshot bytes 反序列化成Message,平均耗时7~8ms

将snapshot所有稿件类的特征做裁剪:一刷请求n个稿件,其中m个稿件参与训练,平均耗时5~6ms

通过性能分析,样本计算中有50%的时间消耗在上述snapshot protobuf解析和处理上。但实际样本计算相关逻辑上,并不需要所有snapshot字段,所以我们使用protobuf wireformat,对snapshot做partial decode,只解析需要的field。最终将snapshot处理的性能从14ms优化到1.5ms,样本计算的cpu资源降低了30%+

04 未来工作

4.1 基于Iceberg批流一体的训练样本计算框架

如3.1章节的数据流架构中,通过FLINK实时计算产出的训练样本,会同时写到Kafka和Hive表,分别用于实时训练和批量训练。同时离线回溯也可以产出训练样本写到Hive表。这种架构存在两个问题:

(1) 需要额外的FLINK资源,把Kafka中的样本备份到Hive表中,即一个实验样本流,需要搭建两个FLINK任务

(2) 实时样本和离线样本,输入输出的介质不同,框架层面需要适配。下游训练模块也需要适配不同的样本源,无法做到批流一体

未来我们计划引入iceberg实现样本计算框架的批流一体,解决上述问题。‌Apache Iceberg‌ 是一种用于大型分析表的高性能格式,旨在解决数据存储和计算引擎之间的适配问题,其核心特性之一是支持同时处理流数据和批数据,提供统一的读写接口

框架如下图所示:

  • Label Join产出数据,实时写到iceberg Shitu表

  • 样本计算框架,从iceberg Shitu读数据,可以实时计算或批量计算,产出数据写到iceberg样本表

  • 训练框架读iceberg样本表,可online training或者batch training

图片

4.2 基于Iceberg MOR的增量特征回填优化

如3.4节的BackFill功能,将全量Shitu和Delta Snapshot拼接之后,再进行样本计算。这个逻辑存在2个问题,一是Shitu数据量比较多,拼接效率低。二是每次都需要全量计算所有特征,性能开销大。当然可以做增量特征计算,在和基线样本拼接。但样本数据量比较大,Hive表拼接性能较差,在某些情况下,可能比全量计算特征慢。

为此我们计划在4.1工作基础上,利用iceberg的MOR技术,优化BackFill的性能:

  • 维护一份基线样本的iceberg表

  • 在基线样本iceberg表新建一个branch,增加新特征列

  • 基于Shitu和delta snapshot,只做增量特征计算,并将增量特征写到新特征列。这一步只计算增量特征,不需要join,可极大提升性能

  • 训练模块读样本表,利用Iceberg MOR的能力,读基线特征+增量特征,再merge成完整的特征列表,完成训练

-End-

作者丨lixiaowei、正鼎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/64320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】839、相似字符串组

【LeetCode】839、相似字符串组 文章目录 一、并查集1.1 并查集 二、多语言解法 一、并查集 1.1 并查集 求共有几组, 联想到并查集, 即并查集有几个集合 字符串相似: 相差0个字符, 或2个字符 其中所有字符串长度都相同, 是比较方便处理的 // go var sets int var father […

官宣!低空经济司,挂牌成立!

近日,国家发展改革委网站“机关司局”栏目悄然更新,一个新设立的部门——低空经济发展司(简称“低空司”)正式进入公众视野。低空司的成立,无疑是对当前国家经济发展形势的深刻把握和前瞻布局。 低空经济是以各类低空飞…

不安全物联网的轻量级加密:综述

Abstract 本文综述了针对物联网(IoT)的轻量级加密解决方案。这项综述全面覆盖了从轻量级加密方案到不同类型分组密码的比较等多个方面。同时,还对硬件与软件解决方案之间的比较进行了讨论,并分析了当前最受信赖且研究最深入的分组…

【小程序】全局数据共享

目录 全局数据共享 1. 什么是全局数据共享 2. 小程序中的全局数据共享方案 全局数据共享 - MobX 1. 安装 MobX 相关的包 2. 创建 MobX 的 Store 实例 3. 将 Store 中的成员绑定到页面中 4. 在页面上使用 Store 中的成员 ​5. 将 Store 中的成员绑定到组件中 6. 在组件中…

自动化测试- 自动化测试模型

目录 自动化测试模型简介 1、线性模型 举例 测试页面html文件 测试脚本 2. 关键字驱动测试(Keyword-Driven Testing) 需测试内容 关键字驱动测试框架 创建测试用例文件 运行测试 3. 数据驱动测试(Data-Driven Testing) …

【GlobalMapper精品教程】091:根据指定字段融合图斑(字段值相同融合到一起)

文章目录 一、加载数据二、符号化三、融合图斑1. 根据图斑位置进行融合2. 根据指定字段四、注意事项一、加载数据 订阅专栏后,从私信中查收配套实验数据包,找到data091.rar,解压并加载,如下图所示: 属性表如下: 二、符号化 为了便于比对不同的融合结果,查看属性表根据…

strace工具使用

下载地址: https://github.com/strace/strace/releases/tag/v6.12 解压后执行以下命令 ./configure --hostarm-linux --prefix/home/wei/Code/strace/strace-6.12/out CC/home/wei/Code/firmware/prebuilts/host/gcc/gcc-arm-10.2-2020.11-x86_64-arm-none-linux…

图像处理-Ch2-空间域的图像增强

Ch2 空间域的图像增强 文章目录 Ch2 空间域的图像增强Background灰度变换函数(Gray-level Transformation)对数变换(Logarithmic)幂律变换(Power-Law)分段线性变换函数(Piecewise-Linear)对比度拉伸(Contrast-Stretching)灰度级分层(Gray-level Slicing) 直方图处理(Histogram …

Linux | Ubuntu零基础安装学习cURL文件传输工具

目录 介绍 检查安装包 下载安装 手册 介绍 ‌cURL是一个利用URL语法在命令行下工作的文件传输工具,首次发行于1997年‌‌12。cURL支持多种协议,包括FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3…

cesium通过经纬度获取3dtiles 得feature信息

找到这里3dtiles的两种访问方式: 1.1 3DTileContent#getFeature 这里涉及3DTile 数据结构,暂不了解3DTile 数据结构,因此暂不使用。 1.2 scene.pick 本次使用 scene表示虚拟场景中所有 3D 图形对象和状态的容器;scene中…

内置ALC的前置放大器D2538A/D3308

一、概述 D2538A/D3308是芯谷科技推出的带有ALC(自动电平控制)的前置音频放大器芯片,最初产品为单声道/立体声收录机及盒式录音机而开发,作为录音/回放的磁头放大器使用;由于产品的高增益、低噪声及ALC外部可调的特性&…

基于SSM的“快递管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“快递管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 登陆页面 注册页面 快递员页面 派单员订单管理页面 派单员订单添…

frp(s) 内网穿透 Liunx环境双端Docker部署

FRP(Fast Reverse Proxy)是一款高性能的反向代理应用,主要用于内网穿透、负载均衡和反向代理等多种场景。它能够将内网中的服务暴露给公网,实现远程访问。此外,FRP还可以用于接收类似GitHub或第三方提供的Webhook请求。在微服务架构中,FRP可以作为服务调用的反向代理,提…

STM32F103RCT6学习之五:ADC

1.ADC基础 ADC(Analog-Digital Converter)模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁12位逐次逼近型ADC,1us转换时间 输入电压范围:0~3.3V&#xff…

实现类似gpt 打字效果

1. css的动画(animation) css中实现动画有两种方式:transition过渡动画、 animation自定义动画。 具体的可以看MDN链接:https://developer.mozilla.org/zh-CN/docs/Web/CSS/animation 使用keyframes自定义关键帧动画并未其命名使用自定义动…

微软远程桌面APP怎么用

微软远程桌面(Remote Desktop)客户端(RD Client)是一款由微软开发的应用程序,允许用户通过网络连接远程访问和控制另一台计算机。同时,微软远程桌面RD Client支持多种设备和操作系统,包括Window…

Unity3d UGUI如何优雅的实现Web框架(Vue/Rect)类似数据绑定功能(含源码)

前言 Unity3d的UGUI系统与Web前端开发中常见的数据绑定和属性绑定机制有所不同。UGUI是一个相对简单和基础的UI系统,并不内置像Web前端(例如 Vue.js或React中)那样的双向数据绑定或自动更新UI的机制。UGUI是一种比较传统的 UI 系统&#xff…

10分钟掌握项目管理核心工具:WBS、甘特图、关键路径法全解析

一、引言 在项目管理的广阔天地里,犹如一场精心编排的交响乐演奏,每个乐器、每个音符都需精准配合才能奏响美妙乐章。而 WBS(工作分解结构)、甘特图、关键路径法无疑是这场交响乐中的关键乐章,它们从不同维度为项目管…

代码思想之快慢路径

处理业务代码的过程中,对业务代码有了一些调整,后续发现这是一种代码思想 在一段复杂的逻辑里,我把查询redis操作写在了前面, 业务逻辑: 如果需要不打压就退出本次处理 查询redis拿到商品需要打压的次数 如果次数 …

纯 HTML+CSS+JS 实现一个炫酷的圣诞树动画特效

纯 HTMLCSSJS 实现一个炫酷的圣诞树动画特效 前言 圣诞节快到了,今天给大家带来一个简单但是效果不错的圣诞树动画特效。这个特效完全使用原生 HTML、CSS 和 JavaScript 实现,包含闪烁的星星、随机彩灯等元素,非常适合节日气氛!…