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