《AIBox:CTR Prediction Model Training on a Single Node》论文翻译

论文链接

摘要

       作为世界上最主要的搜索引擎,在2013年,百度赞助搜索(Sponsored Search)就采用了深度神经网络(DNN)模型来预测广告点击率(CTR)。百度的在线广告系统(Phoenix Nest)使用的输入是及其高维(千亿甚至万亿的特征)且稀疏的。百度的产品系统使用的CTR模型大小会超过10TB。这使得训练、更新、将模型用在产品中都存在巨大挑战。
       对于百度的广告系统,保持模型训练高效以便于工程师能够快速精炼和测试他们新的模型或特征是非常重要的。此外,每天都会有数十亿用户的历史广告点击记录返回,模型不得不重新快速的重新训练,因为CTR预测是一个及其时间敏感的任务。百度现在的CTR模型在MPI(Message Passing Interface)集群上训练,这就要求很高的容错性和同步性,这会导致昂贵的通信和计算成本。当然,集群的维护成本也很高。
       这篇沦为突出AIBox,一个通过使用solid-state drives(SSD)和GPUs来处理数万亿字节尺度参数的集中式系统来训练CTR模型。由于GPUs上存储空间的限制,我们将CTR模型分为两个部分:一部分适用于CPUs,另一部分适用于GPUs。我们进一步在SSD上引入一个二级缓存管理系统来存储10TB参数,同时提供低延迟的访问。广泛的实验证明了新系统的有效性。AIBox具有与大型MPI集群相当的训练性能,但只需要集群成本的一小部分。

1 INTRODUCTION

       作为世界上最领先的搜索引擎之一,百度的赞助搜索系统(Phoenix Nest)在2013年就在使用DNN模型来做CTR预测。CTR预测在决定广告空间分配中扮演至关重要的角色,因为他直接影响用户体验和广告盈利。通常,CTR预测会采用多种资源作为输入,例如查询广告相关性,广告特征和用户画像(user portraits)。然后它估计用户点击给定广告的概率。最近,深度学习在计算机视觉和自然语言处理上取得了巨大成功。受到这些启发,针对CTR预测任务提出学习方法。对比传统的逻辑回归,深度学习模型可以通过增加训练成本大幅提升精度。
       在现在百度搜索广告的产品系统中,我们模型的训练过程既耗费资源又耗费时间。模型在一个MPI(MessagePassingInterface)[52]集群中使用参数服务器[24,32]进行训练,该集群有数百个仅支持cpu的节点。产品中主要模型的尺寸超过10TB,存储并运行在一个特殊的硬件上。参数服务器解决方案在数百个节点环境中存在节点故障和网络故障的可能。更糟的是,参数服务器中的同步会阻止训练计算并导致大量的网络通信开销,而异步训练框架存在由于各工作程序节点上的模型过时造成的模型收敛问题。
