使用亚马逊 SageMaker 选择图像分类模型 JumpStart

研究人员继续为常见的机器学习 (ML) 任务开发新的模型架构。其中一项任务是图像分类,其中图像被接受为输入,模型尝试使用对象标签输出将图像作为一个整体进行分类。当今有许多模型可以执行此图像分类任务,机器学习从业者可能会问诸如此类的问题:“我应该微调然后部署哪个模型才能在我的数据集上获得最佳性能?”机器学习研究人员可能会问这样的问题:“在控制训练超参数和计算机规格(例如 GPU、CPU 和 RAM)的同时,如何才能自己生成多个模型架构与指定数据集的公平比较?”前一个问题涉及跨模型架构的模型选择,而后一个问题涉及根据测试数据集对经过训练的模型进行基准测试。

在这篇文章中,您将看到 亚马逊 S ageMaker JumpStart 的 Tens orFlow 图像分类 算法如何简化解决这些问题所需的实现。再加上相应 示例 Jupyter 笔记本 中的实现细节 ,您将拥有通过探索帕累托前沿来执行模型选择的工具。在帕累托前沿,如果不恶化吞吐量等另一项指标,就不可能提高一项性能指标,例如准确性。

解决方案概述

下图说明了在 Caltech-256 数据集上进行微调的大量图像分类模型的模型选择权衡,该数据集包含了 256 个 对象类别的 30,607 张具有挑战性的真实图像。每个点代表一个模型,点大小根据构成模型的参数数量进行缩放,并根据其模型架构对点进行颜色编码。例如,浅绿色点表示 EfficientNet 架构;每个浅绿色点都是该架构的不同配置,具有独特的微调模型性能测量值。该图显示了模型选择的帕累托边界的存在,其中较高的精度被较低的吞吐量所取代。归根结底,沿着帕累托前沿的模型或一组帕累托高效解决方案的选择取决于您的模型部署性能要求。

如果您观察到感兴趣的测试精度和测试吞吐量前沿,则将在下表中提取上图中的一组帕累托高效解。对行进行排序,使得测试吞吐量增加,测试精度降低。

Model Name Number of Parameters Test Accuracy Test Top 5 Accuracy Throughput (images/s) Duration per Epoch(s)
swin-large-patch4-window12-384 195.6M 96.4% 99.5% 0.3 2278.6
swin-large-patch4-window7-224 195.4M 96.1% 99.5% 1.1 698.0
efficientnet-v2-imagenet21k-ft1k-l 118.1M 95.1% 99.2% 4.5 1434.7
efficientnet-v2-imagenet21k-ft1k-m 53.5M 94.8% 99.1% 8.0 769.1
efficientnet-v2-imagenet21k-m 53.5M 93.1% 98.5% 8.0 765.1
efficientnet-b5 29.0M 90.8% 98.1% 9.1 668.6
efficientnet-v2-imagenet21k-ft1k-b1 7.3M 89.7% 97.3% 14.6 54.3
efficientnet-v2-imagenet21k-ft1k-b0 6.2M 89.0% 97.0% 20.5 38.3
efficientnet-v2-imagenet21k-b0 6.2M 87.0% 95.6% 21.5 38.2
mobilenet-v3-large-100-224 4.6M 84.9% 95.4% 27.4 28.8
mobilenet-v3-large-075-224 3.1M 83.3% 95.2% 30.3 26.6
mobilenet-v2-100-192 2.6M 80.8% 93.5% 33.5 23.9
mobilenet-v2-100-160 2.6M 80.2% 93.2% 40.0 19.6
mobilenet-v2-075-160 1.7M 78.2% 92.8% 41.8 19.3
mobilenet-v2-075-128 1.7M 76.1% 91.1% 44.3 18.3
mobilenet-v1-075-160 2.0M 75.7% 91.0% 44.5 18.2
mobilenet-v1-100-128 3.5M 75.1% 90.7% 47.4 17.4
mobilenet-v1-075-128 2.0M 73.2% 90.0% 48.9 16.8
mobilenet-v2-075-96 1.7M 71.9% 88.5% 49.4 16.6
mobilenet-v2-035-96 0.7M 63.7% 83.1% 50.4 16.3
mobilenet-v1-025-128 0.3M 59.0% 80.7% 50.8 16.2

