

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 计划监控作业
<a name="model-monitor-scheduling"></a>

Amazon SageMaker 模型监控器使您能够监控从您的实时终端节点收集的数据。您可以按照定期计划监控数据，也可以立即进行一次性监控。您可以使用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateMonitoringSchedule.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateMonitoringSchedule.html) API 创建监控计划。

通过监控计划， SageMaker AI 可以开始处理任务，以分析在给定时间段内收集的数据。在处理作业中， SageMaker AI 会将当前分析的数据集与您提供的基线统计数据和约束进行比较。然后， SageMaker AI 会生成违规报告。此外，还会针对正在分析的每个特征发出 CloudWatch 指标。

SageMaker AI 提供了一个预先构建的容器，用于对表格数据集进行分析。或者，您可以选择自带容器，如[使用 Amazon SageMaker 模型监视器支持您自己的容器](model-monitor-byoc-containers.md)主题中所述。

您可以为实时端点或批量转换作业创建模型监控计划。使用基准资源（约束和统计数据）与实时流量或批处理作业输入进行比较。

**Example 基准分配**  
在以下示例中，用于训练模型的训练数据集已上传到 Amazon S3。如果您在 Amazon S3 中已拥有此数据集，则可直接指向它。  

```
# copy over the training dataset to Amazon S3 (if you already have it in Amazon S3, you could reuse it)
baseline_prefix = prefix + '/baselining'
baseline_data_prefix = baseline_prefix + '/data'
baseline_results_prefix = baseline_prefix + '/results'

baseline_data_uri = 's3://{}/{}'.format(bucket,baseline_data_prefix)
baseline_results_uri = 's3://{}/{}'.format(bucket, baseline_results_prefix)
print('Baseline data uri: {}'.format(baseline_data_uri))
print('Baseline results uri: {}'.format(baseline_results_uri))
```

```
training_data_file = open("test_data/training-dataset-with-header.csv", 'rb')
s3_key = os.path.join(baseline_prefix, 'data', 'training-dataset-with-header.csv')
boto3.Session().resource('s3').Bucket(bucket).Object(s3_key).upload_fileobj(training_data_file)
```

**Example 定期分析计划**  
如果要为实时端点计划模型监控，则使用基准约束和统计数据与实时流量进行比较。以下代码片段显示了用于为实时端点计划模型监控的一般格式。此示例将 Model Monitor 计划为每小时运行一次。  

```
from sagemaker.model_monitor import CronExpressionGenerator
from time import gmtime, strftime

mon_schedule_name = 'my-model-monitor-schedule-' + strftime("%Y-%m-%d-%H-%M-%S", gmtime())
my_default_monitor.create_monitoring_schedule(
    monitor_schedule_name=mon_schedule_name,
    endpoint_input=EndpointInput(
        endpoint_name=endpoint_name,
        destination="/opt/ml/processing/input/endpoint"
    ),
    post_analytics_processor_script=s3_code_postprocessor_uri,
    output_s3_uri=s3_report_path,
    statistics=my_default_monitor.baseline_statistics(),
    constraints=my_default_monitor.suggested_constraints(),
    schedule_cron_expression=CronExpressionGenerator.hourly(),
    enable_cloudwatch_metrics=True,
)
```

**Example 一次性分析计划**  
您还可以通过向 `create_monitoring_schedule` 方法传递如下参数，将分析计划为运行一次而不重复运行：  

```
    schedule_cron_expression=CronExpressionGenerator.now(),
    data_analysis_start_time="-PT1H",
    data_analysis_end_time="-PT0H",
```
在这些参数中，`schedule_cron_expression` 参数将分析计划为立即运行一次，其值为 `CronExpressionGenerator.now()`。对于任何具有此设置的计划，都必须使用 `data_analysis_start_time` 和 `data_analysis_end_time` 参数。这些参数可设置分析时段的开始时间和结束时间。将这些时间定义为相对于当前时间的偏移量，并使用 ISO 8601 持续时间格式。在此示例中，时间 `-PT1H` 和 `-PT0H` 定义了过去一小时和当前时间之间的时段。根据此计划，分析只对指定时段内收集的数据进行求值。

**Example 批量转换作业计划**  
以下代码片段显示了用于为批量转换作业计划模型监控的一般格式。  

```
from sagemaker.model_monitor import (
    CronExpressionGenerator,
    BatchTransformInput, 
    MonitoringDatasetFormat, 
)
from time import gmtime, strftime

mon_schedule_name = 'my-model-monitor-schedule-' + strftime("%Y-%m-%d-%H-%M-%S", gmtime())
my_default_monitor.create_monitoring_schedule(
    monitor_schedule_name=mon_schedule_name,
    batch_transform_input=BatchTransformInput(
        destination="opt/ml/processing/input",
        data_captured_destination_s3_uri=s3_capture_upload_path,
        dataset_format=MonitoringDatasetFormat.csv(header=False),
    ),
    post_analytics_processor_script=s3_code_postprocessor_uri,
    output_s3_uri=s3_report_path,
    statistics=my_default_monitor.baseline_statistics(),
    constraints=my_default_monitor.suggested_constraints(),
    schedule_cron_expression=CronExpressionGenerator.hourly(),
    enable_cloudwatch_metrics=True,
)
```

```
desc_schedule_result = my_default_monitor.describe_schedule()
print('Schedule status: {}'.format(desc_schedule_result['MonitoringScheduleStatus']))
```

# 用于监控计划的 cron 表达式
<a name="model-monitor-schedule-expression"></a>

