如何解决大规模机器学习三大痛点?x

时间:2022-06-19 13:08:01 来源:网友投稿

 如何解决大规模机器学习的三大痛点? 阿里妹导读:阿里巴巴电商平台有上亿的用户和产品,每天产生百亿规模的用户反馈数据。比如淘宝首页的猜你喜欢场景,每天就有 100 亿规模的用户行为数据。如此超大规模的训练数据,给分布式机器学习带来了巨大的挑战,也引入了有趣的研究问题。

 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 技术改变我们的生活。

推荐访问:三大 如何解决 机器

版权所有:天海范文网 2010-2024 未经授权禁止复制或建立镜像[天海范文网]所有资源完全免费共享

Powered by 天海范文网 © All Rights Reserved.。鲁ICP备10209932号