这篇文章详细介绍了如何实施大规模的 Amazon S ageMaker基准测试和模型选择任务。首先,我们介绍了 JumpStart 和内置的 TensorFlow 图像分类算法。然后,我们将讨论高级实现注意事项,例如 JumpStart 超参数配置、从 Amazon CloudWatch L ogs 中提取指标以及启动异步超参数调整任务。最后,我们在上表和图中介绍了导致帕累托高效解决方案的实现环境和参数化。

JumpStart TensorFlow 图像分类简介

JumpStart 提供针对常见机器学习任务的一键微调和部署各种预训练模型,以及一系列解决常见业务问题的端到端解决方案。这些功能消除了机器学习流程中每个步骤的繁重工作,使开发高质量模型变得更加容易,缩短了部署时间。 JumpStart API 允许您在自己的数据集上以编程方式部署和微调大量预训练模型。

JumpStart 模型中心提供对大量 TensorFlow 图像分类模型的访问 ,这些模型 支持对自定义数据集进行迁移学习和微调。 截至撰写本文时,JumpStart 模型中心包含 135 个 TensorFlow 图像分类模型,这些模型涵盖从 T ensorFlow Hub 到包括残差网络 ( ResN et ) 、 MobileNet、Effici entNet 、Inception 、神经架构搜索网络 (N asNet ) 、大传输 (BiT)、 移窗口 (Swin) 转换器、图像中的类别注意力 变形金刚 ( CAiT ) 和数据高效图像转换器 ( De It)。

每个模型架构的内部结构都大不相同。例如,ResNet 模型利用跳过连接来实现更深层次的网络,而基于变换器的模型则使用自我注意力机制,这些机制消除了卷积运算的固有局部性,转而支持更多的全球接受场。除了这些不同的结构提供的不同功能集外,每个模型架构还有多种配置,可以调整该架构中的模型大小、形状和复杂性。这导致 JumpStart 模型中心提供了数百种独特的图像分类模型。结合包含许多 SageMaker 功能的内置迁移学习和推理脚本,JumpStart API 是机器学习从业者快速开始训练和部署模型的绝佳起点。

请参阅 亚马逊 SageMaker 中的 TensorFlow 图像分类模型的 迁移学习 以下示例 笔记本,以更深入地了解 SageMaker TensorFlow 图像分类,包括如何对预训练模型进行推理以及如何在定制数据集上微调预训练模型。

大规模模型选择注意事项

模型选择是从一组候选模型中选择最佳模型的过程。此过程可以应用于具有不同参数权重的相同类型的模型以及不同类型的模型。跨相同类型的模型选择模型的示例包括使用不同的超参数(例如学习率)拟合同一个模型,以及提早停止以防止模型权重过度拟合到训练数据集中。跨不同类型的模型选择模型包括选择最佳模型架构(例如,Swin 与 MobileNet),以及在单一模型架构中选择最佳模型配置(例如,mobilenet-v1-025-128 与 mobilen et-v3-large-100-224)。

本节中概述的注意事项使验证数据集上的所有这些模型选择过程成为可能。

选择超参数配置

JumpStart 中的 TensorFlow 图像分类具有大量可用的 超参数 ,可以统一调整所有模型架构的迁移学习脚本行为。这些超参数与数据增强和预处理、优化器规范、过拟合控制和可训练层指示器有关。建议您在应用程序需要时调整这些超参数的默认值:

model_id: str
model_version: str = "*"

hyperparameters = sagemaker.hyperparameters.retrieve_default(
    model_id=model_id, model_version=model_version
)

