Skip to content

Commit

Permalink
Add a module for Data Quality Monitoring Job for a SageMaker Endpoint.
Browse files Browse the repository at this point in the history
  • Loading branch information
Patrick Cloke committed Jun 11, 2024
1 parent 37ec764 commit 2bd0ae7
Show file tree
Hide file tree
Showing 18 changed files with 887 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### **Added**

- Added a `sagemaker-model-monitoring-module` module with an example of data quality monitoring of a SageMaker Endpoint.
- Added an option to enable data capture in the `sagemaker-endpoint-module`.

### **Changed**
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ See deployment steps in the [Deployment Guide](DEPLOYMENT.md).
| [SageMaker Custom Kernel Module](modules/sagemaker/sagemaker-custom-kernel/README.md) | Builds custom kernel for SageMaker Studio from a Dockerfile |
| [SageMaker Model Package Group Module](modules/sagemaker/sagemaker-model-package-group/README.md) | Creates a SageMaker Model Package Group to register and version SageMaker Machine Learning (ML) models and setups an Amazon EventBridge Rule to send model package group state change events to an Amazon EventBridge Bus |
| [SageMaker Model Package Promote Pipeline Module](modules/sagemaker/sagemaker-model-package-promote-pipeline/README.md) | Deploy a Pipeline to promote SageMaker Model Packages in a multi-account setup. The pipeline can be triggered through an EventBridge rule in reaction of a SageMaker Model Package Group state event change (Approved/Rejected). Once the pipeline is triggered, it will promote the latest approved model package, if one is found. |
| [SageMaker Model Monitoring Module](modules/sagemaker/sagemaker-model-monitoring-module/README.md) | Deploy a data quality monitoring job which runs against a SageMaker Endpoint. |

### Mlflow Modules

Expand Down
95 changes: 95 additions & 0 deletions modules/sagemaker/sagemaker-model-monitoring/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# SageMaker Model Monitoring

## Description

This module creates a SageMaker Model Monitoring job for data quality.
It requires a deployed model endpoint and the proper check steps
for each monitoring job:

