网易云音乐算法平台研发专家黄彬:网易云音乐在线预估系统的实践与思考人工智能

现将演讲内容整理如下,希望对诸君有所启发。

首先,我们来看一下整个预估系统的一个架构,如下图所示:

系统整体架构

中间的PredictServer,是预估系统的核心组件,包括查询组件、特征处理组件,和模型计算组件。左侧的监控系统用于线网服务的监控,确保系统网络的畅通。右侧的PushServer用于模型推送,把最新的模型推送进线上预估系统进行预测。

目标是建设一套高性能、易用,且功能丰富的一个预估系统。

如何提升计算性能?我们常见的计算性能问题有哪些,我从三个方面进行阐述。

在通用方案里,我们的特征计算和模型计算是分进程部署的,这样就会导致有大量的特征存在跨服务、跨语言的传递,会带来多次编解码和内存拷贝,导致会存在比较大的性能开销。

我们知道在模型更新时,会有大块类型的申请和释放。然而在一些通用方案里,它不会自带模型预热的方案,这样就会导致模型更新的过程中有比较高的耗时抖动,无法支持模型的实时化更新。

一般的框架使用的是同步机制,并发度不够,CPU利用率比较低,无法满足高并发的计算需求。

那么,我们在预估系统里面是如何解决这些性能瓶颈呢?

我们为什么要做这样一个事情呢?因为在传统方案里,我们都知道特征处理和模型计算分进程部署,这样就会带来比较多的特定的跨网络传输,序列化、反序化,还有频繁的内存申请和释放。尤其是在推荐场景的特征量特别大时,这样就会带来比较明显的性能开销。下图中,靠上方的流程图就展示了通用方案里具体的情况。

无缝集成计器学习库

为了解决上述问题,我们就在预估系统里面将高性能计算学习框架集成到预估系统内部,这样的好处就是我们能够确保特征处理和模型计算能够同进程部署,能够以指针的形式去实现对特征的操作,避免序列化、反序列化以及网络传输的开销,从而在特征计算以及特征处理这一块带来比较好的计算性能提升,这就是无缝集成机器学习带来的好处。

首先,整个系统采用全异步的架构设计。异步架构带来的好处就是外部调用是无堵塞等待的,所以异步机制可以确保在CPU高负载的情况下,例如在60%到70%的情况下,依旧保持线网服务的耗时稳定性。

其次,访存优化。访存优化主要是基于服务器的NUMA架构,我们采用了绑核运行的方式。通过这种方式能够去解决之前NUMA架构存在的远端内存访问的问题,从而提升了我们服务的计算性能。

第三,并行计算。我们对计算任务进行分片的处理,采用多线程并发的方式做计算,这样就能够较大程度降低服务的时耗,提升资源的利用率。

架构设计考量

以上就是我们在预估系统的系统架构考量上的实践。

多级缓存,主要应用在特征查询阶段和初级阶段。我们封装的缓存机制,一方面能够降低查询的外部调用,另一方面也能够减少特征抽取导致反复无效的计算。

通过缓存的方式,可以极大程度的提升查询和抽取的效率。尤其在查询阶段,我们根据特征的重要程度以及根据特征的量级,我们封装了多种组件,例如同步查询、异步查询以及特征批量导入等组件。

第一种是同步查询,主要适用于一些比较重要的特征,当然同步查询的性能没有那么高效。

第二种是异步查询,主要针对一些“艾特维度”的特征,这些特征有可能重要程度不是那么高,那么就可以采用这种异步查询的方式。

第三种是特征批量导入,主要适用于特征规模不是特别大的特征数据。我们将这些特征批量导入到进程内部,就可以实现特征的本地化查询,性能是非常高效的。

多级缓存

介绍完缓存机制之后,我们来看一下模型计算的行为优化。模型计算,我们主要从模型输入优化、模型加载优化以及内核优化,这三个方面进行优化。

在模型输入这一块,大家都知道TFServering采用的是Example的输入。Example输入会存在Example的构造、Example的序列化反序化以及模型内部调用ParseExample的情况,这样就会存在比较明显的耗时。

在下图中,我们看【优化前】的截图展示了模型计算优化前的数据统计情况。我们可以看到,有一个比较长的ParseExample解析耗时,并且在ParseExample解析完之前,其他op是没有办法执行并行调度的。为了解决模型树的性能问题,我们在预估系统里封装了高性能的模型输入方案。通过新的方案,我们能够实现特征输入零拷贝,从而减少这种Example的构造耗时以及解析耗时。

