AI存储:存储系统在优化AI训练中的关键作用 精华
数据加载过程与性能优化
数据加载的复杂性
数据加载并不仅限于从存储读取数据,它涵盖了解码、格式转换及数据增强等预处理环节。这些步骤通常在CPU上执行,目的是将原始数据转换为GPU可处理的张量格式。
数据加载的步骤
数据加载流程可以概括为:
- 从存储系统读取数据到系统内存。
- 解码原始数据。
- 应用数据变换和增强操作(如裁剪、尺寸调整)。
- 将处理后的数据传输至GPU。
预取器的作用
预取器显著提升数据加载效率,它在模型训练需要数据之前,预先加载数据到缓冲区,确保GPU始终有数据可用。然而,若训练速度快于数据加载和预处理速度,预取缓冲区可能会被耗尽,导致GPU空闲等待。
性能影响因素
多个因素会影响数据加载性能,包括样本大小、批量大小、线程数量、I/O模式、使用的协议及缓存效果等。
I/O模式的特性
I/O模式可分为顺序和随机,这取决于具体工作负载及训练数据集的存储方式。例如,3D U-Net模型的I/O轨迹显示文件访问为随机,而文件内部读取为顺序。
数据预处理瓶颈
在处理非结构化数据(如图像、视频)时,数据预处理环节可能成为性能瓶颈。研究表明,某些情况下数据预处理的功耗可与实际训练功耗相当。
解决方案
为应对数据预处理瓶颈,出现了多种解决方案,如将预处理任务卸载到GPU或在训练前离线执行部分预处理工作。
检查点机制
检查点的重要性
检查点是AI模型训练中不可或缺的环节,定期保存模型状态(包括模型权重、优化器状态等),以防数据丢失并确保训练进度在意外情况下不会完全丢失。此外,检查点有助于模型调试和评估,研究人员可通过分析检查点数据监控模型训练过程。
检查点大小与保存频率
检查点大小主要由模型规模决定,通常每个参数需要约4个字节。检查点保存频率需要权衡数据安全性与训练效率,保存过于频繁可能增加存储开销与GPU等待时间,当前没有统一的保存频率标准,具体取决于模型规模和训练时长等。
保存流程与性能优化
检查点保存过程分为三个阶段:
- 训练暂停,模型状态从GPU转移至系统内存。
- 模型状态序列化。
- 序列化数据写入持久化存储。
性能瓶颈与优化方法
保存过程中的性能瓶颈通常在数据写入速度上。优化方法包括:
- 并行化检查点写入:将检查点数据分割,由多个GPU并行写入。
- 内存检查点保存:将数据复制至系统内存后,由专用GPU异步写入。
存储方式与压缩
AI框架支持文件存储与对象存储。文件存储因高吞吐量和低延迟成为主流选择,而对象存储在可扩展性和易用性上表现优异。压缩方法(如量化与剪枝)可以有效减少存储空间占用。
AI训练中的存储系统
文件存储与对象存储
大多数AI框架支持文件存储和对象存储。文件存储因高吞吐量、低延迟及对RDMA技术的支持,成为AI训练的主要选择。对象存储在可扩展性和易用性方面具有优势,得益于新型存储连接器(如Torch.data库、WebDataset、PyTorch S3连接器等)的出现。
存储系统性能优化
AI训练对存储系统性能要求极高,特别是在数据加载和检查点保存阶段。缓存机制、I/O访问模式和RDMA技术等都是提升存储系统性能的重要手段。
其他关注点
- GPU直接存储技术(GPUDirect Storage):允许数据直接读取到GPU内存,提升加载效率,但尚未广泛支持。
- 高速网络:存储网络的速度需与存储设备的写入速度相匹配,以充分发挥存储系统性能。
----------
在AI数据管道的各个阶段,AI工作负载都需要与存储系统进行交互。AI生命周期始于数据采集阶段。如左侧框所示,系统从多个来源收集数据并将其存储在持久化存储(Persistent Storage)中。随后是数据准备阶段,数据科学家将原始数据转换为适合训练和推理的格式。这个阶段包括数据清洗(Data Cleaning)、特征提取(Feature Extraction)和数据标注(Data Labeling)等工作。由于每个项目需求不同,数据准备没有统一的标准流程。
在第二个框中显示的是训练阶段,这时需要训练模型并进行验证。此阶段性能至关重要,存储系统主要用于向GPU提供数据读取服务或执行检查点保存。训练完成后,模型即可部署用于推理。在推理阶段仍需要为GPU提供数据,但对计算资源的需求比训练阶段低。此外,还需要快速读取模型状态,以便将其加载到执行推理的机器上。
我们将重点讨论模型训练过程,特别是数据加载(Data Loading)和检查点保存(Checkpoint Saving)这两个环节。
首先,让我们简要回顾AI训练工作负载的基本概念。AI训练数据集由多个样本组成,每个样本包含模型输入数据。这些数据集可以是文本、图像、视频或它们的组合形式,可以存储在单个或多个文件中。训练初始阶段需要从存储系统读取数据到系统内存,这个过程称为数据加载。系统将训练样本组织成小批量(Mini-batch)输入到模型中。这些批量数据经过模型处理,即前向传播(Forward Propagation)过程,并计算损失值(Loss Score)来评估模型性能。然后利用这个损失值更新模型权重。这个过程会不断重复,直到模型收敛或达到预期精度。完整处理一遍数据集被称为一个训练周期(Epoch)。某些模型可能需要多个训练周期才能收敛,这意味着需要多次读取整个训练数据集。
为防止数据丢失,系统会定期保存模型状态,这就是检查点保存过程。在此过程中,AI框架与存储系统交互,写入检查点数据,或在发生故障时通过读取存储中的检查点数据进行恢复。
这里展示了数据路径和训练工作负载的技术栈,包括数据加载和检查点保存的细节。如图所示,最上层是AI模型,最底层是存储系统。影响训练效率的因素遍布各个层次。从右下角的存储系统开始,可以是本地存储或分布式存储系统,其上是操作系统层,再上是负责与存储通信并连接AI框架的客户端库。
在数据加载方面,AI框架使用数据集(Dataset)的概念。训练基于特定数据集进行,并提供相关API。内部实现中,通过连接器(可以是工具、插件或库)定义对底层存储的访问方式。数据集处理包括采样(Sampling)、索引(Indexing)和数据转换(Data Transformation),这些操作在并行引擎上执行。在检查点保存阶段,如右侧所示,连接器通过客户端库与存储系统通信。该阶段涉及GPU与CPU之间的数据复制以及格式化等任务。
深入分析数据加载阶段的具体流程:数据集包含一系列样本(例如独立的图像文件)。首先,系统通过单线程或多线程方式从存储读取数据到系统内存。原始数据需要转换为张量(Tensor)格式以供GPU处理。第一步是数据解码,然后应用各种变换和增强操作,如裁剪和尺寸调整。最后将数据传输到GPU。
需要强调的是,数据加载不仅仅是简单的存储I/O操作,而是包含了存储I/O和多个处理阶段的复合过程,这些阶段执行实时数据预处理。目前,大多数预处理任务都在CPU上完成。
在数据加载阶段,是什么原因导致GPU等待数据而处于空闲状态?以PyTorch为例,其内置了预取器(Prefetcher)组件。GPU与运行在CPU上的数据加载器协同工作。预取器在模型训练需要数据之前,将数据预先加载到缓冲区。这种预加载机制确保GPU始终有可用数据,从而显著减少空闲时间。用户可以调整和监控预取器参数以优化系统性能。
训练开始时,由于需要同时填充预取缓冲区和读取第一批样本,初始耗时较长。此时系统在等待存储I/O完成。数据到达后开始预处理,在第一批样本预处理完成之前,GPU处于空闲状态。预处理完成后,数据被移至GPU,开始训练这一批数据,同时数据加载器读取下一批。这构成了初始状态下的工作流程。
达到稳定状态后,可能出现两种情况。理想情况下,训练时间大于或等于读取时间(包括存储I/O和处理时间)。这种情况下,预取器能够保持数据持续供应。但如果训练时间小于存储和预处理的总时间,即使预取缓冲区很大,最终也会耗尽,导致数据饥饿(Data Starvation),使GPU处于等待状态。
存储I/O性能受多个因素影响:样本大小、批量大小、线程数量、I/O模式、使用的协议以及缓存效果。虽然通常认为读取时间是主要瓶颈,但这种假设并不总是成立。例如,处理文本数据(如语言模型)时,由于只需进行分词(Tokenization),预处理时间较短。相比之下,处理图像或视频数据集时,预处理时间可能成为主要瓶颈。
这里是一些具体数据。左侧图表展示了ImageNet数据集解码和转换的成本分析,这是一篇来自MIT的研究论文。顶部柱状图中,深灰色区域代表总训练耗时,包括训练、读取和预处理过程。中间柱状图显示了数据读取和预处理的时间开销。数据表明,在这个工作负载中,GPU处理并非性能瓶颈,反而是存储系统或数据预处理成为关键限制。然而,底部柱状图显示的实际数据读取时间非常短,这意味着对于该特定模型,数据处理环节是主要性能瓶颈。
Meta数据中心的研究也得出类似观察结果。右侧图表展示了三种不同推荐模型的功耗分析。在底部柱状图中,推荐模型三的预处理功耗(蓝色区域)与实际训练功耗几乎相当。他们还报告称GPU无法快速处理数据以满足计算需求。这充分表明,尤其在处理图像和视频数据的工作流中,预处理阶段可能极其消耗计算资源。在这一研究领域,已经存在专业的解决方案,例如专门的数据加载器可将预处理任务卸载到GPU,或在训练前离线执行部分预处理工作。
接下来分析I/O模式。训练工作流在数据加载阶段会产生顺序和随机I/O模式,本次我们重点关注读取模式。每个训练样本都需要完整读取,例如对于图像数据,需读取整个图像文件。但样本的检索是随机的,这导致样本间形成随机访问模式。训练通常涉及多个训练周期(epoch),每个周期数据加载器都会读取整个数据集。为确保训练过程的随机性,数据总是被打乱并以随机批次读取。如果数据集可完全载入内存,则可直接从内存提供数据,避免冗余I/O操作。
底部图表展示了3D U-Net模型的I/O轨迹,这是医学图像分割领域的标准基准测试。每个文件存储一个医学图像样本,平均文件大小约150MB。Y轴显示唯一文件标识,X轴代表时间。不同颜色表示不同文件,说明文件访问是随机进行的。但若细究单个文件的访问模式,会发现文件内部读取是顺序的。
情况并非总是如此,因为有时训练数据会将多个样本聚合存储在单一数据集中。这里我展示了来自训练基准的推荐模型I/O访问模式。这是一个包含大量样本的单一训练文件,文件规模达3.8TB。训练过程中,Y轴代表文件偏移量,X轴表示时间。
工作负载读取训练数据、执行训练,随后暂停以评估模型精度,如此往复。从蓝色条可见,训练文件访问看似顺序。然而放大观察,会发现工作负载实际上通过滑动窗口(sliding window)进行随机数据访问。这个基准会在存储系统中产生大量小规模I/O。因此,访问模式可以是顺序的,也可以是随机的,这取决于具体工作负载和训练数据集的存储方式。
检查点(Checkpoint)保存对于大型模型训练至关重要,训练过程可能持续数天甚至数周。检查点保存确保即使出现电力故障或系统崩溃等意外情况,也不会导致全部训练进展丢失。这是一个周期性过程,用于保存模型当前状态,包括模型权重(已学习的参数)和优化器状态。检查点还可能包含随机状态、调度器状态及其他相关信息。训练时间越长,模型权重的价值就越高,因此避免丢失这些权重、重新开始训练的需求变得尤为紧迫。
检查点保存有多重目的,容错是最主要原因,但同时也可用于模型调试和评估。通过监控训练过程,研究者可以判断模型是否正在收敛或发散。若发现模型性能未如预期改善,可回退到表现更好的先前检查点。通常,检查点在训练过程中被保留,后续模型可以还原到任何先前版本。根据故障具体情况,可从任意检查点恢复模型。
检查点过程的一个关键方面是检查点大小,这取决于模型规模,而非训练数据集、GPU内存或GPU数量。一般经验法则是每个参数约需四个字节。假设每个模型参数使用两个字节表示低精度值,另有十二个字节用于优化器和其他状态信息。以GPT-3为例,其1750亿参数模型生成的检查点数据约为2.4TB;Megatron-Turing NLG模型拥有5300亿参数,其检查点存储需求约为7.4TB。检查点大小具有可预测性,在固定硬件带宽下,检查点保存吞吐量可精确估算。检查点过程代价高昂,因为在完成保存之前会暂停训练。
检查点保存过程包括三个阶段:首先,模型在GPU上运行。训练被暂停,模型状态从GPU转移到系统内存,进行序列化,随后保存到持久存储。发生故障或需要恢复时,将从存储中读取检查点数据到系统内存,反序列化,然后将模型状态移回GPU内存。
检查点可以保存在单个或多个文件中,这取决于模型并行策略。AI领域存在两种并行性类型:数据并行(Data Parallelism),即每个GPU持有完整模型副本并处理不同数据批次。通常由一个GPU(称为"rank zero")负责写入检查点。在这种情况下,无需写入所有GPU的全部内存内容,这也是当前的默认行为。
对于超大模型,如果无法装载到单个GPU,可将模型分割到多个GPU,每个GPU写入其模型参数部分的检查点。这需要精确协调以确保模型各部分正确保存。目前也出现许多混合方法,结合数据和模型并行性。这种情况下,检查点机制可能更为复杂,涉及多个GPU写入模型不同部分,具体取决于并行策略。在检查点场景中,多个GPU可参与写入,但检查点文件始终由单个线程顺序写入。恢复检查点时,所有GPU从存储读取检查点数据。
检查点保存极其重要,正如前文提到的TB级检查点数据。存储性能在此至关重要。观察当前趋势,特别是大型语言模型,模型规模持续增长,检查点大小也随之增长。更大模型需要更多GPU,故障概率也随之提高。Meta最新研究表明,检查点保存可能使训练速度降低43%,这一数字凸显了高效检查点对训练的重要性。存储系统应优化以高效写入检查点数据,减少检查点过程中的GPU等待时间。
Meta同一研究还报告,完整恢复开销占总训练时间的12%。Llama 3模型训练论文也强调了类似挑战,指出高突发检查点写入可能导致整个存储系统饱和。阿里巴巴报告称,在大规模语言模型训练作业中,43%的故障发生在检查点阶段。这些故障可能源于软件问题(如bug或数据错误)或硬件问题(如网络故障)。研究者希望增加检查点频率,但同时也要权衡检查点保存的高额成本。
检查点保存性能直接影响检查点频率。低频检查点策略缺乏吸引力。因此,高效检查点保存对大规模训练至关重要。当前检查点方法往往导致GPU停顿。以数据并行检查点策略为例,当使用torch.save作为默认检查点机制时,训练会被暂停。检查点数据被移动到内存,序列化,写入硬盘。这一过程产生大量顺序写入,使GPU处于空闲等待状态。学术界和产业集群已提出多种优化方法,旨在减少检查点保存期间的GPU等待时间。虽然无法详尽列举所有方法,但我将重点阐述几种常见技术。
第一种技术是并行化检查点写入(Parallel Checkpoint Writing)。这种方法利用数据并行性,因为每个GPU持有相同的检查点数据。它将检查点创建分配给多个并行数据并行的GPU,使得每个GPU仅写入检查点文件的一部分,而非由单个GPU完成。因此,复制到存储的数据规模和写入量减少,您将从更多并行存储I/O中受益,而不是生成单一的存储I/O。基于这些变化,检查点保存的性能和效率得到提升。然而,需要注意的是,这种方法会对存储产生大量并行I/O,因此您的存储系统必须具备可扩展性,并能高效处理这些并行I/O。此外,每个单独文件生成的检查点数据量也变小。
第二种优化是内存检查点保存(In Memory Checkpointing)。这种技术解决了检查点保存过程中硬盘或网络I/O成为瓶颈的情况。在这种情况下,您暂停检查点,将数据复制到系统内存中,然后继续训练,而不等待检查点数据写入持久存储。之后,专用GPU异步地将此检查点数据写入持久存储。采用这种方法存在丢失检查点数据的风险,但文献提供了确保持久性的方法。通常,至少确保先前的检查点已写入存储。此外,还需权衡:与等待硬盘相比,丢失一个检查点是否值得?
我们已讨论数据加载和检查点保存,现在聚焦存储部分。大多数现有AI框架支持文件存储(File Storage)和对象存储(Object Storage)访问,用于数据加载和检查点保存。为提供高吞吐量和低延迟,存储集群通常配备高性能闪存存储。大多数AI训练工作负载使用基于文件的存储系统来存储和访问训练数据,以确保昂贵的GPU得以高效利用。AI框架设计为访问文件系统,期待使用文件样式的API来加载和恢复检查点。其主要原因在于性能。对象存储由于其高且不可预测的延迟,阻碍了其在AI训练工作流中的直接使用。对象存储的典型部署模型涉及一个更快的缓存层,可以是本地驱动器或缓存,将数据从对象层移动到为GPU提供支持的更快层。
尽管存在更快速的对象存储解决方案,但基于文件的解决方案在为GPU提供数据时仍占主导地位。然而,对象存储具有显著优势,包括可扩展性和容量。随着数据集规模的持续增长,许多AI应用正在云中开发,导致基于云的AI应用增加。此外,对象存储解决方案用户友好,运行在用户空间,使数据科学家能够避免处理远程存储的复杂性。近期,我们看到许多新的存储连接器,使得高效访问对象存储成为可能,表明对象存储在AI训练工作负载中的使用案例正在增加。
如果查看PyTorch如何使用不同连接器访问基于文件和对象的存储解决方案,可以概括当前的技术格局。所谓存储连接器,是指能够使AI框架访问存储系统读写数据的特殊工具或库。这些连接器旨在架起AI框架与各种存储解决方案之间的桥梁,确保以优化方式访问存储。
可以看到,顶部是PyTorch框架,下方有多种连接器选项。选择合适的工具可能令人困惑,因此我将重点介绍最新和最流行的几种。首先,从左侧的三个黄色框来看对象存储连接器。
PyTorch提供Torch.data库,包含数据加载工具。可以配置其直接从对象存储读取数据并进行流式传输,支持S3及其他对象存储协议。Web数据集是一个示例,允许直接从云存储访问TAR文件,无需解压。另一个选项是PyTorch的S3连接器,支持检查点保存和数据加载。该连接器允许用户以顺序和随机方式访问存储,使用高性能库,显著提升标准GET操作效率。它包含各种优化,如高级网络管理和有效处理重试与超时,从而加快检查点计算。
第三个选项是基于FUSE的文件系统客户端,允许用户将S3存储桶挂载为本地文件系统。这使应用程序能够使用标准文件操作(如打开和读取)访问S3桶中的对象存储。可用选项众多,Mountpoint-S3是最新的之一。这些基于FUSE的客户端在性能和POSIX兼容性间进行平衡。值得注意的是,它们提供有限的POSIX兼容性,仅支持少数易于映射到对象协议API的文件操作。例如,大多数不支持重命名或修改现有文件,因为S3和对象协议不允许。然而,其POSIX兼容性足以满足AI框架在数据加载和检查点保存方面的需求。
第二个连接器是基于文件的存储,这是默认方法。可执行标准的POSIX文件API调用,如读取和写入。几乎所有AI框架都偏好这种方法。例如,如果您使用Torch.save、Torch.load或PyTorch的分布式检查点模块,它们都与基于文件的存储一起使用。此外,PyTorch提供了一整套优化库,用于使用这些文件API访问不同类型的数据集,如图像数据集和文本数据集。基于文件的存储系统的主要优点之一是能够使用RDMA(远程直接内存访问)技术,这使得框架在访问文件系统时能够透明地受益于RDMA。
RDMA到GPU内存是另一回事。在左侧,我展示了哪些连接器支持RDMA到GPU内存。这项技术称为GPU直接存储(GPUDirect Storage),目前尚未得到像PyTorch这样的框架广泛支持。要启用此功能,需要额外的配置和集成。这项技术仅在使用基于文件的存储解决方案时存在。例如,HSDLY是一个数据加载库,支持GPU直接存储,允许将数据集直接读取到GPU内存中。另一个支持GPU直接存储的库是Kyo。这两个连接器都使用K文件API进行GPU直接存储。
这里展示了基于文件的连接器和基于对象的连接器之间的高层次架构差异。以NFS作为文件表示的示例,比较对象连接器与基于文件的连接器,其中Torch Data 3连接器和Mountpoint作为对象连接器的代表。尽管存在诸多差异,但可以将它们分为三大类。
第一个是缓存。缓存是主要区别之一。基于文件的存储得益于操作系统页面缓存,这避免了在数据集适合缓存时对同一数据的重复访问。这也改善了顺序访问与读取头的关系。相反,对象连接器在用户空间运行,并绕过虚拟文件系统层,因此它们无法利用操作系统页面缓存。因此,这些对象连接器必须部署自己的独立缓存机制。例如,Mountpoint S3提供读取缓存。
第二个区别在于I/O访问模式,这非常重要,并可能影响存储吞吐量。例如,通过S3连接器或Mountpoint,我们看到这两种解决方案都得益于异步S3客户端,生成许多小的并行I/O到存储。它们不是发送单个GET请求,而是创建多个并行范围GET请求。底层库使用多部分上传,而不是执行单个PUT操作。我们观察到数据以大约8 MB的部分大小被读取或写入,并且进行了大量的异步I/O。这是这两个连接器的一项优化。
第三个区别是协议。这些连接器使用不同的协议。对象协议的延迟较高,认证和授权过程在对象存储中非常昂贵。对于每个请求,您必须执行IAM认证和授权,这可能会产生高昂的成本。此外,正如前面的幻灯片提到的,基于文件的存储解决方案受益于RDMA技术,而对象存储解决方案则不然。
总结我们今天讨论的内容:我们谈到了数据加载,这不仅包括存储I/O,还包括数据转换。I/O访问模式依赖于模型和数据集。存储系统必须提供高吞吐量和低延迟,以确保数据尽可能快速地送入GPU。
检查点保存至关重要;大型模型需要高读写带宽,以高效保存和恢复检查点。检查点文件可以保存在一个或多个文件中,但每个检查点文件由单个写入者写入。同时,必须注意,累积的检查点可能会产生显著的存储需求,尤其是在频繁检查点保存的情况下。因此,存储解决方案必须高效处理这些需求。
我们还讨论了文件存储和对象存储;目前,AI框架期望使用类似文件的接口。然而,近年来,对访问对象存储解决方案的支持明显增加。
----------
问题:训练结束后,检查点(Checkpoint)是否会保留?
回答:这取决于具体情况,不能一概而论。通常,在训练过程中会保留检查点。由于模型调试、评估等原因,您可能希望在训练结束后继续保留这些检查点。如果检查点仅用于容错,则可以不必长期保留。总的来说,这取决于具体用例。在模型调试、验证等工作中,检查点往往会保留更长时间。
问题:块存储(Block Storage)真的有适用场景吗?
回答:在人工智能训练方面,目前观察较少。您可以使用块存储,但训练框架通常期望类似文件系统的访问方式。我尚未看到对象存储(Object Storage)在训练过程中的广泛使用。通常,您需要使用文件系统(File System)或对象存储。这是当前的技术观察。
问题:检查点保存的频率是多少?
回答:这是一个常见的问题。根据在线资源和文献,检查点保存通常发生在每个训练周期(Epoch)结束后。在完成对训练数据集的完整遍历时进行检查点保存。对于大型语言模型(LLMs),通常在某些训练步骤后进行检查点保存。例如,Meta在其研究论文中提到每30分钟进行一次检查点保存。然而,这难以作为通用标准。检查点保存频率可能是每30分钟一次,或每几个小时一次。这很大程度上取决于写入吞吐量以及根据模型规模进行检查点保存的需求。遗憾的是,很难给出一个确切的数字。
问题:检查点机制在SSD和HDD之间有何差异?
回答:在人工智能场景中,检查点保存需要尽快完成。检查点保存通常产生顺序写入,而非随机写入。尽管HDD可以进行顺序I/O,但AI框架通常与SSD或高速NVMe驱动器交互。HDD通常用于备份或存档。对于即时存储需求,推荐使用快速存储层,如NVMe SSD。如果需要长期保存,可以将检查点后续移动到HDD,但目前观察显示,训练阶段主要使用闪存存储。
问题:训练中I/O性能的典型要求是什么,具体包括IOPS和每秒字节数?
回答:对于数据加载或文本类工作负载的LLMs,I/O性能要求远低于图像或视频数据集。根据MLPerf最近的基准测试,训练用于医学图像分割的3D U-Net模型时,每个GPU的平均读取吞吐量约为2.7至3 GB/s。相比之下,对于LLMs或文本类数据,通常约为每个GPU每秒1 MB,因为这类模型通常是计算密集型而非存储密集型。对于图像或视频工作负载,存储要求的每GPU带宽可能达到数GB/s。
问题:为什么检查点保存需要序列化?
回答:检查点保存需要序列化,是因为需要将GPU上的张量(Tensor)数据提取出来,通常需要将这些数据序列化为数据流,然后以单个文件形式写入存储。这是基于当前的技术理解,但可能需要进一步确认。
问题:您认为S3对象存储会采用类似RDMA的技术,以便更快地直接读写数据到GPU内存吗?
回答:目前,对象存储尚未支持RDMA技术。我尚未在相关文献中看到相关实现。然而,随着人工智能框架中对象存储使用的增加,人们可能会开始优化存储和网络性能。据目前所知,现有的对象存储解决方案中尚未支持RDMA。
问题:每个GPU的存储吞吐量(Storage Throughput)的经验法则是什么?
回答:在数据加载阶段,文本数据的存储吞吐量通常在几兆字节到更少的范围内,具体取决于数据量。对于图像或视频类工作负载,吞吐量可达到几GB。以医学图像工作负载为例,每个GPU的读取吞吐量约为3 GB/s,这能使GPU利用率达到90%。医学图像通常对存储吞吐量要求最高。在检查点(Checkpoint)保存方面,存储吞吐量取决于写入存储的速度需求。显然,更高的吞吐量意味着更好的性能,但难以给出具体的吞吐量标准。
问题:由于检查点文件较大,许多环境是否会集中使用磁带存储(Tape Storage)以保留多个检查点副本?
回答:检查点的初始写入必须在高速存储介质上进行,因为整个检查点数据需要写入远程存储并进行冗余复制。因此,第一个检查点需要存储在高速存储层。几乎所有检查点都会写入这一快速存储层。如遇存储容量限制,有几种处理策略:出于容错目的,可以删除早期检查点;若用于模型调试或评估且存储空间受限,可将早期检查点迁移至低速存储。磁带存储通常不用于训练阶段,但训练完成后,可用于长期备份。
问题:存储如何处理序列化(Serialization)的检查点保存?是单线程还是将作业分配给单个存储设备?
回答:默认情况下为单线程模式。序列化检查点数据后,单线程将其写入存储。对于内存检查点保存,数据移动到系统内存后,持久存储的刷新机制可能会有所不同。如果采用异步写入机制,处理方式可能有所变化。通常,这些框架的默认行为是单线程写入,每个检查点文件由单独的线程写入。
问题:高速网络是否显著增强了I/O和检查点保存过程?
回答:检查点保存发生在GPU权重同步之后。此处讨论的网络是指GPU与服务器和存储间的网络连接。性能可能受网络速度和存储设备驱动器速度的共同影响。两者需要平衡:不能有超高速存储驱动器却配备低速网络,反之亦然。因此,存储网络的高速确实至关重要。
问题:检查点保存的频率如何?是否可以进行检查点缓存以便快速恢复?
回答:检查点缓存确实具有价值,尤其是最新的检查点。通常不会频繁读取检查点,仅在发生故障时使用。除调试或验证模型时,如发现模型性能不佳或未收敛,才会读取检查点。根据具体情况,检查点缓存很有意义,特别是在故障恢复场景中。可将最新检查点保存在缓存中,需要时可快速恢复。但在选择缓存哪个检查点时,需谨慎考虑模型准确性,可能需要比较前一个、前两个或前三个检查点,这取决于具体用例。
问题:检查点保存中压缩的好处是什么?
回答:传统无损压缩技术(如Gzip)在人工智能训练工作负载中压缩效果有限,因为检查点数据高度随机,缺乏重复模式。但存在其他有效技术:
- 量化(Quantization):将浮点数转换为低精度,减少位使用和存储需求。例如,从单精度转换为半精度。
- 剪枝(Pruning):去除模型中不重要的部分,减小检查点体积。
这两种技术是常见的检查点压缩方法,能有效减少存储开销。
参考资料:Kaynar, Ugur. "AI Storage: The Critical Role of Storage in Optimizing AI Training Workloads." YouTube, October 30, 2024. https://www.youtube.com/watch?v=vycUUhlRmVs.
本文转载自 Andy730,作者: 常华Andy