在当今快速发展的人工智能领域,深度学习模型已成为创新的先锋,广泛应用于计算机视觉CV、自然语言处理NLP和推荐系统等多个领域。然而,与训练和微调这些模型相关的高昂费用却是企业所面临的一大挑战,这种费用主要源于在训练深度学习模型时使用的数据量庞大。如今,许多大型模型需要在数TB的数据上进行训练,即使是使用强大的GPU或 AWS Trainium 硬件,也可能需要数周时间才能完成。
通常情况下,客户依赖于一些技术和优化方案来提高模型的训练效率,比如优化的内核或层、混合精度训练,以及 Amazon SageMaker 的分布式训练库等。然而,目前对于训练数据本身的效率关注较少,并不是所有数据对模型训练都有同等的贡献:相当一部分计算资源可能会用于处理那些对模型整体准确度贡献不大的简单示例。
飞鸟加速器客户通常依赖于上采样、下采样和去重等预处理技术来提升数据的信息质量,这些技术虽然有效,却往往费时费力,并需要专门的数据科学经验,有时更像是一门艺术。客户们还常常依赖于 RefinedWeb 等策划的数据集以提高模型的性能,但这些数据集并不总是完全开源,并且往往过于通用,不一定与您的特定用例紧密相关。
那么,有什么方法可以克服与低信息数据样本相关的低效问题呢?
我们很高兴宣布推出智能筛选的公共预览,作为SageMaker的一项新功能,它可以将深度学习模型的训练成本降低高达35。智能筛选是一种新的数据效率技术,它在训练过程中主动分析您的数据样本,并过滤掉那些对模型贡献较小的样本。通过在较小的数据子集上训练这些最具信息量的样本,整体训练时间和成本得到减少,同时对准确度的影响也最小化或没有影响。此外,由于该功能在线上进行操作,因此智能筛选不需要对您的上游数据或下游训练流程进行任何更改。
在本文中,我们将讨论以下主题:
SageMaker中的智能筛选功能及其工作原理如何在PyTorch训练工作负载中使用智能筛选您也可以查看我们的 文档 和 示例笔记本,获取有关如何开始使用智能筛选的更多资源。
我们首先介绍智能筛选功能如何加速您在SageMaker上的模型训练。
智能筛选的任务是在训练过程中筛选您的训练数据,仅将更具信息量的样本输入模型。在普通的PyTorch训练中,数据会通过 PyTorch DataLoader 以批次的形式迭代发送到训练循环和加速器设备例如,GPU或Trainium芯片。智能筛选在此数据加载阶段实现,因此它独立于训练流程中的上游数据预处理。
智能筛选使用您的模型和用户指定的损失函数对每个加载的数据样本进行评估前传forward pass。高损失的样本会实质性地影响模型训练,因此将用于训练;而相对低损失的数据样本则会被搁置并排除在训练之外。
智能筛选的一个关键输入是要排除的数据比例:例如,通过将比例设置为33betavalue=05,每批次数据中约三分之一损失最低的样本将被排除。识别到足够的高损失样本后,数据将通过完整的训练循环进行处理,模型将正常学习和训练。当启用智能筛选时,您无需对训练循环做任何更改。
以下图表展示了此工作流。
通过仅包括您训练数据的一个子集,智能筛选减少了训练模型所需的时间和计算量。在我们的测试中,我们实现了近40的总训练时间和成本减少。通过智能筛选数据,模型的准确度可保持在最小或无影响的状态,因为被排除的样本对模型的损失相对较低。下表包含了一组实验结果,展示了使用SageMaker智能筛选能实现的性能提升。
AcceptedIMR Savings 502066307535在表格中, Accepted列表示包含并用于训练循环的数据比例。增加这个可调参数将减少成本如IMR Savings 列所示,但也可能会影响准确性。适合的 Accepted设置与数据集和模型相关;您应当对其进行实验并调整该参数,以在降低成本和对准确度的影响之间达到最佳平衡。
在接下来的部分中,我们将通过一个使用PyTorch训练作业启用智能筛选的实际示例进行讲解。如果您希望快速开始,请跳转至 PyTorch或PyTorch Lightning示例。
我们假设您已经知道如何使用SageMaker Python SDK和Estimator类借助SageMaker深度学习容器训练模型。如果不清楚,请在继续之前参考 使用SageMaker Python SDK。
在典型的PyTorch训练作业中,您使用训练数据集和其他必要参数初始化PyTorch训练 DataLoader,以在训练过程中提供输入批次。要启用训练数据的智能筛选,您将使用一个新的DataLoader类:smartsiftingdataloadersiftdataloaderSiftingDataloader。该类作为您现有PyTorch DataLoader 的包装器,训练过程将使用 SiftingDataloader 来获取输入批次。SiftingDataLoader 从原始PyTorch DataLoader 获取输入批次,评估批次中样本的重要性,并构建一个包含高损失样本的筛选批次,将其传递给训练步骤。包装器代码如下:
pythonfrom smartsiftingdataloadersiftdataloader import SiftingDataloader
traindataloader = SiftingDataloader( siftconfig = siftconfig origdataloader=DataLoader(selftrain selfbatchsize shuffle=True) lossimpl=BertLoss() model=selfmodel)
SiftingDataloader需要一些额外的参数来分析您的训练数据,这些参数可以通过siftconfig传递。首先,创建一个 smartsiftingsiftconfigsiftconfigsRelativeProbabilisticSiftConfig 对象。该对象包含可配置和必需的betavalue和losshistorylength,它们分别定义了要保留的样本比例和在评估相对损失时包含的样本窗口。请注意,由于智能筛选使用模型来定义样本的重要性,因此如果使用完全随机权重的模型可能会产生负面影响。相反,您可以使用lossbasedsiftconfig和siftdelay来延迟筛选过程,直到模型中的参数权重更新超过随机值。有关更多详细信息,请参阅 将智能筛选应用于您的训练脚本在以下代码中,我们定义siftconfig并指定betavalue和losshistorylength,以及使用 lossbasedsiftconfig延迟筛选的开始:
pythonfrom smartsiftingsiftconfigsiftconfigs import RelativeProbabilisticSiftConfig LossConfig SiftingBaseConfig
siftconfig = RelativeProbabilisticSiftConfig( betavalue=3 losshistorylength=500 lossbasedsiftconfig=LossConfig( siftconfig=SiftingBaseConfig(siftdelay=10) ))
接下来,您还必须在SiftingDataloader对象中包含lossimpl参数。智能筛选在单个样本级别上工作,拥有访问损失计算方法以判断样本的重要性至关重要。您需要实现一个筛选损失方法,该方法返回一个n x 1的张量,包含n个样本的损失值。通常,您会指定与训练时相同的损失方法。最后,在SiftingDataloader对象中包含对模型的引用,该引用用于在样本包含在训练之前进行评估。请看以下代码:
pythonfrom smartsiftingsiftconfigsiftconfigs import RelativeProbabilisticSiftConfig LossConfig SiftingBaseConfig
class SiftBertLoss(Loss) # 您应添加以下初始化函数 # 以按样本而非批次计算损失。 def init(self) selfceloss = torchnnCrossEntropyLoss(reduction=none)
def loss( self model torchnnModule transformedbatch SiftingBatch originalbatch Any = None) gt torchTensor device = next(modelparameters())device batch = [tto(device) for t in originalbatch] # 计算损失 outputs = model(batch) return selfceloss(outputslogits batch[2])
以下代码展示了如何在现有的BERT训练作业中启用智能筛选的完整示例:
pythonfrom smartsiftingdataloadersiftdataloader import SiftingDataloaderfrom smartsiftinglossabstractsiftlossmodule import Lossfrom smartsiftingsiftconfigsiftconfigs import RelativeProbabilisticSiftConfig LossConfig SiftingBaseConfig
class SiftBertLoss(Loss) # 您应添加以下初始化函数 # 以按样本而非批次计算损失。 def init(self) selfceloss = torchnnCrossEntropyLoss(reduction=none)
def loss( self model torchnnModule transformedbatch SiftingBatch originalbatch Any = None) gt torchTensor device = next(modelparameters())device batch = [tto(device) for t in originalbatch] # 计算损失 outputs = model(batch) return selfceloss(outputslogits batch[2])
siftconfig = RelativeProbabilisticSiftConfig( betavalue=3 losshistorylength=500 lossbasedsiftconfig=LossConfig( siftconfig=SiftingBaseConfig(siftdelay=10) ))
traindataloader = SiftingDataloader( siftconfig = siftconfig origdataloader=DataLoader(selftrain selfbatchsize shuffle=True) lossimpl=SiftBertLoss() model=selfmodel)
在本文中,我们探讨了智能筛选的公共预览,这是一项新功能,使得SageMaker能够将深度学习模型训练成本降低高达35。此功能在训练期间提高数据效率,过滤掉不太重要的数据样本。通过仅包括对模型收敛影响最大的最有信息量的数据,您可以显著减少训练时间和费用,同时保持准确度。此外,它可以无缝集成到您现有的流程中,无需对您的数据或训练流水线进行任何更改。
要深入了解SageMaker智能筛选,探索其工作原理,并实现于PyTorch训练工作负载中,请查看我们的 文档 和 示例笔记本,快来开始使用这项新功能吧!
Robert Van Dusen 是Amazon SageMaker的高级产品经理,负责深度学习训练的框架、编译器和优化技术。

K Lokesh Kumar Reddy 是Amazon应用人工智能团队的高级工程师,专注于高效的机器学习训练技术和构建提高对话式人工智能系统的工具。闲暇时,他喜欢探索新文化和新体验,并保持对最新科技趋势的关注。
Abhishek Dan 是Amazon应用人工智能团队的高级开发经理,负责机器学习和对话式人工智能系统。对人工智能技术充满热情的他,致力于科学和工程交汇处的工作,以增强人工智能系统的能力,创造更加直观和无缝的人机交互体验。目前,他正在利用大型语言模型创建应用程序,以提高亚马逊的效率和客户体验。
2026-01-27 14:22:44