Posted by Hao Liang's Blog on Monday, January 1, 0001

本章涵盖 使用工作流连接机器学习系统组件 使用扇入和扇出模式在机器学习工作流中构建复杂但可维护性强的架构 使用同步和异步模式通过并发步骤加速机器学习工作流 通过步骤记忆化模式提高性能

模型服务是模型训练完成后的关键步骤。 它是整个机器学习工作流的最终产物,模型服务的结果直接呈现给用户。 之前,我们探讨了分布式模型服务系统中涉及的一些挑战,例如:如何处理不断增长的模型服务请求量和请求的数据大小,并研究了业界广泛采用的一些模式。 我们了解了如何借助复制服务实现水平扩展来应对这些挑战,以及分片服务模式如何帮助系统处理大型模型服务请求。 最后,我们学习了如何评估模型服务系统,并确定事件驱动设计在现实场景中是否有效。

工作流是机器学习系统中的重要组成部分,因为它连接了系统中的所有其他组件。 一个机器学习工作流可以简单到仅包含数据摄取、模型训练和模型服务这几个链式步骤。 然而,处理实际场景可能非常复杂,需要额外的步骤和性能优化。 我们在做出设计决策以满足不同的业务和性能要求时,了解有哪些需要权衡的地方是至关重要的。

在本章中,我们将探讨在实践中构建机器学习工作流时遇到的一些挑战。 这些成熟的模式可以被复用,以构建从简单到复杂、高效且可扩展的机器学习工作流。 例如,我们将了解如何构建一个系统来执行复杂的机器学习工作流,以训练多个机器学习模型。 我们将使用扇入和扇出模式来选择性能最佳的模型,这些模型在模型服务系统中提供良好的实体标记结果。 我们还将结合同步和异步模式,使机器学习工作流更加高效,避免由于某个长时间运行的模型训练步骤阻碍其他步骤而导致的延迟。

5.1 工作流的基本概念 工作流是连接端到端机器学习系统中多个组件或步骤的过程。 一个工作流由机器学习应用程序中常见的各种组件组合而成,例如:数据摄取、分布式模型训练和模型服务,如前几章所讨论的。 图 5-1 显示了一个简单的机器学习工作流。 此工作流连接了端到端机器学习系统中的多个组件或步骤,包括了以下几个步骤: 1 数据摄取——使用 Youtube-8M 视频数据集 2 模型训练——训练实体标记模型 3 模型服务——标记新视频中的实体 需要注意的是,机器学习工作流(workflow)通常称为机器学习流水线(pipeline)。 我会交替使用这两个术语。 虽然我使用不同的术语来指代不同的技术,但在本书中这两个术语之间没有区别。 由于机器学习工作流可能由任意组合的组件构成,我们经常在不同情况下看到不同形式的机器学习工作流。 与图 5-1 所示的简单工作流不同,图 5-2 展示了一个更复杂的工作流,在单个数据摄取步骤之后启动了两个独立的模型训练步骤,然后使用两个单独的模型服务步骤来服务通过不同模型训练步骤训练出的不同模型。

图 5-1 一个包括数据摄取、模型训练和模型服务的简单机器学习工作流的示意图。 箭头表示方向。右侧的箭头表示步骤执行的顺序(例如:工作流在模型训练步骤完成后执行模型服务步骤)。

A workflow connects multiple components or steps in an end-to-end machine learning system. 工作流连接了端到端机器学习系统中的多个组件或步骤。

The arrow indicates the direction that the workflow executes the model serving step after the model training step is completed. 箭头表示模型训练步骤完成后工作流执行模型服务步骤的方向。

图 5-2 一个更复杂的工作流,在单个数据摄取步骤之后启动两个单独的模型训练步骤,然后使用两个单独的模型服务步骤来服务通过不同模型训练步骤训练的不同模型。

Two separate model training steps are launched after a single data ingestion step, and then two separate model serving steps are used to serve different models trained via different model training steps. 在单个数据摄取步骤之后启动两个单独的模型训练步骤,然后使用两个单独的模型服务步骤来服务通过不同模型训练步骤训练的不同模型。

