|
89 | 89 | subnets=SUBNETS,
|
90 | 90 | )
|
91 | 91 | CRON_HOURLY = CronExpressionGenerator.hourly()
|
| 92 | +CRON_NOW = CronExpressionGenerator.now() |
92 | 93 | ENDPOINT_NAME = "endpoint"
|
93 | 94 | GROUND_TRUTH_S3_URI = "s3://bucket/monitoring_captured/actuals"
|
94 | 95 | ANALYSIS_CONFIG_S3_URI = "s3://bucket/analysis_config.json"
|
@@ -1305,6 +1306,66 @@ def test_model_explainability_monitor(model_explainability_monitor, sagemaker_se
|
1305 | 1306 | )
|
1306 | 1307 |
|
1307 | 1308 |
|
| 1309 | +def test_model_explainability_create_one_time_schedule( |
| 1310 | + model_explainability_monitor, sagemaker_session |
| 1311 | +): |
| 1312 | + endpoint_input = EndpointInput( |
| 1313 | + endpoint_name=ENDPOINT_NAME, |
| 1314 | + destination=ENDPOINT_INPUT_LOCAL_PATH, |
| 1315 | + features_attribute=FEATURES_ATTRIBUTE, |
| 1316 | + inference_attribute=str(INFERENCE_ATTRIBUTE), |
| 1317 | + ) |
| 1318 | + |
| 1319 | + # Create one-time schedule |
| 1320 | + with patch( |
| 1321 | + "sagemaker.s3.S3Uploader.upload_string_as_file_body", return_value=ANALYSIS_CONFIG_S3_URI |
| 1322 | + ) as _: |
| 1323 | + model_explainability_monitor.create_monitoring_schedule( |
| 1324 | + endpoint_input=endpoint_input, |
| 1325 | + analysis_config=ANALYSIS_CONFIG_S3_URI, |
| 1326 | + output_s3_uri=OUTPUT_S3_URI, |
| 1327 | + monitor_schedule_name=SCHEDULE_NAME, |
| 1328 | + schedule_cron_expression=CRON_NOW, |
| 1329 | + data_analysis_start_time=START_TIME_OFFSET, |
| 1330 | + data_analysis_end_time=END_TIME_OFFSET, |
| 1331 | + ) |
| 1332 | + |
| 1333 | + # Validate job definition creation |
| 1334 | + sagemaker_session.sagemaker_client.create_model_explainability_job_definition.assert_called_once() |
| 1335 | + job_definition_args = ( |
| 1336 | + sagemaker_session.sagemaker_client.create_model_explainability_job_definition.call_args[1] |
| 1337 | + ) |
| 1338 | + assert ( |
| 1339 | + job_definition_args["JobDefinitionName"] == model_explainability_monitor.job_definition_name |
| 1340 | + ) |
| 1341 | + assert job_definition_args == { |
| 1342 | + "JobDefinitionName": model_explainability_monitor.job_definition_name, |
| 1343 | + **EXPLAINABILITY_JOB_DEFINITION, |
| 1344 | + "Tags": TAGS, |
| 1345 | + } |
| 1346 | + |
| 1347 | + # Validate monitoring schedule creation |
| 1348 | + sagemaker_session.sagemaker_client.create_monitoring_schedule.assert_called_once() |
| 1349 | + schedule_args = sagemaker_session.sagemaker_client.create_monitoring_schedule.call_args[1] |
| 1350 | + assert schedule_args == { |
| 1351 | + "MonitoringScheduleName": SCHEDULE_NAME, |
| 1352 | + "MonitoringScheduleConfig": { |
| 1353 | + "MonitoringJobDefinitionName": model_explainability_monitor.job_definition_name, |
| 1354 | + "MonitoringType": "ModelExplainability", |
| 1355 | + "ScheduleConfig": { |
| 1356 | + "ScheduleExpression": CRON_NOW, |
| 1357 | + "DataAnalysisStartTime": START_TIME_OFFSET, |
| 1358 | + "DataAnalysisEndTime": END_TIME_OFFSET, |
| 1359 | + }, |
| 1360 | + }, |
| 1361 | + "Tags": TAGS, |
| 1362 | + } |
| 1363 | + |
| 1364 | + # Check if the monitoring schedule is stored in the monitor object |
| 1365 | + assert model_explainability_monitor.monitoring_schedule_name == SCHEDULE_NAME |
| 1366 | + assert model_explainability_monitor.job_definition_name is not None |
| 1367 | + |
| 1368 | + |
1308 | 1369 | def test_model_explainability_batch_transform_monitor(
|
1309 | 1370 | model_explainability_monitor, sagemaker_session
|
1310 | 1371 | ):
|
|
0 commit comments