定义指标和环境变量 - Amazon SageMaker

定义指标和环境变量

调优作业使用指标来评估性能,从而优化其启动的训练作业的超参数。本指南将介绍如何定义指标,以便您可以使用自定义算法进行训练,或者使用 Amazon SageMaker 的内置算法。本指南还将介绍如何在自动模型调优 (AMT) 作业期间指定环境变量。

定义指标

Amazon SageMaker 超参数调优会解析机器学习算法的 stdoutstderr 流以查找指标,例如,损失或验证准确性。这些指标表明了模型在数据集上的表现。

以下部分将介绍如何使用两种类型的算法进行训练:内置算法和自定义算法。

使用内置算法进行训练

如果您使用 SageMaker 内置算法中的一种,那么指标已经定义好。此外,内置算法会自动将指标发送至超参数调优以进行优化。这些指标还将写入 Amazon CloudWatch 日志。有关更多信息,请参阅使用 Amazon CloudWatch 记录 Amazon SageMaker 事件

对于调优作业的目标指标,可选择内置算法发出的指标之一。有关可用指标的列表,请参阅使用 Amazon SageMaker 内置算法或预训练模型中相应算法的模型调优部分。

您可以在调优作业中选择最多 40 个指标进行监控。请选择其中一个指标作为目标指标。超参数调优作业将根据目标指标,返回性能最佳的训练作业

注意

超参数调优会自动发送一个额外的超参数 _tuning_objective_metric,将目标指标传递给调优作业,以便在训练期间使用。

使用自定义算法进行训练

本部分将介绍如何定义自己的指标,以便使用自定义算法进行训练。使用自定义算法时,请确保算法至少将一个指标写入 stderrstdout。超参数调优会解析这些流,以找到可表明模型在数据集上的表现的算法指标。

您可以通过为调优作业所监控的每个指标指定名称和正则表达式,以定义自定义指标。然后,通过 AlgorithmSpecificationMetricDefinitions 字段中的 TrainingJobDefinition 参数,将这些指标定义传递给 CreateHyperParameterTuningJob API。

以下显示了由训练算法写入 stderrstdout 的日志的示例输出。

GAN_loss=0.138318; Scaled_reg=2.654134; disc:[-0.017371,0.102429] real 93.3% gen 0.0% disc-combined=0.000000; disc_train_loss=1.374587; Loss = 16.020744; Iteration 0 took 0.704s; Elapsed=0s

以下代码示例演示了如何在 Python 中使用正则表达式。此代码用于搜索示例日志输出,并捕获四个不同指标的数字值。

[ { "Name": "ganloss", "Regex": "GAN_loss=(.*?);", }, { "Name": "disc-combined", "Regex": "disc-combined=(.*?);", }, { "Name": "discloss", "Regex": "disc_train_loss=(.*?);", }, { "Name": "loss", "Regex": "Loss = (.*?);", }, ]

在正则表达式中,圆括号 () 用于将正则表达式的各个部分组合在一起。

  • 对于代码示例中定义的 loss 指标,表达式 (.*?); 将捕获确切文本 "Loss=" 与第一个分号 (;) 字符之间的任何字符。

  • 字符 . 指示正则表达式匹配任何字符。

  • 字符 * 表示匹配零个或多个字符。

  • 字符 ? 表示仅在 ; 字符首次出现之前进行捕获。

代码示例中定义的损失指标将从示例输出中捕获 Loss = 16.020744

选择您定义的指标之一作为调优作业的目标指标。如果使用 SageMaker API,那么可在发送至 CreateHyperParameterTuningJob 操作的 HyperParameterTuningJobConfig 参数的 HyperParameterTuningJobObjective 字段中,指定 name 键的值。

指定环境变量

SageMaker AMT 会在调优作业中优化超参数,以找到可达到最佳模型性能的最佳参数。您可以使用环境变量配置调优作业,以更改其行为。您还可以在调优作业中使用训练期间使用的环境变量。

如果要使用调优作业中的环境变量或指定新的环境变量,可在 SageMaker HyperParameterTrainingJobDefinition API 中,为 Environment 输入字符串值。将此训练作业定义传递至 CreateHyperParameterTuningJob API。

例如,可将环境变量 SM_LOG_LEVEL 设置为以下值,以定制 Python 容器的输出。

NOTSET=0 DEBUG=10 INFO=20 WARN=30 ERROR=40 CRITICAL=50

例如,要将日志级别设置为 10 以调试容器日志,可在 HyperParameterTrainingJobDefinition 中设置环境变量,如下所示。

{ "HyperParameterTuningJobConfig": { ..., } "TrainingJobDefinition": { ..., "Environment" : [ { "SM_LOG_LEVEL": 10 } ], ..., }, ..., }