图 5-1 和 5-2 是一些常见的示例。 在实践中,机器学习工作流的复杂性各不相同,这增加了构建和维护可扩展的机器学习系统的难度。 我们将在本章中讨论一些更复杂的机器学习工作流,但首先,我将介绍并区分以下两个概念之间的差异:顺序工作流和有向无环图(DAG)。 顺序工作流表示依次执行一系列步骤,直到完成最后一步。 执行的顺序可能会有所不同,但步骤始终是连续的。 图 5-3 是一个顺序工作流示例,其中包含 3 个依次执行的步骤:A、B 和 C。

图 5-3 一个顺序工作流的示例,包含按以下顺序执行的 3 个步骤:A、B 和 C。

A sequential workflow represents a series of steps performed one after another until the last step in the series has completed. The exact order of execution varies, but steps will always be sequential. 顺序工作流表示依次执行一系列步骤,直到最后一个步骤完成。确切的执行顺序有所不同,但步骤始终是连续的。执行的顺序可能会有所不同,但步骤始终是连续的。

Step C executes after step B has completed. 步骤 B 完成后执行步骤 C。

如果一个工作流只包含从一个步骤指向另一个步骤的步骤,但从不形成闭环,那么这个工作流可以被视为一个有向无环图(DAG)。

例如,图 5-3 中的工作流是一个有效的有向无环图,因为这 3 个步骤是从步骤 A 到步骤 B,然后从步骤 B 到步骤 C——没有形成闭环。 然而,如图 5-4 所示的另一个示例工作流并不是有效的有向无环图,因为有一个附加步骤 D 从步骤 C 连接并指向步骤 A,从而形成闭环。

如果步骤D没有指向步骤A,如图 5-5 所示,箭头被划掉,这个工作流就变成了一个有效的有向无环图。 循环不再闭合,因此它变成了一个简单的顺序工作流,类似于图 5-3。

在实际的机器学习应用程序中,为了满足不同用例的需求(例如:模型的批量重新训练、超参数调整实验等),所需的工作流可能会变得非常复杂。 我们将深入探讨一些更为复杂的工作流,并抽象出可重用的结构模式,以便为各种场景组合对应的工作流。

图 5-4 一个工作流示例,其中步骤 D 从步骤 C 连接并指向步骤 A,形成闭环,因此整个工作流不是有效的有向无环图。

A workflow where there’s an additional step D that connects from step C and points to step A. These connections form a closed loop and thus the entire workflow is not a valid DAG. 一个工作流,其中有一个附加步骤 D,从步骤 C 连接并指向步骤 A,形成闭环,因此整个工作流不是有效的有向无环图。

图 5-5 一个工作流示例,其中最后一个步骤 D 没有指向步骤 A。该工作流是有效的有向无环图,因为闭环不再存在。而且它是一个类似于图 5-3 的简单顺序工作流。

This workflow becomes a valid DAG since the closed loop no longer exists, and this becomes a simple sequential workflow similar to what we’ve seen previously. 由于闭环不再存在,因此该工作流成为有效的有向无环图,并且它变成了一个我们之前看到的简单顺序工作流。

The closed loop no longer exists since this arrow is crossed out. 由于该箭头被划掉,闭环不再存在。

5.2 扇入和扇出模式:组成复杂的机器学习工作流 在第 3 章中,我们构建了一个机器学习模型来标记 YouTube-8M 数据集的新视频的主题。 YouTube-8M 数据集包含数百万个 YouTube 视频 ID,这些视频 ID 带有来自 3,800 多个不同视觉实体(例如:食物、汽车、音乐等)的高质量机器生成的注释。 在第 4 章中,我们还讨论了有助于构建可扩展模型服务系统的模式,用户可以上传新视频,然后系统加载之前训练的机器学习模型来标记上传视频中出现的实体或主题。在现实应用程序中,我们通常希望将这些步骤串联起来,并以一种易于重用和分发的方式打包它们。 例如,如果原始的 YouTube-8M 数据集已更新,我们想使用相同的模型架构从头开始训练一个新模型应该怎么办? 在这种情况下,将这些组件容器化并将它们串联在一起形成一个机器学习工作流是相当容易的,当数据更新时,通过重新执行端到端的工作流就可以复用它。 如图 5-6 所示,新视频定期被添加到原始的 YouTube-8M 数据集中,并且每次数据集更新时都会执行工作流。 下一个模型训练步骤使用最新的数据集训练实体标记模型。 然后,最后的模型服务步骤使用训练好的模型来标记新视频中的实体。

