在大规模推荐系统中整合 ML 模型的经验教训

一、说明

        在这篇博文中,我们分享了将 Netflix 大规模搜索和推荐系统的多个相关机器学习模型整合到一个统一模型中的系统设计经验。给定不同的推荐用例,许多推荐系统将每个用例视为单独的机器学习任务,并为每个任务训练定制的 ML 模型。相比之下,我们的方法从单个多任务机器学习模型中为多个用例生成建议。这不仅提高了模型性能,还简化了系统架构,从而提高了可维护性。此外,为搜索和建议构建通用的可扩展框架使我们能够更快地为新用例构建系统。我们描述了为实现这种整合所做的权衡,以及我们学到的可以普遍应用的经验教训。

二、背景

图 1:典型推荐系统中的多个用例

        在电子商务、流媒体服务和社交媒体等大型现实世界推荐系统应用程序中,训练多个机器学习模型以优化系统不同部分的项目推荐。不同的用例有单独的模型,如通知(用户到项目的建议)、相关项目(基于项目到项目的建议)、搜索(查询到项目建议)和类别探索(类别到项目的建议)(图 1)。然而,这可能会迅速导致系统管理开销和维护大量专用模型的隐性技术债务(Sculley et al., 2015)。这种复杂性会导致长期成本增加,并降低 ML 系统的可靠性和有效性(Ehsan & Basillico,2022 年)。

图 2 显示了这种具有模型扩散的 ML 系统的外观。通知、相关项、搜索和类别探索等不同用例具有不同的 UI 画布,用户可以在其中与之交互。针对这些不同用例的 ML 系统通常会演变为具有多个离线管道,这些管道具有类似的步骤,例如标签生成、特征化和模型训练。在在线端,不同的模型可能托管在不同的服务中,具有不同的推理 API。但是,离线管道和在线基础结构中都存在许多共性,这种设计没有利用这些共性。

图 2:ML 系统中的模型扩散

        在这篇博客中,我们描述了我们利用这些任务的共性来整合这些模型的离线和在线堆栈的努力。这种方法不仅减少了技术债务,而且通过利用从一个任务中获得的知识来改进另一个相关任务,从而提高了模型的有效性。此外,我们注意到在跨多个推荐任务有效实施创新更新方面的优势。

        图 3 显示了整合的系统设计。在特定于用例的标签准备的初始步骤之后,我们统一了离线管道的其余部分并训练了单个多任务模型。在在线端,灵活的推理管道根据延迟、数据新鲜度和其他需求在不同环境中托管模型,并且模型通过统一的画布无关 API 公开。

图 3:整合的 ML 系统

三、离线设计

        在脱机模型训练管道中,每个建议任务都映射到需要显示建议的请求上下文。请求上下文架构因特定任务而异。例如,对于查询到项目建议,请求上下文将由查询、国家/地区和语言等元素组成。另一方面,对于逐项建议,请求上下文还将包括源项目和国家信息。请求上下文架构的组合是量身定制的,以适应每个建议任务的要求。

脱机管道从以下阶段记录的交互数据训练模型:

标签准备: 清理记录的交互数据并生成(request_context,标签)对。

特征提取:为上述生成的(request_context,标签)元组生成特征向量。

模型训练:基于(feature_vector,标签)行训练模型。

模型评估:使用适当的评估指标评估训练模型的性能。

部署: 使模型可用于在线投放。

        对于模型整合,我们将统一请求上下文设置为跨任务的所有上下文元素的联合。对于特定任务,缺少或不必要的上下文值将替换为 sentinel(默认)值。我们引入了一个task_type分类变量作为统一请求上下文的一部分,以通知目标推荐任务的模型。

        在标签准备中,来自每个画布的数据都会使用统一的请求上下文架构进行清理、分析和存储。然后将来自不同画布的标签数据与适当的分层合并在一起,以获得统一的标记数据集。在特征提取中,并非所有特征都包含某些任务的值,并使用适当的默认值填充。

四、在线设计

        大规模提供单个 ML 模型会带来某些独特的在线 MLOps 挑战(Kreuzberger 等人,2022 年)。每个用例在以下方面可能有不同的要求:

  • 延迟和吞吐量: 不同的服务级别协议 (SLA),以保证延迟和吞吐量目标,以提供最佳的最终用户体验。
  • 可用性: 模型服务正常运行时间的不同保证,无需诉诸回退。
  • 候选集:不同类型的项目(例如视频、游戏、人物等),可以根据特定于用例的业务需求进一步策划。
  • 预算: 模型推理成本的不同预算目标。
  • 业务逻辑: 不同的预处理和后处理逻辑。

        从历史上看,特定于用例的模型会进行调整以满足独特的要求。核心在线 MLOps 挑战是支持各种用例,而不会在模型性能方面倒退到最低公分母。

