本文的主图是由 HackerNoon 的AI Image Generator通过提示“robots looking at computers”生成的
机器学习(ML) 工作负载需要高效的基础架构才能快速产生结果。模型训练严重依赖于大数据集。将这些数据从存储中汇集到训练集群是任何 ML 工作流程的第一步,这会显着影响模型训练的效率。
本文将讨论一种为端到端机器学习管道编排数据的新解决方案,以解决上述问题。我将概述常见的挑战和陷阱,然后提出一种新技术,即数据编排,以优化机器学习的数据管道。
端到端机器学习管道是从数据预处理和清理到模型训练再到推理的一系列步骤。培训是整个工作流程中最关键和资源最密集的部分。
下图显示了典型的 ML 管道。它从数据收集开始,然后是数据准备,最后是模型训练。在数据收集阶段,数据平台工程师通常需要花费大量时间来让数据工程师可以访问数据,他们为数据科学家准备数据以构建和迭代模型。
在训练阶段,处理的数据量空前庞大,以确保向生成模型的 GPU 持续提供数据。必须管理数据以支持 ML 及其可执行架构的复杂性。在数据管道中,每个步骤都有其自身的技术挑战。
训练受益于大型数据集,因此从所有相关来源收集数据至关重要。当数据驻留在数据湖、数据仓库和对象存储中时,无论是在本地、云端还是分布在多个地理位置,都不再可行将所有数据组合成一个整体源。对于数据孤岛,通过网络进行远程访问不可避免地会导致延迟。如何在保持所需性能的同时使数据可访问是一项重大挑战。
数据准备从收集阶段摄取数据开始,包括清理、ETL 和转换,然后再交付数据以训练模型。如果孤立地考虑这个阶段,数据管道是序列化的,并且在等待为训练集群准备的数据时会浪费额外的时间。因此,平台工程师必须弄清楚如何创建并行数据管道,并实现高效的数据共享和中间结果的高效存储。
模型训练需要处理数百 TB 的数据,通常是大量的小文件,例如图像和音频文件。训练涉及需要 epoch 运行多次的迭代,从而频繁访问数据。有必要通过不断向 GPU 提供数据来使其保持忙碌。优化 I/O 并保持 GPU 所需的吞吐量并不容易。
在我谈论不同的解决方案之前,让我们设置一个简化的场景,如下图所示。在这里,我们使用 GPU 集群在云中进行训练,该集群具有多个运行 TensorFlow 的节点作为 ML 框架。预处理后的数据存储在 Amazon S3 中。通常,有两种方法可以将此数据获取到训练集群。我们接下来会讨论这些。
方法 1:本地存储中的重复数据
在第一种方法中,将整个数据集从远程存储复制到每个服务器的本地存储进行训练,如下所示。因此,数据局部性得到保证,训练作业从本地读取输入,而不是从远程存储中检索。
从数据管道和 I/O 的角度来看,这种方法提供了最高的 I/O 吞吐量,因为所有数据都是本地的。 GPU 将保持忙碌,除了开始时,因为训练必须等待数据从对象存储完全复制到训练集群。
然而,这种方法并不适用于所有情况。
首先,数据集必须适合聚合本地存储。随着输入数据集大小的增长,数据复制过程变得更长且更容易出错,花费更多时间并浪费 GPU 资源。
其次,将大量数据复制到每台训练机会对存储系统和网络造成巨大压力。在输入数据经常变化的情况下,数据同步可能会非常复杂。
最后,手动制作数据副本非常耗时且容易出错,因为要使云存储上的数据与训练数据保持同步具有挑战性。
方法二:直接访问云存储
另一种常见的方法是直接将训练与远程存储上的目标数据集连接起来,如下所示。使用这种方法,数据集的大小不是问题,就像以前的解决方案一样。但它面临着几个新的挑战。
首先,从 I/O 和管道的角度来看,数据是串行处理的。所有的数据访问操作都必须经过对象存储和训练集群之间的网络,使I/O成为瓶颈。因此,由于 I/O 吞吐量受网络限制,因此 GPU 需要等待多个周期。
其次,当训练规模较大时,所有训练节点同时从同一个远程存储访问同一个数据集,给存储系统增加了巨大的压力。由于高并发访问,存储可能会变得拥塞,从而导致 GPU 利用率低下。
第三,如果数据集由大量小文件组成,元数据访问请求将占数据请求的很大一部分。因此,直接从对象存储中获取大量文件或目录的元数据成为性能瓶颈,并增加了元数据操作成本。
为了应对这些挑战和陷阱,我们需要在处理机器学习管道中的 I/O 时重新考虑数据平台架构。在这里,我推荐一种新方法,即数据编排,以加速端到端 ML 管道。数据编排技术抽象化跨存储系统的数据访问,虚拟化所有数据,并通过标准化 API 和全局命名空间将数据呈现给数据驱动的应用程序。
与其四处复制和移动数据,不如将数据留在原处,无论是在本地还是在云端。数据编排可以帮助抽象数据以创建统一的视图。这将大大降低数据收集阶段的复杂性。
由于数据编排已经可以与存储系统集成,机器学习框架只需要与单个数据编排平台交互即可从任何连接的存储访问数据。因此,可以对来自任何来源的所有数据进行训练,从而提高模型质量。无需手动将数据移动到中央源。所有计算框架,包括 Spark、Presto、PyTorch 和TensorFlow ,都可以访问数据而无需关心数据位于何处。
我建议实施分布式缓存,而不是将整个数据集复制到每台机器中,这样数据可以在集群中均匀分布。当训练数据集远大于单个节点的存储容量时,分布式缓存尤其有利。当数据位于远程时它也有帮助,因为数据缓存在本地。 ML 训练变得更快且更具成本效益,因为在访问数据时没有网络 I/O。
上图显示了一个存储所有训练数据的对象存储,以及两个表示数据集的文件(/path1/file1 和/path2/file2)。不是将所有文件块存储在每台训练机器上,而是将这些块分布在多台机器上。为了防止数据丢失并提高读取并发性,每个块可以同时存储在多个服务器上。
ML 训练作业执行的数据读取和写入在作业内部和作业之间存在高度重叠。数据共享可以确保所有计算框架都可以访问先前缓存的数据,以用于下一步的读取和写入工作负载。例如,如果您在数据准备步骤中使用 Spark 进行 ETL,数据共享可以确保输出数据被缓存并可用于未来阶段。通过数据共享,整个数据管道获得更好的端到端性能。
我们通过实施预加载和按需缓存来编排数据管道。下图显示,使用数据缓存从源加载数据可以与实际训练任务并行完成。因此,训练在访问数据时受益于高数据吞吐量,无需在训练前等待缓存完整数据。
虽然一开始会有一些 I/O 延迟,但等待时间会减少,因为数据已经加载到缓存中。通过这种方法,您可以重叠这些步骤。从对象存储到训练集群的数据加载、缓存、数据按需加载到训练、训练都可以并行完成,大大加快了整个过程。
让我们将新的推荐方法与两种传统方法进行比较。通过在机器学习管道的各个步骤中编排数据,我们消除了串行执行和数据从一个阶段流向下一个阶段时相关的低效率。这反过来会产生高 GPU 利用率。
| 本地存储中的重复数据 | 直接访问云存储 | 数据编排 |
---|---|---|---|
数据局部性 | ✓ | | ✓ |
对数据集的大小没有限制 | | ✓ | ✓ |
训练前无需手动复制完整数据 | ✓ | ✓ | ✓ |
保证数据一致性 | | ✓ | ✓ |
GPU利用率高 | ✓ | | ✓ |
这里以Alluxio为例,向大家展示如何使用数据编排。同样,我们将使用相同的简化场景。要安排 TensorFlow 作业,您可以使用 Kubernetes 或使用公共云服务。
使用 Alluxio 编排机器学习和深度学习训练通常包括三个步骤:
挂载后可以立即通过Alluxio访问不同存储系统中的数据,无需修改TensorFlow即可通过benchmark脚本透明访问。这显着简化了应用程序开发,否则应用程序开发将需要集成每个特定的存储系统以及凭证的配置。
您可以按照此处的指南使用带有 TensorFlow 的 Alluxio 运行图像识别。
随着机器学习技术的不断发展和框架执行更复杂的任务,我们管理数据管道的方法也将得到改进。通过将数据编排扩展到数据管道,您可以提高端到端训练管道的效率和资源利用率。
经许可转载。 © IDG Communications, Inc.,2022。保留所有权利。 https://www.infoworld.com/article/3651453/orchestrating-data-for-machine-learning-pipelines.html 。