图 5-6 新视频会定期被添加到原始的 YouTube-8M 数据集中,每次数据集更新时都会执行工作流。

New videos are being added to the original YouTube-8M dataset regularly, and the workflow is being executed every time the dataset has been updated. 新视频会定期被添加到原始的 YouTube-8M 数据集中,并且每次数据集更新时都会执行工作流。

Trains the entity tagging model using the most recent dataset 使用最新的数据集训练实体标记模型

Uses the trained model to tag entities in unseen videos 使用训练好的模型来标记未新视频中的实体。

现在,让我们来看一个更复杂的现实场景。 假设我们知道所有机器学习模型架构的模型训练的实现细节。

The models trained from the first two model training step outperform the model trained from the third model training step. Thus, only the first two model training steps are connected to model serving steps. 从前两个模型训练步骤训练的模型优于从第三个模型训练步骤训练的模型。因此,只有前两个模型训练步骤连接到模型服务步骤。

Maximum delta step we allow each leaf output to be 我们允许每个叶子输出的最大增量步长

5.2.4 练习 1 如果步骤之间不是相互独立的,我们可以使用扇入或扇出模式吗? 2 尝试使用扇入模式构建集成模型时的主要问题是什么?

5.3 同步和异步模式:通过并发加速工作流

系统中的每个模型训练步骤都需要很长时间才能完成。然而,它们的持续时间可能因模型架构或模型参数的不同而不同。 想象一种极端的情况,其中一个模型训练步骤需要两周才能完成,因为它正在训练一个需要大量计算资源的复杂机器学习模型。 而其他所有的模型训练步骤只需一周就能完成。 我们之前构建的使用扇入和扇出模式的机器学习工作流中的许多步骤(例如:模型选择和模型服务)将需要再等待一周,直到这个长时间运行的模型训练步骤完成。 图 5-14 展示了 3 个模型训练步骤持续时间差异的示意图。

图 5-14 3 个模型训练步骤持续时间差异的工作流

One of the model training steps takes two weeks to complete since it is training a complex machine learning model that requires a huge amount of computational resources, whereas each of the rest of the model training steps only takes one week to complete. 其中一个模型训练步骤需要两周才能完成,因为它正在训练一个需要大量计算资源的复杂机器学习模型,而其他所有的模型训练步骤只需一周就能完成。

The following steps will have to wait for an additional week until this long-running model training step is completed. 接下来的步骤将需要再等待一周,直到这个长时间运行的模型训练步骤完成。

在这种情况下,由于模型选择步骤及其后续步骤需要完成所有的模型训练步骤,因此需要两周才能完成的模型训练步骤将使工作流整整慢了一周。 我们宁可利用额外的一周时间来重新执行所有模型训练步骤,也不希望把时间耗费在等待某一个步骤上!

5.3.1 问题 我们希望构建一个机器学习工作流来训练不同的模型,然后选择前两个性能最优的模型用于模型服务,模型服务基于两个模型生成预测。 由于现有机器学习工作流中每个模型训练步骤的完成时间不同,后续步骤(例如:模型选择步骤和模型服务)的开始取决于前面步骤的完成。

然而,当至少一个模型训练步骤的完成时间比其余步骤的完成时间长得多时,就会出现问题,因为接下来的模型选择步骤只能在这一个需要长时间的模型训练步骤完成后才能开始。 结果,整个工作流都会因这个运行时间特别长的步骤而延迟。 有没有办法加速这个工作流,使其不受单个步骤持续时间的影响呢?

5.3.2 解决方案 我们希望构建与之前相同的机器学习工作流,该工作流将在系统从数据源获取数据后训练不同的模型,选择前两个性能最佳的模型,然后使用这两个模型提供模型服务,以生成对应的预测。

然而,这次我们发现了一个性能瓶颈,因为后续每个步骤(例如:模型选择和模型服务)的开始都取决于其先前步骤的完成。 在我们的例子中,我们有一个长时间运行的模型训练步骤,必须先完成该步骤,然后才能继续下一步。