在本分析和相关的笔记本中,除学习率、周期数和提前停止规格外,所有超参数都设置为默认值。学习率 由 SageMaker 自动模型 调整作业作为 分类参数 进行调整。 由于每个模型都有唯一的默认超参数值,因此可能的学习率的离散列表包括默认学习率和默认学习率的五分之一。这将为单个超参数调整作业启动两个训练作业,并选择验证数据集上报告性能最好的训练作业。由于纪元数设置为 10,大于默认的超参数设置,因此所选的最佳训练作业并不总是与默认学习速率相对应。最后,使用提早停止标准,耐心等于三个时代,即继续训练时没有改善的周期数。

一个特别重要的默认超参数设置是 t rain_only_only_top_layer ,如果设置为 T rue ,则不会根据提供的训练数据集对模型的特征提取层进行微调。优化器将仅训练顶部完全连接的分类图层中的参数,其输出维度等于数据集中类别标签的数量。默认情况下,此超参数设置为 True ,这是针对小型数据集的迁移学习的设置。您可能有一个自定义数据集,其中从 ImageNet 数据集的预训练中提取特征是不够的。在这些情况下,你应该将 t rain_only_only_top_l ayer 设置为 False。 尽管此设置会增加训练时间,但您将为感兴趣的问题提取更多有意义的特征,从而提高准确性。

从 CloudWatch 日志中提取指标

JumpStart TensorFlow 图像分类算法在训练期间可靠地记录 SageMaker Estimator 和 HyperParameterTuner 对象可以访问的各种指标。 SageMaker E stimator 的构造函数 具有 metric_d efinition s 关键字参数,该参数可用于通过提供带有两个键的字典列表来评估训练作业:名称代表指标名称,正则表达式代表用于从日志中提取指标的正则 表达式 。随附的 笔记本 显示了实施细节。下表列出了所有 JumpStart TensorFlow 图像分类模型的可用指标和相关的正则表达式。

Metric Name Regular Expression
number of parameters “- Number of parameters: ([0-9\\.]+)”
number of trainable parameters “- Number of trainable parameters: ([0-9\\.]+)”
number of non-trainable parameters “- Number of non-trainable parameters: ([0-9\\.]+)”
train dataset metric f”- {metric}: ([0-9\\.]+)”
validation dataset metric f”- val_{metric}: ([0-9\\.]+)”
test dataset metric f”- Test {metric}: ([0-9\\.]+)”
train duration “- Total training duration: ([0-9\\.]+)”
train duration per epoch “- Average training duration per epoch: ([0-9\\.]+)”
test evaluation latency “- Test evaluation latency: ([0-9\\.]+)”
test latency per sample “- Average test latency per sample: ([0-9\\.]+)”
test throughput “- Average test throughput: ([0-9\\.]+)”

内置的迁移学习脚本在这些定义中提供了各种训练、验证和测试数据集指标,以 f 字符串替换值表示。可用的确切指标因所执行的分类类型而异。所有编译后的模型都有一个 损失 指标,该指标由二进制或分类问题的交叉熵损失表示。当有一个分类标签时使用前者;如果有两个或更多类别标签,则使用后者。如果只有一个分类标签,则可以通过上表中的 f 字符串正则表达式计算、记录和提取以下指标:真阳性数 (true_pos)、假阳性数 (false _pos )、真否定数 (tr ue_n eg )、假否定数 (false _ neg )、精度、召回率、接收运行特性曲线下方的面积 (ROC) (auc ) ,以及精确召回 (PR) 曲线 (pr c ) 下方的区域。同样,如果有六个或更多类标签,则还可以通过前面的正则表达式计算、记录和提取排名前五的 精度指标(top_5_ accuracy )。

在训练期间,向 SageMaker 估算器指定的指标将发送到 CloudWatch Logs。训练完成后,你可以调用 SageMaker DescribeTrainingJob API 并检查 JS ON 响应中的 fin alMetricDataList 密钥:

tuner: sagemaker.tuner.HyperparameterTuner
session: sagemaker.Session

training_job_name = tuner.best_training_job()
description = session.describe_training_job(training_job_name)
metrics = description["FinalMetricDataList"]

