Facebook十亿级用户运用机器进行数据处理


Facebook公司的许多机器学习模型,成功的主要因素就是普遍而高质量的可用数据。快速处理并将这些数据提供给机器学习模型的能力可以确保咱们部署快速有效的离线训练。算法


对于复杂的机器学习应用程序,如广告和排名,每一个训练任务所需的数据量都超过数百TB大小。此外,复杂的预处理逻辑的使用能确保数据被清理并归一化,以便高效地迁移和更轻松地学习。这些操做对资源的要求很是高,特别对存储量,网络和CPU的需求。


做为一个通用的解决方案,咱们尝试对训练工做量中的数据进行解耦。这两个工做量都有很是显著的特色。一方面,它很是复杂,具备临时的,依赖业务性的,且变化快等特色。另外一方面,训练工做量一般是固定的(例如GEMM),稳定的(核心业务相对较少),高度优化,且更偏心于“干净”的环境下工做(例如,独占高速缓存使用和最小线程争夺)。


为了优化这二者,咱们在物理上对不一样的机器的不一样工做负载进行隔离。数据处理机器,又名“readers”,从存储器中读取数据,处理和压缩它们,而后将结果反馈给一个叫作“trainers”的训练机器。另外一方面,trainers只专一于快速有效地执行任务。readers和trainers能够分布以便提供更灵活性和可扩展性的应用。此外,咱们还优化了不一样工做负荷的机器配置。


另外一个重要的优化指标是网络使用。训练过程产生的数据流量很是重要的,而且有时候会忽然产生。若是没有智能化处理的话,这很容易就会致使网络设备的饱和,甚至干扰到其余服务。为了解决这些问题,咱们采用压缩优化,调度算法,数据/计算布局等等操做。

利用规模


做为一家为用户提供服务的全球性公司,Facebook必须保持大量服务器的设计可以知足在任什么时候间段内的峰值工做负载。如图所示,因为用户活动的变化取决于平常负荷以及特殊事件(例如地区节假日)期间的峰值,所以大量的服务器在特定的时间段内一般是闲置的。


这就释放了非高峰时段内大量可用的计算资源。利用这些可能的异构资源,以弹性方式合理分配给各类任务。这是Facebook目前正努力探索的一大机会。对于机器学习应用程序,这提供了将可扩展的分布式训练机制的优点应用到大量的异构资源(例如具备不一样RAM分配的CPU和GPU平台)的机会。可是,这也会带来一些挑战。在这些低利用率的时期,大量可用的计算资源将从根本上致使分布式训练方法的不一样。


调度程序首先必须正确地平衡跨越异构硬件的负载,这样主机就没必要为了同步性而等待其余进程的执行。当训练跨越多个主机时,调度程序还必需要考虑网络拓扑结构和同步所需的成本。若是处理不当,机架内或机架间同步所产生的流量可能会很大,这将极大地下降训练的速度和质量。


例如,在1xCPU设计中,四个1xCPU主机共享一个50G的网卡。若是所有四台主机同时尝试与其余主机的梯度进行同步,那么共享的网卡很快就会成为瓶颈,这会致使数据包降低和请求超时。所以,网络之间须要用一个共同的设计拓扑和调度程序,以便在非高峰时段有效地利用闲置的服务器。另外,这样的算法还必须具有可以提供检查指向中止及随着负荷变化从新开始训练的能力。


灾难后恢复能力


可以无缝地处理Facebook一部分全球计算,存储和网络足迹的损失,一直是Facebook基础设施的一个长期目标。Facebook的灾难恢复小组会按期在内部进行演习,找出并补救全球基础设施中最薄弱的环节和软件堆栈。干扰行动包括在几乎没有任何通知状况下,进行整个数据中心离线处理以确认咱们全球数据中心的损失对业务形成最小的干扰值。


对于机器学习的训练和推理部分,容灾的重要性是不言而喻的。尽管驱动几个关键性项目的推理过程十分重要这一观点以并不让人意外,但在注意到几个关键产品的可测量退化以前发现其对频繁训练的依赖性依然是一个的惊喜。api

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------缓存