因在,在很多方面有极好的机会和挑战来提高赞助搜索的产品系统。积极研究的一个领域是在调用CTR模型之前提高(广告)“召回”的质量。 例如,百度向社区分享了这样的技术论文,该算法基于快速近邻搜索算法和最大内积搜索技术。
       在这篇论文中,我们介绍了百度同时为改进在线广告系统所做的另一项重大努力,即将CTR模型训练从MPI集群转移到GPU。在机器学习和科学计算中使用GPUs已经是一个平常举措,但在GPU中训练商业CTR模型仍然存在许多挑战。最显著的挑战是:训练数据集的PB尺度的规格,训练模型也超过10TB。训练样本可能有数千亿,特征值可能数万亿(我们通常使用264作为特征空间大小的方便替代)。输入到模型的数据也非常稀疏,每个特征向量只有几百个非零数据。
       作为一个商业赞助的搜索系统,任何模型压缩技术都不应该损害预测性能(收入)。的确,即使预测准确率小到0.1%下降都会导致不能接受的经济损失。事实上,整个系统已经尽可能的优化使冗余尽可能的小(例如,参数已经仔细的量化为整数)。这表示这方面已经很少有可能再提高了。
       流行的模型压缩技术,如downsampling和hashing,对训练那些训练数据极度高维的(千亿的特征)和极度稀疏(每个特征中仅几百个非零输入)的商业CTR模型效果微乎其微。研究论文中常见的论点,如“减少培训成本的一半,准确性只降低0.3%”,在这个行业已不再适用。在另一方面,训练DNN CTR模型在百度是一个日常工作。工程师和数据科学家不得不实验不同的模型/特征/策略/参数并非常频繁的反复训练CTR模型。硬件的成本(如MPI集群)和能源消耗可能非常高。
       为了处理这些挑战,我们提出了AIBox,一个新奇的集中式系统在一个单一节点上高效的训练大的机器学习模型。AIBox使用新兴的硬件SSD和GPUs来存储大量的参数,并加速繁重的神经网络训练计算。作为一个集中式的系统,AIBox直接消除了分布式系统中由于网络通信而带来的弊端。此外,与大型计算集群中的数千个节点相比,单节点AIBox的硬件故障要少几个数量级。此外,由于只需要内存锁和GPU片上通信,单个节点的同步成本显著降低。与分布式环境相比,不需要通过网络传输数据。
       尽管如此,AIBox的设计仍然还有两个主要挑战。第一个挑战是在一个单一节点上存储10TB模型尺度的参数。当容量超过1TB时,内存价格显著提高。当模型在未来变得更大时,它是不可扩展的,在现实世界应用的大规模生产中是不实际的。由于成本太高我们不能在主存中存储整个10TB的参数。PCIe总线上新兴的非易失性内存快车(NVMe) SSDs的延迟比硬盘驱动器低50倍以上。我们利用SSD作为辅助存储来保存参数。然而,SSD有两个缺点:首先,在延迟方面,SSD仍然比主存慢两个数量级,导致训练过程中参数的访问和更新速度慢。SSD的另一个缺点是,SSD中的存储单元只能维持几千个写周期。因此,我们必须在内存中维护一个有效缓存来隐藏SSD延迟并减少对SSD的磁盘写操作。
       第二个挑战是在一个单一节点上用多GPUs来加速训练计算。最近,Nvidia Tesla V100 32GB高带宽内存(HBM)的单精度性能达到15.7 TFLOPS,比深度学习推理上的高端服务器CPU节点(Intel Xeon series)快47倍。这为设计具有与集群相当的计算性能的多GPU计算节点提供了独特的机会。然而,目前现成的GPU没有TB规模的HBM。我们不能将整个CTR预测神经网络保留在GPU HBMs中。在这项工作中,我们提出了一种新的方法(第2节)来划分神经网络分成两部分。网络的第一部分是内存密集型的,在CPU上训练的。网络的另一部分是计算密集型的,同时具有有限数量的输入特征。我们在GPU上训练它。训练数据和模型参数在主存储器和多GPU的HBM之间传输。然而,主存储器和GPU HBM之间的通信受到PCIe总线带宽的限制。当通信带宽成为瓶颈时,GPU的高数值计算性能受到阻碍。新兴的NVLink和NVSwitch技术使直接GPU到GPU通信不涉及PCIe总线。为了减少GPU数据传输量,我们采用了NVLink,并设计了一个内嵌HBM参数服务器。

总结工作如下:

  • 我们介绍AIBox,一个通过SSD和GPU加速的单一节点来训练10TB参数级别的CTR模型。单节点设计范式消除了分布式系统昂贵的网络通信和同步成本。就像我们知道的,AIBox是第一个被设计用于现实世界中的大规模机器学习应用的集中式系统。
  • 我们提出一个新颖的想法:将大的CTR模型分为两部分。在拆分过后,我们能够是内存密集的训练部分在CPU上进行,计算密集的部分在内存有限的GPU上加速训练。
  • 我们提出一个新颖的想法:将大的CTR模型分为两部分。在拆分过后,我们能够是内存密集的训练部分在CPU上进行,计算密集的部分在内存有限的GPU上加速训练。
  • 我们进行了大量的实验来评估所提出的系统,将其与拥有75个节点的分布式集群解决方案进行比较,实际CTR预测数据由10个PB示例组成。它表明AIBox-AIBox的有效性与集群解决方案具有可比性的训练性能,但它只需要不到集群成本的1/10。
           论文剩下部分的组织如下:Section2展示我们的CTR预测深度神经网络模型。Section3,我们介绍AIBos的高阶设计。在Section4中,我们研究在稀疏表上存储大型模型的挑战,并提出了在SSD上使用二级缓存管理系统的解决方案。Section5中展示了实验结果。Section6中讨论了相关工作,Section7中引用文献。
    在这里插入图片描述

