Facebook 的应用机器学习平台

960 阅读17分钟
原文链接: www.infoq.com

机器学习是Facebook许多重要产品和服务的核心技术。这篇论文来自Facebook的17位科学家和工程师,向世界介绍了Facebook应用机器学习的软件及硬件架构。

本着“赋予人们建立社区的力量,使世界更紧密地联系在一起”的使命,到2017年12月,Facebook已经将全球超过二十亿人连接在一起。同时,在过去几年里,机器学习在实际问题上的应用正在发生一场革命,这场革命的基石便是机器学习算法创新、大量的模型训练数据和高性能计算机体系结构进展的良性循环。在Facebook,机器学习提供了驱动几乎全部用户服务的关键动力,包括News Feed、语音和文本翻译、照片和实时视频分类等服务。

Facebook在这些服务中用到了各种各样的机器学习算法,包括支持向量机、梯度提升决策树和多种的神经网络。Facebook的机器学习架构主要包括内部“机器学习作为服务”工作流、开源机器学习框架、以及分布式训练算法。从硬件角度看,Facebook利用了大量的CPU和GPU平台来训练模型,以支持必要的训练频率,以满足服务的延迟需求。

关键摘要:

  • 机器学习在几乎所有的服务中都有应用,而计算机视觉只代表一小部分的资源需求。
  • Facebook采用多种机器学习方法,包括但不限于神经网络。
  • 大量的数据通过机器学习管道,这一点所带来的工程效率的挑战,远远不是计算节点可以解决的。
  • Facebook目前在很大程度上依赖于CPU进行测试阶段的推断,以及CPU和GPU进行训练,但是也在不断地从每瓦特性能的视角创造和评估新的硬件解决方案。

Facebook的机器学习

机器学习一般包括两个阶段:

1)训练阶段:搭建模型,一般在线下(offline)进行。
2)推断阶段:在生产中运行训练好的模型,并且进行一系列的实时预测,该阶段在线上(online)进行。

Facebook机器学习的一个显著特点是大量的数据对模型的训练有潜在的影响。这些数据的规模在整个架构的跨度上有许多意义。

A.主要机器学习应用服务

News Feed(Facebook信息流服务)排序算法可以让人们在每次访问Facebook时第一眼看到与他们最相关的故事。首先训练一般模型,以选择最终用来确定内容排序的各种用户和环境因素。然后,当一个人访问Facebook时,该模型会从成百上千的候选中生成一组个性化的最佳状态、图片以及其他内容来显示,以及所选内容的最佳排序。

Ads利用机器学习来决定对某一用户应显示哪些广告。Ads模型被训练来学习如何通过用户特征、用户环境、先前的交互以及广告属性来更好地预测点击广告、访问网站或购买产品的可能性。

Search服务针对各个垂直行业推出了一系列不同的、特定的子搜索,如视频、照片、人、事件等。分类层运行在各种垂直搜索顶部,来预测要搜索的是哪个方面。

Sigma是整体分类和异常检测框架,用于许多内部应用,包括站点完整性、垃圾邮件检测、付款、注册、未经授权的员工访问和事件推荐。

Lumos从图像和内容中提取高级属性和映射关系,使算法自动理解它。

Facer是Facebook的人脸检测和识别框架。对于给定图像,它首先找出图像中的所有人脸。然后,运行针对特定用户的面部识别算法,来确定图中的人脸是你的好友的可能性。Facebook通过这个服务帮助你选择想在照片中标记的好友。

Language Translation是管理Facebook内容国际化的服务。该系统支持超过45种语言、2000种翻译方向,每天帮助6亿人打破语言障碍,让他们能够看到翻译版本的News Feed。

Speech Recognition将音频转换成文本,主要应用于为视频自动填补字幕。

B. 机器学习模型

Facebook使用的机器学习模型包括逻辑回归(Logistic Regression,LR)、支持向量机(Support Vector Machine,SVM)、梯度提升决策树(Gradient Boosted Decision
Tree,GBDT),以及深度神经网络(Deep Neural Network,DNN)。LR和SVM用于训练和预测的效率很高。GBDT使用额外的计算资源可以提高准确性。DNN是最具表现力的模型,有能力达到最高的准确性,但是它利用的资源最多(计算量至少超过像LR和SVM这样的线性模型一个数量级)。

