开启成长之旅!这是我参与「日新方案 · 12 月更文挑战」的第12天,点击查看活动概况

微博引荐团队:陈雨、韩楠、蔡小娟、高家华

1.项目背景

抢手微博是新浪微博的重要功用之一,包含抢手流、抢手流、频道流、小视频后引荐、视频社区等场景。

引荐首页 发现页引荐 沉溺视频

weidl机器学习结构为抢手微博在线学习供给模型练习和推理服务,引荐全链路中在线推理服务的功用一向是weidl结构优化迭代的重要方针。在线学习体系依托于weidl结构。其服务的吞吐量、均匀呼应时刻、接受上游QPS、机器资源占用等方针彼此制衡,其间weidl结构推理核算的功用至关重要,与引荐服务全链路的全体功用方针及本钱密切相关。探究引擎中核算图运转时算子核算加快的各种特性及优化支撑成为本项目首要方向。

DeepRec是阿里巴巴集团供给的针对搜索、引荐、广告场景模型的练习/预测引擎,在分布式、图优化、算子、Runtime等方面对稀少模型进行了深度功用优化,一起供给了稀少场景下丰厚的Embedding相关功用。

本文首要介绍抢手微博引荐的全体架构与DeepRec对抢手引荐结构功用上的进步,并具体分析的weidl渠道中运用的DeepRec的重要优化点。

2.抢手微博引荐体系与weidl在线学习渠道

2.1 抢手微博引荐体系全体架构

抢手微博引荐体系可分为前台事务与weidl在线学习渠道两个部分。前台事务为各个事务的接口,担任将引荐结果返回给事务方。在线学习渠道集成了样本拼接、模型练习、参数服务器、模型服务等多个模块,为抢手引荐的多个事务完结了完好的引荐流程,可快速为新事务搭建一套引荐体系。

2.2 weidl在线学习渠道

在线学习渠道是整个体系最中心的部分,首要担任召回、粗排、精排等模块。抢手引荐体系为全链路大规划深度模型的在线学习体系,其间召回模块有兴趣召回、抢手召回、战略召回、模型召回等多路召回,分别从千万级物料库中召回部分候选集,经过每路配额配置,将万级物料送入粗排模块。粗排阶段经过物料特征离线生成、用户特征实时拉取的方法,完结高功用的打分服务,经过粗排排序后,将千级候选集送入精排阶段。精排阶段模型最为杂乱,物料与用户特征实时拉取,多场景多方针交融,终究经过规矩体系的重排,选出一次曝光的博文,引荐给用户。

在线学习渠道底层推理核算部分选用bridge形式,支撑多个backend,包含DeepRec、TensorFlow、Torch、TensorRT等,一起支撑根据CPU与GPU的模型练习与在线推理。

weidl在线学习渠道

抢手微博引荐体系从2018年开端,经过几年的晋级,在实时性和规划上都有了本质的进步。

2.2.1 实时性

实时性包含模型学习到用户行为的速度,模型参数的更新应用到线上模型服务的速度。引荐体系的更新速度越快,越能够反响用户最近的用户习气,越能够给用户进行越有时效性的引荐;模型更简单发现最新流行的数据pattern,越能够让模型反响找到最新的流行趋势。工程上首要经过以下几个方面,完结引荐体系的实时性。

a. 样本拼接作为模型练习的起点,一条完好的样本拼接完结的速度决议了模型学习用户行为速度的上限,目前抢手引荐样本拼接窗口为30分钟,即用户在客户端的互动行为在30分钟内必会生成一条样本,送入kafka队列。

b. 模型练习读取样本流kafka,确保kafka无积压,所以该条样本会在毫秒级被模型学到,并经过rpc调用,更新到练习的参数服务器,并将新的模型参数推入kafka队列。

c. 参数同步服务从模型更新的kafka队列中读取数据,将模型最新的参数经过rpc调用,发送给在线服务所用的参数服务器中,此刻从用户行为到模型更新完结。

d. 模型在线推理服务直连参数服务器,实时拉取模型最新参数进行打分。除掉样本拼接所需的30分钟窗口,其他流程在1分钟内完结。

2.2.2 大规划深度杂乱模型