* Data Quality: [QualityCheck step](https://docs.aws.amazon.com/sagemaker/latest/dg/build-and-manage-steps.html#step-type-quality-check)

### Architecture

![SageMaker Model Monitoring Module Architecture](docs/_static/sagemaker-model-monitoring-module-architecture.png "SageMaker Model Monitoring Module Architecture")

## Inputs/Outputs

### Input Parameters

#### Required

- `endpoint-name`: The name of the endpoint used to run the monitoring job.
- `security-group-id`: The VPC security group IDs, should provide access to the given `subnet-ids`.
- `subnet-ids`: The ID of the subnets in the VPC to which you want to connect your training job or model.
- `model-package-arn`: Model package ARN
- `model-bucket-arn`: S3 bucket ARN for model artifacts
- `kms-key-id`: The KMS key used to encrypted storage and output.
- `data-quality-checkstep-output-prefix`: The S3 prefix in `model-artifacts-bucket-arn` which contains the output from the corresponding [Check step in the SageMaker Pipeline](https://docs.aws.amazon.com/sagemaker/latest/dg/build-and-manage-steps.html#build-and-manage-steps-types).
- `data-quality-output-prefix`: The S3 prefix in `model-artifacts-bucket-arn` to contain the output of the monitoring job.


#### Optional

- `sagemaker-project-id`: SageMaker project id
- `sagemaker-project-name`: SageMaker project name
- `data-quality-instance-count`: The number of ML compute instances to use in the model monitoring job.
- `data-quality-instance-type`: The ML compute instance type for the processing job.
- `data-quality-instance-volume-size-in-gb`: The size of the ML storage volume, in gigabytes, that you want to provision.
- `data-quality-max-runtime-in-seconds`: The maximum length of time, in seconds, the monitoring job can run before it is stopped.
- `data-quality-schedule-expression`: A cron expression that describes details about the monitoring schedule.

### Sample manifest declaration

```yaml
name: monitoring
path: modules/sagemaker/sagemaker-model-monitoring
parameters:
- name: sagemaker_project_id
value: dummy123
- name: sagemaker_project_name
value: dummy123
- name: model_package_arn
value: arn:aws:sagemaker:<region>:<account>:model-package/<package_name>/1
- name: model_bucket_arn
value: arn:aws:s3:::<bucket name>
- name: data-quality-checkstep-output-prefix
value: model-training-run-1234/dataqualitycheckstep
- name: data-quality-output-prefix
value: model-training-run-1234/monitor/dataqualityoutput
- name: endpoint_name
valueFrom:
moduleMetadata:
group: endpoints
name: endpoint
key: EndpointName
- name: security_group_id
valueFrom:
moduleMetadata:
group: endpoints
name: endpoint
key: SecurityGroupId
- name: kms_key_id
valueFrom:
moduleMetadata:
group: endpoints
name: endpoint
key: KmsKeyId
- name: subnet_ids
valueFrom:
moduleMetadata:
group: networking
name: networking
key: PrivateSubnetIds
```
### Module Metadata Outputs
- `ModelExecutionRoleArn`: SageMaker Model Execution IAM role ARN
- `ModelName`: SageMaker Model name
- `ModelPackageArn`: SageMaker Model package ARN
- `EndpointName`: SageMaker Endpoint name
- `EndpointUrl`: SageMaker Endpoint Url

#### Output Example

N/A
30 changes: 30 additions & 0 deletions modules/sagemaker/sagemaker-model-monitoring/app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0

import os

import aws_cdk
import cdk_nag

from sagemaker_model_monitoring.settings import ApplicationSettings
from sagemaker_model_monitoring.stack import SageMakerModelMonitoringStack

# Load application settings from env vars.
app_settings = ApplicationSettings()

environment = aws_cdk.Environment(
account=os.environ["CDK_DEFAULT_ACCOUNT"],
region=os.environ["CDK_DEFAULT_REGION"],
)

app = aws_cdk.App()
stack = SageMakerModelMonitoringStack(
scope=app,
id=app_settings.settings.app_prefix,
env=environment,
**app_settings.parameters.model_dump(),
)

aws_cdk.Aspects.of(app).add(cdk_nag.AwsSolutionsChecks(log_ignores=False))

app.synth()
25 changes: 25 additions & 0 deletions modules/sagemaker/sagemaker-model-monitoring/deployspec.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
publishGenericEnvVariables: true
deploy:
phases:
install:
commands:
- env
# Install whatever additional build libraries
- npm install -g [email protected]
- pip install -r requirements.txt
build:
commands:
- cdk deploy --require-approval never --progress events --app "python app.py" --outputs-file ./cdk-exports.json
# Export metadata
- seedfarmer metadata convert -f cdk-exports.json || true
destroy:
phases:
install:
commands:
# Install whatever additional build libraries
- npm install -g [email protected]
- pip install -r requirements.txt
build:
commands:
# execute the CDK
- cdk destroy --force --app "python app.py"
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<mxfile modified="2024-06-10T19:00:42.984Z" host="design-inspector.a2z.com" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:126.0) Gecko/20100101 Firefox/126.0" etag="ymXan4Qe_-5LTGC5bwpJ" version="10.1.8" type="device"><diagram id="Slb-7FiMrRCHa78ZGk73X" name="Page-1">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</diagram></mxfile>
41 changes: 41 additions & 0 deletions modules/sagemaker/sagemaker-model-monitoring/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
[tool.ruff]
exclude = [
".eggs",
".git",
".hg",
".mypy_cache",
".ruff_cache",
".tox",
".venv",
"_build",
"buck-out",
"build",
"dist",
"codeseeder",
]
line-length = 120
target-version = "py38"

[tool.ruff.lint]
select = ["F", "I", "E", "W"]
fixable = ["ALL"]

[tool.mypy]
python_version = "3.8"
strict = true
ignore_missing_imports = true
disallow_untyped_decorators = false
exclude = "codeseeder.out/|example/|tests/"
warn_unused_ignores = false

[tool.pytest.ini_options]
addopts = "-v --cov=. --cov-report term"
pythonpath = [
"."
]

[tool.coverage.run]
omit = ["tests/*"]

[tool.coverage.report]
fail_under = 80
12 changes: 12 additions & 0 deletions modules/sagemaker/sagemaker-model-monitoring/requirements-dev.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
awscli
cdk-nag
cfn-lint
check-manifest
mypy
pip-tools
pydot
pyroma
pytest
ruff
types-PyYAML
types-setuptools
Loading

0 comments on commit 2bd0ae7

Please sign in to comment.