在DNN中,主要使用的网络类型有三种:多层感知器(Multi-Layer Perceptrons,MLP)一般用于结构化的输入特征(如排序),卷积神经网络(Convolutional Neural Networks,CNN)作为空间处理器(如图像处理),以及循环神经网络(RNN、LSTM)主要用于序列处理器(如语言处理)。

Facebook产品或服务使用的机器学习算法。

C.Facebook内部“机器学习作为服务”

Facebook有几个内部平台和工具包,目的是简化在Facebook产品中利用机器学习的任务。例如FBLearner、Caffe2和PyTorch。FBLearner包含三个工具,每一个都重点负责机器学习管道的不同部分。FBLearner利用内部作业调度程序在GPU和CPU的共享池分配资源、安排工作。Facebook大多数的机器学习训练通过FBLearner平台完成。这些工具和平台协同工作的目的是提高机器学习工程师的生产力,并帮助他们专注于算法的创新。

Facebook机器学习流和架构。

FBLearner Feature Store(特征仓库)。许多机器学习建模任务的出发点是聚集和生成特征。特征仓库本质上是一个可以用于训练和实时预测的多个特征生成器的目录,并且也可以将它看做一个市场,多个团队可以在这里共享并发现特征。

FBLearner Flow是Facebook用于模型训练的机器学习平台。Flow是一个通道管理系统,执行workflow(工作流),其中描述了训练或评测模型的步骤,以及所需资源。workflow是由离散的单元构成的,称作操作器(operater),每个operator都有输入和输出。Flow也含有实验管理的工具以及一个简单的用户界面,来跟踪每个workflow执行或实验中生成的所有工件和数据。

FBLearner Predictor(预测器)是Facebook内部的推理引擎,采用Flow中训练的模型提供实时的预测。

D. 深度学习框架

Facebook使用两种完全不同、但协同工作的深度学习框架:PyTorch,主要用于优化研究环境,和Caffe2,用于优化生产环境。

Caffe2是Facebook的内部训练和部署大规模机器学习模型的框架。Caffe2关注产品要求的几个关键的特征:性能、跨平台支持,以及基本的机器学习算法。Caffe2的设计使用的是模块化的方法,所有的后端实现(CPU,GPU,和加速器)共享一个统一的图表示。单独的执行引擎满足不同图的执行需求,并且Caffe2加入了第三方库(例如,cuDNN、MKL,和Metal),以在不同的平台上优化运行。

PyTorch是Facebook人工智能研究所用的框架。它的前端注重灵活性、调试以及动态神经网络,能够快速进行实验。由于它依赖Python,所以它没有针对生产和移动部署而优化。当研究项目产生了有价值的结果时,模型需要转移到生产中。传统方法是通过在产品环境中用其他框架来重写训练流程来实现转移。最近Facebook开始搭建ONNX工具来简化这一转移过程。

ONNX,该深度学习工具系统在整个行业中仍处于初期阶段。由于不同的框架(Caffe2和PyTorch)针对不同的问题有各自的优点,因此在不同的框架或平台之间交换训练好的模型是目前的一大生产需求。在2017年底,Facebook与其他相关团队合作推出ONNX(Open Neural Network Exchange,开源神经网络交换),是一种以标准方式表示深度学习模型的格式,以便在不同的框架和供应商优化库之间实现互操作。Facebook内部使用ONNX作为将PyTorch环境下的研究模型转移到高性能生产环境Caffe2中的首要方法。

机器学习的资源解读

A.Facebook硬件资源总结

Facebook的架构有着悠久的历史,为主要的软件服务提供高效的平台,包括自定义的服务器、存储和网络支持,以满足每个主要工作的资源需求。Facebook目前支持8个主要的计算和存储框架,对应8个主要服务。

2U Chassis,具有三个计算插槽,支持两种可供选择的服务器类型。一个是单插槽CPU服务器(1xCPU),包含4个Monolake服务器子卡,另一个是双插槽CPU服务器(2xCPU)。

为了加速更大以及更深神经网络的训练过程,Facebook打造了Big Basin,最新一代GPU服务器。

最初的Big Basin GPU服务器包含8块NVIDIA Tesla P100 GPU加速器。