要提供监控计划的详细信息，请使用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ScheduleConfig.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ScheduleConfig.html)，它是一个描述有关监控计划的详细信息的 `cron` 表达式。

Amazon SageMaker 模型监控器支持以下`cron`表达式：
+ 要将作业设置为每小时启动一次，请使用以下命令：

  `Hourly: cron(0 * ? * * *)`
+ 要每日运行作业，请使用以下命令：

  `cron(0 [00-23] ? * * *)`
+ 要立即运行一次作业，使用以下关键字：

  `NOW`

例如，以下是有效的 `cron` 表达式：
+ 每天凌晨 12 点 (UTC)：`cron(0 12 ? * * *)`
+ 每天中午 12 点 (UTC)：`cron(0 0 ? * * *)`

为了支持每 6 小时或 12 小时运行一次，Model Monitor 支持以下表达式：

`cron(0 [00-23]/[01-24] ? * * *)`

例如，以下是有效的 `cron` 表达式：
+ 每 12 小时一次，从下午 5 点 (UTC) 开始：`cron(0 17/12 ? * * *)`
+ 每 2 小时一次，从中午 12 点 (UTC) 开始：`cron(0 0/2 ? * * *)`

**注意**  
尽管 `cron` 表达式设置为下午 5 点 (UTC) 开始，但请注意，从实际请求的时间到运行执行可能有 0-20 分钟的延迟。
如果您想按每日计划运行，请不要提供此参数。 SageMaker AI 每天都会选择一个时间来跑步。
目前， SageMaker AI 仅支持 1 小时到 24 小时之间的每小时整数费率。

# 为监控计划配置服务控制策略
<a name="model-monitor-scp-rules"></a>

 在分别使用 API 或 [CreateMonitoringSchedule](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateMonitoringSchedule.html)API 为监控任务创建或更新计划时，必须指定其参数。[UpdateMonitoringSchedule](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_UpdateMonitoringSchedule.html)根据您的使用案例，可以通过以下方式之一执行此操作：
+  您可以在调用`CreateMonitoringSchedule`或时指定[MonitoringJobDefinition](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_MonitoringJobDefinition.html)字段`UpdateMonitoringSchedule`。[MonitoringScheduleConfig](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_MonitoringScheduleConfig.html)只能用它来创建或更新数据质量监控作业的计划。
+  调用 `CreateMonitoringSchedule` 或 `UpdateMonitoringSchedule` 时，可以为 `MonitoringScheduleConfig` 的 `MonitoringJobDefinitionName` 字段指定已创建的监控作业定义的名称。您可以将其用于使用以下任一选项创建的任何作业定义 APIs：
  +  [CreateDataQualityJobDefinition](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateDataQualityJobDefinition.html) 
  +  [CreateModelQualityJobDefinition](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModelQualityJobDefinition.html) 
  +  [CreateModelBiasJobDefinition](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModelBiasJobDefinition.html) 
  +  [CreateModelExplainabilityJobDefinition](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModelExplainabilityJobDefinition.html) 

   如果要使用 SageMaker Python SDK 来创建或更新计划，则必须使用此过程。

 上述过程是相互排斥的，也就是说，在创建或更新监控计划时，要么指定 `MonitoringJobDefinition` 字段，要么指定 `MonitoringJobDefinitionName` 字段。

 创建监控作业定义或在 `MonitoringJobDefinition` 字段中指定监控作业定义时，可以设置安全参数，如 `NetworkConfig` 和 `VolumeKmsKeyId`。作为管理员，您可能希望将这些参数始终设置为特定值，以便监控作业始终在安全的环境中运行。为确保这一点，请设置适当的[服务控制策略](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) (SCPs)。 SCPs 是一种组织策略，可用于管理组织中的权限。

 以下示例显示了一个 SCP，在创建或更新监控作业计划时，您可以使用它来确保正确设置基础设施参数。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "sagemaker:CreateDataQualityJobDefinition",
                "sagemaker:CreateModelBiasJobDefinition",
                "sagemaker:CreateModelExplainabilityJobDefinition",
                "sagemaker:CreateModelQualityJobDefinition"
            ],
            "Resource": "arn:*:sagemaker:*:*:*",
            "Condition": {
                "Null": {
                    "sagemaker:VolumeKmsKey":"true",
                    "sagemaker:VpcSubnets": "true",
                    "sagemaker:VpcSecurityGroupIds": "true"
                }
            }
        },
        {
            "Effect": "Deny",
            "Action": [
                "sagemaker:CreateDataQualityJobDefinition",
                "sagemaker:CreateModelBiasJobDefinition",
                "sagemaker:CreateModelExplainabilityJobDefinition",
                "sagemaker:CreateModelQualityJobDefinition"
            ],
            "Resource": "arn:*:sagemaker:*:*:*",
            "Condition": {
                "Bool": {
                    "sagemaker:InterContainerTrafficEncryption": "false"
                }
            }
        },
        {
            "Effect": "Deny",
            "Action": [
                "sagemaker:CreateMonitoringSchedule",
                "sagemaker:UpdateMonitoringSchedule"
            ],
            "Resource": "arn:*:sagemaker:*:*:monitoring-schedule/*",
            "Condition": {
                "Null": {
                    "sagemaker:ModelMonitorJobDefinitionName": "true"
                }
            }
        }
    ]
}
```

------

 示例中的前两条规则可确保始终为监控作业定义设置安全参数。最后一条规则要求组织中的任何人在创建或更新计划时都必须指定 `MonitoringJobDefinitionName` 字段。这可确保在创建或更新计划时，组织中的任何人都无法通过指定 `MonitoringJobDefinition` 字段来为安全参数设置不安全的值。