2 CTR预测神经网络

       工业深度网络在大规模的数据实例前提下设计和训练,以帮助预测广告的CTR准确、快速、可靠。百度CTR预测模型的特点是典型的极度稀疏特征(千亿甚至万亿的特征),但每个集合只有几百个有效的非零数据。这个庞大的DNN模型存储超过10TB的经过仔细量化后的非零参数。因为GPU HBM容量限制,将整个模型超过10TB参数全存放在GPU HBM内是不切实际的。
       在这篇论文中,我们提出了在CPU + GPU上训练大型DNN CTR模型的双模块架构。第一个模块专注于高维且特征稀疏的嵌入式学习,第二个模块联合学习第一模块输出的稠密特征进行学习。在CPU上进行嵌入式学习以帮助学习低维稠密的embedding representations。由于10TB参数不能在训练过程中全部存入内存中所存在的内存密集型问题,我们用SSD来存储模型参数。CPU可以从SSD中快速的获取这些参数。通过将学习到的嵌入向量从CPU转移到GPU,计算密集型联合学习模块可以充分利用强大的GPU进行CTR预测。在联合学习模块中,以嵌入件为输入,对多个全连接神经网络进行建模。这些神经网络的最后一层被连接在一起,用于最终的CTR预测。Figure1大致表示了CTR神经网络模型的设计,我们将在后面介绍模型的一些细节。
       为了便于讨论,在本文的其余部分,我们将使用1012(百亿)作为CTR模型中极端稀疏特征的维数。读者应该记住,实际产品系统中的特征数量应该超过是10 12

2.1 Embedding Learning on CPUs

       嵌入学习模块的目标是映射高维稀疏向量(如1012维度)转化为低维密集表示。如Figure1所示,嵌入式学习模块包括高维稀疏特征的输入层和输出层。使用RELU作为激活函数。这个模块主要是内存密集型的,因为1012个特征会导致10TB尺度的模型参数,不可能将所有的参数都加载到主存中。为了学习嵌入式,我们将10TB的参数都存进SSD中。由于SSD和CPU之间的高效访问速度,我们可以很容易地从SSD加载参数并在CPU上嵌入式学习。

2.2 Joint Learning on GPUs

       在我们在CPU上计算了高维稀疏特征嵌入向量后,将嵌入向量从CPU转移到GPU执行CTR预测进程。联合学习(Joint Learning)的组成由稠密个性化特征和学习的嵌入向量组成。个性化特征来自多种来源,包括广告创意的文本、用户个性化行为和各种与广告相关的元数据。如果我们直接连接这些特征并将他们投入神经网络中,个性化特征中最重要的信息可能不能被完全挖掘,导致CTR预测结果的不准确。因此,我们为最终的CTR预测设计了几个深度神经网络和联合学习有意义的表现。如Figure1所示,联合学习模块包括几个(图中为2个)深度神经网络。每个网络连接学习过后的嵌入向量和一种个性化信息作为输入层。然后,提供几个全连接层自动捕获特征的交互。CTR预测网络最后的隐藏层由softmax和输出层组成。我们用负对数似然(negative log-likelihood)函数作为目标函数:
在这里插入图片描述
这里S是训练集,|S|是训练样本数量。x表示我们CTR预测模型的输入特征,y∈{0,1}是表示用户是否会点击广告的标签。p(x)是softmax层后的输出,表示样本数据被点击的可能性。
       为了有效地从前一个的神经网络中学习,从第一个和最后一个隐藏层中提取模型表示,然后将其与当前神经网络的输入层连接起来进行联合学习。具体来说,第一个隐藏层代表一个低级的特征学习,从输入层中提取最相关的信息。最后一个隐藏层为表示一个高级的特征学习和并为CTR预测发现最抽象但最有用的信息。我们结合了上一个网络中最有意义的低层次和最强大的高层信息,以获得更准确的CTR预测结果。
       这个模块是计算最密集因为有许多神经网络。我们为了提高速度在GPU上训练这个模块。在一轮或几轮联合学习执行后,用反向传播在首次更新神经网络的参数和转给GPU嵌入向量。然后更新嵌入向量并返回更新的模型参数给CPU。通过这种方式,两个模块为CTR模型训练协同工作。在这里插入图片描述

3 AIBOX SYSTEM OVERVIEW

       这节中包括AIBOX系统的概述和描述高级视图中的主要模块。Figure 2描述了AIBOX的结构。包括三个部分:CPU模块、稀疏表、GPU模块。
       协调和嵌入学习的CPU模块:CPU模块协调整个训练工作流。首先,通过高速网络从分布式文件系统(如HDFS)中读取训练样本,并未接下来的并行处理构造mini-batches。我们称这些mini-batches为pass。然后,CPU模块通过与稀疏表模块的交互计算mini-batches的嵌入特征,获得相关参数。之后,嵌入向量就传递给GPU进行联合学习的神经网络。经过GPU上联合学习的计算,反向传播梯度给CPU模块。通过稀疏表的push操作在CPU端更新参数。除了主工作流之外,CPU模块还定期在分布式文件系统中保存当前训练快照作为检查点,以便于出错时进行恢复。
       稀疏表:稀疏表是一个在SSD上的键值对存储系统,存储1012离散特征(如模型权重、点击信息)。这些特征要占10TB的空间。一个特征-文件映射的哈希键索引在内存中查找键。虽然SSD相对于硬盘来说延迟较低,但它仍然不能跟纳米级的内存延迟相比较。为了解决这个关键性的问题来,我们为SSD访问设计了一个显式的内存高速缓存策略来隐藏延迟。与此同时,高速缓存同样作为一个缓冲区来避免SSD的频繁写操作(Section4)。
       用于联合学习的GPU模块:GPU模块接收从CPU模块发来的稀疏嵌入向量,并将他们存入HBM中。然后这些向量被投入稠密的联合学习网络中。这些向量异步的在PCIE总线和GPU的联合学习中传输。我们申请一个单独是CUDA进行数据传输,另一个CUDA进行学习计算。GPU HBMs作为芯片上的参数服务器。密集神经网络的参数被复制到所有GPU上并存储在GPU HBM芯片中。对于每次经过的mini-bathes,每个GPU根据其本地副本计算新的参数。之后,AIBox中的所有GPU通过NVLink高速互连进行集体通信以同步参数。