如果我们可以完全排除需要长时间运行的模型训练步骤会怎样呢? 一旦我们这样做了,其余的模型训练步骤将拥有一致的完成时间。 因此,我们可以执行工作流中的其余步骤,而无需等待正在运行的步骤。 更新后的工作流如图 5-15 所示。

这种简单的方法可能解决了我们因长时间运行的步骤而需要额外等待的问题。 但是,我们最初的目标是利用这种复杂的工作流来试验不同的机器学习模型架构和这些模型的不同超参数集合,以选择性能最佳的模型用于模型服务。 如果我们简单地排除掉长时间运行的模型训练步骤,那么我们实际上就放弃了探索更好地捕获视频中实体的模型的机会。

是否有更好的方法来加快工作流,使其不受此单个步骤的持续时间的影响呢? 让我们重点关注那些仅需一周就能完成的模型训练步骤。 当这些短期运行的模型训练步骤完成后,我们能做些什么呢?

图 5-15 移除了长时间运行的模型训练步骤后的新工作流

After the long-running model training step is excluded, the rest of the model training steps will have consistent completion time. Thus, the remaining steps in the workflow can be executed without having to wait for any particular step that’s still running. 在排除长时间运行的模型训练步骤后,其余模型训练步骤将具有一致的完成时间。 因此,我们可以执行工作流中的其余步骤,而无需等待正在运行的步骤。

当一个模型训练步骤完成后,我们就成功获得了一个训练好的机器学习模型。 事实上,我们可以立即将这个训练好的模型用于我们的模型服务系统,而无需等待其余的模型训练步骤完成。 这样一来,用户可以在我们完成工作流中的某个步骤并训练出一个模型后,立即看到他们的模型服务请求中实体标记的结果。 该工作流的示意图如图 5-16 所示。

第二个模型训练步骤完成后,我们可以将两个训练好的模型直接传递给模型服务系统。 如图 5-17 所示,将聚合后的推理结果呈现给用户,而不仅仅是我们最初获得的单个模型的推理结果。

图 5-16 一个工作流,其中一个通过短时间运行的模型训练步骤训练好的模型直接应用于模型服务系统,无需等待其余的模型训练步骤完成。

Uses the trained model from this short-running model training step that finishes earlier directly in our model serving system without waiting for the rest of the model training steps to complete 使用此短时间运行模型训练步骤中训练好的模型,该模型直接应用于模型服务系统,无需等待其余模型训练步骤完成

图 5-17 第二个模型训练步骤完成后,我们直接将两个训练好的模型传递给模型服务系统。 聚合推理结果并呈现给用户,而不仅仅是我们最初获得的单个模型的推理结果。

After a second model training step finishes, we can pass the two trained models directly to be used for model serving, and the aggregated inference results will be presented to users instead of the results from only the one model that we obtained initially. 第二个模型训练步骤完成后,我们可以直接将两个训练好的模型用于模型服务,并且聚合推理结果呈现给用户,而不仅仅是我们最初获得的单个模型的推理结果。

Both short-running model training steps have finished. 两个短时间运行模型训练步骤均已完成。

虽然我们可以继续使用训练好的模型进行模型选择和模型服务,但长时间运行的模型训练步骤仍在进行中。 换句话说,这些步骤是异步执行的,它们不依赖于彼此的完成情况。 工作流在前一个步骤完成之前就已经开始执行下一个步骤。

顺序步骤一次执行一个,只有当其中一个步骤完成后,下一个步骤才会继续。 换句话说,您必须等待一个步骤完成才能进入下一个步骤。 例如,数据摄取步骤必须完成后,我们才能开始模型训练的步骤。

与异步的步骤相反,一旦步骤间相互依赖的条件得到满足,同步的步骤就可以同时开始运行。 例如,一旦前面的数据摄取步骤完成,模型训练步骤就可以同时并行运行。 不同的模型训练步骤之间不必相互等待。 当您有多个可以并发运行并且可以几乎同时完成的相似工作流步骤时,同步模式非常有用。

通过结合这些模式,整个工作流将不再被长时间运行的模型训练步骤所阻塞。 相反,它可以继续使用模型服务系统中短时间运行的模型训练步骤中已经训练好的模型,直接处理用户的模型服务请求。