抢手引荐事务从开始的FM模型,到现在召回阶段以双塔为主,粗排阶段以cold dnn为主,精排阶段以多场景、多方针的杂乱深度模型为主,模型在特征数量、方针个数、模型结构杂乱度上都发生了质的改变,给事务带来了很大的收益。

精排模型从snr模型迭代到mm模型

粗排双塔模型迭代到cold dnn模型

模型杂乱度的进步给工程架构带来了不小的压力,一个multitask模型比一个单方针的dnn模型在算力上是成倍的添加。为了杂乱模型的落地,抢手微博引荐团队探究了多种开源结构,包含TensorRT, XDL,TFRA等,经过测验与源码分析,这些结构都在原生Tensorflow基础上做了不同方向的优化,但功用一向无法满足要求。一起,我们也经过指令集优化、改进TensorFlow内存办理、算子交融等方法,优化weidl kernel部分功用。

在不断的优化与开源结构的尝试中,发现DeepRec结构在功用、易用性、与weidl的兼容性上都全面胜出,终究,抢手引荐结构引擎选用DeepRec引擎,进步了练习与在线推理的新能,一起也给事务带来了作用上的进步。

3.DeepRec及相关模块优化点分析

3.1 OneDNN库加快算子运算

DeepRec集成了最新版别的开源的跨渠道深度学习功用加快库oneDNN(oneAPI Deep Neural Network Library),英特尔相关团队进一步优化将oneDNN 原有的线程池统一成DeepRec的Eigen线程池,削减了线程池切换开支,防止了不同线程池之间竞赛而导致的功用下降问题。oneDNN针对主流算子完结了功用优化,包含MatMul、BiasAdd、LeakyReLU等在稀少场景中的常见算子。针对抢手微博的线上模型,功用进步显着。

在DeepRec中英特尔CESG团队针对搜索广告引荐模型中存在着很多稀少算子如Select、DynamicStitch、Transpose、Tile、SparseSegmentMean、Unique、SparseSegmentSum、SparseFillEmptyRows等一系列稀少算子进行了深度的优化,下面介绍2个常用稀少算子的优化方法。

3.1.1 Select算子优化

Select算子完结原理是根据条件来做元素的挑选,此刻可选用向量化指令的mask load方法,如图所示,以削减原先由if条件带来很多判断所导致的时刻开支,然后再经过批量挑选进步数据读写功率,终究线上测验标明,功用进步明显。

3.1.2 Transpose算子优化

相同,能够运用向量化的unpack和shuffle指令对transpose算子进行优化,即经过小Block的方法对矩阵进行转置,终究经线上测验标明,功用进步相同非常明显。

3.2 要害途径优先的调度引擎

DeepRec经过对履行引擎以及底层线程池的从头规划,到达在不同的场景下,包含trianing和inference,能做到更佳履行功用。确保不同线程之间的均衡性,尽量削减线程之间的steal,防止加锁等问题。

Executor的规划需求考虑对内存的访问及其并行完结之间的联系,进行多层次使命调度,削减缓存缺失和远程内存访问,充分发挥多核、多节点CPU的并行特性,进步体系的运转功用。在线程池层面,规划Cost-aware线程池,结合内存感知以及算子类型等信息,进行针对性优化;在核算图层面,对张量内存的方位进行调度,有利于线程池的调度;在算子生成层面,进行有利于线程池使命调度的算子使命划分。

DeepRec供给的根据要害途径优化的履行引擎,经过动态采集Session Run状况,核算与核算多组方针,并构建CostModel,核算出一个较优的调度战略。该功用中包含了根据要害途径的调度战略,根据CostModel patching履行细碎算子的调度战略以及线程池Cost-aware调度战略等。

在graph履行进程中,Collector会监测一切算子履行以及线程池状况,包含算子履行时刻,线程池pending使命饱和度,以及算子的前后依赖关系。这些参数会经过CostModel来核算更佳的调度战略。关于一张graph来说,存在一条或许多条要害途径,即从输入到输出经过的延时最长的逻辑途径。graph履行总的时刻一定是大于等于要害途径时刻。为了让整个graph履行更快,并发更佳高效 ,在graph履行时应当优先履行要害途径上的节点。