在这里插入图片描述
       3-stage pipeline:训练流程包括三个主要耗时的任务:读取训练样本,稀疏表操作,神经网络训练(embedding learning+joint learning)。这3个任务对应于独立的硬件资源:网络,SSD,CPU+GPU。从Figure3中能看出,我们构建了一个3-stage pipeline来辅助减少任务延迟,并为每个stage维护一个预读取队列。此外,预读取还隐藏了阶段之间的通信时间。对于每个stage,我们创建一个工作线程,它从预读取队列获取作业并提供相应的资源。然后结果会存入下一个stage的预读取队列。当下一阶段的预读取队列已满时,每个阶段的线程暂停,因为下一阶段已经有太多未处理的作业。预读取队列的容量是根据每个stage的执行时间预先设置的。如Figure3中的RE stage,我们没有任何执行依赖关系。因此,我们从分布式系统中得到样本加入网络中,直到ST队列有足够多的进程未执行。ST stage仅仅依赖于RE,而EL和JL还受限于高速缓存管理系统。ST stage加载SSD中的RE相关参数。由于缓存内存足够大,可以缓存过去几次传递中参数引用,所以我们不需要等待EL和JL完成。我们仅仅需要保证加载的参数在EL+JL阶段完成前不会被删除。EL计算依赖于ST阶段,因为我们只能在将参数加载到内存之后才开始嵌入式计算。JL训练必须等待EL部分的嵌入式计算完成。由于数据依赖,JL和EL是一个通道内的。具有多个高端GPU的AIBox与几十个仅有CPU节点的分布式集群具有相当的计算能力。此外,RE是最简单、最快的阶段,它的延迟被通道隐藏。但是,与所有参数都在内存中的分布式集群解决方案相比,与SSD交互的稀疏表操作是额外的开销。我们需要优化ST阶段使ST快于EL+JL。在这种情况下,ST的延迟被通道隐藏,这样我们就可以有一个相当的训练速度。因此,在接下来的论文中,我们将重点研究稀疏表(SparseTable)的设计细节。

4 SPARSE TABLE

       稀疏表的目的是在SSD上有效的存储模型参数。它利用内存作为SSD的快速缓存,同时减少SSD I/O并提供低延迟的SSD访问。主要包括两个方面:键哈希索引(key hash index)和二级高速缓存管理(bi-level cache management)。

