亚马逊AWS官方博客
在Amazon SageMaker中灵活使用多种存储服务
Amazon SageMaker 是一种完全托管的端到端机器学习服务,数据科研人员、开发人员和机器学习专家可以快速、大规模地构建、训练和托管机器学习模型。这极大地推进了您所有的机器学习工作,让您能够将机器学习技术迅速融入生产应用程序。Amazon SageMaker的主要工作组件包括:算法编写、模型训练、模型评估、模型托管等。
模型训练是机器学习工作流程中至关重要的一步,而为模型训练提供灵活、高效、准确的输入数据则直接决定了训练结果质量。通常,模型训练的工作不是一蹴而就,而是一个动态调整,循序渐进的过程,需要反复调整以及多个部门和工作流程的协作完成。
本文中,我们以机器学习中的图像分类算法为例,介绍典型的机器学习模型训练的输入数据准备过程:
为了满足机器学习图像分类算法对训练和验证数据量的要求,我们会维护一个巨大的图片仓库,里面存放着几万甚至更多的分类图片文件。数据准备团队每天都会往仓库中增加新获取的图片文件并完成分类。同时,因为一些原因(比如,发现之前的分类错误或者弃用一些类别),我们也会对仓库中的图片文件进行修改或删除。
在实际的机器学习训练任务中,为了控制训练任务的时间和规模,我们会根据模型使用的场景,选取完整仓库中的部分数据或者一个子集来组成训练数据集和验证数据集。
不同格式输入数据的使用差异:
Amazon SageMaker 的训练任务支持两种输入模式:管道模式和文件模式。
以管道模式运行训练任务的时候,训练实例不会将数据完全下载到本地后才运行,训练实例按需从指定的管道中读取训练数据。管道模式可以加速训练实例启动和开始训练的过程,尤其是当训练数据量非常大,比如超过16TB的时候,训练实例的本地磁盘无法承载全量的运行数据时,必须要使用管道模式才能进行训练。
接下去,我们主要看一下Amazon SageMaker训练任务的文件模式输入,训练任务文件模式下目前支持的数据源包括:Amazon S3、Amazon EFS和Amzon FSx for Lustre 。不同的数据输入源以通道的形式提供给训练实例作为输入数据,一个训练实例可以最多配置20个不同的输入源通道,不同的通道可以使用不同的数据源类型。
我们使用Amazon SageMaker提供的内置图像分类算法进行图像分类模型的训练,内置算法可以接收两种数据格式,一种是RecordIO格式,另一种是图片文件,关于如何处理数据到RecordIO格式可以参考MXNet的官方文档。以下我们重点介绍图片文件的输入方式:
图像分类算法接受4个输入通道:train, validation, train_lst, validation_lst
分别对应训练数据集,验证数据集,训练数据集列表文件,验证数据集列表文件,
数据集和数据集列表文件在格式、存储模式和使用行为上有很大的差异。
数据集本身是图片文件,以某种形式的目录结构存放,比如:按时间、按类别、按部门等。图片文件一经生成后文件内容就固定下来,可以作为一个整体被读取,替换或删除。不同训练任务中,从图片仓库中选取部分图片组成训练数据集,同一个图片文件可能在不同的训练任务中被多次重复使用到。
数据集列表文件是一个以.lst为扩展名,文件内部以制表符(tab)作为分割,为数据集里的图片文件提供索引信息。
一个典型的.lst索引文件格式如下:
5 1 your_image_directory/train_img_dog1.jpg
1000 0 your_image_directory/train_img_cat1.jpg
22 1 your_image_directory/train_img_dog2.jpg
第一列是图像文件的唯一索引号;第二列代表图像类别对应的数字号(从0开始),比如0代表猫,1代表狗;第三列是文件路径包括了文件相对目录和文件名。
数据集列表文件需要根据每次训练任务的适用场景生成,可能频繁被读取和修改,包括:
- 多次递进的训练任务中需要向列表文件中添加更多的图片文件索引记录;
- 因为发现分类信息错误,需要修改部分行的信息;
- 因为图片仓库的修改,需要替换部分行的信息;
- 多个lst文件之间需要频繁进行diff,通过比较输入数据的差异来确认对训练输出模型的影响;
- 分类规则改变,原有分类细化分支或者合并到新的分类;
- 需要在团队之间共享协作,完成对同一个.lst文件内容的确认和创建;
- 其他一些场景。
以图片形式的保存的图片仓库适合以对象形成存储于Amazon S3上,当然,如果您希望避免反复从Amazon S3下载大量的图片数据,或者现有的一些辅助工具是基于POSIX文件系统接口开发的,那么,Amazon EFS或Amazon FSx for Lustre同样可以提供一个简便、高效的数据持久化存储来构建您的图片仓库。
对列表文件.lst来说,需要频繁创建和修改,并可能需要结合工作流程,在多个成员之间协作的情况下完成最终文件内容的确定。因此列表文件.lst 适合保存在具备POSIX接口的共享文件系统上,包括Amazon EFS和Amazon FSx for Lustre。当然您也可以使用S3来保存.lst文件,但考虑到在文件块级别修改和读取上的便捷性以及文件分享简便性来说,在POSIX支持的共享文件系统上直接使用.lst文件的工作流程还是会更简便一些。
如何配置输入通道和数据源
对于输入通道的具体配置,您可以在Amazon SageMaker控制台的训练任务创建过程中通过集成界面来具体指定:
以下是使用 Amazon FSx for Lustre作为输入通道数据源的配置:
如果您使用编程的方式来创建和提交Amazon SageMaker的训练任务,您可以使用以下的API来构建不同的输入数据源:
在以上的代码例子中训练集和验证集都以文件对象形式存储于Amazon S3上。考虑到lst文件的使用特点,将用于训练集的.lst列表文件存放于EFS上,将用户验证集的.lst列表文件存放于Amazon FSx for Lustre上。
通过以上代码创建的训练任务会从来自于3个不同的数据源获取训练所需的输入数据,增加了训练任务数据准备的灵活性。
如何选择存储服务:
Amazon SageMaker可以同时使用Amazon S3,Amazon EFS和Amazon FSx for Lustre三种不同的存储服务类型作为输入通道的数据源。在具体的机器学习场景中如何选择合适的存储服务呢?
我们建议从确定当前您的训练数据保存的位置开始入手:
如果您的训练数据已经在Amazon S3上,并且对完成目前训练任务的时间感到满意,那您可以继续使用Amazon SageMaker在Amazon S3进行训练任务。然而,如果您需要更快地启动训练任务,更短的训练时间,我们建议您可以使用与Amazon S3原生集成的文件系统 Amazon FSx for Lustre.
通过Amazon FSx for Lustre,Amazon SageMaker可以高速访问您在Amazon S3上的训练数据,从而加速您的机器学习训练任务。在您第一次运行训练任务时,Amazon FSx for Lustre会自动把训练数据从Amazon S3下载并提供给Amazon SageMaker。此外,训练任务的后续迭代可以继续使用这些数据,避免了重复从Amazon S3多次下载同样的数据。正因为如此,对于训练数据存放于Amazon S3,并需要多次使用不同的训练算法和训练参数来进行训练任务以评价最优结果的场景来说,使用Amazon FSx for Lustre会有带来非常大的好处。
如果您的训练数据已经在Amazon EFS文件系统中,我们建议您使用Amazon EFS作为数据源。训练任务可以直接使用Amazon EFS上的数据,无需额外的数据搬运工作,加速了训练的启动时间。一些典型的场景包括:数据科学家已经在Amazon EFS上有所属目录,并且在不断引入新的数据来对模型进行快速迭代,同时可能需要在同事之间进行数据分享,在数据的字段或标注上进行各种试验。
其次,机器学习训练数据集,尤其是训练数据的索引文件(上文提到的.lst文件)是否会频繁地进行内容变更也是需要考虑的因素:
通常来说Amazon S3作为对象存储,更适合存放内容不会发生变化的数据文件;
如果文件内容需要频繁进行增减或者部分修改,那么我们建议您可以考虑使用Amazon EFS或Amazon FSx for Lustre来存放您的数据文件。作为共享文件系统Amazon EFS和Amazon FSx for Lustre提供了POSIX的文件操作接口并具备块级别的修改能力,方便与现有的机器学习工作流程进行集成。
总结:
Amazon SageMaker可以同时使用Amazon S3,Amazon EFS和Amazon FSx for Lustre三种不同的存储服务类型作为输入通道的数据源,用户可以根据自己的使用场景、工作流程以及各个存储的特点,灵活组合各种数据来源,实现机器学习训练任务的高效运行。