与之前的Big Sur GPU服务器相比,Big Basin平台在每瓦特性能上有了极大的提高,受益于单精度浮点运算从7 teraflops到15.7 teraflops的提高,以及900GB/s的带宽。

B. 训练阶段资源配置

不同服务的机器学习训练平台、频率、持续时间。

计算类型和位置

  • 在GPU进行训练:Lumos, Speech Recognition、Language Translation。
  • 在CPU进行训练:News Feed、Sigma。
  • 在CPU和GPU上进行训练:Facer(整体模型在GPU上每隔几年进行训练,因为该模型比较稳定,用户特定模型在1xCPU进行训练)、Search(利用多个独立的垂直搜索,并将预测分类器应用在最合适的领域)。

训练过程大量利用生产存储的数据,出于性能和带宽的原因,生产环境中GPU需要布局在数据获取的附近。每个模型利用的数据都在快速增加,所以靠近数据源的位置随时间而变得越来越重要。

内存、存储,以及网络

从内存容量的角度来看,CPU平台和GPU平台都提供了足够的训练空间。例如Facer,在32GB RAM的1xCPU上训练用户特定的SVM模型。Facebook的机器学习会用到大部分存储数据,这也为数据存储附近的计算资源的放置创建了区域性偏好。随着时间的推移,大多数服务显示出利用更多用户数据的趋势,因此这将增加对其他Facebook服务的依赖性,同时也增加了数据访问的网络带宽。

规模考虑与分布式训练

训练神经网络需要用随机梯度下降算法来优化参数权重,通过对数据分批(batch、mini-batch)评估的迭代权重更新来完成。传统的模型在一个机器上完成训练,训练性能可以通过增加模型、数据并行达到最优。但是考虑到训练所需数据会随时间而增长,硬件限制会增加整体的训练延迟和收敛时间,甚至到无法接受的地步。为了克服这些硬件带来的局限性,分布式训练是一个解决方案,也是目前AI领域很活跃的研究方向之一。

一个常见的假设是,跨机器的数据并行需要一个专门的连接。然而,在关于分布式训练的工作中,研究人员发现基于以太网的网络就足够提供近似线性的扩展能力。

C. 推断阶段的资源配置

训练完成后,在线推断步骤包括将模型加载到机器上,并用实时输入运行该模型,以生成实时结果。

在线推断资源要求

这里以Ads排序模型来介绍在线推断模型的工作。Ads排序模型过滤掉成百上千的广告,只在News Feed中显示前1-5个。这是通过对越来越小的广告子集进行逐渐复杂的排序计算过滤的结果。排序计算使用一个类MLP的模型,包含稀疏嵌入层,每一次过滤都在缩小广告的范围。稀疏嵌入层是内存密集型的,对于后面的过滤操作,参数会越来越多,它会从MLP过滤分离,在单独的服务器上运行。

从计算角度来说,大量的在线推断运行在1xCPU(单插槽)或2xCPU(双插槽)上,对于Facebook的服务,1xCPU比2xCPU更节能高效,因此要尽可能的将模型从2xCPU迁移到1xCPU上。

数据中心规模的机器学习

除了资源需求外,在数据中心规模部署机器学习时还有一些重要因素要考虑,包括重要数据的要求,以及在面对灾难时的可靠性。

A.从数据到模型

对于Facebook的许多复杂机器学习应用,例如Ads和Feed Ranking,每一个训练任务需要处理的数据量超过上百的百万字节(terabytes)。此外,复杂的预处理操作用于确保数据的清理和规范化,以便高效传输和学习。这就对存储、网络和CPU提出了很高的资源要求。

Facebook采用将数据负载和训练负载分开的方法来解决这一问题。将不同的负载分配给不同的机器:数据处理机器“reader”从存储中读取数据,处理并压缩它们,随后传递给训练机器“trainer”,训练机器只需要快速高效地执行训练操作。

B. 使用规模

Facebook必须维护大量的服务器,以在任何时间都可以处理峰值负载。

