Logo
Section 1 / 6

性能与容量考量

本课程简要介绍性能与容量方面的考虑因素,并探讨在设计机器学习问题解决方案时,这些因素为何重要。

导入

性能与容量考量

本课程简要介绍性能与容量方面的考虑因素,并探讨在设计机器学习问题解决方案时,这些因素为何重要。

在构建基于机器学习的系统时,我们的目标通常是提升各项指标(如用户参与率等),同时确保满足系统的容量和性能要求。

在构建机器学习系统的以下两个阶段中,性能与容量问题尤为关键:

  1. 训练阶段:我们需要多少训练数据和计算资源来构建预测模型?

  2. 推理(评估)阶段:在模型服务过程中,我们需要满足哪些服务等级协议(SLA)以及相应的资源容量需求?

我们必须将性能与容量因素与当前机器学习任务的优化目标结合起来考虑,即衡量机器学习系统在训练和推理阶段的复杂度,并将其用于指导ML系统架构的设计以及机器学习建模方法的选择。

机器学习系统的复杂度考量

机器学习算法通常涉及三种不同类型的复杂度:

  • 训练复杂度
    指的是机器学习算法完成给定任务模型训练所需的时间。

  • 推理(评估)复杂度
    指的是机器学习算法在测试阶段对输入样本进行预测或评估所需的时间。

  • 样本复杂度
    指的是成功学习目标函数所需的训练样本总数。

📝 当模型容量发生变化时,样本复杂度也会随之改变。例如,深度神经网络所需的训练样本数量远大于决策树或线性回归模型。

![衡量机器学习系统中样本数据的训练与推理时间复杂度]

训练与推理复杂度对比

我们可以通过比较不同模型的训练和推理复杂度,来判断哪种模型更适合特定任务及可用资源。

假设:

  • nn 表示训练样本数量
  • ff 表示特征数量
  • ntreesn_{trees} 表示基于树模型中的树的数量
  • nlin_{l_i} 表示神经网络第 ii 层的神经元数量
  • ee 表示训练轮数(epoch)
  • dd 表示树的最大深度

则各类算法的训练与推理时间复杂度可近似表示如下(采用渐进分析法):

算法训练时间推理时间
线性/逻辑回归(批量训练)O(nfe)O(nfe)O(f)O(f)
神经网络取决于网络结构和实现(通常按前向/反向传播计算量计)O(fnl1+nl1nl2+… )O(fn_{l_1} + n_{l_1}n_{l_2} + \dots)
多加性回归树(MART)O(ndfntrees)O(ndfn_{trees})O(fdntrees)O(fdn_{trees})

分析说明

  • 线性回归的推理复杂度与单层神经网络相当。若我们希望在训练和推理上都节省时间,线性回归是理想选择。
    假设一个模型处理一条样本需 5 μ\mus,则处理 10 万条样本需要 100k × 5 μ\mus = 500 ms 的单机执行时间。
    举例来说,在广告推荐系统中,服务等级协议(SLA)要求我们在 300ms 内从候选广告池中选出相关广告。面对这一要求,必须使用快速算法,此时线性回归是一个合适的选择。

  • 相比之下,深层神经网络在训练和推理阶段耗时均显著更高,且需要大量训练数据。但其在图像分割、语言理解等复杂任务上的学习能力更强,预测精度也通常优于其他模型。因此,当任务本身适合深度学习且资源充足时,深层神经网络是一个可行的选择。

  • MART 是一种基于树的算法,其计算开销高于线性模型,但仍远快于深层神经网络。这类算法能够利用中等规模的数据集实现良好的泛化能力。因此,当训练数据仅限于几百万条样本,且性能与资源受限时,基于树的模型是较优选择。

大规模系统中的性能与容量考量

以搜索引擎(如 Google、Bing)为例,当用户搜索“computer science”时,可能匹配到一亿个网页。基于机器学习的系统需要在满足系统约束的前提下,返回最相关的页面结果。这些约束通常称为服务等级协议(SLA)。虽然 SLA 包含可用性、容错性等多个方面,但在设计机器学习系统时,性能 和 容量 是最关键的考量因素。

  • 性能型 SLA 要求系统在指定时间内(例如 99% 的查询在 500ms 内)返回结果。
  • 容量 指系统能承受的负载量,例如支持每秒 1000 次查询(QPS)。

假设我们使用相对快速的模型(如线性回归或树模型)对每个文档进行打分,单次评估耗时约 1μ\mus。即便如此,对一亿个匹配文档逐一评估仍需 100 秒(1μs × 1e8 = 100s),这显然无法满足实时响应的需求。

此时,分布式系统的作用就凸显出来:我们可以将单个查询的负载分散到多个模型副本上。例如,将任务分配给 1000 台机器并行处理,那么即使每台机器处理 10 万个文档,也能将总耗时压缩至约 100ms(100s / 1000)。

![将输入查询分发至多个分片以实现负载均衡]

现在考虑另一种情况:我们决定采用深度学习模型进行搜索排序,因为它能显著提升搜索质量指标。然而,深度学习模型速度较慢,假设单个文档评估耗时达 1ms。即使使用 1000 个分片并行处理,对一亿个文档排序仍需 100 秒(1ms × 1e8 / 1000 = 100s),远远超出性能 SLA 的容忍范围。

如果我们拥有无限资源,或许可以通过不断增加分片数量来降低延迟。但现实中资源有限,我们必须在固定资源条件下设计出最优的系统方案。

这就引出了另一个重要思路:在机器学习系统设计中采用漏斗式(分层)建模策略。下面我们详细讨论这一方法。

分层/漏斗式建模方法

为了兼顾系统性能与资源限制,一种常用且有效的做法是在文档数量最多的第一阶段使用较快的模型(例如“computer science”查询匹配了 1 亿个网页)。随着流程推进,逐步采用更复杂的模型(即预测更精准的模型),尽管其运行时间更长,但由于处理的文档数量已大幅减少,整体延迟仍可控。

例如:

  • 第一阶段使用线性模型快速筛选出前 10,000 个候选文档;
  • 后续阶段使用更复杂的模型(如深度神经网络)对这 10,000 个文档进一步精排;
  • 最终阶段仅对 Top 500 文档使用深度神经网络打分。

假设深度神经网络对每个文档的评估耗时为 1ms,若只对 500 个文档进行打分,则单机耗时为 500ms;若使用 5 个分片并行处理,可在约 100ms 内完成。

📝 在搜索排序、推荐系统和广告预估等机器学习系统中,采用分层/漏斗式建模方法是解决大规模场景下相关性、性能与资源平衡问题的有效途径。

下图展示了这种多层级漏斗结构的示意图,我们将在后续的搜索排序系统设计问题中详细讲解。

![搜索排序系统的分层模型架构示意图]

类似地,下图展示了一个广告相关性系统如何采用漏斗式结构。我们将在广告预估系统章节中进一步深入探讨。

![广告预估系统的漏斗式架构示意图]

简介

训练数据收集策略