如何修复因“FailureReason”而失败的 SageMaker 数据质量监控计划作业:“作业输入没有数据”

Nav*_*ala 4 amazon-web-services aws-sdk amazon-sagemaker

我尝试按照此 AWS 文档页面中提到的步骤在 AWS SageMaker 中安排数据质量监控作业。我已为我的端点启用数据捕获。然后,在我的训练 csv 文件上训练基线,S3 中提供统计数据和约束,如下所示:

from sagemaker import get_execution_role
from sagemaker import image_uris
from sagemaker.model_monitor.dataset_format import DatasetFormat

my_data_monitor = DefaultModelMonitor(
    role=get_execution_role(),
    instance_count=1,
    instance_type='ml.m5.large',
    volume_size_in_gb=30,
    max_runtime_in_seconds=3_600)

# base s3 directory
baseline_dir_uri = 's3://api-trial/data_quality_no_headers/'
# train data, that I have used to generate baseline
baseline_data_uri = baseline_dir_uri + 'ch_train_no_target.csv'
# directory in s3 bucket that I have stored my baseline results to 
baseline_results_uri = baseline_dir_uri + 'baseline_results_try17/'


my_data_monitor.suggest_baseline(
    baseline_dataset=baseline_data_uri,
    dataset_format=DatasetFormat.csv(header=True),
    output_s3_uri=baseline_results_uri,
    wait=True, logs=False, job_name='ch-dq-baseline-try21'
)
Run Code Online (Sandbox Code Playgroud)

并且数据在 S3 中可用: 在此输入图像描述

然后,我尝试按照sagemaker-examples github repo 中的模型质量监控示例笔记本来安排监控作业,通过根据错误消息的反馈进行必要的修改来安排我的数据质量监控作业。

以下是尝试从 SageMaker Studio 安排数据质量监控作业的方法:

from sagemaker import get_execution_role
from sagemaker.model_monitor import EndpointInput
from sagemaker import image_uris
from sagemaker.model_monitor import CronExpressionGenerator
from sagemaker.model_monitor import DefaultModelMonitor
from sagemaker.model_monitor.dataset_format import DatasetFormat

# base s3 directory
baseline_dir_uri = 's3://api-trial/data_quality_no_headers/'

# train data, that I have used to generate baseline
baseline_data_uri = baseline_dir_uri + 'ch_train_no_target.csv'

# directory in s3 bucket that I have stored my baseline results to 
baseline_results_uri = baseline_dir_uri + 'baseline_results_try17/'
# s3 locations of baseline job outputs
baseline_statistics = baseline_results_uri + 'statistics.json'
baseline_constraints = baseline_results_uri + 'constraints.json'

# directory in s3 bucket that I would like to store results of monitoring schedules in
monitoring_outputs = baseline_dir_uri + 'monitoring_results_try17/'

ch_dq_ep = EndpointInput(endpoint_name=myendpoint_name,
                         destination="/opt/ml/processing/input_data",
                         s3_input_mode="File",
                         s3_data_distribution_type="FullyReplicated")

monitor_schedule_name='ch-dq-monitor-schdl-try21'

my_data_monitor.create_monitoring_schedule(endpoint_input=ch_dq_ep,
                                           monitor_schedule_name=monitor_schedule_name,
                                           output_s3_uri=baseline_dir_uri,
                                           constraints=baseline_constraints,
                                           statistics=baseline_statistics,
                                           schedule_cron_expression=CronExpressionGenerator.hourly(),
                                           enable_cloudwatch_metrics=True)
Run Code Online (Sandbox Code Playgroud)

大约一个小时后,当我检查时间表的状态时,如下所示:

import boto3
boto3_sm_client = boto3.client('sagemaker')
boto3_sm_client.describe_monitoring_schedule(MonitoringScheduleName='ch-dq-monitor-schdl-try17')
Run Code Online (Sandbox Code Playgroud)

我得到如下失败状态:

'MonitoringExecutionStatus': 'Failed',
  ...
  'FailureReason': 'Job inputs had no data'},
Run Code Online (Sandbox Code Playgroud)

整个消息:

from sagemaker import get_execution_role
from sagemaker import image_uris
from sagemaker.model_monitor.dataset_format import DatasetFormat

