经典案例

探索使用 Amazon SageMaker 自动模型调优的高级超参数优化技术 机器学习博客

2026-01-27 14:16:52
24次

深入探索 Amazon SageMaker 自动模型调优的高级技术

作者:mit Yoldas、Elina Lesyk 和 Mariano Kamp,于 2023 年 11 月 10 日发布在 Amazon 机器学习 等平台上。

关键要点

本文介绍了如何在 Amazon SageMaker 中使用高级技术进行超参数优化HPO,并探讨不同的优化策略。超参数的选取和优化对于模型性能至关重要,可以通过系统地调整参数值来提升模型的准确性和训练效率。SageMaker 的自动模型调优AMT功能提供了智能的优化机制,支持热启动,让模型训练和调优变得更加高效。

创建高性能的机器学习 (ML) 解决方案依赖于对训练参数也称为超参数的探索和优化。超参数是调整训练过程的关键因素,例如学习率、批量大小、正则化强度等,这些参数会影响特定模型和任务的表现。系统地调整超参数的值,可以观察其对模型性能的影响。尽管这一过程需要额外的努力,但其带来的好处显著。超参数优化HPO通常会缩短训练时间,提高模型准确性,并增强对新数据的泛化能力。

我们继续探索之前的帖子 使用 Amazon SageMaker 自动模型调优优化超参数。之前,我们探索了单个作业的优化,进行了 SageMaker 内置算法的结果可视化,并了解了特定超参数值的影响。除了在模型创建周期末使用 HPO 进行一次性优化外,我们还可以在多个步骤中进行对话式优化。每个调优作业不仅能帮助我们接近良好的性能,还能让我们了解到模型对某些超参数的敏感性,从而在下一次调优中利用这一认知。通过对学习到的超参数及其值范围进行修正,我们可以将此优化努力转化为对话。同时,Amazon SageMaker 自动模型调优 (AMT) 通过热启动功能,也能保存之前调优作业中获得的知识,以供后续使用。

加速器排行榜第一名

在本文中,我们将运行多个使用自定义训练算法的 HPO 作业,并尝试不同的 HPO 策略,如贝叶斯优化和随机搜索。我们还将实现热启动,并通过视觉化手段比较我们的试验,进一步细化超参数空间的探索。

SageMaker AMT 的高级概念

在接下来的部分中,我们将详细介绍以下主题,并展示 SageMaker AMT 如何帮助您在您的 ML 项目中实施这些概念:

在 SageMaker 训练中使用自定义训练代码和流行的 ML 框架 Scikitlearn根据日志定义自定义评估指标以供评估和优化使用合适的策略进行 HPO利用热启动技术将单次超参数搜索转化为与我们的模型的对话使用我们的解决方案库的高级可视化技术比较两种 HPO 策略和调优作业结果

无论您是使用我们第一篇文章中提到的内置算法,还是您自己的训练代码,SageMaker AMT 都为优化 ML 模型提供了无缝的用户体验。它提供的关键功能使您能够专注于当前的 ML 问题,同时自动记录实验和结果。同时,它还会自动管理底层基础设施。

在本文中,我们将不再使用 SageMaker 的内置算法,而是将使用自定义代码。我们将使用来自 SkLearn 的随机森林分类器。但我们将继续使用我们的 第一篇文章 中相同的 ML 任务和数据集,即手写数字检测。我们将涉及 Jupyter notebook 2advancedtuningwithcustomtrainingandvisualizingipynb 的内容,并邀请您同时调用代码以进一步阅读。

让我们深入探讨如何使用自定义训练代码,完成部署并运行,同时探索超参数搜索空间来优化我们的结果。

如何构建 ML 模型并执行超参数优化

构建 ML 解决方案的典型流程是什么样的?虽然存在许多可能的用例和广泛的 ML 任务,但我们建议您按照以下步骤:

理解您所面临的 ML 场景,根据需求选择算法。例如,您可能希望使用监督学习算法解决图像识别任务。在本篇文章中,我们继续使用手写图像识别场景和相同的数据集。决定在 SageMaker 训练中要使用的算法实现。有多种选择,包括 SageMaker 内部算法和外部选项。此外,您还需要定义哪个基础指标最适合您的任务,并希望优化如准确率、F1 分数、ROC。根据您的需求和资源,SageMaker 支持四种选项:借助 Amazon SageMaker JumpStart 使用预训练模型,您可以直接使用或进行微调。使用内置的训练和调优算法,例如我们之前提到的 XGBoost。基于 Scikitlearn、TensorFlow 或 PyTorch 等主流框架训练和调整自定义模型。AWS 提供了一系列为此目的制作的预制 Docker 镜像。对于本篇,我们采用这种选项,可以通过在预制容器镜像上快速运行自己的代码进行实验。

