发布于: Mar 14, 2022

在本文中我们将介绍一些技巧,探讨如何通过网络操作(例如从 Amazon S3 处下载数据、使用 Amazon EBS 以及 Amazon Elastic Files System(简称 Amazon EFS)等文件系统)优化数据传输服务。

优化文件大小

大家能够以低成本将大量数据存储在 Amazon S3 当中,其中包括来自应用程序数据库的数据,例如通过 ETL 过程提取为 JSON CSV 格式的图像文件。而 Amazon SageMaker 运行中的第一步,就是从 Amazon S3 处下载文件这种默认输入模式被称为文件模式。

即使是并行下载或上传体积极小的多个文件,其速度也要低于总大小相同的少数较大文件。例如,如果您拥有200万个文件,单个文件的大小为 5 KB(总大小 = 10 GB = 200 x 5 x 1024 KB),则下载大量小型文件可能需要耗费几个小时。但如果这 10 GB 数据量来自2000个单个大小为 5 MB 的文件(总大小 = 10 GB = 2000 x 5 x 1024 x 1024 KB),那么下载只需要几分钟就能完成。假定用于大文件与小文件的总存储容量与用于数据传输的线程数量大致相同,同时假设传输块大小为 128 KB,那么面对仅为 5 KB 的实际文件大小,每个传输块的实际数据传输量也将仅为 5 KB 而非 128 KB

在另一方面,如果文件太大,则无法使用并行处理加快文件的数据上传或者下载速度 除非大家使用 Amazon S3 range gets 等选项并行下载多个不同的数据块。

通过 MXNet RecordIOTFRecord 等格式,我们可以将多个图像文件压缩并密集打包至单一文件当中,从而避免这种性能浪费。例如,MXNet RecordIO 在处理图像时会建议对多幅图像进行尺寸压缩,确保将至少一批图像容纳到 CPU/GPU 内存当中;另外,通过将多幅图像密集打包至单一文件中,我们也能彻底消除 I/O 操作中因小文件传输导致的传输瓶颈。

作为一项通行原则,最佳文件大小一般在1128 MB 之间。

适用于大型数据集 Amazon SageMaker ShardedByS3Key Amazon S3 数据分布

在分布式训练期间,大家还可以跨多个实例对超大规模数据集进行分片。您可以将 S3DataDistributionType 参数设置为 ShardedByS3Key,轻松实现 Amazon SageMaker 训练工作的数据分片。在此模式下,如果 Amazon S3 输入数据集总计包含 M 个对象,而训练作业有 N 个实例,则每个实例都将处理 M/N 个对象。在这种用例下,各设备上的模型训练将只使用训练数据中的一个子集。

适用于大型数据集的 Amazon SageMaker Pipe 模式

相较于 SageMaker 文件模式,Pipe 模式可帮助我们直接将大量数据从 Amazon S3 流式传输至您的训练实例,而无需先将其下载至本地磁盘。Pipe 模式允许我们的代码直接访问数据,这就避免了先行完整下载对速度产生的影响。由于数据永远不会被下载至磁盘,且只在内存中保留相对较小的占用空间,因此该模式会持续不断地从 Amazon S3 处下载数据,这非常适用于处理 CPU 内存无法一次性容纳的超大规模数据集。要使用部分原始字节在流式传输带来的可用性优势,大家需要在代码中根据记录格式(例如 CSV)对字节进行解码,并找到记录末尾部分将部分字节转换为逻辑记录。Amazon SageMaker TensorFlow 就为文本文件及 TFRecord 等常见格式提供内置的 Pipe 模式数据集读取器。如果您使用的框架或库不具备内置数据读取器,也可以使编写您自己的数据读器,从而正常使用 Pipe 模式。 

Pipe 模式流传输带来的另一个结果,则是要求对数据进行重新整理,即通过 ShuffleConfig 重新整理 manifest 文件及 augmented manifest 文件中的 Amazon S3 键前缀匹配或行结果。如果文件体积很大,则不能依靠 Amazon SageMaker 完成重整;这里大家必须预取“N”个批次,并根据 ML 框架编写代码以实现数据重整。

如果可以直接将整个数据集放入 CPU 内存当中,那么文件模式的执行效率可能比 Pipe 模式更高。这是因为如果内存足以容纳整个数据集,则需要一次性将完整数据集下载至本地磁盘,再一次性将整个数据集加载至内存中,并在训练流程中的各个阶段反复从内存中读取数据。从内存中读取数据,在速度上往往远高于网络 I/O,能够带来显著的性能提升。

在下一节中,我们将讨论如何处理超大规模数据集。

使用 Amazon FSx for Lustre Amazon EFS  处理大型数据集

对于超大型数据集,大家可以使用分布式文件系统以缩短 Amazon S3 的下载时间。

大家可以在 Amazon SageMaker 上使用 Amazon FSx for Lustre 以缩短启动时间,并将数据驻留在 Amazon S3 当中。

在首次运行训练作业时,FSx for Lustre 会自动从 Amazon S3 处复制数据,并将其交付至 Amazon SageMaker。另外,大家也可以将相同的 FSx for Lustre 文件系统用于对 Amazon SageMaker 上的训练作业进行后续迭代,以防止重复下载使用频率较高的 Amazon S3 对象。从这个角度看,对于将训练数据集放置在 Amazon S3 中的训练工作、以及需要使用不同训练算法或参数多次运行训练作业才能得到最佳效果的工作流当中,FSx for Lustre 具有非常显著的比较优势。

如果您已经在 Amazon Elastic File System (Amazon EFS) 上拥有训练数据,还可以将 Amazon EFSAmazon SageMaker 结合使用。

在使用这个选项时,请务必关注文件的大小。如果文件体积过小,由于传输块大小的限制,I/O 性能可能因此受到影响。

配备本地 NVMe SSD 存储的 Amazon SageMaker 实例

一部分 Amazon SageMaker GPU 实例(例如 ml.p3dn.24xlarge  ml.g4dn)提供基于 NVMe 的本地 SSD 存储,用以替代 EBS 存储卷。例如,ml.p3dn.24xlarge 实例就提供 1.8 GB 的本地 NVMe SSD 存储容量。使用基于 NVMe 的本地 SSD 存储,意味着在将训练数据从 Amazon S3 下载至本地磁盘之后,磁盘的 I/O 要远远快于 Amazon S3 EBS 存储卷等的网络资源读取速度。如此一来,只要训练数据的大小与本地 NVMe 存储相适应,即可大大加快训练速度。 

相关文章