2017年,阿里巴巴推荐算法团队和计算平台PAI团队合作打造了eXtreme Parameter Sever (XPS) 机器学习平台,其中eXtreme寓意为“追求极致”, 体现我们希望设计具有极致性能和效果的机器学习平台的愿景。XPS平台已经广泛全流量运行在手机淘宝的猜你喜欢、生活研究所、飞猪旅行和天猫推荐等大数据场景。
2017年双11购物狂欢节当天,小时级XNN模型在猜你喜欢和天猫推荐场景上线,稳定和快速地使用了用户双11的实时行为信息,显著提升了双11当天的收入和用户价值。在性能上,XPS平台上的例行算法,现在每天能轻松处理100亿规模样本1000亿规模的特征,算法运行速度快,容错能力强,资源利用率高。本文将对XPS平台的整体结构进行介绍,希望通过这些分享和大家交流我们在分布式算法设计和框架优化上的经验。
近年来,阿里巴巴个性化推荐和个性化搜索给用户带来了很好的体验,用户行为数量也随之大幅增长。特别是移动终端的业务飞速发展,用户和商品两个维度都呈现爆发式增长,用户和产品状态也随时间持续动态变化。在这种动态的超大规模的数据体量下,打造高效的分布式机器学习平台,精准预测用户对产品的点击率和转化率是非常有价值的,也是很有挑战的。
规模庞大且高频变化的特征和样本,给分布式机器学习平台的设计带来的挑战具体可以归结为样本、特征和分布式规模三个方面:
- 在样本方面,我们每天面对的是百亿规模的训练数据,累计六个月的历史训练数据就超过了万亿规模。显然,传统的全量多轮迭代的机器学习算法已经不太适合这样规模的训练样本,因为这类算法需要消耗的计算资源极多,也无法很好地引入数据的时序性。
- 在特征方面,大规模样本下特征总量轻易超过千亿量级,传统的特征编号方法需要消耗极多的机器资源和耗费很长的计算时间来完成特征编号,而且对新出现的特征也难以及时进行编号。从资源消耗和时间消耗上看,特征序列化编号方法已经是不可承受的步骤。此外,采用类似TensorFlow里通过string_to_hash_bucket的方法将特征映射到固定范围的做法,虽然保证固定了tensor的shape,减少了参数总量,但是在特征总数巨大的时候则又引入了大量的哈希冲突,影响了算法效果。
- 在分布式规模方面,大规模特征下给Server的存储和分布式计算性能带来巨大压力。举例来说,1万亿个32位float浮点数就需要3.63TB的存储空间,再加上需要保留的历史梯度等,往往需要300到600台server才能使各个进程的内存占用控制在一个合理范围。Server数成倍增长,导致并行请求数也线性增长,给通信也带来较大压力。同时,存储量以及单任务进程数的增长,也给集群调度、容错、网络、IO带来较大的压力。
面对这些挑战,XPS平台提出了很多创新的技术来应对,向“极限参数服务器”的目标前进了一步:
- 在样本处理问题上,我们采用流式学习算法为主的算法选型来解决大规模样本问题。在流式学习下,对每一批新数据,直接在当前模型上进行增量训练,并产出下一个模型,无需加载全量数据进行多轮全量学习。流式学习算法选型,平衡了数据规模和资源消耗问题,更轻量级地应对了大规模样本的问题;
- 在特征处理问题上,采用了将特征哈希映射为哈希值的方法替代特征编号机制。在节省内存、提升性能的同时,支持了特征的动态稀疏化正则机制和表示向量维度的动态扩张机制,解决了特征总量过大的问题;
- 在分布式规模方面,通过异步Checkpoint和Exactly Once Failover以及高性能的ArrayHashMap等机制,加上动态稀疏化正则机制等特征处理技术,保证了分布式训练的性能,提高了Server的存储效率。
面对这些大规模下的机器学习问题,eXtreme Parameter Server在阿里巴巴内部应运而生,针对性地解决了大规模样本和大规模特征的挑战,并得到了广泛的应用。
XPS在阿里巴巴内部的猜你喜欢、天猫、购物链路、飞猪、生活研究所、阿里妈妈等业务场景广泛应用,对用户点击率、线上收入提升、线上用户价值提升效果显著。
下面我们对XPS平台的系统结构和数据流程、分布式优化、核心算法和算子体系进行介绍。
一、系统结构和数据流程
1.1 系统结构
XPS平台整体结构如下图所示。在数据源上,底层支持OSS File、MaxCompute离线存储、流式数据源Streaming DataHub和Kafka等数据源。用户在MaxCompute上同时完成离线数据处理和XPS算法调用。集群调度使用了阿里集团的飞天集群调度,能够有效避免资源抢占,高效利用计算资源;在算法层,XPS提供了XNN/XFTRL/XSVD/XGBOOST/FM等算法;在业务层,我们支持了推荐、广告和搜索等业务场景。
业务方通过MaxCompute中的SQL进行XPS平台的算法调用,配置选择需要的算法和优化算子,能够快速地完成训练任务的搭建。预估服务会来抓取XPS产出的模型,提供给线上做预估服务。XPS提供了完善的容错机制,用户任务失败会自动被重新拉起训练。
1.2 数据流程
目前,XPS平台在阿里巴巴内部建立了完善的数据流解决方案,我们与阿里集团各个团队合作,形成了从训练数据生产、特征工程、模型训练、模型评估、模型部署、模型打分的数据流程,XPS整体数据处理流程如下图所示。
数据生产、特征工程、模型训练和模型评估阶段,我们采用了阿里的MaxCompute离线存储系统。平台上单个任务能够轻松应对每天百亿规模的训练数据,千亿特征规模的特征学习。通过支持大规模的特征,能充分挖掘了数据中蕴含的数据规律。模型训练采用流式调度,在流式调度学习下,每次学习只需要加载之前存储的模型,输入新样本进行训练产出新模型,部署到线上进行预估。整体上,相比全量计算,流式学习节约了大量计算资源。
在预估服务端,我们采用阿里内部的rtp-xps服务,我们将模型转化为tf格式,采用tf-serving来做预估服务。在模型评估方面,我们基于rtp-xps和MaxCompute研发了自己的一致性测试方案和工具,结合tf-serving可以实现快速的特征和模型一致性测试。在特征工程上,我们在开发XPS的过程中,开发了一套高性能的SessionServer服务,SessionServer提取了用户一段时间的前文行为数据,这些数据更好地帮助我们理解用户,也捕捉了用户的实时行为特性。
二、分布式优化
为了能够支持千亿规模特征、万亿规模样本,我们针对分布式机器学习场景下的异步通信做了专门优化。XPS框架自主研发了高性能的通信框架,在分布式机器学习场景下的异步通信场景下较传统的MPI通信性能提升1~2倍。通过这些优化手段,XPS的Server数能够横向扩展至800个,完成千亿特征万亿参数规模的机器学习任务。分布式优化技术具体包括下面几个方面:
2.1 特征哈希化
XPS框架支持直接输入哈希散列计算后的特征ID,或者对输入的字符串特征自动计算哈希值。这样整个计算过程和输出模型均只保存哈希值。我们与在线inference服务打通,输入样本、输出模型以及训练迭代、通信都能直接哈希散列特征ID,在实际线上的模型训练中,节省了一半的内存,并且性能也提升了1倍。
2.2 动态特征扩缩容
在流式学习场景,一个显著的特点是快速变化的动态特征。每时每刻都有新的特征加入,也有老的特征被删除,在引入实时的自动化会话特征之后,在较短时间内会有千亿量级的特征插入和删除。在这种情形下,需要底层框架能够支持高频、动态的特征增删和通信。XPS框架针对高频增删特征场景做了专门的优化,重新设计实现了XPS-ArrayHashMap,采用realloc/mremap方式手工管理内存,插入、删除KV的性能显著高于std::unordered_map、google::DenseMap等哈希表实现;更为重要的是,XPS-ArrayHashMap支持直接零拷贝通信,消除了序列化、反序列化步骤。
2.3 全局Checkpoint和Exactly Once Failover
万亿参数的总存储空间可以达到10TB级别。在这个量级的存储空间需求下,使用400-800个server是很常见的需求。而大量的server进程和worker进程给分布式参数服务器带来很高的稳定性和扩展性压力。针对这种场景,XPS框架支持了多Worker并行加载、输出模型,异步Checkpoint和异步Failover等机制,对节点失效能够零感知自动化恢复。
不同于独立的HPC集群,阿里集团的飞天集群在并行节点数量很大时,遇到个别节点故障的概率是比较高的。XPS框架支持完善的Failover功能,在各类流式数据源和离线数据源上,都支持Exactly Once的Failover,能够将数据流和模型都恢复到节点失败的前一刻,从而做到节点重启后不丢数据和不重复计算。
2.4 高并发通信
XPS框架自主研发了高性能的通信框架,在分布式机器学习场景下的异步通信场景下较传统的MPI通信性能提升1~2倍。针对大规模的特征场景,XPS的通信层对稀疏矩阵能够支持零拷贝收发,并通过稀疏层、稠密层分别合并通信,减少通信包数量并降低了通信延迟。通过这些优化手段,使得XPS的Server数能够横向扩展至800个,从而能够支持在训练过程中存储千亿特征,万亿参数的规模。
2.5 表示学习优化
学习稀疏特征的表示向量对稀疏特征的计算和通信优化是最重要的,我们对稀疏哈希特征下的Embedding矩阵计算进行了深度优化,极致地优化表示向量学习中的性能。具体地,通过Pull通信操作得到的表示向量组虽然表示一个稀疏矩阵,但全部表示向量在一个连续的缓冲区中,用这段通信buffer数据可直接构造ArrayHashMap,不需要内存拷贝。通过这样的哈希表实现的稀疏特征索引接口,计算时能够以O(1)时间复杂度访问到通信传过来的各稀疏特征的表示向量,这样,稀疏表示向量组无须转换成稠密格式也能被高效地使用,消除了创建中间稠密矩阵的开销,大幅加快了minibatch的Embedding矩阵计算。
三、核心算法
大规模的训练样本,全量多轮迭代算法即使优化得再高效,也无法避免每天需要重新训练全量数据的问题,显然这已经不适合大数据的发展。流式学习算法选型,能够平衡了数据规模和资源消耗问题,轻松应对了大规模样本的学习问题。以流式学习算法为核心的分布式机器学习平台,在算法调参、算法评估、算法监控等各方面都有很多有趣的优化内容。
XPS旨在设计超大规模数据场景下高效的流式学习算法平台,我们当前主要设计了线性算法XFTRL、双线性算法XSVD和深度学习算法XNN。
3.1 XFTRL算法
XFTRL算法是对经典线性算法FTRL的扩展,是为了解决大规模数据下FTRL的一些缺点而提出的。我们在使用FTRL算法的时候,遇到了很多数值问题和稳定性问题,为了解决这些问题,我们设计了几个优化点:
第一,引入正则防止奇异权重。在实践中,我们发现FTRL算法在运行中容易发生权重突然陡增的现象,通过在FTRL中引入变量z的二正则,可以有效抑制权重突然过大的现象;
第二,引入权重版本控制和梯度平均让更新更平滑。我们在更新梯度时,引入了Pull权重和Push梯度时的权重版本差打折机制,来减轻分布式下的梯度更新时worker和server的权重不一致的问题。我们进一步对minibatch下Server端的梯度和做平均,让模型权重更新过程更加平滑;
第三, 引入流式学习下的参数衰减机制。我们对FTRL算法中的w, z和n等变量在每次更新完之后,乘以一个衰减系数,让整个模型权重偏向最新数据,更好地捕获数据的时效性。
3.2 XSVD算法
XSVD算法是针对电商系统中“用户”、“产品”和“历史行为产品”三个核心元素,通过改进SVD++提出的算法。SVD++是推荐领域经典的算法,但我们很少看到大规模数据场景下的解决方案。我们的核心动机是解决SVD++算法在万亿样本下的可学习性问题。在流式学习的算法设计基调下,我们需要将SVD算法改造为流式场景下可学习的模式。很容易想到,对SVD++中的反馈产品隐向量累加项,只取当前行为的前K次行为作为反馈项,就可以实现流式学习。其次,为了让XSVD算法也具有LR算法的表达能力,我们也将用户,产品和会话特征也作为普通的特征,和隐向量一起做联合学习。此外,为了丰富XSVD的表达能力,我们还在XSVD中引入阿里内部的SLRM算法的“模型特征化”的转化思想,通过将SLIM算法中需要学习的产品序对关系映射为学习产品序对的特征权重的方式在XSVD中引入了SLIM思想。
3.3 XNN算法
XNN算法是我们提出的深度学习算法,其结构图如下图所示。XNN主要包含了输入层(InputLayer)、转化层(TransformLayer)、乘积激活层(MultiActiveLayer)和输出层(OutputLayer)。
XNN网络的InputLayer对输入的离散特征、组合特征和连续特征进行处理,每个one-hot编码的特征会进行short和long编码,然后按照特征组进行累加(reduce_sum)操作。TransformLayer对输入层InputLayer进行各种归一化变化然后推送给MultiActiveLayer,MultiActiveLayer进行逐层的矩阵连乘和激活操作,最后顶层被Sigmoid激活算子作用后输出。XNN的输入数据按照特征组来组织,以降低在做reduce_sum时cache miss的代价。矩阵操作混合使用Eigen矩阵库和CBlas矩阵库,平衡数据接口的简洁性和计算的高效性。
相比经典的深度学习算法,它主要有以下优点:
- 动态特征稀疏化正则。我们根据每个特征f的动态效用值Utlity(f)实现特征的动态增加和动态删除, 当Utility(f)大于一定阈值时创建特征并学习特征权重,小于一定阈值时擦除特征并删除特征权重。动态特征的设计思想有效控制了可学习的特征总量;
- 动态表达维度扩张。我们根据每个特征f的动态信息量Infomation(f),给不同特征赋予不同的隐向量维度,对重要特征进行高维压缩,不重要的特征进行低维压缩,提高特征价值,提升内存使用效率。
- 自动化会话特征建模。我们在模型中自动统计长期、中期和短期的会话特征,把会话特征加入神经网络进行特征统计值和隐表达的联合学习,自动化会话特征思想将在算子设计中详细介绍。
- 分频次正则。我们对不同频次的特征采用不同的正则系数,以避免局部过拟合,最大化测试准度。在性能方面,猜你喜欢场景累计的全量数据,包含了千亿规模的特征和万亿规模的样本,单个样本平均一百个特征,在5600核16TB内存的资源开销下(和MR任务混部的普通CPU集群),XNN算法可以在7小时内完成每天增量的百亿规模的流式样本的学习。
XFTRL、XSVD和XNN算法是XPS平台比较独特的新算法,XPS平台还支持以下经典算法: XGBOOST、Factorization Machine、OWL-QN、Word2Vector等。未来,我们会不断扩展XPS的算法集,提出更多的创新算法。我们还将进一步研究流式学习下更多的工程特性,比如去中心化设计、慢机的智能化处理和通信层机制优化,建立更加完善的流式学习机器学习平台机制。
四、算子体系
在开发XPS的过程中,我们抽象了一些通用的算法思想,逐步形成了XPS的算子体系。使用XPS平台的算法用户设计一个新算法的时候,设计完算法之后,只需要选择系统中的算子进行搭配,就可以完成算法开发。算子体系的设计,不仅加速了算法构建过程,提升了算法开发、调试的效率,同时还增强算法的表达能力。我们主要设计了下面的算子:
4.1 流式评估算子
针对XPS的流式训练数据,我们设计了流式评估框架,极大地加速了我们的调参工作,有效地帮助我们进行模型正确性效验。流式测试算子具体思想也十分简单,每经过M个Batch的训练,我们就对未来的N个Batch的数据做一次评估,并观察预估数据上的AUC, MAE, RMSE, 最大权值和最小权重等指标,同时密切关注预估准度PCOPC(Predict Click Over Post Click)。这样的评估机制,极大地提升了参数调试的效率。同时,在训练结束时,这些指标也反应出模型的质量,训练框架会检查这些参数,只有它们达到一定的正确性标准,才产出模型给预估服务模块进行模型部署。
4.2 自动化会话特征算子
在点击率预估和转化率预估场景,用户在最近一段时间内的会话特征的重要性是很高的。一般的系统中,用于提供会话特征的SessionServer能提供的只是一定维度的统计。我们提出了Automatic Session这种“特征模型化”的设计思想。具体而言,模型一边进行数据训练,一边统计每个特征在一定的时间内的曝光和点击,然后计算每个特征在不同周期的点击率,加入到训练特征中其他特征一起训练。Automatic Session的加入,极大地丰富了我们的特征体系。我们提供了长中短三个衰减系数项,用户可以在任何XPS算法中通过配置这三个衰减系数引入自动化会话特征算子,增强模型本身的表达能力。
4.3 梯度平均算子
频率过低的特征的学习容易造成模型权重过度分散而引入过拟合,频率过高的特征因为局部过度更新也容易过拟合。Server端每次更新权重的时候,会根据特征频次对梯度做不同方式的打折。
4.4 异步更新控制算子
异步更新控制算子根据Pull模型权重和Push梯度时模型权重的版本差做梯度打折,防止了异步更新的效率损失。版本差低的梯度更新值置信度更高,版本差高的梯度更新值置信度更低。
除了以上算子而外,XPS里面还有激活函数选择算子,正则选择算子,变量衰减算子和安全性检查算子。
对于XPS的算法开发用户,我们在提供高效的分布式扩展性的基础上,还抽象了一套面向算法开发者的SDK,对用户屏蔽了复杂的分布式调度、通信和同步、异步等底层细节。算法开发用户只需要考虑算法总体流程、Worker上计算梯度的逻辑以及Server上更新模型的逻辑,选择算法算子体现中的算子,就可以开发出千亿特征的算法。一个XPS新算法的构建过程,一般会包含下面9个步骤:
- 完成新算法Worker端梯度计算代码;
- 选择加入自动化会话特征,以丰富特征体系;
- 加入流式测试算子,方便快速调参和模型监控;
- 选择梯度平均函数保持更新的平滑性;
- 选择异步更新控制算子的版本差控制函数类型;
- 通过激活函数选择算子来选择激活函数;
- 通过正则选择算子来选择正则方法;
- 选择变量衰减值,激活变量衰减算子,进行变量的流式衰减;
- 选择安全性检查算子对梯度值、更新值和模型最大最小值进行安全性检查和安全性控制。
通过XPS的算子抽象设计,算法开发用户对算法的优化算子有了更多灵活性的选择。在这种方式下,用户可以集中精力进行算法创新性研究,而忽略不必关心的技术细节。在阿里集团中,XPS平台已经帮助用户研发了SLRM新算法,其他新算法也在研究之中。
经过大量的实践,eXtreme Parameter Server平台已经成为阿里集团解决超大规模样本和特征学习问题的新一代分布式机器学习系统。2017年,XPS被广泛应用到阿里集团的搜索,广告和推荐等场景,算法开发用户数量也在快速增长。2018年,我们将在XPS中建设图像和NLP算法;我们也正在完善TensorFlow编程模式,将支持用户使用python编程接入TensorFlow,方便用户能快速地编写自己的模型,并且调用高效的XPS的Sever功能;我们还在整合强化学习算法框架和引入阿里基础特征服务系统AliBasicFeatureServer。
高速发展的阿里集团,未来将会遇到更多的大数据研究问题,这些问题很挑战,也很迷人。XPS将会在极限化参数服务器的设计理念下坚定前行。XPS算法负责人范朝盛和工程负责人陈绪表示: eXtreme Parameter Sever的目标是设计追求极致性能和效果的分布式参数服务器,我们走出了一步,未来还有很长的路要走,我们将努力用AI技术改变我们的生活。
原文发布时间为:2017-12-14
本文作者:阿里XPS团队