如果您希望使用未得到支持的框架或软件,可以提供您自己的自定义 Docker 镜像。这一选项需要最多的工作量,但也提供了最大的灵活性和控制能力。

使用您的数据训练模型。根据上一步选择的算法实现,这可以简单到只需引用您的训练数据并运行训练作业,或额外提供自定义代码进行训练。在我们的案例中,我们使用基于 Scikitlearn 的一些自定义培训代码。

应用超参数优化与您的 ML 模型进行“对话”。训练后,您通常希望通过找出算法超参数的最有效组合值来优化模型性能。

根据您的 ML 算法和模型大小,超参数优化的最后一步可能会比预期更具挑战性。在这一阶段,ML 从业者通常会提出以下问题:

哪种超参数对我的 ML 问题影响最大?如何有效地搜索巨大的超参数空间以找到最佳值?某些超参数值的组合如何影响我的性能指标?成本是一个重要因素;我如何有效利用我的资源?哪些调优实验是有价值的,如何进行比较?

虽然回答这些问题并不容易,但好消息是 SageMaker AMT 可以帮助您减轻负担,让您专注于选择合适的 HPO 策略和想要探索的值范围。此外,我们的可视化解决方案促进了迭代分析和实验过程,从而有效地找到表现良好的超参数值。

在接下来的部分中,我们将使用 Scikitlearn 从头开始构建一个数字识别模型,并演示所有这些概念的实际应用。

解决方案概述

SageMaker 提供了一些非常便利的功能来训练、评估和调优我们的模型。它涵盖了端到端 ML 生命周期的所有功能,因此我们甚至不需要离开 Jupyter notebook。

在我们的第一篇文章中,我们使用了 SageMaker 内置算法 XGBoost。为了演示,这次我们改用随机森林分类器,这样我们就可以展示如何提供自己的训练代码。我们选择提供自己的 Python 脚本,并使用 Scikitlearn 作为我们的框架。那么,我们如何表达希望使用特定的 ML 框架呢?正如我们将看到的,SageMaker 在后台使用 AWS 的另一个服务检索用于训练的预构建 Docker 容器镜像Amazon Elastic Container Registry。

我们会详细介绍以下步骤,包括代码片段和图示来帮助您理解。正如之前所提到的,如果有机会,请打开该笔记本并逐步骤运行代码单元,以在您的 AWS 环境中创建所需的 artifacts。没有什么比这种主动学习的方式更好。

首先,加载和准备数据。我们使用 Amazon Simple Storage Service (Amazon S3) 上传包含手写数字数据的文件。接下来,准备训练脚本和框架依赖项。我们提供自定义训练代码使用 Python,引用一些依赖的库,并进行测试运行。要定义自定义目标指标,SageMaker 允许我们定义正则表达式以从容器日志文件中提取所需指标。使用 Scikitlearn 框架训练模型。通过引用预构建的容器镜像,我们创建相应的估计器对象并传递我们的自定义训练脚本。AMT 使我们能够尝试各种 HPO 策略。在本篇中,我们将重点讨论两个策略:随机搜索和贝叶斯搜索。在 SageMaker HPO 策略中选择。可视化、分析和比较调优结果。我们的可视化包使我们能够发现哪种策略表现更好,以及哪些超参数值得最佳性能。继续探索超参数空间,并热启动 HPO 作业。

AMT 会处理扩展和管理底层计算基础设施,以在 Amazon Elastic Compute Cloud (Amazon EC2) 实例上运行各种调优作业。因此,您不需要担心如何配置实例、处理任何操作系统和硬件问题或自行聚合日志文件。ML 框架镜像是从 Amazon ECR 获取的,而模型 artifacts包括调优结果存储在 Amazon S3 中。所有日志和指标都在 Amazon CloudWatch 中收集,以便于访问和进一步分析。

探索使用 Amazon SageMaker 自动模型调优的高级超参数优化技术 机器学习博客

前提条件

由于这是一系列文章的延续,因此建议但不必要阅读 我们关于 SageMaker AMT 和 HPO 的第一篇文章。除此之外,基本的 ML 概念和 Python 编程熟悉程度是有帮助的。我们还建议您在阅读本篇文章时,同时参照 GitHub 仓库中的附属笔记本。此笔记本可以独立运行,但需要从子文件夹中获取一些代码,请确保在您的环境中克隆完整的仓库,如 README 文件所示。

对代码进行实验并使用互动可视化选项将极大提高您的学习体验。因此,请务必查看。

加载和准备数据

作为第一步,我们确保所需的 手写数字数据 可供 SageMaker 访问。Amazon S3 可以安全、可扩展地实现这一点。请参考笔记本以获取完整源代码,并随意根据您自己的数据进行调整。