在特殊日期,由于用户活动的变化,会导致日负荷高峰,大量的服务器池往往在某些时间段内处于闲置状态,这为非峰值时间提供了大量的计算资源。对于机器学习应用程序,这提供了一个充分利用分布式训练机制的机会,这些机制可以扩展到大量的异质资源(例如不同的CPU和GPU平台,具有不同的RAM分配)。例如,在1xCPU结构中,有四个主机共享一个50G的NIC,如果4个主机试图同时与其他主机同步梯度,共享的NIC马上就会变成瓶颈,导致丢失包以及响应超时。因此,需要在网络拓扑和调度器之间进行协同设计,以在非峰值时间有效地利用空闲的服务器。

C. 灾难发现

当Facebook全球计算、存储和网络痕迹的一部分丢失时,能够无缝地处理该问题一直是Facebook Infrastructure的长期目标。在内部,Facebook的灾难恢复小组定期进行演练,以识别和补救全球架构和软件堆栈中最薄弱的环节。破坏行动包括把整个数据中心离线而几乎不被发觉,以确保Facebook的任何一个全球数据中心的丢失对业务造成最小的干扰。

如果不训练模型会发生什么?

作者分析了使用机器学习的三个关键服务,来说明如果在训练过程中模型不能进行频繁地更新所带来的影响。

Community Integrity(社区完整性):Facebook的Community Integrity团队充分利用机器学习技术来检测文本、图像和视频中的攻击性内容。攻击内容检测是垃圾邮件检测的一种特殊形式。对手会不断寻找新的方法绕过Facebook的鉴别器,向用户显示不良内容。如果不能进行完全训练,会导致无法抵御这些不良内容。

News Feed:在用户每次访问Facebook时为每一个用户识别最相关的内容,将显著地依赖于最先进的机器学习算法,以便正确地找到并为该内容排序。旧的News Feed模型对该服务会产生质的影响。即使是一周的训练计算损失也会阻碍News Feed团队探索新模型和新参数的能力。

Ads:该服务为人们寻找并展示最好的广告,对机器学习有重要的依赖性。研究人员发现,利用过时的机器学习模型的影响是以小时衡量的。换句话说,使用一天前的模型比使用一小时前的模型影响更糟。

灾难恢复的架构支持

2017年12月Facebook全球数据中心位置。

随着深度学习在多个产品中得到应用,GPU计算和大数据之间的布局越来越重要。并且面向巨型区域存储的战略支点使计算-数据的共同布局变得更加复杂。巨型区域的概念意味着少量的数据中心区域将容纳大部分Facebook的数据。并且容纳整个GPU机群的区域并不位于存储的巨型区域内。
因此,除了协同定位的重要性计算数据,很快就要考虑如果完全失去存储GPU的区域可能发生什么事情。这一考虑推动了多样化GPU物理位置的需求。

未来方向:硬件、软件及算法的协同设计

增加计算强度通常会提高底层硬件的效率,所以在延迟允许的范围下,用更大的batchsize进行训练是可取的。计算范围内的机器学习工作负载将受益于更宽的SIMD单元、专用卷积或矩阵乘法引擎,以及专门的协同处理器。

有些情况下,每个计算节点的小批次是固定要求,这通常会降低计算密集度。因此,当完整的模型不适用于固定的SRAM或最后一级缓存时,可能会降低表现性能。这可以通过模型压缩、量化和高带宽存储器来解决这一问题。

减少训练时间和加快模型交付需要分布式训练。分布式训练需要细致的网络拓扑和调度的协同设计,以有效地利用硬件达到良好的训练速度和质量。分布式训练中最常用的并行形式是数据并行,这就要求梯度下降在所有的节点上同步。

总结

在Facebook,研究人员发现了应用机器学习平台的规模和驱动决策方面设计中出现的几个关键因素:数据与计算机联合布局的重要性、处理各种机器工作负载的重要性,不仅仅是计算机视觉,以及来自日计算周期的空闲容量的机会。在设计端到端的解决方案时,研究人员考虑了每一个因素,这些解决方案包括定制设计的、现成的、开放源码的硬件,以及一个平衡性能和可用性的开源软件生态系统。这些解决方案为服务了全球超过21亿人的大规模机器学习工作提供了动力,反映了专家们在机器学习算法和系统设计方面的跨学科努力。

论文原文:Applied Machine Learning at Facebook: A Datacenter Infrastructure Perspective

感谢蔡芳芳对本文的审校。