机器学习系统中数据流转的路径很复杂,其性能要求在生命周期的每个阶段都有显著变化。针对成本效益高、长期原始数据归档优化的存储方案,通常不适合分布式训练任务所需的高吞吐量并行读取。为每项任务选择合适的存储技术并非只是优化问题,它是构建高性能、高成本效益AI平台的基本架构要求。匹配存储特性与机器学习工作负载机器学习生命周期的不同阶段对底层存储系统施加了不同的I/O(输入/输出)模式。一个成功的存储架构通过采用分层方法来适应这些不同需求,而非一刀切的方案。需要考虑的主要访问模式有:高吞吐量顺序读取: 这是模型训练的典型模式。系统读取大型连续数据块,通常每个周期流式传输整个数据集一次。这里的关键性能指标是带宽(GB/秒),而非每秒操作数。低延迟随机访问: 在线推理期间需要,模型需要以最小延迟获取单个预测请求的特定特征向量。它也与某些数据整理和预处理任务相关。在此,延迟(毫秒)和IOPS(每秒I/O操作数)是最重要的指标。混合读/写并行I/O: 在复杂数据预处理、特征工程和检查点操作中很常见。多个进程可能同时读取原始数据、对其进行转换并写入新特征或模型权重。这种模式要求吞吐量、IOPS和并发控制之间达到平衡。我们来审视三种主要的存储模式及其对这些机器学习工作负载的适用性。对象存储对象存储系统,例如Amazon S3、Google Cloud Storage (GCS)和Azure Blob Storage,将数据作为对象在扁平地址空间中管理。每个对象包含数据本身、可变数量的元数据和一个全局唯一标识符(键)。访问通过基于HTTP的API进行。优势:大规模可扩展性: 对象存储旨在容纳EB级数据,可水平扩展容量和吞吐量,无需管理开销。这使得它们成为构建数据湖的默认选择。耐久性和可用性: 它们通常将数据复制到多个物理位置,提供极高的数据耐久性保证。成本效益: 每GB成本显著低于其他存储类型,特别是对于归档使用的分层存储类别(例如S3 Glacier)。劣势:高延迟: 每个请求都是一个HTTP调用,这会引入网络开销。这使得对象存储对于需要读取许多小文件的任务来说速度较慢,因为每个文件的延迟会主导总读取时间。基于API的访问: 对象存储不符合POSIX标准。您不能像传统文件系统那样挂载它并使用标准文件I/O操作。应用程序必须编写为使用S3(或等效)API。虽然存在s3fs等工具,但它们通常存在性能和一致性问题。“最终一致”模型: 某些对象存储具有一致性模型,可能导致新写入或覆盖的对象在所有后续读取请求可见之前出现延迟,这会使某些数据处理流程变得复杂。机器学习中的用例:主要数据湖: 存储原始非结构化数据(图像、文本、日志)。模型和工件库: 一个持久的、版本化的存储库,用于存储训练过的模型权重、数据划分和实验结果。检查点存储: 一个经济高效的位置,用于保存长期训练检查点。块存储块存储,例如Amazon Elastic Block Store (EBS)或Google Persistent Disk,为计算实例提供原始存储卷(块)。操作系统使用传统文件系统(例如ext4、XFS)格式化此卷,并管理文件和目录。优势:低延迟和高IOPS: 由于存储(逻辑上)直接连接到实例,它为随机读/写操作提供了出色的性能,使其非常适合数据库或事务性工作负载。符合POSIX标准: 它表现为标准本地磁盘,允许任何应用程序无需修改即可使用它。劣势:单主机访问: 标准块卷一次只能由一个计算实例挂载,因此不适合在多节点训练集群之间共享数据。可扩展性有限: 单个卷有最大大小限制(例如某些EBS类型为64 TiB),其性能与所连接的实例绑定。成本更高: 每GB成本远高于对象存储。机器学习中的用例:实例引导卷: 训练或推理服务器的操作系统运行在块存储上。临时空间: 用于需要高性能磁盘I/O的单节点任务的临时存储。特征存储数据库: 托管特征存储的在线组件,该组件需要低延迟查找(例如,Redis或Cassandra实例)。并行文件系统并行文件系统,例如Lustre、BeeGFS及其托管云等效服务(例如Amazon FSx for Lustre),旨在为数千个客户端提供对共享数据集的并发、高性能访问。它们通过将数据分条到多个存储服务器上并将元数据操作分离到专用服务器来实现这一点。digraph G { rankdir=TB; splines=ortho; node [shape=box, style="filled,rounded", fontname="sans-serif", fillcolor="#e9ecef", color="#868e96"]; edge [fontname="sans-serif", color="#495057"]; subgraph cluster_clients { label="GPU训练集群 (客户端)"; style="filled"; fillcolor="#f8f9fa"; color="#ced4da"; node [fillcolor="#a5d8ff"]; gpu1 [label="GPU节点 1"]; gpu2 [label="GPU节点 2"]; gpu3 [label="..."]; gpu4 [label="GPU节点 N"]; } subgraph cluster_pfs { label="并行文件系统"; style="filled"; fillcolor="#f8f9fa"; color="#ced4da"; node [fillcolor="#96f2d7"]; mds [label="元数据服务器 (MDS)\n(文件名, 权限)"]; subgraph cluster_oss { label="对象存储服务器 (OSS)"; style="filled"; fillcolor="#f1f3f5"; color="#ced4da"; node [fillcolor="#b2f2bb"]; oss1 [label="OSS 1\n(数据块 A)"]; oss2 [label="OSS 2\n(数据块 B)"]; oss3 [label="..."]; oss4 [label="OSS N\n(数据块 C)"]; } } gpu1 -> mds [label="1. 打开 /data/image.jpg"]; mds -> gpu1 [label="2. 授予锁,\n指向 OSS 1,2,N"]; gpu1 -> oss1 [label="3. 读取数据块 A"]; gpu2 -> oss2 [label="3. 读取数据块 B"]; gpu4 -> oss4 [label="3. 读取数据块 C"]; }并行文件系统架构图。客户端节点首先联系元数据服务器(MDS)以定位文件数据,然后直接从多个对象存储服务器(OSS)并行读取数据块。优势:极高吞吐量: 通过聚合许多存储服务器的带宽,这些系统可以提供数百GB/秒甚至TB/秒的吞吐量,并随存储服务器的数量扩展。共享POSIX访问: 集群中的所有客户端节点都看到相同且一致的文件系统。这大大简化了分布式训练的数据加载代码,因为每个节点都可以使用标准文件路径访问数据。大规模低延迟: 专为高性能计算(HPC)环境设计,即使在繁重并发负载下也能保持低延迟。劣势:成本与复杂性: 并行文件系统是最昂贵的选择,部署和管理起来可能很复杂,尽管托管服务可以消除大部分此类困难。不适合小文件: 尽管优于对象存储,但由于元数据开销,在处理数百万个小文件时性能仍可能下降。机器学习中的用例:热门训练数据: 大型多节点分布式训练任务正在积极使用的数据集的主要存储。共享主目录: 为数据科学家团队提供公共的高性能文件空间。高性能临时空间: 多节点数据处理任务生成中间文件的共享临时空间。AI分层存储架构没有单一系统能为整个机器学习工作流提供性能、成本和可扩展性的最佳平衡。行业最佳实践是采用分层架构,使存储方案与数据访问模式匹配。{"layout":{"font":{"family":"sans-serif"},"xaxis":{"title":"存储指标"},"yaxis":{"type":"category"},"barmode":"group","legend":{"orientation":"h","yanchor":"bottom","y":1.02,"xanchor":"right","x":1},"title":{"text":"机器学习存储特性对比"},"margin":{"t":60,"b":40,"l":150,"r":20}},"data":[{"y":["成本 (\u0024/GB/月)","总吞吐量","每文件延迟","可扩展性","访问模式"],"x":[0.02,2,8,10,2],"name":"对象存储","type":"bar","marker":{"color":"#339af0"},"orientation":"h"},{"y":["成本 (\u0024/GB/月)","总吞吐量","每文件延迟","可扩展性","访问模式"],"x":[0.1,4,10,3,10],"name":"块存储 (SSD)","type":"bar","marker":{"color":"#f76707"},"orientation":"h"},{"y":["成本 (\u0024/GB/月)","总吞吐量","每文件延迟","可扩展性","访问模式"],"x":[0.25,10,7,8,10],"name":"并行文件系统","type":"bar","marker":{"color":"#37b24d"},"orientation":"h"}]}存储方案在主要指标上的相对比较,按1(低)到10(高)进行缩放。请注意,具体性能和成本很大程度上取决于特定的云服务提供商和服务配置。一个常见且有效的方法是使用对象存储作为永久、持久的数据湖,并使用并行文件系统作为活跃训练任务的高性能缓存。数据摄取: 原始数据进入对象存储数据湖。预处理: Spark或Ray任务从对象存储读取数据,处理后,将准备好的训练数据集以优化格式(例如TFRecord、Petastorm)写回对象存储。训练准备: 在分布式训练任务开始前,将准备好的数据集从对象存储复制到并行文件系统。这是每次训练运行的一次性成本。模型训练: 多节点GPU集群以最大速度从并行文件系统读取数据,该系统旨在处理所有节点的并发请求,而不会产生I/O瓶颈。归档: 训练完成后,并行文件系统上的高性能副本可以删除以节省成本,主副本则安全地保留在对象存储中。这种混合方法结合了对象存储的低成本和可扩展性与并行文件系统的卓越性能,确保只有在绝对必要时才使用昂贵的高性能层。这可以避免存储成为模型训练速度的制约因素,并帮助您有效地扩展计算资源。