Skip to content

Commit 584980c

Browse files
author
Chuyang Deng
committed
Modify timeout class, README, CHANGELOG and model none check in session and transformer.
1 parent 757c8ab commit 584980c

File tree

8 files changed

+19
-62
lines changed

8 files changed

+19
-62
lines changed

CHANGELOG.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ CHANGELOG
77

88
* doc-fix: update information about saving models in the MXNet README
99
* doc-fix: change ReadTheDocs links from latest to stable
10-
* feature: Make predictor to delete endpoint configuration by default when calling ``delete_endpoint()``
10+
* feature: Support for predictor class to delete endpoint configuration by default when calling ``delete_endpoint()``
1111
* feature: Support for model class to delete SageMaker model
1212
* feature: Support for transformer to delete Sagemaker model
1313

README.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ We can take the example in `Using Estimators <#using-estimators>`__ , and use e
280280
# Serializes data and makes a prediction request to the local endpoint
281281
response = mxnet_predictor.predict(data)
282282
283-
# Tears down the endpoint and endpoint configuration
283+
# Tears down the endpoint container and deletes the corresponding endpoint configuration
284284
mxnet_predictor.delete_endpoint()
285285
286286
@@ -303,7 +303,7 @@ Here is an end-to-end example:
303303
data = numpy.zeros(shape=(1, 1, 28, 28))
304304
predictor.predict(data)
305305
306-
# Tear down the endpoint and endpoint configuration
306+
# Tear down the endpoint container and delete the corresponding endpoint configuration
307307
predictor.delete_endpoint()
308308
309309

src/sagemaker/predictor.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,11 @@ def _delete_endpoint_config(self):
113113
self.sagemaker_session.delete_endpoint_config(endpoint_config_name)
114114

115115
def delete_endpoint(self, delete_endpoint_config=True):
116-
"""Delete the Amazon SageMaker endpoint backing this predictor. Also delete the endpoint configuration attached
117-
to it if delete_endpoint_config is True.
116+
"""Delete the Amazon SageMaker endpoint and endpoint configuration backing this predictor.
118117
119118
Args:
120-
delete_endpoint_config (bool): Flag to indicate whether to delete endpoint configuration together with
121-
endpoint. If False, only endpoint will be deleted. Default: True.
119+
delete_endpoint_config (bool): Flag to indicate whether to delete the corresponding SageMaker endpoint
120+
configuration tied to the endpoint. If False, only the endpoint will be deleted. (default: True)
122121
123122
"""
124123
if delete_endpoint_config:

src/sagemaker/session.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -795,15 +795,9 @@ def delete_model(self, model_name):
795795
Args:
796796
model_name (str): Name of the Amazon SageMaker model to delete.
797797
798-
Raises: ValueError if model is not deployed yet.
799-
800798
"""
801-
try:
802-
self.sagemaker_client.describe_model(ModelName=model_name)
803-
LOGGER.info('Deleting model with name: {}'.format(model_name))
804-
self.sagemaker_client.delete_model(ModelName=model_name)
805-
except Exception:
806-
raise ValueError('The Sagemaker model must be deployed first before attempting to delete.')
799+
LOGGER.info('Deleting model with name: {}'.format(model_name))
800+
self.sagemaker_client.delete_model(ModelName=model_name)
807801

808802
def wait_for_job(self, job, poll=5):
809803
"""Wait for an Amazon SageMaker training job to complete.

src/sagemaker/transformer.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ def __init__(self, model_name, instance_count, instance_type, strategy=None, ass
5252
using the default AWS configuration chain.
5353
volume_kms_key (str): Optional. KMS key ID for encrypting the volume attached to the ML
5454
compute instance (default: None).
55-
model (sagemaker.model.Model): A SageMaker Model object, used for SageMaker Model interactions
56-
(default: None). If not specified, model object related activities will fail.
5755
"""
5856
self.model_name = model_name
5957
self.strategy = strategy
@@ -115,7 +113,7 @@ def transform(self, data, data_type='S3Prefix', content_type=None, compression_t
115113
split_type)
116114

