如何修复因失败而失败的SageMaker数据-质量监控-计划作业。作业输入没有数据' [英] How to fix SageMaker data-quality monitoring-schedule job that fails with 'FailureReason': 'Job inputs had no data'

查看:5
本文介绍了如何修复因失败而失败的SageMaker数据-质量监控-计划作业。作业输入没有数据'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试按照this AWS documentation page中提到的步骤在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'
)

,数据在S3中可用:

然后我尝试按照this example notebook for model-quality-monitoring in 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)

大约一个小时后,当我像这样检查日程状态时:

import boto3
boto3_sm_client = boto3.client('sagemaker')
boto3_sm_client.describe_monitoring_schedule(MonitoringScheduleName='ch-dq-monitor-schdl-try17')

我得到如下失败状态:

'MonitoringExecutionStatus': 'Failed',
  ...
  'FailureReason': 'Job inputs had no data'},

完整消息:

数据-lang="js"数据-隐藏="真"数据-控制台="假"数据-巴贝尔="假">
```
{'MonitoringScheduleArn': 'arn:aws:sagemaker:ap-south-1:<my-account-id>:monitoring-schedule/ch-dq-monitor-schdl-try21',
 'MonitoringScheduleName': 'ch-dq-monitor-schdl-try21',
 'MonitoringScheduleStatus': 'Scheduled',
 'MonitoringType': 'DataQuality',
 'CreationTime': datetime.datetime(2021, 9, 14, 13, 7, 31, 899000, tzinfo=tzlocal()),
 'LastModifiedTime': datetime.datetime(2021, 9, 14, 14, 1, 13, 247000, tzinfo=tzlocal()),
 'MonitoringScheduleConfig': {'ScheduleConfig': {'ScheduleExpression': 'cron(0 * ? * * *)'},
  'MonitoringJobDefinitionName': 'data-quality-job-definition-2021-09-14-13-07-31-483',
  'MonitoringType': 'DataQuality'},
 'EndpointName': 'ch-dq-nh-try21',
 'LastMonitoringExecutionSummary': {'MonitoringScheduleName': 'ch-dq-monitor-schdl-try21',
  'ScheduledTime': datetime.datetime(2021, 9, 14, 14, 0, tzinfo=tzlocal()),
  'CreationTime': datetime.datetime(2021, 9, 14, 14, 1, 9, 405000, tzinfo=tzlocal()),
  'LastModifiedTime': datetime.datetime(2021, 9, 14, 14, 1, 13, 236000, tzinfo=tzlocal()),
  'MonitoringExecutionStatus': 'Failed',
  'EndpointName': 'ch-dq-nh-try21',
  'FailureReason': 'Job inputs had no data'},
 'ResponseMetadata': {'RequestId': 'dd729244-fde9-44b5-9904-066eea3a49bb',
  'HTTPStatusCode': 200,
  'HTTPHeaders': {'x-amzn-requestid': 'dd729244-fde9-44b5-9904-066eea3a49bb',
   'content-type': 'application/x-amz-json-1.1',
   'content-length': '835',
   'date': 'Tue, 14 Sep 2021 14:27:53 GMT'},
  'RetryAttempts': 0}}
```

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

  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"}

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

推荐答案

在GROUND-TRUE-MERGE作业期间,当Spark在‘/opt/ml/Processing/Ground Truth/’或‘/opt/ml/Processing/InputData/’目录中找不到任何数据时,就会发生这种情况。当您尚未向Sagemaker终结点发送任何请求或没有基本事实时,就会发生这种情况。

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

我之所以回答这个问题,是因为有人读到了这个问题,并对其进行了投票。这意味着,其他人也面临着这个问题。所以,我已经提到了对我有效的方法。我写了这篇文章,这样StackExchange就不会认为我在向论坛发送垃圾邮件。

这篇关于如何修复因失败而失败的SageMaker数据-质量监控-计划作业。作业输入没有数据&#39;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