本着“赋予人们建立社区的力量,使世界更紧密地联系在一起”的使命,到 2017 年 12 月,Facebook 已经将全球超过二十亿人连接在一起。同时,在过去几年里,机器学习在实际问题上的应用正在发生一场革命,这场革命的基石便是机器学习算法创新、大量的模型训练数据和高性能计算机体系结构进展的良性循环。在 Facebook,机器学习提供了驱动几乎全部用户服务的关键动力,包括 News Feed、语音和文本翻译、照片和实时视频分类等服务。
Facebook 在这些服务中用到了各种各样的机器学习算法,包括支持向量机、梯度提升决策树和多种的神经网络。Facebook 的机器学习架构主要包括内部“机器学习作为服务”工作流、开源机器学习框架、以及分布式训练算法。从硬件角度看,Facebook 利用了大量的 CPU 和 GPU 平台来训练模型,以支持必要的训练频率,以满足服务的延迟需求。
机器学习在几乎所有的服务中都有应用,而计算机视觉只代表一小部分的资源需求。
Facebook 采用多种机器学习方法,包括但不限于神经网络。
大量的数据通过机器学习管道,这一点所带来的工程效率的挑战,远远不是计算节点可以解决的。
Facebook 目前在很大程度上依赖于 CPU 进行测试阶段的推断,以及 CPU 和 GPU 进行训练,但是也在不断地从每瓦特性能的视角创造和评估新的硬件解决方案。
机器学习一般包括两个阶段:
1)训练阶段:搭建模型,一般在线下(offline)进行。
2)推断阶段:在生产中运行训练好的模型,并且进行一系列的实时预测,该阶段在线上(online)进行。
Facebook 机器学习的一个显著特点是大量的数据对模型的训练有潜在的影响。这些数据的规模在整个架构的跨度上有许多意义。
News Feed(Facebook 信息流服务) 排序算法可以让人们在每次访问 Facebook 时第一眼看到与他们最相关的故事。首先训练一般模型,以选择最终用来确定内容排序的各种用户和环境因素。然后,当一个人访问 Facebook 时,该模型会从成百上千的候选中生成一组个性化的最佳状态、图片以及其他内容来显示,以及所选内容的最佳排序。
Ads 利用机器学习来决定对某一用户应显示哪些广告。Ads 模型被训练来学习如何通过用户特征、用户环境、先前的交互以及广告属性来更好地预测点击广告、访问网站或购买产品的可能性。
Search 服务针对各个垂直行业推出了一系列不同的、特定的子搜索,如视频、照片、人、事件等。分类层运行在各种垂直搜索顶部,来预测要搜索的是哪个方面。
Sigma 是整体分类和异常检测框架,用于许多内部应用,包括站点完整性、垃圾邮件检测、付款、注册、未经授权的员工访问和事件推荐。
Lumos 从图像和内容中提取高级属性和映射关系,使算法自动理解它。
Facer 是 Facebook 的人脸检测和识别框架。对于给定图像,它首先找出图像中的所有人脸。然后,运行针对特定用户的面部识别算法,来确定图中的人脸是你的好友的可能性。Facebook 通过这个服务帮助你选择想在照片中标记的好友。
Language Translation 是管理 Facebook 内容国际化的服务。该系统支持超过 45 种语言、2000 种翻译方向,每天帮助 6 亿人打破语言障碍,让他们能够看到翻译版本的 News Feed。
Speech Recognition 将音频转换成文本, 主要应用于为视频自动填补字幕。
Facebook 使用的机器学习模型包括逻辑回归(Logistic Regression,LR)、支持向量机(Support Vector Machine,SVM)、梯度提升决策树(Gradient Boosted DecisionTree,GBDT),以及深度神经网络(Deep Neural Network,DNN)。LR 和 SVM 用于训练和预测的效率很高。GBDT 使用额外的计算资源可以提高准确性。DNN 是最具表现力的模型,有能力达到最高的准确性,但是它利用的资源最多(计算量至少超过像 LR 和 SVM 这样的线性模型一个数量级)。
在 DNN 中,主要使用的网络类型有三种:多层感知器(Multi-Layer Perceptrons,MLP)一般用于结构化的输入特征(如排序),卷积神经网络(Convolutional Neural Networks,CNN)作为空间处理器(如图像处理),以及循环神经网络(RNN、LSTM)主要用于序列处理器(如语言处理)。
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 中训练的模型提供实时的预测。
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 中的首要方法。
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 的带宽。
不同服务的机器学习训练平台、频率、持续时间。
计算类型和位置
在 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 领域很活跃的研究方向之一。
一个常见的假设是,跨机器的数据并行需要一个专门的连接。然而,在关于分布式训练的工作中,研究人员发现基于以太网的网络就足够提供近似线性的扩展能力。
训练完成后,在线推断步骤包括将模型加载到机器上,并用实时输入运行该模型,以生成实时结果。
在线推断资源要求
这里以 Ads 排序模型来介绍在线推断模型的工作。Ads 排序模型过滤掉成百上千的广告,只在 News Feed 中显示前 1-5 个。这是通过对越来越小的广告子集进行逐渐复杂的排序计算过滤的结果。排序计算使用一个类 MLP 的模型,包含稀疏嵌入层,每一次过滤都在缩小广告的范围。稀疏嵌入层是内存密集型的,对于后面的过滤操作,参数会越来越多,它会从 MLP 过滤分离,在单独的服务器上运行。
从计算角度来说,大量的在线推断运行在 1xCPU(单插槽)或 2xCPU(双插槽)上,对于 Facebook 的服务,1xCPU 比 2xCPU 更节能高效,因此要尽可能的将模型从 2xCPU 迁移到 1xCPU 上。
除了资源需求外,在数据中心规模部署机器学习时还有一些重要因素要考虑,包括重要数据的要求,以及在面对灾难时的可靠性。
对于 Facebook 的许多复杂机器学习应用,例如 Ads 和 Feed Ranking,每一个训练任务需要处理的数据量超过上百的百万字节(terabytes)。此外,复杂的预处理操作用于确保数据的清理和规范化,以便高效传输和学习。这就对存储、网络和 CPU 提出了很高的资源要求。
Facebook 采用将数据负载和训练负载分开的方法来解决这一问题。将不同的负载分配给不同的机器:数据处理机器“reader”从存储中读取数据,处理并压缩它们,随后传递给训练机器“trainer”,训练机器只需要快速高效地执行训练操作。
Facebook 必须维护大量的服务器,以在任何时间都可以处理峰值负载。
在特殊日期,由于用户活动的变化,会导致日负荷高峰,大量的服务器池往往在某些时间段内处于闲置状态,这为非峰值时间提供了大量的计算资源。对于机器学习应用程序,这提供了一个充分利用分布式训练机制的机会,这些机制可以扩展到大量的异质资源(例如不同的 CPU 和 GPU 平台,具有不同的 RAM 分配)。例如,在 1xCPU 结构中,有四个主机共享一个 50G 的 NIC,如果 4 个主机试图同时与其他主机同步梯度,共享的 NIC 马上就会变成瓶颈,导致丢失包以及响应超时。因此,需要在网络拓扑和调度器之间进行协同设计,以在非峰值时间有效地利用空闲的服务器。
当 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
小彩蛋:如果您平常有阅读论文的习惯,并且愿意做一些论文编译整理的工作,或者有论文导读类稿件希望可以发布,欢迎关注 AI 前线(ai-front),在后台留下联系方式,我们将与您联系,并进行更多交流!