117115
def delete_model(self):
118-
"""Delete a SageMaker Model.
116+
"""Delete the corresponding SageMaker model for this Transformer.
119117
120118
"""
121119
self.sagemaker_session.delete_model(self.model_name)

tests/integ/timeout.py

Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ def timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session, second
7575
sagemaker_session.delete_endpoint(endpoint_name)
7676
LOGGER.info('deleted endpoint {}'.format(endpoint_name))
7777

78-
_show_endpoint_logs(endpoint_name, sagemaker_session)
78+
_show_logs(endpoint_name, 'Endpoints', sagemaker_session)
7979
if no_errors:
80-
_cleanup_endpoint_logs(endpoint_name, sagemaker_session)
80+
_cleanup_logs(endpoint_name, 'Endpoints', sagemaker_session)
8181
return
8282
except ClientError as ce:
8383
if ce.response['Error']['Code'] == 'ValidationException':
@@ -102,41 +102,19 @@ def timeout_and_delete_model_with_transformer(transformer, sagemaker_session, se
102102
try:
103103
transformer.delete_model()
104104
LOGGER.info('deleted SageMaker model {}'.format(transformer.model_name))
105+
106+
_show_logs(transformer.model_name, 'Models', sagemaker_session)
105107
if no_errors:
106-
_cleanup_model_logs(transformer.model_name, sagemaker_session)
108+
_cleanup_logs(transformer.model_name, 'Models', sagemaker_session)
107109
return
108110
except ClientError as ce:
109111
if ce.response['Error']['Code'] == 'ValidationException':
110112
pass
111113
sleep(10)
112114

113115

114-
def _show_model_logs(model_name, sagemaker_session):
115-
log_group = '/aws/sagemaker/Models/{}'.format(model_name)
116-
try:
117-
LOGGER.info('cloudwatch logs for log group {}'.format(log_group))
118-
logs = AWSLogs(log_group_name=log_group, log_stream_name='ALL', start='1d',
119-
aws_region=sagemaker_session.boto_session.region_name)
120-
logs.list_logs()
121-
except Exception:
122-
LOGGER.exception('Failure occurred while listing cloudwatch log group %s. Swallowing exception but printing '
123-
'stacktrace for debugging.', log_group)
124-
125-
126-
def _cleanup_model_logs(model_name, sagemaker_session):
127-
log_group = '/aws/sagemaker/Models/{}'.format(model_name)
128-
try:
129-
LOGGER.info('deleting cloudwatch log group {}:'.format(log_group))
130-
cwl_client = sagemaker_session.boto_session.client('logs')
131-
cwl_client.delete_log_group(logGroupName=log_group)
132-
LOGGER.info('deleted cloudwatch log group: {}'.format(log_group))
133-
except Exception:
134-
LOGGER.exception('Failure occurred while cleaning up cloudwatch log group %s. '
135-
'Swallowing exception but printing stacktrace for debugging.', log_group)
136-
137-
138-
def _show_endpoint_logs(endpoint_name, sagemaker_session):
139-
log_group = '/aws/sagemaker/Endpoints/{}'.format(endpoint_name)
116+
def _show_logs(resource_name, resource_type, sagemaker_session):
117+
log_group = '/aws/sagemaker/{}/{}'.format(resource_type, resource_name)
140118
try:
141119
# print out logs before deletion for debuggability
142120
LOGGER.info('cloudwatch logs for log group {}:'.format(log_group))
@@ -148,8 +126,8 @@ def _show_endpoint_logs(endpoint_name, sagemaker_session):
148126
'stacktrace for debugging.', log_group)
149127

150128

151-
def _cleanup_endpoint_logs(endpoint_name, sagemaker_session):
152-
log_group = '/aws/sagemaker/Endpoints/{}'.format(endpoint_name)
129+
def _cleanup_logs(resource_name, resource_type, sagemaker_session):
130+
log_group = '/aws/sagemaker/{}/{}'.format(resource_type, resource_name)
153131
try:
154132
# print out logs before deletion for debuggability
155133
LOGGER.info('deleting cloudwatch log group {}:'.format(log_group))

tests/unit/test_session.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -156,22 +156,11 @@ def test_delete_model(boto_session):
156156
sess = Session(boto_session)
157157

158158
model_name = 'my_model'
159-
boto_session.client().describe_model = Mock(return_value={'ModelName': model_name})
160159
sess.delete_model(model_name)
161160

162161
boto_session.client().delete_model.assert_called_with(ModelName=model_name)
163162

164163

165-
def test_delete_non_existing_model(boto_session):
166-
sess = Session(boto_session)
167-
168-
expected_error_message = 'The Sagemaker model must be deployed first before attempting to delete.'
169-
boto_session.client().describe_model = Mock(side_effect=ValueError(expected_error_message))
170-
171-
with pytest.raises(ValueError, match=expected_error_message):
172-
sess.delete_model('non_existing_model')
173-
174-
175164
def test_user_agent_injected(boto_session):
176165
assert 'AWS-SageMaker-Python-SDK' not in boto_session.client('sagemaker')._client_config.user_agent
177166

tests/unit/test_transformer.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ def transformer(sagemaker_session):
6060

6161

6262
def test_delete_model(sagemaker_session):
63-
transformer = Transformer(MODEL_NAME, INSTANCE_COUNT, INSTANCE_TYPE, output_path=OUTPUT_PATH,
64-
sagemaker_session=sagemaker_session, volume_kms_key=KMS_KEY_ID)
63+
transformer = Transformer(MODEL_NAME, INSTANCE_COUNT, INSTANCE_TYPE, sagemaker_session=sagemaker_session)
6564
transformer.delete_model()
6665
sagemaker_session.delete_model.assert_called_with(MODEL_NAME)
6766

0 commit comments

Comments
 (0)