我们通过以下方式应对这一挑战:

  • 根据用例在不同的系统环境中部署相同的模型。每个环境都有“旋钮”来调整模型推理的特征,包括模型延迟、模型数据新鲜度和缓存策略以及模型执行并行性。
  • 公开用于消费系统的通用、与用例无关的 API。为了实现这种灵活性,API 支持异构上下文输入(用户、视频、流派等)、异构候选选择(用户、视频、流派等)、超时配置和回退配置。

五、吸取的教训

        将ML模型合并为单个模型可以被认为是软件重构的一种形式(Cinnéide等人,2016)。与软件重构类似,其中相关代码模块被重组和整合以消除冗余并提高可维护性,模型整合可以被认为是将不同的预测任务组合到单个模型中,并利用共享的知识和表示。这样做有几个好处。

5.1 减少代码和部署占用空间

        支持新的 ML 模型需要在代码、数据和计算资源方面进行大量投资。设置训练管道以生成标签、功能、训练模型和管理部署非常复杂。维护此类管道需要不断升级底层软件框架并推出错误修复。模型整合是降低此类成本的重要杠杆。

5.2 提高可维护性

        生产系统必须具有高可用性:必须快速检测和解决任何问题。ML 团队通常有随叫随到的轮换,以确保运营的连续性。单一的统一代码库使待命工作更轻松。好处包括几乎没有上下文切换,工作流的同质性,更少的故障点和更少的代码行。

5.3 将模型改进快速应用于多个画布

        使用多任务模型构建整合的 ML 系统使我们能够将一个用例中的改进快速应用于其他用例。例如,如果针对特定用例尝试某个功能,则通用管道允许我们在其他用例中尝试该功能,而无需额外的管道工作。对于其他用例,需要权衡潜在的回归,因为为一个用例引入了功能。但是,在实践中,如果合并模型中的不同用例足够相关,则这不是问题。

5.4 更好的可扩展性

        将多个用例整合到一个模型中需要灵活的设计,并在合并多个用例时要额外考虑。因此,这种基本的可扩展性使系统经得起未来的考验。例如,我们最初设计模型训练基础设施来整合一些用例。然而,事实证明,整合这些多个用例所需的灵活设计对于在同一基础设施上载入新模型训练用例是有效的。特别是,我们包含可变请求上下文模式的方法简化了使用相同的基础设施为新用例训练模型的过程。

六、结语

尽管 ML 系统整合不是灵丹妙药,可能并非适用于所有情况,但我们相信,在许多情况下,这种整合可以简化代码,允许更快的创新并提高系统的可维护性。我们的经验表明,合并对相似目标进行排名的模型会带来许多好处,但目前尚不清楚对目标进行排名完全不同且具有非常不同的输入特征的模型是否会从这种合并中受益。在未来的工作中,我们计划为何时最适合ML模型整合建立更具体的指导方针。最后,NLP 和建议的大型基础模型可能会对 ML 系统设计产生重大影响,并可能导致系统级别的更多整合。

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

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

相关文章

python进阶之图像编程 pillow扩展库

一、概述 1.1pillow简介 Python Imaging Library (PIL)是python 下的图像处理模块,支持多种格式,并提供强大的图像处理功能,可以通过pip进行安装后使用。 1.2pillow具体应用 Pillow 库是 Python3 最常用的图像处理库,它支持多种图像格式&a…

npm script命令

1 串行/并行执行命令 //串行 npm-run-all text test npm run text && npm run test //并行改成& npm-run-all --parallel text test npm run text & npm run test2 传递参数 {"lint": "eslint js/*.js","lint:fix"&#xff1a…

VBA Excel自定义函数的使用 简单的语法

一个简单的教程,实现VBA自定义函数。 新建模块 复制后面的代码放进来 函数的入口参数不定义,则认为是一块区域; 反之,如FindChar1 As String,则认为是输入的单值。 循环和分支如下例子,VB比较接近自然语…

第9章 【C语言】用户自己建立数据类型