同步和异步模式在其他分布式系统中也非常有用,它们可以优化系统性能并最大限度地利用现有计算资源,尤其是当计算资源量有限时。 我们将在第 9.4.1 节中应用此模式。

5.3.3 讨论 通过混合同步和异步模式,我们可以创建更高效的机器学习工作流,避免了由于某个步骤长时间阻塞(例如:长时间运行的模型训练步骤)而导致的延迟。 然而,通过短时间运行的模型训练步骤训练出的模型可能不是非常准确。 也就是说,简单架构的模型可能不会像长时间训练的模型那样,能够识别出那么多的实体(如图 5-18 所示)。

图 5-18 通过两个短期模型训练步骤训练出的模型,这两个步骤使用了非常简单的模型作为基线。它们只能识别少量实体,而从最耗时的步骤中训练出的模型能够识别更多实体。

因此,我们早期获得的模型可能不是最好的,它只能够标记少量实体,这可能无法满足用户的需求。

当我们将这种端到端工作流部署到实际的应用程序中时,我们需要考虑用户是更希望能快速得到推理结果,还是更希望得到好的推理结果。 如果目标是让用户在新模型可用时尽快得到推理结果,他们可能就无法得到他们所期望的更准确的结果。 然而,如果用户能够容忍一定时间的延迟,最好是等待更多模型训练完成。 然后,我们可以选择性地挑选我们训练出的最佳性能模型,使其能提供非常好的实体标记结果。 用户能否接受延迟取决于他们的实际需求。

通过使用同步和异步模式,我们可以从架构和计算的角度编排机器学习工作流中的步骤。 因此,数据科学团队可以减少等待工作流完成的时间以最大限度地提高性能,从而降低基础设施成本和闲置的计算资源。 在下一节中,我们将介绍现实中经常使用的另一种模式,它可以节省更多计算资源并加快工作流的运行速度。

5.3.4 练习 1 模型训练步骤的各个步骤的开始取决于什么? 2 如果步骤异步运行,它们会相互阻塞吗? 3 在决定是否要尽早使用可用的模型时,我们需要考虑哪些因素?

5.4 步骤记忆化模式:通过缓存跳过重复冗余的步骤

通过工作流中的扇入和扇出模式,系统能够执行复杂的工作流,训练多个机器学习模型并选择性能最佳的模型,以便在模型服务系统中提供精确的实体标记结果。 我们在本章中看到的工作流仅包含一个数据摄取步骤。 也就意味着工作流中的数据摄取步骤始终先执行,然后才能开始执行其余的步骤(例如:模型训练和模型服务)。

不幸的是,在实际的机器学习应用中,数据集并不总是保持不变的。 现在假设每周都有新的 YouTube 视频被添加到 YouTube-8M 数据集中。 按照我们现有的工作流架构,如果我们想要重新训练模型,以便它能够考虑到定期新增的视频,我们就需要定期从头开始运行整个工作流(从数据摄取步骤到模型服务步骤),如图 5-19 所示。

假设数据集没有改变,但我们想尝试新的模型架构或新的超参数,这对机器学习从业者来说是非常常见的(如图 5-20)。 例如,我们可能会将模型架构从简单的线性模型更改为更复杂的模型,例如基于树或卷积神经网络的模型。 我们也可以坚持使用之前已经使用过的特定模型架构,只更改模型超参数集合,例如:修改神经网络模型的层数和每个层中的隐藏单元数或基于树模型的最大深度。 对于这些情况,我们仍然需要运行端到端的工作流,其中包括从头开始从原始数据源重新摄取数据的数据摄取步骤。 而再次执行数据摄取步骤是非常耗时的。

图 5-19 每次数据集更新时重新执行整个工作流的示意图

New videos are added to the original YouTube-8M dataset regularly. 新视频会定期被添加到原始 YouTube-8M 数据集中。

The entire workflow is re-executed every time the dataset has been updated. 每次更新数据集时,整个工作流都会重新执行。

图 5-20 每当我们尝试新的模型类型或超参数时,即使数据集没有改变,整个工作流也需要重新执行

The dataset does not change. 数据集没有变化。

