Skip to content

Commit 1ae3b34

Browse files
author
Chuyang Deng
committed
Support for Predictor to delete SageMaker model.
1 parent b95710d commit 1ae3b34

File tree

6 files changed

+51
-2
lines changed

6 files changed

+51
-2
lines changed

CHANGELOG.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ CHANGELOG
88
* doc-fix: update information about saving models in the MXNet README
99
* doc-fix: change ReadTheDocs links from latest to stable
1010
* doc-fix: add ``transform_fn`` information and fix ``input_fn`` signature in the MXNet README
11-
* feature: Support for ``Predictor`` to delete endpoint configuration by default when calling ``delete_endpoint()``
12-
* feature: Support for ``model`` to delete SageMaker model
11+
* feature: Support for ``Predictor`` to delete model, and delete endpoint configuration by default when calling ``delete_endpoint()``
12+
* feature: Support for ``Model`` to delete SageMaker model
1313
* feature: Support for ``Transformer`` to delete SageMaker model
1414
* bug-fix: Default account for SKLearnModel fixed
1515

README.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,8 @@ Here is an end to end example of how to use a SageMaker Estimator:
192192
# Tears down the SageMaker endpoint and endpoint configuration
193193
mxnet_predictor.delete_endpoint()
194194
195+
# Deletes SageMaker model
196+
mxnet_predictor.delete_model()
195197
196198
The example above will eventually delete both the SageMaker endpoint and endpoint configuration through `delete_endpoint()`. If you want to keep your SageMaker endpoint configuration, use the value False for the `delete_endpoint_config` parameter, as shown below.
197199

@@ -283,6 +285,9 @@ We can take the example in `Using Estimators <#using-estimators>`__ , and use e
283285
# Tears down the endpoint container and deletes the corresponding endpoint configuration
284286
mxnet_predictor.delete_endpoint()
285287
288+
# Deletes the model
289+
mxnet_predictor.delete_model()
290+
286291
287292
If you have an existing model and want to deploy it locally, don't specify a sagemaker_session argument to the ``MXNetModel`` constructor.
288293
The correct session is generated when you call ``model.deploy()``.
@@ -306,6 +311,9 @@ Here is an end-to-end example:
306311
# Tear down the endpoint container and delete the corresponding endpoint configuration
307312
predictor.delete_endpoint()
308313
314+
# Deletes the model
315+
predictor.delete_model()
316+
309317
310318
If you don't want to deploy your model locally, you can also choose to perform a Local Batch Transform Job. This is
311319
useful if you want to test your container before creating a Sagemaker Batch Transform Job. Note that the performance

src/sagemaker/predictor.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,22 @@ def delete_endpoint(self, delete_endpoint_config=True):
127127

128128
self.sagemaker_session.delete_endpoint(self.endpoint)
129129

130+
def delete_model(self):
131+
"""Deletes the Amazon SageMaker models backing this predictor.
132+
133+
"""
134+
model_names = self._get_model_names()
135+
for model_name in model_names:
136+
self.sagemaker_session.delete_model(model_name)
137+
138+
def _get_model_names(self):
139+
endpoint_desc = self.sagemaker_session.sagemaker_client.describe_endpoint(EndpointName=self.endpoint)
140+
endpoint_config_name = endpoint_desc['EndpointConfigName']
141+
endpoint_config = self.sagemaker_session.sagemaker_client.describe_endpoint_config(EndpointConfigName=
142+
endpoint_config_name)
143+
production_variants = endpoint_config['ProductionVariants']
144+
return map(lambda d: d['ModelName'], production_variants)
145+
130146

131147
class _CsvSerializer(object):
132148
def __init__(self):

tests/integ/test_kmeans.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ def test_kmeans(sagemaker_session):
7575
assert record.label["closest_cluster"] is not None
7676
assert record.label["distance_to_cluster"] is not None
7777

78+
predictor.delete_model()
79+
with pytest.raises(Exception) as exception:
80+
sagemaker_session.sagemaker_client.describe_model(ModelName=model.name)
81+
assert 'Could not find model' in str(exception.value)
82+
7883

7984
def test_async_kmeans(sagemaker_session):
8085
training_job_name = ""

tests/integ/test_mxnet_train.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ def test_deploy_model(mxnet_training_job, sagemaker_session, mxnet_full_version)
7272
data = numpy.zeros(shape=(1, 1, 28, 28))
7373
predictor.predict(data)
7474

75+
predictor.delete_model()
76+
with pytest.raises(Exception) as exception:
77+
sagemaker_session.sagemaker_client.describe_model(ModelName=model.name)
78+
assert 'Could not find model' in str(exception.value)
79+
7580

7681
def test_deploy_model_with_update_endpoint(mxnet_training_job, sagemaker_session, mxnet_full_version):
7782
endpoint_name = 'test-mxnet-deploy-model-{}'.format(sagemaker_timestamp())

tests/unit/test_predictor.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,3 +466,18 @@ def test_delete_endpoint_only():
466466

467467
sagemaker_session.delete_endpoint.assert_called_with(ENDPOINT)
468468
sagemaker_session.delete_endpoint_config.assert_not_called()
469+
470+
471+
def test_delete_model():
472+
endpoint_desc = {
473+
'ProductionVariants': [{
474+
'VariantName': 'my-model'
475+
}]
476+
}
477+
sagemaker_session = empty_sagemaker_session()
478+
sagemaker_session.sagemaker_client.describe_endpoint = Mock(return_value=endpoint_desc)
479+
predictor = RealTimePredictor(ENDPOINT, sagemaker_session=sagemaker_session)
480+
481+
predictor.delete_model()
482+
sagemaker_session.delete_model.assert_called_with('my-model')
483+

0 commit comments

Comments
 (0)