
作者简介
Ben Weber 是 Aarki 的机器学习副总裁,负责领导构建更智能的模型,这些模型每秒可处理数百万次实时竞价决策。他曾在 McAfee、Zynga、Twitch 和 EA 等公司担任高级职务。从构建竞价系统到重写预测流程,他的经验涵盖了实践操作、生产环境应用以及在现实世界中久经考验的案例。.
在 本系列第一部分, 我们分享了Aarki如何从经典机器学习发展到深度神经网络,教会我们的DSP如何利用深度学习进行更智能的思考。但如果没有基础设施的支持,再智能的模型也只能发挥有限的作用。.
这篇文章讲述了故事的后半部分:我们如何决定投资 GPU,为什么公共云无法满足我们的需求,以及构建一个每天训练数十亿条记录的系统需要付出怎样的努力。.
仅仅在CPU上进行训练已经不够了
Aarki 的机器学习平台每天训练数十个模型,其中一些最大的模型每天使用超过十亿条记录进行训练。为了高效地训练模型,我们使用 GPU 进行深度学习模型的硬件加速训练。.
我们正在利用 TensorFlow 生态系统和 NVIDIA 的 CUDA 平台来处理海量数据,以确定哪些广告展示能为我们的广告主带来最大价值。当我们开始将需求方平台 (DSP) 迁移到深度学习模型时,我们面临着一个抉择:是租用还是购买 GPU?
在这篇文章中,我们将重点介绍我们探索过的选项、我们为证明 GPU 的价值而采取的途径,以及我们为大规模支持深度学习而采取的未来方向。.
为什么我们的基础设施最初并非以GPU为基础
我们的数据中心已经针对速度进行了优化。
我们的DSP部署在四个私有数据中心,这些数据中心与主要程序化广告交易平台的交易场所位于同一地点。我们投资购置了硬件,以支持在我们拥有和运营的机器上每秒处理超过五百万个竞价请求。.
虽然这种方法不如使用公共云选项(例如 AWS 或 GCP)那样灵活,因为可以按需启动新机器,但我们避免了支付高额的网络出口费用,而且每次请求的摊销成本也低于使用这些平台之一。.
我们早期的基础设施侧重于核心DSP吞吐量,而非训练
我们最初专注于支持DSP的硬件,并没有预先投资GPU。数据中心没有GPU并没有对我们上一代深度学习模型造成影响,因为我们用于训练模型的库是针对Rust优化的,不支持硬件加速。.
DeepFM 在没有加速的情况下也能正常工作——直到它不再工作为止
我们之前的模型采用深度因子分解机,它结合了两个阶段:一个深度阶段学习所有输入特征的嵌入向量,另一个因子分解机阶段学习特征之间的交互作用。这些模型在重定向广告系列中表现良好,这类广告系列专注于安装后的转化事件,例如识别哪些安装最有可能转化为付费用户。.
然而,当我们开始开发预安装模型(例如点击预测)时,我们的模型训练平台开始出现瓶颈。我们每天能够使用数亿条记录训练模型,但模型训练速度太慢,无法扩展到每天超过十亿条记录。.
向深度神经网络(DNN)的转变使得GPU成为必需品
我们的新模型需要硬件加速
我们的下一代定价模型采用深度学习框架,支持硬件加速进行模型训练和模型部署。我们初期重点是利用GPU进行模型训练,因为训练数据集的规模是目前的主要瓶颈。.
TensorFlow 和 PyTorch 为我们的 DNN 训练栈提供支持
我们目前生产环境中的定价模型采用 TensorFlow 框架,而用于创建模型嵌入的管道则使用 PyTorch 框架。我们使用硬件加速训练模型,并将训练好的模型转换为 ONNX 格式,以便在现有 DSP 基础设施上使用 CPU 以 Rust 语言进行服务。.
证明GPU的价值
数据中心外的测试培训
在为我们的私有数据中心投资 GPU 之前,我们希望确保我们的下一代深度学习模型能够提高 DSP 的性能,并确认我们的新模型在 GPU 上的训练效率比在 CPU 上高得多。.
为了验证训练效率,我们探索了几种在数据中心之外使用GPU进行训练的方案。最初,我们尝试在办公室的机器上使用采样数据集进行模型训练;之后,我们尝试在AWS上启动GPU实例;最终,我们决定使用Google Colab来验证使用GPU是否能够显著缩短模型训练时间。.
A/B 测试 新旧模型
我们在 Google Colab 上训练了挑战者模型,并在我们当前和下一代深度学习模型之间进行了 A/B 测试,以增强我们对迁移到 GPU 进行模型训练的信心。在决定是否购买 GPU 时,我们必须做出的关键决策之一是确定哪些类型的显卡最适合我们的模型训练用例。.
L4 GPU 的速度比 CPU 快 10 倍
我们使用 Google Colab,利用 NVIDIA T4、L4 和 A100 三种实例类型收集模型训练统计数据,发现 L4 显卡非常适合我们的模型架构。与在 CPU 上训练相比,使用 NVIDIA L4 显卡可以实现 10 倍的速度提升,将我们最大模型的批处理时间从 200 毫秒缩短到 20 毫秒。.
我们发现,L4 卡是我们投资 GPU 的一个良好起点。随着我们探索新的架构、增加模型参数以及为模型添加更多功能,我们将继续评估哪些实例类型能够为我们的模型提供最佳性能。.
原型验证了这一点,但我们需要量产规模。
我们使用 Google Colab 进行的 A/B 测试证明了迁移到 GPU 的价值,使我们能够使用更大的数据集进行训练,并超越我们当前一代的深度学习模型。下一步,我们将这些流程自动化,以支持每天使用数十亿条记录对模型进行重新训练。.
Google Colab 非常适合原型设计和实验,但它并不适用于生产环境工作负载,Google 建议使用 Vertex AI 来处理这些流程。我们需要决定下一步的方案是利用公共云选项(例如 AWS SageMaker 或 GCP Vertex),还是购买我们自己的硬件来加速模型训练。.
租用GPU不适用于我们的规模或配置。
数据传输和TensorFlow I/O使得云端训练变得不切实际
我们在租用显卡进行模型训练时遇到的最大问题是如何将数据从我们的私有数据中心传输到GPU所在的位置。我们使用私有数据中心集群上的Spark来准备训练数据集,并将编码后的数据集输出为TensorFlow的TFRecord格式。.
即使使用 gzip 压缩记录,我们最大的数据集也有数百 GB,而且我们每天都会使用不同的训练数据集训练数十个这种规模的模型。.
另一个问题是,TensorFlow 核心库已移除直接使用云存储(例如 AWS S3 和 GCP Cloud Storage)上的文件训练模型的支持,并将其转移到了 TensorFlow I/O 库,而该库已停止维护。如果在日常模型训练过程中需要移动所有这些数据,将会给我们的模型流水线带来编排方面的挑战,而且我们每天都需要为数 TB 的数据支付云存储和传输费用。.
我们把GPU引入公司内部,并围绕它们构建了整个流水线。
鉴于我们之前在 Google Colab 上进行的测试,我们已经知道 NVIDIA L4 卡是训练模型的理想选择。我们与一家供应商合作,评估了在我们的私有数据中心为每台服务器配备多张 L4 卡的方案,并首先购置了一小批配备 GPU 的服务器。.
机器安装完毕后,我们便能将所有资源保留在我们自己的私有数据中心内,从而避免了数据传输这一最大的难题。这种方式使我们能够投入更多资源用于开源工具,例如用于流程编排的 Prefect、用于性能分析的 TensorBoard 以及用于模型管道机器学习运维的 MLflow。.
对于 GPU 来说,购买选项并不总是最佳选择,但由于我们采用的是私有数据中心部署,并且模型训练的工作负载是可预测的,因此购买选项对我们来说效果很好。.
我们现在每天都在公司内部使用数十亿行数据进行训练。
为了协调 Spark 数据准备工作流和 GPU 模型训练作业之间的交接,我们做了一些工程工作,但这很值得,现在我们每天能够用数十亿个样本训练我们最大的模型。.
购买选项并不总是正确的选择,但对于我们的私有数据中心和可预测的模型工作负载而言,它为我们提供了所需的控制、效率和规模。.
毕竟,不扩展基础设施,就无法扩展智能。
第一部分着眼于大脑的进化,第二部分则着眼于为大脑提供成长所需的基础设施。通过投资GPU并将模型训练转移到内部,我们实现了性能的飞跃,而无需大幅增加云成本。.
深度学习已成为我们竞价逻辑的核心,GPU 每天支持数十亿行的训练,我们构建了一个旨在学习速度更快、优化更智能、扩展性更强的系统,而不会造成任何妥协。.
错过了故事的开头?请阅读第一部分。 这里.
如果你喜欢这篇博客,请给Ben发个信息。 bweber@aarki.com. 他很乐意收到你的来信!