5.4.1 问题 机器学习工作流通常从数据摄取步骤开始。 如果数据集定期更新,我们可能需要重新运行整个工作流,以训练出一个考虑到新数据的新机器学习模型。 为此,我们需要每次都重新执行数据摄取步骤。 即使数据集未更新,但我们想尝试新的模型参数,我们仍然需要重新执行整个工作流,这也包括了数据摄取步骤。 但是,数据摄取具体取决于数据集的大小,它可能需要很长时间才能完成。 有没有办法让这个工作流更加高效呢?

5.4.2 解决方案 考虑到数据摄取步骤通常非常耗时,我们不希望在每次运行工作流时都重新执行它来重新训练或更新我们的模型。 首先,让我们思考一下这个问题的根本原因。 YouTube 视频的数据集会定期更新,新数据会定期持久化到数据源中(例如:每月一次)。

我们目前在两种情况下需要重新执行整个机器学习工作流: 1 数据集更新后,重新运行工作流以使用更新后的数据集训练新模型。 2 我们希望使用已经摄取的数据集(可能还没有更新)来试验新的模型架构。

目前的根本问题在于数据摄取步骤非常耗时。 并且在当前的工作流架构中,无论数据集是否已更新,都需要执行数据摄取步骤。

理想情况下,如果数据集没有更新,我们不希望重新摄取已经收集的数据。 也就是说,只有当我们知道数据集已经更新时,才重新执行数据摄取步骤,如图 5-21 所示。

现在的挑战在于如何确定数据集是否已更新。 一旦我们找到了识别方法,我们就可以有条件地重建工作流,并能够控制是否要重新执行数据摄取步骤(如图 5-21)。

图 5-21 当数据集尚未更新时,跳过数据摄取步骤

The dataset has not been updated yet. 数据集尚未更新。

识别数据集是否已更新的一种方法是使用缓存。 由于我们的数据集按照固定的时间表定期更新(例如:每月一次),因此我们可以创建一个基于时间的缓存,用于存储已经摄取和清洗的数据集(假设数据集位于远程数据库中)和记录最后更新的时间戳。 然后,我们根据最后更新时间戳是否在特定时间窗口内,决定是否执行数据摄取步骤。 例如,假设时间窗口设置为两周,即使摄取的数据在过去两周内被更新,我们仍然认为当前数据是新的。 将跳过数据摄取步骤,并且接下来的模型训练步骤将使用缓存中已摄取的数据集。

图 5-22 描述了触发工作流的情况,我们通过访问缓存来检查数据是否在过去两周内更新。 如果当前数据仍然是新的,我们就跳过不必要的数据摄取步骤,直接执行模型训练步骤。

图 5-22 示意图:工作流被触发,我们通过访问缓存来检查近两周内数据是否有更新。 如果当前数据仍然是新的,我们就跳过不必要的数据摄取步骤,直接执行模型训练步骤。

The workflow is triggered. 工作流被触发。

The data has not been updated within the last two weeks. 该数据在过去两周内没有更新。

Writes new cache or reads existing cache that contains timestamp information 写入新缓存或读取包含时间戳信息的现有缓存。

The data has been updated within the last two weeks. 该数据在过去两周内已更新。

在我们判定数据集是否足够新、可以直接用于模型训练而不需要从头开始重新摄取数据时,时间窗口可用于控制缓存的过期时间。

或者,我们可以将一些关于数据源的重要元数据存储在缓存中,例如:当前可用的原始数据源中的记录数。 这种类型的缓存被称为基于内容的缓存,因为它存储从特定步骤中提取的信息,例如:输入和输出信息。 通过这种类型的缓存,我们可以识别数据源是否发生显著变化(例如:数据源中原始记录的数量增加了一倍)。 如果数据发生显著变化,这通常是重新执行数据摄取步骤的信号,因为这意味着当前数据集已经非常旧了。 图 5-23 展示了该方法的工作流。

图 5-23 示意图:工作流被触发,我们检查从数据集中收集的元数据(例如:记录数)是否发生了显著变化。 如果变化不显著,我们就跳过不必要的数据摄取步骤,直接执行模型训练步骤。

The workflow is triggered. 工作流被触发

The number of records in the dataset has updated so a re-ingestion is required. 数据集中的记录数量已更新,因此需要重新摄取。

Writes new cache or reads existing cache that contains metadata about the dataset itself 写入新缓存或读取包含数据集本身元数据的现有缓存。