4.1 Key Hash Index

       为了能通过特征键在SSD上找到参数文件,我们需要为点击率预测模型的1012参数存储一个1012的键值对映射。存储每一个64位键值对映射需要1.6TB=(8 Bytes key + 8 Bytes offset on SSD0)*1012,这超过了1TB内存的预算。我们必须小心地设计一个键哈希索引和SSD上的文件结构来降低内存占用。
       我们引入了一个分组函数,它将一个键映射到一个group id,这样每个group都包含m个键。如,group(key)→{0,1,…,1012/m-1}。1012个键被分成1012/m个group。在对键分组后,我们能得到一个仅占用原本key-file映射1/m内存消耗的group-file映射。因为键是连续的1到1012,所以分组函数可以很容易的对键空间进行均匀划分。如。group(key)→key mod 1012/m。m=[BLOCK/(8+sizeof(value)] (向下取整),BLOCK是SSD的I/O单元,它由SSD的块大小(通常是4096)决定,8表示一个key占用的字节,sizeof(value)是值(模型参数)大小,以字节为单位,在我们的CTR预测模型中大约为50字节。m不能比[BLOCK/(8+sizeof(value)] (向下取整)的值小,因为SSD访问必须从磁盘中获取块字节。过小的m是次优的。另一方面,m设置得越大,键哈希索引的内存占用就越小。然而,较大的m会导致较大的group,因为我们必须从SSD中获取多个页面才能获得一个group。因此,当group-file映射占据内存中可接受的空间时,我们设置的m值是最优的。当块的大小远远大于值的大小时,它是正确的。
       作为对内存占用的权衡,分组策略的缺点是,同一组中的值是从磁盘获取的,即使在当前的mini-batch-I/O带宽中没有引用这些值,也会造成带宽浪费。一种可能的优化方法是将高共现性的特征分组在一起,例如,预先训练一个学习过的哈希函数来最大化特征共现性。这属于垂直分区的另一个研究领域,超出了本文的范围。此外,高速缓存管理组件减少了这一缺点,在该组件中,我们跳过了从磁盘读取缓存键的group。

4.2 Bi-level Cache Management

       缓存管理设计由以下两个挑战指导:访问性能和ssd的寿命。
       首先,内存访问延迟的等级是纳米秒,而SSD需要微秒来查看数据,因为SSD大约比内存慢1000倍。然而,CTR中的参数是如此稀疏和倾斜,以至于在一次mini-baches访问中只有不到1%的参数被引用。它为我们提供了一个构建内存缓存系统的机会,使经常使用的“热门参数”保持在有限的内存预算中。
       第二个挑战是SSD的物理属性只允许对每个存储单元进行数千次写操作。参数在每次迭代训练中更新。参数如此频繁的更新必然导致SSD寿命缩短。缓存管理同样也作为参数缓冲区。缓存的参数在内存中更新,不涉及到SSD I/O操作。当缓冲区达到容量上限并且缓存替换策略将其从缓存中交换出去时,它们在SSD中具体化是惰性的。
在这里插入图片描述
       我们提出一个二级高速缓存管理系统(bi-level cache management)来处理这些挑战(如Figure 4)。与通过链接链表来处理冲突的传统哈希表相比,我们的系统在链接之前有一个额外的哈希。此外,我们还引入了两个单独的链表来优化缓存探测性能。我们还为每个SSD文件附加一个Bloom过滤器,以减少不必要的SSD读取。一个工作线程在后台运行,以维护缓存策略,执行缓存替换并将更新后的参数写回SSD。
       第一个级别,即图4中的Level 1,将密钥组id散列到一个缓存槽si-si = hash1(g_id),其中g_id是在密钥分组(g_id = group(key))中计算的group id。每个si都有一个指向SSD中的文件的指针,该文件使用hash1(g_id) = si存储所有处理过的密钥的序列化模型参数。由于我们的模型的极度稀疏性,在训练的早期阶段,很多参数都没有被触及。将所有参数都初始化设置一个默认值和存在SSD上是低效的。.对于第一次引用一个键,我们必须从SSD读取一个数据块,它只返回默认值。由于模型中有1012个参数,可能导致SSD1012次不必要的读取。因此,我们执行一个延迟参数初始化,即,在被一个mini-batch处理引用之前,我们不会具体化一个参数。此外,我们为每个具体化文件附加一个Bloom过滤器,以过滤掉不必要的磁盘读取。Bloom过滤器是一种低内存占用的概率数据结构,用于测试一个元素是否存在于集合中。它保证没有错误的否定,因为当Bloom过滤器返回false时,被测试元素肯定不是集合的成员。另外,查询Bloom滤波器速度快,具有较高的存储带宽效率。只有固定数目的位被访问。Bloom过滤器带来的开销与SSD的读取开销相比是可以忽略的。因为当Bloom过滤器返回false时,我们跳过了探测SSD文件,所以Bloom过滤器可能会减少SSD文件中潜在的密钥丢失数量。
       第二级(Figure 4中的level 2)的哈希编码是由hash2 (g_id,bucket)计算的,其中bucket是一个可调参数,它控制每个缓存槽si中的bucket数量。我们引入了第二级哈希来缩短链表的链接长度。搜索链表需要遍历链表,直到找到探测键为止。在最坏情况下,它可能需要链表步骤的长度,而其他哈希表操作只需要常量时间。因此,遍历链表是哈希表探测中最耗时的一步。level 2 哈希将si的一个长链链表分割成多个bucket,使用短链表来减少低效的迭代。参数桶牺牲了空间来进行探测。桶越大,我们期望的链表就越短。
       对于所有散列到level 2中相同bucket的键值对,我们构造两个单独的链表,最近最少使用(LRU)链表和最不经常使用(LFU)链表,以便将这些键值对缓存到内存中(Figure 4中的单独链表)。LRU列表存储当前pass of mini-batches中使用的参数。它将最近使用的键值对保存在链表的前面,以便减少在链表上查找数据的迭代步骤。另一方面,LFU列表充当一个缓冲区,其中包含缓存替换的候选对象。最常使用的值位于链表的头部,以便可以更方便地访问它们。而最不经常使用的值被存回到ssd并从高速缓存中删除。一个在后台运行的工作线程定期地将数据从LRU列表移动到LFU列表,而不是当前的pass of mini-batches。这种链接导致了许多小链表节点的分配和再分配。我们维护一个内存池,它使用Slab内存分配机制来管理链表中节点的创建和删除。

4.3 Sparse Table Operators

在这里插入图片描述
       稀疏表的pull操作符接受在当前传递中引用的键的集合作为输入,并将这些键的值加载到内存中。图5演示了如下的工作流。首先,我们通过组id在双层缓存管理的第一层中定位缓存槽si。group id是从键分组哈希函数计算出来的。然后,我们查询每个定位的缓存槽的Bloom过滤器,以测试那些引用的键是否存在(一个键在第一次被引用时不存在)。对于每个无法通过Bloom过滤器的键,我们在内存中创建一个默认值的链表节点,并将该键插入到Bloom过滤器中。对于通过Bloom过滤器的键(它们可能存在于缓存或SSD文件中),我们根据它们的键和组id在第二层定位对应的缓存桶bi、j,并遍历两个链表(LRU和LFU)来查找引用的键。当在链表中找到键时,即高速缓存命中,我们就不需要访问SSD。另一方面,我们必须读取SSD上的文件,以获取不在链表中的键。Bloom过滤器理论上保证了较低的概率,因此在文件中找不到引用的键。我们创建一个默认节点,并为每个未找到的键更新相应的Bloom过滤器,就像我们为未能通过Bloom过滤器的键所做的那样。最后,我们将定位/创建的链表节点移动到LRU列表的头。在拉取操作之后,所有引用的键的参数都存储在内存缓存中,都能被使用了。
       Sparse Table的push操作符通过给定的键集合更新模型参数。引用的参数的更新增量是学习率和反向传播的梯度相结合。我们的工作流(第三节)确保给定键的所有参数已经被具有相同键的pull操作符加载到内存中。因此,我们可以通过双层缓存管理定位这些参数的值,并在不涉及数据写入SSD的情况下有效地增加它们。磁盘写操作被延迟,直到更新的缓存节点从缓存内存中删除。当缓存内存预算满时,即,如果LFU列表的长度大于预先设置的阈值MAX_LFU,则从LFU列表中删除最后的FLUSH_STEP节点,其中FLUSH_STEP是一个可调常量。因为LFU列表中节点已经按使用频率降序排列,最后一个FLUSH_STEP节点的使用频率最小。删除的参数必须刷新到SSD,因为它们由过去的push操作更新。我们在缓存管理组件的level 1定位包含已删除键的文件,从SSD中读取它们,并将它们与更新的值合并到新文件中。

4.4 File Management

       push稀疏表操作符在SSD上创建小文件,而在现代操作系统上的本机文件系统,例如,ext4和XFS并不是为处理许多小文件而设计的。大量的文件元数据压垮了这些文件系统。
       我们为这个任务设计了一个特殊的轻量级文件管理系统,通过利用生成的小文件总是进入batches的优点。使用类似于密钥分组的设计,我们将F个小文件分组到一个大文件中以创建更少的文件。此外,它在将一批独立的小文件磁盘写入分组为顺序写入时充分利用了磁盘带宽。对于每个小文件,它在大文件中的偏移量将被保存。大文件的偏移量和名称的组合充当小文件的“文件名”。这种组合在缓存管理系统的第一层的缓存槽中维护。当我们将更新刷新到SSD时,它会被更新。当我们创建越来越多的新文件后,一些没有被任何缓存槽引用的旧文件就过时了。我们为内存中的每个大文件维护一个引用计数器。当更新其中的“小文件”并引用一个新文件时,计数器会减少。当大文件的计数器达到0时,我们立即删除它。此外,我们定期监视磁盘使用情况。我们合并引用计数较低的文件,并在磁盘使用量高于模型大小MAX_REPLICATION时间时删除它们。在这里,MAX_REPLICATION由SSD容量*(85%+过载配置)/modelsize计算,其中过载配置是为制造商指定的SSD预留的存储空间。为了最大化SSD寿命,SSD控制器使用磨损平衡算法,它需要空闲空间来分发磁盘写。当可用空间小于85%时,SSD的性能会下降。

5 EXPERIMENTS

       实验评估的目的是研究提出的系统的总体性能,以及优化的影响。具体来说,在实验中我们的目标是回答以下问题:

  • AIBox与MPI集群比较起来表现如何?
  • Sparse Table操作引入的延迟是什么?
  • 3-stage pipeline隐藏了这个延迟吗?
  • 提出的二级缓存管理对执行时间有什么影响?
           我们在一个拥有8个先进gpu的AIBox上进行实验。它有服务器级的CPU、1TB的内存和一个带有NVMe SSD的RAID 0。为了训练基线模型,MPI集群中的节点被维护在同一个数据中心,并通过高速以太网交换机相互连接。MPI集群中的CPU与AIBox的CPU具有相似的性能规范。
           对于CTR模型的训练数据,我们从百度的搜索引擎中收集用户点击历史广告日志。训练数据大小约为10PB。每个示例的非零特征的平均数量约为500个。经过训练的CTR模型以A/B测试的方式在我们的搜索引擎的生产环境中进行评估。

5.1 Performance Evaluation

       我们评估了AIBox在训练时间和预测质量方面的性能。我们以75个计算节点上的MPI集群训练框架为基准。基线解决方案维护一个分布式参数服务器,该服务器跨所有节点在内存中保存整个10- tb模型。
在这里插入图片描述

       Figure 6a描述了相对于集群基线的AIBox的累计执行时间。培训包括大约300个mini-batches。AIBox在第一轮中的执行较慢(占集群的267%),因为我们的3-stage pipeline的并行性在第一轮中没有涉及——执行是顺序的。经过2轮后,3级管道全部充满。因此,我们可以观察到,在前几次传递之后,执行时间显著减少。相对累积时间的波动主要是由于AIBox和集群解决方案的训练批量大小不同造成的。在我们的传统的基于簇的CTR预测训练框架中,通过对时间戳上的数据进行切片来获得通行证。由于在工作时间内查询较多,因此一天内搜索数据的数量并不是均匀分布的,而且在集群解决方案中,每轮中的示例数量变化很大。另一方面,AIBox将训练数据统一划分为mini-batch的通道,使处理过程对流水线友好。通过每个通道的数据对相对累积时间进行归一化。在图中,我们展示了处理相同数量的训练示例的相对执行时间。与75个节点相比,AIBox在相同的时间框架内完成了训练,比集群解决方案多25%。然而,AIBox的硬件和维护成本不到集群成本的10%。
       在预测质量评价方面,我们利用曲线下面积(AUC)来衡量模型的质量。Figure 6b显示了AIBox相对于集群的AUC。在真实的赞助搜索生产环境中,对两种模型的AUCs进行10天的在线测试。由于CTR的预测精度对收入至关重要,我们必须确保AIBox的优化不会失去准确性。我们观察Figure 6b,AIBOX相比于集群的AUC甚至更甚一筹。这可能只是由于实验中固有的随机性,但它也可能是真实的,一般来说,AIBox可能会产生稍微更准确的模型。一个合理的原因是,与分布式参数服务器相比,单节点上的模型训练依赖的陈旧参数更少。AIBox的单节点设计通过在每一遍结束时通过GPU进行集体通信来更频繁地同步参数。
在这里插入图片描述

5.2 Optimization Effects

       在本节中,我们将研究所提出的优化的效果:3-stage pipeline和bi-level cache management。在这里插入图片描述
       我们首先分析了提出的pipeline。Table1 给出了管道中每个阶段的相对执行时间。100%对应于AIBox的一轮mini-batch的平均执行时间。一轮EL+JL阶段需要92%的时间。它支配着整个通道的训练时间。通道中剩下的8%的时间是内存通信和处理开销。RE(65%)和ST(78%)阶段的延迟隐藏在通道中。
       然后我们评估二级缓存管理。图7a说明了缓存和SSD上的访问计数,图7b显示了缓存命中率。SSD访问计数在几次传递后下降,因为“热门参数”被识别并存储在缓存的LFU列表中。缓存命中率在第100次时达到80%然后收敛到85%左右。它证实了提议的二级缓存管理显著降低了SSD I/Os。
       最后研究了Bloom过滤器的修剪。在我们的缓存系统中的Bloom过滤器旨在减少不必要的SSD读数。Figure 7c演示了缓存管理中的Bloom过滤器修剪时间。当Bloom过滤器返回false时,我们跳过SSD探测。如图所示,在50轮mini-batches过后,Bloom过滤器每轮裁剪出超过1百万次SSD读取。经过150轮mini-batch的筛选后,Bloom过滤器裁剪的数量保持在400万左右。Bloom过滤器帮助我们消除每一轮数以百万计的SSD读数。

5.3 Discussion

       基于以上结果,我们可以回答之前实验评估的问题。AIBox的训练时间(125%)与75节点的MPI集群解决方案相当,但成本不到10%。此外,AIBox训练的模型的AUC甚至稍好,这可能是因为在AIBox的单节点架构中比集群解决方案中的分布式参数服务器执行更多的参数同步。EL + JL的神经网络训练支配着管道的执行时间,使得稀疏表操作的等待时间隐藏在3-stage pipeline中。此外,提出的二级缓存管理也避免了稀疏表操作的瓶颈。通过识别“热门参数”并将它们保存在内存中,我们的缓存策略的平均缓存命中率约为80%

6 RELATED WORK

       在本节中,我们将讨论相关的工作,包括CTR预测模型、内存高速缓存管理系统和SSD上的键值存储。
       CTR预测模型:受深度神经网络在计算机视觉和自然语言处理中的成功启发,提出了许多深度学习方法来处理CTR的大规模稀疏特征。例如,Deep Crossing,Wide&Deep Learning,YouTube推荐CTR模型和Deep Interest Network(DIN)[66]被引入作为一类具有多个隐藏层的深度神经网络。这些模型首先使用一个嵌入层来从稀疏输入中学习低维密集表示,然后使用特别设计的完全连接层来捕获特征之间的潜在交互。基于产品的神经网络在嵌入层之上使用产品层来捕获高阶特性交互。为了更好的CTR性能,DeepFM和xDeepFM考虑了因子分解机器(FM)对低阶和高阶特征交互进行建模。总的来说,所有这些模型结合了一个嵌入层和几个完全连接层来学习对CTR预测有意义的表示法。它们大大减少了特征工程的工作量,提高了模型的性能。在本文中,我们遵循这种模型结构来设计AIBox。此外,为了利用GPU加速训练,我们将模型划分为两部分:CPU上的内存密集型嵌入学习和GPU上的计算密集型联合学习。
       内存高速缓存管理:许多缓存策略已经被开发用于存储系统,例如LRU-K、DBMIN、LRFU和语义缓存。这些算法根据最近使用的时间-标记和频率的组合权重来驱逐缓存。在web上下文中,为可变大小的对象开发了大量的工作。一些最著名的算法包括最低延迟优先、lru阈值和GreedyDual-Size。与我们的缓存问题不同,我们的CTR预测模型中的参数大小是固定的,并且在训练过程中有一个清晰的访问模式,即,一些参数经常被引用。通过应用LFU驱逐策略,可以有效地将那些“热门参数”保存在缓存中。而我们附加的LRU链表维护当前传递中引用的参数,以加速哈希表的探测。
       SSD的键值存储:在SSD设备的键值存储上有大量工作要做。主要的设计遵循维护内存中的哈希表的范例,并在SSD上构造一个仅用于更新的、类似于lsm树的附加数据结构。FlashStore优化了内存中索引的散列函数,以压缩密钥内存占用。SkimpyStash将哈希表中的键值指针移动到SSD上。BufferHash使用Bloom过滤器构建多个哈希表,用于哈希表的选择。WiscKey将键和值分开以最小化读/写放大。我们的稀疏表设计遵循主流范式,而它是专门针对我们的训练问题。我们不需要面对存储通用键和值的挑战。一个原因是,我们存储的键是均匀分布的参数的索引。不需要使用任何复杂的哈希函数。此外,这些值有一个已知的固定长度,并且SSD上的序列化桶与物理SSD块完全匹配。通过这种方式,I/O的放大被最小化。我们的稀疏表没有处理一般的键值存储挑战,而是维护了一个双层哈希机制,这样它对缓存更友好。

7 CONCLUDING REMARKS

       自从2013年,百度搜索广告(Phoenex Nest)一直使用深度学习CTR模型作为标准生产工具。虽然在某种程度上,构建CTR模型似乎是一项成熟的技术,但仍有许多可能的方向来改进工业CTR模型。一个令人兴奋的方向是将近似近邻搜索(ANN)和最大内积搜索(MIPS)技术集成到赞助广告制作系统[20]中。这篇论文是关于另一个有趣的方向:将CTR模型训练从CPU转移到GPU。
       这篇论文,我们介绍了一个通过SSD和GPU,有能力在一个单一节点上训练超过10TB参数的CTR预测模型的集中式系统AIBox。我们提出了一个新颖的想法,将CTR预测模型分为两部分。用神经网络分区,我们把内存密集型的训练部分放在CPU上,内存受限的GPU作为计算密集型部分加速训练。此外,我们还提出了稀疏表(Sparse Table)在SSD上存储模型参数。为了较少SSD I/O延迟,我们利用内存作为快速缓存。还有,3-stage pipeline在网络、稀疏表、CPU&GPU学习重叠的执行,被应用在隐藏稀疏表操作的延迟上。我们用产品数据对比评估AIBox和标准的MPI分布式集群解决方案。结果表明了在保证相同的训练速度下,AIBox在降低成本方面是非常有效的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值