9.1 定义和使用结构体变量 9.1.1 自己建立结构体类型 变量大多数是互相独立的、无内在联系的。C语言允许用户建立由不同类型数据组成的组合型的数据结构,它称为结构体。 在程序中可以自己建立一个结构体类型: struct Student{int num; //学号为整…

IDEA 配置注释模板

目录 一、配置类模板注释 二、配置方法注释 一、配置类模板注释 打开IDEA,打开settings(快捷键:Ctrl Alt s),选择Editor,找到File and Code Templates,设置需要配置注释的文件类型,如下图所示&#xf…

Git版本管理(04) git中常见问题整理

1 git pull 和git fetch之间的差别 git pull和git fetch都是用于从远程仓库获取更新的Git命令,它们之间的主要差别如下: git fetch:git fetch命令将从远程仓库下载最新的提交和分支信息,但不会自动合并或更新本地分支。执行git …

rust学习-引用C库

link和extern #[link(name = "...")] 是一个用于链接外部库的属性宏。 可以在 Rust 代码中引入其他语言编写的动态链接库(.so、.dll 等文件),从而实现 Rust 和其他语言的互操作。 #[link(name = "...")] 属性宏用于在 Rust 模块中引入标准 C 库(如 m…

入门超值型32位单片机MM32G0001开发板

灵动微入门级超值型MM32G0001系列MCU。采用48MHz ArmCortex-M0内核,提供16KB Flash和2KB SRAM,并提供丰富的外设资源。适用于多种多样的入门级32位MCU市场,可覆盖广泛的8/16位MCU升级需求。MM32G0001在各种温度范围内的闪存擦写寿命与数据保存…

服务器自动备份、打包、传输脚本

备份脚本 #!/bin/bash #author cheng #备份服务器自动打包归档每天的备份文件 Path/backhistory Host$(hostname) Date$(date %F) Dest${Host}_${Date}#创建目录 mkdir -p ${Path}/${Dest}#打包文件到目录 cd / && \#结合autoback.sh脚本,它往那个地方备&a…

MySQL执行更新的流程

一、加载缓存数据 引擎要执行更新语句的时候 ,比如对“id10”这一行数据,他其实会先将“id10”这一行数据看看是否在缓冲池里,如果不在的话,那么会直接从磁盘里加载到缓冲池里来,而且接着还会对这行记录加独占锁。 二…

MySQL数据库初体验

目录 一、数据库的基本概念 二、主流的数据库介绍 三、关系数据库与非关系数据库 1.关系数据库 一、数据库的基本概念 数据:描述事物的符号记录,包括数字、文字、图形、声音、档案记录等。以“记录的”形式按统一的格式进行存储 表:行(…

springboot中关于继承WebMvcConfigurationSupport后自定义的全局Jackson失效解决方法,localdate返回数组问题

一般情况下我们在config里增加jackson的全局配置文件就能满足基本的序列化需求,比如前后端传参的问题。 Configuration public class JacksonConfig {public static final String LOCAL_TIME_PATTERN "HH:mm:ss";public static final String LOCAL_DATE…

js判断类型:typeof Object.prototype.toString instanceof constructor有什么区别?一文讲清楚

相信很多小伙伴在使用js的过程中,经常会需要对js的数据类型进行判断,而js中可以对数据类型进行判断的方法有很多种,最常见的有typeof、Object.prototype.toString、instanceof、constructor这四种,那么他们有什么区别呢&#xff1…

软件测试之可靠性测试

CNAS标识 软件可靠性测试主要目的是通过在有使用代表性的环境中执行软件,以证实软件需求是否正确实现,为进行软件可靠性估计采集准确的数据,并找出所有对软件可靠性影响较大的错误。可靠性测试的特点是不同于硬件可靠性测试,主要…

最新Nmap入门技术

点击星标,即时接收最新推文 本文选自《web安全攻防渗透测试实战指南(第2版)》 点击图片五折购书 Nmap详解 Nmap(Network Mapper,网络映射器)是一款开放源代码的网络探测和安全审核工具。它被设计用来快速扫…

KUKA机器人零点标定的具体方法

KUKA机器人零点标定的具体方法 在进行机器人校正时,先将各轴置于一个定义好的机械位置,即所谓的机械零点。这个机械零点位置表明了同轴的驱动角度之间的对应关系,它用一个测量刻槽表示。 为了精确地确定机器人某根轴的机械零点位置,一般应先找到其预校正位置,然后去掉测量…

64位ATT汇编语言调用自己编写的两个数相加函数,使用printf输出,发现报错Segmentation fault

cat /etc/redhat-release看到操作系统是CentOS Linux release 7.6.1810,uname -r看到内核版本是3.10.0-957.el7.x86_64,gcc --version可以看到gcc版本是12.2.0,gdb --version可以看到gdb版本是12.1。 twoNumberPlus.s里边的内容如下&#x…

芯科科技宣布推出下一代暨第三代无线开发平台,打造更智能、更高效的物联网

第三代平台中的人工智能/机器学习引擎可将性能提升100倍以上 Simplicity Studio 6软件开发工具包通过新的开发环境将开发人员带向第三代平台 中国,北京 - 2023年8月22日 – 致力于以安全、智能无线连接技术,建立更互联世界的全球领导厂商Silicon Labs&…

【Unity 工程化】unity一些资源路径用途

Resources Resources 目录用于存放可以通过 Unity 的 Resources.Load 函数进行加载的资源。这些资源会在构建时被打包为一个单独的资源包,因此它们必须满足一些 Unity 所要求的命名和文件夹结构规则。由于这些资源被打包在一起,因此在构建后的游戏中可以…

提速换挡 | 至真科技用技术打破业务壁垒,助力出海破局增长

各个行业都在谈出海,但真正成功的又有多少? 李宁出海十年海外业务收入占比仅有1.3%,走出去战略基本失败。 京东出海业务磕磕绊绊,九年过去国际化业务至今在财报上都不配拥有姓名。 几百万砸出去买量,一点水花都没有…