my_data_monitor = DefaultModelMonitor(
    role=get_execution_role(),
    instance_count=1,
    instance_type='ml.m5.large',
    volume_size_in_gb=30,
    max_runtime_in_seconds=3_600)

# base s3 directory
baseline_dir_uri = 's3://api-trial/data_quality_no_headers/'
# train data, that I have used to generate baseline
baseline_data_uri = baseline_dir_uri + 'ch_train_no_target.csv'
# directory in s3 bucket that I have stored my baseline results to 
baseline_results_uri = baseline_dir_uri + 'baseline_results_try17/'


my_data_monitor.suggest_baseline(
    baseline_dataset=baseline_data_uri,
    dataset_format=DatasetFormat.csv(header=True),
    output_s3_uri=baseline_results_uri,
    wait=True, logs=False, job_name='ch-dq-baseline-try21'
)
Run Code Online (Sandbox Code Playgroud)

您可能认为我这边出了问题或者可能帮助我解决问题:

  1. 用于基线的数据集:我尝试使用包含和不包含目标变量(或因变量或 y)的数据集创建基线,并且错误两次都持续存在。因此,我认为该错误是由于不同的原因而产生的。
  2. 没有为这些作业创建日志组供我查看并尝试调试问题。基线作业具有日志组,因此我认为用于监视计划作业的角色没有创建日志组或流的权限,没有问题。
  3. 角色:我附加的角色由 定义get_execution_role(),它指向具有对 sagemaker、cloudwatch、S3 和其他一些服务的完全访问权限的角色。
  4. 推理期间从端点收集的数据:以下是保存到 S3 的 .jsonl 文件的一行数据,其中包含推理期间收集的数据,如下所示:
{"captureData":{"endpointInput":{"observedContentType":"application/json","mode":"INPUT","data":"{\"longitude\": [-122.32, -117.58], \"latitude\": [37.55, 33.6], \"housing_median_age\": [50.0, 5.0], \"total_rooms\": [2501.0, 5348.0], \"total_bedrooms\": [433.0, 659.0], \"population\": [1050.0, 1862.0], \"households\": [410.0, 555.0], \"median_income\": [4.6406, 11.0567]}","encoding":"JSON"},"endpointOutput":{"observedContentType":"text/html; charset=utf-8","mode":"OUTPUT","data":"eyJtZWRpYW5faG91c2VfdmFsdWUiOiBbNDUyOTU3LjY5LCA0NjcyMTQuNF19","encoding":"BASE64"}},"eventMetadata":{"eventId":"9804d438-eb4c-4cb4-8f1b-d0c832b641aa","inferenceId":"ef07163d-ea2d-4730-92f3-d755bc04ae0d","inferenceTime":"2021-09-14T13:59:03Z"},"eventVersion":"0"}
Run Code Online (Sandbox Code Playgroud)

我想知道整个过程中出了什么问题,导致数据无法输入到我的监控工作中。

Nav*_*ala 5

在 ground-truth-merge 作业期间,当 Spark 在“/opt/ml/processing/groundtruth/”或“/opt/ml/processing/input_data/”目录中找不到任何数据时,就会发生这种情况。当您没有向 sagemaker 端点发送任何请求或者没有基本事实时,就会发生这种情况。

我收到此错误是因为/opt/ml/processing/input_data/映射到监视容器的 docker 卷的文件夹没有要处理的数据。发生这种情况是因为,促进整个过程(包括获取数据)的东西在 S3 中找不到任何东西。/发生这种情况的原因是,在保存端点捕获数据的目录中有一个额外的斜杠( )。详细地说,在创建端点时,我提到目录为s3://<bucket-name>/<folder-1>/,而它应该是s3://<bucket-name>/<folder-1>。因此,虽然将数据从 S3 复制到 docker 卷的东西尝试获取该小时的数据,但它尝试从中提取数据的目录是s3://<bucket-name>/<folder-1>//<endpoint-name>/<variant-name>/<year>/<month>/<date>/<hour>(注意两个斜杠)。因此,当我再次创建端点配置并在 S3 目录中删除斜杠时,此错误不存在,并且作为模型质量监控的一部分,地面实况合并操作成功。

我回答这个问题是因为有人读了这个问题并投票了。也就是说,其他人也遇到过这个问题。所以,我已经提到了对我有用的方法。我写了这篇文章,这样 StackExchange 就不会认为我在论坛上乱发问题。