在下图中,我们看【优化后】的截图展示了模型计算优化之后的数据统计情况,我们可以看到,已经没有了ParseExample解析耗时,就只剩下Example的解析耗时。

模型计算优化

介绍完模型输入优化,我们来看一下模型加载的优化。Tensorflow的模型加载是懒加载的模式,模型加载到内部之后,它并不会进行模型预热,而是要等到线网正式请求来了之后才会进行模型预热,这样就会导致模型加载之后会有比较严重的耗时抖动。

为了解决这个问题,我们在预估系统内部实现了自动的模型预热功能,并且实现了新旧模型的热切换,还实现了旧模型的异步卸载和内存释放。这样通过这些模型加载的一些优化手段,实现模型的分钟级更新能力。

接下来,我们看一下模型内核的优化。目前我们主要是对Tensorflow内核做了一些内核同步优化,以及我们会根据模型去调整op间和op内的一些线程池等等。

以上就是我们在模型计算方面的一些性能优化的尝试。

通过介绍上面的性能优化方案之后,我们来看一下最终的性能优化成果。

性能优化成果

这里我们使用预估系统和通用方案的系统做了一个对比。我们可以看到预估系统在CPU使用达到80%的情况下,整个服务的计算耗时以及超时率都非常稳定,非常低。通过对比,我们可以得出新方案(预估系统)在计算处理这一块,性能是有提升两倍,对CPU的榨取能力更强,服务耗时更低。

得益于我们对系统的优化,我们可以为业务算法提供更多模型的复杂度计算以及更多候选集的计算。

上图中举了一个例子,候选集从之前的300个候选集扩充到1000个候选集,同时我们增加了模型计算复杂度以及使用了一些比较复杂的特征,分别在多个业务里带来了比较好的效果提升。

以上就是预估系统在性能优化上以及性能优化成果的介绍。

系统采用分层的架构设计。我们将整个预估系统分成三层,分为底层架构层、中间模板层和上层结构层。

底层架构层主要提供异步机制、任务队列、并发调度、网络通信等。

上层接口层主要提供Highlevel的接口,业务仅需实现此层接口,大量减少代码开发。

如下图所示,我们通过少量的几行配置,就能够实现复杂的一个查询逻辑。同时,通过查询封装提升了查询的效率。

特征计算可以说是整个预估系统里面,代码开发复杂度最高的一个模块,那么什么是特征计算呢?

特征计算包括离线过程和在线过程。离线过程其实就是离线样本,通过处理得到离线训练平台需要的一些格式,例如TFRecocd的格式。在线过程,主要是对在线的请求做一些特征计算,通过处理得到在线预测平台需要的一些格式。离线过程和在线过程,其实对特征处理的计算逻辑是完全一样的。但是因为离线过程和在线过程的计算平台不一样,使用的语言不一样,就需要开发多套代码来实现特征计算,所以存在以下三个问题。

一致性难以保证的根本原因是离线训练和在线预测对特征处理逻辑难以统一。一方面会影响到算法的效果,另外一方面会导致在开发过程中带来比较高昂的一次性校验成本。

如果要新加一个特征,就需要涉及到离线过程和在线过程的多套代码的开发,导致开发效率非常的低。

复用难,主要原因是框架缺乏对复用能力的支持,导致不同业务之间想要做到特征计算的复用,变得非常难。

以上就是特征计算框架存在的一些问题。

为了解决这些问题,我们将按照如下四点思路来逐步解决。

首先,我们提出算子的概念,将特征计算抽象成算子的封装。其次,算子封装之后,我们建立一个算子库,通过算子库能够提供业务之间算子的复用能力。然后,我们基于算子,定义特征计算描述语言DSL。通过这种描述语言,我们能够完成特征计算的配置化表达。最后,就是前面介绍的,因为在线过程和离线过程存在多套逻辑,会导致逻辑不一致的问题,我们就需要解决特征一次性的问题。

以上四点,就是我们如何对特征计算框架进行封装的思路。

为了实现算子抽象,首先必须实现数据协议的统一。我们利用动态pb的技术,根据特征的原数据信息,将任意的一个特征按照统一的数据进行处理,这样就为我们的算子封装提供了数据基础。接下来,我们对特征处理的过程进行抽样封装,将特征计算过程抽象成解析、计算、组装、异常处理几个过程,并且统一计算过程API,从而实现了算子抽象。

有了算子的抽象之后,我们就可以建立算子库。算子库分为平台通用算子库和业务自定义算子库。平台通用算子库主要是实现公司级的复用。业务自定义算子库主要是针对业务的一些自定义场景及特征,实现组内的复用。我们通过算子的封装以及算子库的建设,实现特征计算的多场景复用,提升开发效率。