在稀少模型图中,可能会存在很多细碎算子,会带来很多调度开支。有些能够经过算子交融来做优化,算子交融一般经过graph pattern匹配或许手动指定子图来确定需求交融的目标,难以掩盖悉数算子。故而在executor层面,经过trace运转时数据来动态进行批量调度履行,这样能够削减非必要的细碎算子调度开支。

在线程调度层面,目前的线程池调度战略比较简单,如果当时履行线程是inter线程,优先将task调度到当时线程履行,若不是,则调度到一个random线程上。线程的balance完全由steal机制来确保。在我们的调查中,发现inter线程之间存在很多的steal,这会导致很多锁以及重复的线程调度等开支。CostModel executor经过采集运转时数据,来确定更佳的线程来履行使命,削减很多的steal行为。

在杂乱模型上,运用DeepRec的CostModel调度,能够生成更佳的调度战略,削减调度开支。在测验的snr模型上均匀耗时稳定优化2ms。

3.3 动态感知的内存/显存分配器

在张量内存办理方面,通常存在两点问题,一个是内存碎片过多,另一个是没有考虑模型结构存在多分支的状况下算子并行带来的内存增加。其内存办理非常粗放,大体上都是运转时根据内存恳求动态进行内存开释和分配,一起进行一些内存池办理。由于无法感知上层应用的分配恳求特色,这种内存办理存在着内存碎片过多的特色。例如在不清楚后续内存恳求的状况下,由于前期的屡次内存分配和开释,会导致后来的大内存恳求由于内存碎片的问题而需求一块新的内存或许OOM。

深度学习模型的内存分配由于其应用特色存在着显着的规律性,练习时都是以一个个mini-batch的形式练习,每个mini-batch的分配特征大体上保持一致,练习时前向进程一向分配内存,较少开释,而反向进程中会开释前向核算中的暂时张量,开释很多内存,所以内存会周期性呈现先增加后下降的特征。根据此学习到履行进程中内存分配pattern,然后削减内存的动态分配以及对内存块做到最佳的复用。一起自适应内存分配器也是graph-aware的,这样使得不同子图之间存在较小的彼此干扰,进步分配功率。自适应内存分配器基本架构如下图所示:

自适应内存分配器在练习进程关于前面的K轮进行一些核算,经过Allocator模块,对内存的分配,包含分配的时刻点、分配的巨细,核算好分配的时刻点和巨细后,在K轮结束之后会运用启发式的一些算法规划出一个较优的tensor cache planner,planner会创立allocator,而且预分配一些tensor内存块,后续的分配会优先经过此allocator进行分配。

自适应内存分配器基本原则是运用尽量少内存,一起进步内存的复用率。全体来讲,自适应内存分配器处理了在稀少场景中内存分配上存在的一些问题,首要包含,榜首,削减了在稀少场景中,很多内存分配问题,包含小内存和大内存。譬如小内存分配出现在特征的处理进程中,包含一些特征的拼接,或许在做一些交叉特征,这里会存在很多的小内存的分配。相同在模型练习也存在很多大的内存,包含attention、RNN、或许全衔接层,会有一些大内存的分配。削减大内存的分配,进而也削减了minor pagefault数量。第二,关于tensor能做到更好的复用,削减了全体的内存占用量。

4.DeepRec在事务中获得的收益

4.1 服务功用进步

抢手微博已于9月将weidl的backend全量替换为DeepRec,线上服务与练习都获得了很大的收益,最显着的是精排多使命模型,图核算部分DeepRec比原生TensorFlow耗时下降50%,精排阶段全体耗时下降20%,单机吞吐量进步30%。

关于双塔和cold dnn模型,图核算部分耗时下降20%,粗排阶段全体耗时下降10%, 单机吞吐量进步20%,模型练习模块功用进步20%, 进步了练习速度并有用的改善了样本积压问题。

4.2 功用进步所带来的其他收益

引荐引擎模块全体耗时削减与吞吐量的进步,削减了引荐在练习与在线推理上所运用的机器资源,极大的下降了公司本钱。

在线推理服务功用进步,使引荐引擎各个模块能够核算更多的候选物料,粗排阶段能够核算更多的候选物料,进步物料库总量与扩大召回条数,精排也由1000条扩到2000条,每个阶段候选物料数的添加,都会对全体方针有明显的进步。

更多关于 DeepRec 练习/预测引擎相关信息: github.com/alibaba/Dee…