此 API 只需要向查询提供作业名称,因此,一旦完成,只要训练作业名称经过适当记录并可恢复,就可以在将来的分析中获得指标。对于此模型选择任务,将存储超参数调整作业名称,后续分析会重新附加给定调优作业名称的 HyperP arameterTuner 对象,从附加的超参数调谐器中提取最佳训练作业名称,然后如前 所述调用 DescribeTrainingJob API 以获取与最佳训练作业相关的指标。

启动异步超参数调整作业

有关异步启动超参数调整作业 的实现详细信息,请参阅相应的 笔记本 ,该作业使用 Python 标准库的 并发期货 模块,这是一个用于异步运行可调用对象的高级接口。此解决方案中实现了几个与 Sagemaker 相关的注意事项:

  • 每个 亚马逊云科技 账户都与 SageMaker 服务 配额相关联。 您应该查看当前的限制,以充分利用您的资源,并可能根据需要请求增加资源限制。
  • 频繁调用 API 来创建许多同步超参数调整作业可能会 超过 Python SDK 速率并引发限制异 常。 解决这个问题的方法是使用自定义重试配置创建一个 SageMaker Boto3 客户端。
  • 如果你的脚本遇到错误或者脚本在完成之前停止,会发生什么?对于如此大规模的模型选择或基准测试研究,您可以记录调整作业名称并提供便捷功能来 重新连接 已经存在的超参数调整作业
tuning_job_name: str
session: sagemaker.Session

tuner = sagemaker.tuner.HyperparameterTuner.attach(tuning_job_name, session)

分析细节和讨论

这篇文章中的分析对加州理工学院256数据集的JumpStart TensorFlow图像分类算法 中的 模型ID 进行了迁移学习。所有训练任务都在 SageMaker 训练实例 ml.g4dn.xlarge 上执行,该实例包含一个 NVIDIA T4 GPU。

训练结束时,将在训练实例上评估测试数据集。模型选择在测试数据集评估之前进行,以将模型权重设置为具有最佳验证集性能的时代。测试吞吐量未优化:数据集批量大小设置为默认的训练超参数批次大小,未对其进行调整以最大限度地提高 GPU 内存使用量;报告的测试吞吐量包括数据加载时间,因为数据集未预先缓存;未使用跨多个 GPU 的分布式推理。出于这些原因,此吞吐量是一个很好的相对测量值,但实际吞吐量将在很大程度上取决于训练模型的推理端点部署配置。

尽管JumpStart模型中心包含许多图像分类架构类型,但这个帕累托前沿由精选的Swin、EfficientNet和MobileNet模型主导。Swin 模型更大,相对更准确,而 MobileNet 模型更小,精度相对较低,适合移动设备的资源限制。值得注意的是,这一前沿取决于多种因素,包括所使用的确切数据集和所选的微调超参数。您可能会发现,您的自定义数据集生成了一组不同的帕累托高效解决方案,并且您可能希望使用不同的超参数来延长训练时间,例如更多的数据增强或微调,而不仅仅是模型的顶级分类层。

结论

在这篇文章中,我们展示了如何使用 JumpStart 模型中心运行大规模模型选择或基准测试任务。该解决方案可以帮助您选择最适合您需求的型号。我们鼓励您在自己的数据集 上尝试和探索此 解决方案

参考文献

更多信息可在以下资源中获得:

  • 图像分类 — TensorFlow
  • 使用亚马逊 SageMaker 进行图像分类 JumpStart
  • 使用亚马逊 SageMaker JumpStart 构建高性能图像分类模型

作者简介

凯尔·乌尔里希博士 亚马逊 S ageMaker 内置算法团队 的应用科学家。 他的研究兴趣包括可扩展机器学习算法、计算机视觉、时间序列、贝叶斯非参数和高斯过程。他的博士学位来自杜克大学,他曾在 Neurips、Cell 和 Neuron 上发表过论文。

Ashish Khetan 博士 是一位高级应用科学家,拥有 亚马逊 SageMaker 内置算法,并帮助开发机器学习算法 。他在伊利诺伊大学厄巴纳香槟分校获得博士学位。他是机器学习和统计推理领域的活跃研究人员,曾在Neurips、ICML、ICLR、JMLR、ACL和EMNLP会议上发表过许多论文。