特征计算的配置化表达,是指定义特征计算表达的配置化语言叫DSL。通过配置化语言,我们能够实现算子的多层嵌套表达,能够实现四则运算等等。下图中的第一幅截图展示了配置化语言的具体语法情况。

我们通过特征计算的配置化语言能够带来什么好处呢?

第一,我们能够通过配置化完成整个特征计算,从而达到开发效率的提升。

第二,我们能够通过发布特征计算配置化表达,实现特征计算的热更新。

第三,训练和预测使用同一份特征计算的配置,从而实现线上线下一致性。

这就是特征计算表达带来的好处。

前面说到,特征计算分为离线过程和在线过程。因为离线和在线的多平台原因,导致逻辑计算的不一致。为了解决这个问题,我们在特征计算框架里,实现了特征计算框架的跨平台运行能力。核心逻辑采用C++开发,对外暴露的是C++接口以及Java接口。在打包构建的过程中,能够一键实现C++的so库以及jar包,从而确保特征计算能够运行在线计算的C++平台以及离线的Spark平台或者说Flink平台,并且用特征计算表达,可以确保特征计算实现线上线下逻辑的一致性。

上面介绍的是特征计算的具体情况。下面我们来看一下特征计算目前已经取得的一些成果。

我们现在已经沉淀了120家的算子,通过特征计算的DSL语言能够实现配置化,完成整个特征计算。通过我们提供的跨平台运行能力,实现了线上线下逻辑不一致的问题。

下图中的截图展示了通过少量的配置,就可以实现整个特征计算的过程,较大程度提高了特征计算的开发性效率。

上述介绍了我们在开发效率提升的一个探索。总得来说,我们通过系统的分层设计,提高代码的复用度,以及通过对查询、对抽取、对模型计算的封装,能够实现配置化的开发流程。

模型计算同样也是采用封装的形式。通过配置化表达的形式,实现模型的加载、模型的输入构造、模型的计算等等,使用几行配置,实现整个模型计算的表达过程。

下面我们来看一下模型实时化的落地案例。

我们为什么要做这样的模型实时化项目?

主要原因是传统的推荐系统是天级别更新用户推荐结果的系统,它的实时性非常差,无法满足这种实时性要求比较高的场景,例如我们的直播场景,或者说其他一些实时性要求比较高的场景。

还有一个原因是传统的样本生产方式,是存在特征穿越的问题。什么是特征穿越呢?下图中展示了特征穿越产生的根本原因,是因为我们在做样本拼接的过程中,我们采用的是“T-1”时刻的模型预估结构,和“T”时刻的特征进行拼接,这样就会出现特征穿越的问题。特征穿越会非常大程度的影响线网推荐的效果。为了解决实时性的问题,以及为了解决样本穿越的问题,我们就在预估系统里去落地这样一个模型实时化的方案。

模型实时化方案从三个维度进行阐述。

样本实时生成。我们基于在线预估系统,将预估系统的特征实时落地到Kafka,通过RACEID的形式关联,这样我们就能够确保样本实现秒级落盘,并且能够解决特征穿越的问题。

模型增量训练。有了样本的秒级落盘之后,我们就可以修改训练模块,实现模型的增量训练,就能实现模型的分钟级更新。

预估系统实时化。有了模型的分钟级导出之后,我们通过模型推送服务PushServer,将最新的模型推送到线上预估系统,能够使得现场预估系统使用最新的模型进行预测。

模型实时化方案总得来说,就是要实现样本的秒级落盘,实现模型的分钟级训练和分钟级线上更新。

我们现在的模型实时化方案,已经在多个场景进行了落地。通过模型实时化方案,在业务上有比较好的效果提升。

上图中,主要展示了模型实时化方案的具体实验数据。我们可以看到增量训练,它的训练周期越短越好。通过具体的数据,我们可知周期为15分钟的效果远远大于2小时、10小时、一天的。现在的模型实时化方案已经有一套规范化的接入流程,能够批量为业务带来比较好的效果提升。

上述介绍了预估系统如何提升计算性能,如何提升开发效率,以及如何通过工程的手段带来项目算法提升三个方面的探索和尝试。

整个预估系统的平台价值,或者说整个预估系统的平台目的,可以概括成三个字,就是“快、好、省”。

“快”就是前面介绍的应用性建设。我们希望通过持续的应用性建设,使得业务的迭代能够更加高效。