pythonsmsess = sagemakersessionSession(botosession=botosess sagemakerclient=sm)BUCKET = smsessdefaultbucket()PREFIX = amtvisualizedemos3dataurl = fs3//{BUCKET}/{PREFIX}/datadigits = datasetsloaddigits()digitsdf = pdDataFrame(digitsdata)digitsdf[y] = digitstargetdigitsdftocsv(data/digitscsv index=False)!aws s3 sync data/ {s3dataurl} exclude include digitscsv

digitscsv 文件包含特征数据和标签。每个数字由 88 图像中的像素值表示,如下图所示的数字 4。

准备训练脚本和框架依赖项

数据存储在我们 S3 存储桶中后,我们可以在 Scikitlearn 中定义自定义训练脚本。SageMaker 允许我们稍后简单地引用 Python 文件以进行训练。依赖库如 Scikitlearn 或 pandas 可以通过两种方式提供:

它们可以在 requirementstxt 文件中显式指定它们可以预安装在底层的 ML 容器镜像中,这些镜像由 SageMaker 提供或自定义构建

这两种方式通常被视为标准的依赖管理方式,因此您可能已经对此有所了解。SageMaker 支持 多种 ML 框架 在一个即用的受管理环境中。这包括许多流行的数据科学和 ML 框架,例如 PyTorch、TensorFlow 或 Scikitlearn如我们的案例中所示。我们没有使用额外的 requirementstxt 文件,但随时可以添加一些库来尝试一试。

我们的实现代码包含一个名为 fit() 的方法,该方法为数字识别任务创建新的分类器并对其进行训练。与我们第一篇文章中使用 SageMaker 内置的 XGBoost 算法相比,我们现在使用的是 ML 库 sklearn 提供的 RandomForestClassifier。对分类器对象调用 fit() 方法便能启动使用我们 CSV 数据子集80的训练过程:

pythondef fit(traindir nestimators maxdepth minsamplesleaf maxfeatures minweightfractionleaf) digits = pdreadcsv(Path(traindir)/digitscsv)

Xtrain Xtest ytrain ytest = traintestsplit(digitsiloc[ 1] digitsiloc[ 1] testsize=2)m = RandomForestClassifier(nestimators=nestimators                            maxdepth=maxdepth                            minsamplesleaf=minsamplesleaf                           maxfeatures=maxfeatures                           minweightfractionleaf=minweightfractionleaf)mfit(Xtrain ytrain)predicted = mpredict(Xtest)pre rec f1  = precisionrecallfscoresupport(ytest predicted poslabel=1 average=weighted)print(fpre {pre53f} rec {rec53f} f1 {f153})return m

请参阅我们的 Jupyter notebook 中的完整脚本 GitHub。

在为完整的训练过程启动容器资源之前,您是否尝试直接运行该脚本?这是一个很好的实践,可以快速确保代码没有语法错误,检查数据结构的维度匹配,以及及早发现其他一些错误。

有两种方法可以在本地运行代码。首先,您可以直接在笔记本中运行,这样就可以使用 Python 调试器 pdb :

python

从笔记本内部运行代码。此时可以使用 Python 调试器 pdb。

from train import fitfit(data 100 10 1 auto 001)

或者像在容器中可能会使用的那样,从命令行运行训练脚本。这也支持设置各种参数并根据需要重写默认值,例如:

bash!cd src ampamp python trainpy train /data/ modeldir /tmp/ nestimators 100

输出中,您可以看到基于目标指标 precision、recall 和 F1score 的模型性能的初步结果。例如,pre 0970 rec 0969 f1 0969。

对于如此快速的训练,结果算不错。但这些数字从何而来,又该如何处理?

定义自定义目标指标

请记住,我们的目标是根据我们认为与任务相关的目标指标,全面训练和调优我们的模型。由于我们使用自定义训练脚本,因此需要明确为 SageMaker 定义这些指标。

我们的脚本在训练期间通过 print 函数输出 precision、recall 和 F1score:

pythonprint(fpre {pre53f} rec {rec53f} f1 {f153})

标准输出将被 SageMaker 捕获并作为日志流发送到 CloudWatch。为了检索指标值并在后续使用 SageMaker AMT 处理这些值,我们需要提供一些信息以解析该输出。我们可以通过定义正则表达式语句达到这一目的欲获取更多信息,请参阅 使用 Amazon CloudWatch 指标监控和分析训练作业:

pythonmetricdefinitions = [ {Name validprecision Regex rpres([09])} {Name validrecall Regex rrec

本文网址: https://www.grpkj.com/works/12.html
 Copyright © Nord加速器【官网入口】|Nord加速器 2024 版权所有 All rights reserved 加速器排行榜第一名