The number of records in the dataset has not changed. 数据集中的记录数没有变化。

这种使用缓存来决定是否应执行或跳过步骤的模式称为步骤记忆化模式。 通过将步骤记忆化,工作流可以识别出那些重复冗余工作负载的步骤,这些步骤可以直接跳过而无需重新执行,从而大大加快端到端工作流的执行速度。 我们将在第 9.4.2 节中应用此模式。

5.4.3 讨论 在实际的机器学习应用中,除了数据摄取之外,还有许多工作负载计算量大且耗时。 例如,模型训练步骤使用大量计算资源来实现高性能训练,有时可能需要几周的时间才能完成。 如果我们只是试验其他不需要更新模型的组件,那么避免重复执行模型训练步骤是有意义的。 在决定是否可以跳过繁重且冗余的步骤时,步骤记忆化模式非常有用。

如果我们正在创建基于内容的缓存,那么决定提取和存储哪些类型的信息并不是一件容易的事。 例如,如果我们尝试缓存模型训练步骤的结果,我们可能需要考虑使用训练好的模型制品,这包括了模型的类型和模型的超参数等信息。 当工作流再次执行时,它将根据我们使用的是否为相同的模型来决定是否重新执行模型训练步骤。 或者,我们可以存储模型性能统计信息(例如:准确性、均方误差等),以确定它是否超出阈值且值得再训练一个性能更高的模型。

此外,在实际应用步骤记忆化模式时,请注意它需要一定的维护工作来管理所创建的缓存的生命周期。 例如,如果每天运行 1,000 个机器学习工作流,并且每个工作流平均需要记忆 100 个步骤,那么每天将创建 100,000 个缓存。 根据它们存储的信息类型,这些缓存需要一定的空间,并且可能会快速累积。

为了大规模应用这种模式,我们必须有垃圾回收机制来自动删除不必要的缓存,以防止缓存的累积占用大量磁盘空间。 例如,一种简单的策略是记录缓存最后一次命中并被工作流使用的时间戳,然后定期扫描现有缓存以清理那些长时间未使用或命中的缓存。

5.4.4 练习 1 哪种类型的步骤最能从步骤记忆化中受益? 2 如果某个步骤的工作流被触发再次运行,我们如何判断该步骤是否可以跳过? 3 为了大规模应用步骤记忆化模式,我们需要如何进行管理和维护?

5.5 习题答案 第 5.2 节 1 不可以,因为我们无法保证这些步骤的并发副本将以什么顺序运行 2 训练集成模型取决于完成子模型的其他训练步骤。我们不能使用扇入模式,因为集成模型训练步骤需要等待其他模型训练完成后才能开始运行,这将需要一些额外的等待时间并延迟整个工作流。

第 5.3 节 1 由于现有机器学习工作流中每个模型训练步骤的完成时间存在差异,因此后续每个步骤(例如:模型选择和模型服务)的开始取决于上一个步骤的完成。 2 异步步骤不会相互阻塞。 3 我们需要从用户的角度考虑是否要尽早使用任何可用的模型。 我们应该思考,对于用户来说,是更快地看到推理结果更重要,还是看到更好的结果更重要。如果目标是让用户在新模型可用时尽快看到推理结果,那么这些结果可能不够好或达不到用户的预期。 而如果用户可以接受一定的延迟,那么最好能够等待更多的模型训练完成。 这样,用户就可以在训练好的模型中,选择性能最佳的模型,从而得到非常好的实体标记结果。

第 5.4 节 1 耗时长或需要大量计算资源的步骤 2 我们可以使用存储在缓存中的信息(例如:缓存最初创建的时间或元数据)来决定是否应该跳过某些步骤的执行。 3 我们需要建立垃圾回收机制,自动回收和删除创建的缓存。

总结 工作流是机器学习系统中的重要组成部分,因为它连接机器学习系统中的所有组件。机器学习工作流可以简单到仅包含数据摄取、模型训练和模型服务这几个链式步骤。 扇入和扇出模式可以被整合到复杂的工作流中,使其保持可维护性和可组合性。 同步和异步模式借助并发特性加速了机器学习工作流。 步骤记忆化模式通过跳过重复的步骤来提高工作流的性能。