“好”就是希望通过工程手段,例如通过模型实时化方案,以及通过特征计算的线上线下逻辑一致性方案,能够为业务带来比较好的效果提升。

“省”就是使用预估系统的更高性能,能够更加节省计算资源,以及节省计算成本。

THE END
1.机器学习基础超全汇总!机器学习常用术语词汇表(建议收藏同样是监督学习算法,用于预测连续的数值,如预测股票价格、房价等。线性回归是最基本的回归算法之一。 聚类算法 无监督学习算法,将数据对象分成不同的簇,使得同一簇内的数据对象具有较高的相似性,而不同簇之间的相似性较低。例如 K-Means 聚类算法。 决策树 https://www.bilibili.com/read/cv39478871/
2.在线算法和离线算法的区别–PingCode什么是在线算法和离线算法,它们有哪些区别? 在线算法和离线算法都是常见的数据处理算法,但它们在应用场景和运行方式上存在一些区别。 在线算法是什么,它和离线算法有什么不同之处? 在线算法是一种实时处理数据的算法,它在数据到达时立即进行处理,即时的结果可以随时更新。在线算法适用于需要实时响应和动态更新的场景,如https://docs.pingcode.com/ask/202629.html
3.离线算法vs在线算法在计算机科学中,离线和在线算法的本质不同是:在处理数据流和资源使用方面 离线和在线不是具体的某种算法公式,而是一种思维模式,取决于在所给的问题背景下,数据资源是否能够通盘考虑,或是现实场景中不断地有新数据介入 离线算法(OfflineAlgorithm) 离线算法是指在开始处理数据之前,所有需要的输入数据都是已知的。算法https://blog.csdn.net/m0_61678439/article/details/141088418
4.在线算法离线算法在线算法与离线算法是计算机科学中两个重要的概念,它们之间的区别对于理解算法的性能和应用至关重要。在线算法和离线算法在处理问题的方式上存在本质差异。在线算法在运行过程中逐步接收输入,并根据当前已知信息做出决策。它必须做出即时的决策,且这些决策不可逆地影响后续步骤。举例来说,当你在社交媒体平台https://zhidao.baidu.com/question/693651552016535292.html
5.我想问一下不足月如何算月利息呢,具体的算法是什么?结论:如果贷款本身就是按日计息的,那计算月息的时候,不满一个月就是按实际借款天数来算 解析:比如某https://www.64365.com/ask/1926218.aspx
6.在对齐AI时,为什么在线方法总是优于离线方法?澎湃号·湃客根据现有的强化学习研究成果,在线比离线更好似乎是显而易见的结论。在线和离线强化学习算法之间的性能差距也已经被多项研究发现,所以这项研究给出了什么不一样的结论呢? 最重要的是,在线 RLHF 算法依赖于一个学习后的奖励模型,该奖励模型是使用与离线 RLHF 算法一样的成对偏好数据集训练得到的。这与常规强化学习https://www.thepaper.cn/newsDetail_forward_27434433
7.「事实核查」是啥?专题笔记已经整理好啦,直接背!事实核查的人工算法,集智能算法与专业编辑优势于一体,在智能算法抓取社交媒体上的相关信息后,由记者进一步核实信息。 三 社交媒体时代的事实核查的特点 田心说:此部分可在理解的基础上简单记忆。 在实践中,事实核查已成为近年来全球新闻业用以应对数字化浪潮冲击所尝试的最重要的创新项目之一。与海外新闻业相比,事实核https://www.douban.com/note/863236156/
8.在线学习平台常见问题解答——超星尔雅2、总成绩组成和算法 解答:总成绩 =视频成绩*视频考核比例+课堂测验作业的平均成绩*章节测验考核比例+考试成绩*考试考核比例,如果有访问的考核标准,需要加上访问的成绩*访问比例,可以登录后点开课程图片进入,点击导航栏【进度】,进入查看相关进度和分数的分配,如果学校没有特殊要求,总成绩已获得的分数达到60以上即为http://syxt.xjtu.edu.cn/info/1171/2038.htm
9.详解抖音算法:为啥百万粉丝的抖音号,直播时才几十个人在线?视频抖音的算法,就是抖音这款游戏的规则。 成立日期2021年06月04日 法定代表人王生 主营产品抖音小风车,蓝V开通,企业号认证,私信卡片,引流链接,橱窗,跳转微信,在线预约,KS小钥匙,立即预约,升黄金等级,二手车播,橱窗开通 ,二手车直播资质,信息咨询,定位修改,团购达人,电商执照,代办执照抖音团购,小店开通,虚拟号码改https://product.11467.com/info/11530048.htm
10.重建生态:价值与系统的力量——第七届中国教育创新年会11月启幕算法学习的课堂提问艺术 冯书伟(北京亦庄实验小学信息技术中心主任) 合作学习的管理策略 叶丹(武汉经济技术开发区洪山小学校长) 新冠疫情下的混合式学习经验 马鸣燕(美国普利西学校中学部创校老师) 个体学习的崛起对学校传统群体学习的冲击与改造 唐雅月(巴川中学精英班海外首席升学指导) 学生们如何在场馆式https://sghexport.shobserver.com/html/toutiao/2020/08/26/250533.html
11.从玄学走向科学:AB测试驱动的科学增长在这之后,AB实验渐渐普及开来,逐步成为数据驱动增长的经典手段,助力了大量互联网产品的迭代优化。今天,谷歌微软这些科技公司每年进行着数以万计的实验,覆盖了亿级的用户量,实验的内容涵盖了绝大多数产品特征的迭代优化,从产品命名到交互设计,从改变字体、弹窗效果、界面大小,到推荐算法、广告优化、用户增长等等。 https://www.51cto.com/article/745854.html
12.在线匹配问题研究进展:如何应对一般图以及顶点全在线的挑战?在STOC90会议中,Karp, Vazirani和Vazirani三位学者首次提出了在线二分图匹配模型:假设存在一个潜在的二分图 其中一侧顶点为离线顶点(直接给定),而另一侧顶点为在线顶点(逐步到达)。我们要求算法在任何一个在线顶点输入的时间点(此时与中顶点的边同时给出),即时地决定是否将与中某一相邻顶点匹配,并且决策不能反悔。https://www.orsc.org.cn/wechat/article/detail?id=760
13.2024年10款最佳RSS阅读器推荐(在线/软件+免费/付费)现在无论是在新闻媒体、社交平台还是在线视频软件,订阅或者说关注对大多数人来说是一个熟悉的词汇,比如知乎专栏的订阅,抖音的关注等等。为了获取更大懂得利润,很多平台不断地采用算法分析和收集用户数据,从而推荐你潜在可能感兴趣的内容和商品。这样导致你身边的信息具有同质化,让你看不到跟你不一样的观点、接收到https://www.extrabux.cn/chs/guide/6500762
14.算法基础与在线实践带目录完整pdf[31MB]电子书下载1.1 什么是算法 1.2 算法的时间复杂度 1.3 算法时间复杂度分析示例 1.4 PKU 0penJudge在线评测系统 1.5 本章小结 第2章 简单计算与模拟 2.1 基本思想 2.2 例题:鸡兔同笼(POJ 3237) 2.3 例题:校门外的树(POJ 2808) 2.4 例题:装箱问题(POJ 1017) https://www.jb51.net/books/679145.html
15.大数据流的在线HeavyHitters算法(上篇):基于计数器的方法Heavy Hitters(频繁项)以及它衍生出来的Top-K(前K最高频项)是大数据和流式计算领域非常经典的问题,并且在海量数据+内存有限+在线计算的前提下,传统的HashMap + Heap-Sort方式几乎不可行,需要利用更加高效的数据结构和算法来解决。好在大佬们对Heavy Hitters问题进行了深入的研究,并总结出了很多有效的方案,本文简要介https://www.jianshu.com/p/690432d7fc45
16.生物信息学简史1970年,Needleman和Wunsch 开发了第一个成对蛋白质序列比对的动态编程算法,80年代早期,做为Needleman-Wunsch算法的推广,第一个多序列比对(MSA)算法首次公布,但是这个算法并没有太大的价值。 多序列比对第一个真正成熟的算法由Da-Fei Feng和Russell F. Doolitle于1987年开发,流行的MSA软件 CLUSTAL 开发于1988年,作为https://www.biowolf.cn/m/view.php?aid=372
17.蚂蚁金服核心技术:百亿特征实时推荐算法揭秘阿里妹导读:本文来自蚂蚁金服人工智能部认知计算组的基础算法团队,文章提出一整套创新算法与架构,通过对TensorFlow底层的弹性改造,解决了在线学习的弹性特征伸缩和稳定性问题,并以GroupLasso和特征在线频次过滤等自研算法优化了模型稀疏性,在支付宝核心推荐业务获得了uvctr的显著提升,并较大地提升了链路效率。 https://maimai.cn/article/detail?fid=1010621115&efid=mIQCHnkj0zjxlpygUmo5mg