Skip to content

Commit 5ebe225

Browse files
committed
breaking: deprecate unused functions from utils and fw_utils
This also deprecates the unused class sagemaker.session.ModelContainer
1 parent 77086de commit 5ebe225

File tree

5 files changed

+1
-268
lines changed

5 files changed

+1
-268
lines changed

src/sagemaker/fw_utils.py

+1-52
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,6 @@
3333
instantiated with positional or keyword arguments.
3434
"""
3535

36-
EMPTY_FRAMEWORK_VERSION_WARNING = (
37-
"No framework_version specified, defaulting to version {}. "
38-
"framework_version will be required in SageMaker Python SDK v2."
39-
)
40-
LATER_FRAMEWORK_VERSION_WARNING = (
41-
"This is not the latest supported version. "
42-
"If you would like to use version {latest}, "
43-
"please add framework_version={latest} to your constructor."
44-
)
4536
PYTHON_2_DEPRECATION_WARNING = (
4637
"{latest_supported_version} is the latest version of {framework} that supports "
4738
"Python 2. Newer versions of {framework} will only be available for Python 3."
@@ -54,21 +45,10 @@
5445
"fully leverage all GPU cores; the parameter server will be configured to run "
5546
"only one worker per host regardless of the number of GPUs."
5647
)
57-
PARAMETER_V2_RENAME_WARNING = (
58-
"Parameter {v1_parameter_name} will be renamed to {v2_parameter_name} "
59-
"in SageMaker Python SDK v2."
60-
)
61-
62-
63-
EMPTY_FRAMEWORK_VERSION_ERROR = (
64-
"framework_version is required for script mode estimator. "
65-
"Please add framework_version={} to your constructor to avoid this error."
66-
)
6748

49+
DEBUGGER_UNSUPPORTED_REGIONS = ("us-gov-west-1", "us-iso-east-1")
6850
SINGLE_GPU_INSTANCE_TYPES = ("ml.p2.xlarge", "ml.p3.2xlarge")
6951

70-
DEBUGGER_UNSUPPORTED_REGIONS = ["us-gov-west-1", "us-iso-east-1"]
71-
7252

7353
def is_version_equal_or_higher(lowest_version, framework_version):
7454
"""Determine whether the ``framework_version`` is equal to or higher than
@@ -294,26 +274,6 @@ def model_code_key_prefix(code_location_key_prefix, model_name, image):
294274
return "/".join(filter(None, [code_location_key_prefix, model_name or training_job_name]))
295275

296276

297-
def empty_framework_version_warning(default_version, latest_version):
298-
"""
299-
Args:
300-
default_version:
301-
latest_version:
302-
"""
303-
msgs = [EMPTY_FRAMEWORK_VERSION_WARNING.format(default_version)]
304-
if default_version != latest_version:
305-
msgs.append(later_framework_version_warning(latest_version))
306-
return " ".join(msgs)
307-
308-
309-
def later_framework_version_warning(latest_version):
310-
"""
311-
Args:
312-
latest_version:
313-
"""
314-
return LATER_FRAMEWORK_VERSION_WARNING.format(latest=latest_version)
315-
316-
317277
def warn_if_parameter_server_with_multi_gpu(training_instance_type, distribution):
318278
"""Warn the user that training will not fully leverage all the GPU
319279
cores if parameter server is enabled and a multi-GPU instance is selected.
@@ -363,17 +323,6 @@ def python_deprecation_warning(framework, latest_supported_version):
363323
)
364324

365325

366-
def parameter_v2_rename_warning(v1_parameter_name, v2_parameter_name):
367-
"""
368-
Args:
369-
v1_parameter_name: parameter name used in SageMaker Python SDK v1
370-
v2_parameter_name: parameter name used in SageMaker Python SDK v2
371-
"""
372-
return PARAMETER_V2_RENAME_WARNING.format(
373-
v1_parameter_name=v1_parameter_name, v2_parameter_name=v2_parameter_name
374-
)
375-
376-
377326
def _region_supports_debugger(region_name):
378327
"""Returns boolean indicating whether the region supports Amazon SageMaker Debugger.
379328

src/sagemaker/session.py

-23
Original file line numberDiff line numberDiff line change
@@ -3370,29 +3370,6 @@ def __init__(self, seed):
33703370
self.seed = seed
33713371

33723372

3373-
class ModelContainer(object):
3374-
"""Amazon SageMaker Model configurations for inference pipelines.
3375-
3376-
Attributes:
3377-
model_data (str): S3 Model artifact location
3378-
image_uri (str): Docker image URL in ECR
3379-
env (dict[str,str]): Environment variable mapping
3380-
"""
3381-
3382-
def __init__(self, model_data, image_uri, env=None):
3383-
"""Create a definition of a model which can be part of an Inference Pipeline
3384-
3385-
Args:
3386-
model_data (str): The S3 location of a SageMaker model data ``.tar.gz`` file.
3387-
image_uri (str): A Docker image URI.
3388-
env (dict[str, str]): Environment variables to run with ``image_uri`` when hosted in
3389-
SageMaker (default: None).
3390-
"""
3391-
self.model_data = model_data
3392-
self.image_uri = image_uri
3393-
self.env = env
3394-
3395-
33963373
def _create_model_request(
33973374
name, role, container_def=None, tags=None
33983375
): # pylint: disable=redefined-outer-name

src/sagemaker/utils.py

-79
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,8 @@
2424
import tempfile
2525
import time
2626
from datetime import datetime
27-
from functools import wraps
2827

2928
import botocore
30-
import six
3129
from six.moves.urllib import parse
3230

3331

@@ -132,21 +130,6 @@ def sagemaker_short_timestamp():
132130
return time.strftime("%y%m%d-%H%M")
133131

134132

135-
def debug(func):
136-
"""Print the function name and arguments for debugging.
137-
138-
Args:
139-
func:
140-
"""
141-
142-
@wraps(func)
143-
def wrapper(*args, **kwargs):
144-
print("{} args: {} kwargs: {}".format(func.__name__, args, kwargs))
145-
return func(*args, **kwargs)
146-
147-
return wrapper
148-
149-
150133
def get_config_value(key_path, config):
151134
"""
152135
Args:
@@ -178,19 +161,6 @@ def get_short_version(framework_version):
178161
return ".".join(framework_version.split(".")[:2])
179162

180163

181-
def extract_name_from_job_arn(arn):
182-
"""Returns the name used in the API given a full ARN for a training job or
183-
hyperparameter tuning job.
184-
185-
Args:
186-
arn:
187-
"""
188-
slash_pos = arn.find("/")
189-
if slash_pos == -1:
190-
raise ValueError("Cannot parse invalid ARN: %s" % arn)
191-
return arn[(slash_pos + 1) :]
192-
193-
194164
def secondary_training_status_changed(current_job_description, prev_job_description):
195165
"""Returns true if training job's secondary status message has changed.
196166
@@ -276,55 +246,6 @@ def secondary_training_status_message(job_description, prev_description):
276246
return "\n".join(status_strs)
277247

278248

279-
def generate_tensorboard_url(domain, bucket_paths):
280-
"""Generate Tensorboard URL for given list of s3 buckets
281-
282-
Args:
283-
domain: JupyterLab app domain
284-
bucket_paths: List of S3 bucket paths in format `bucket/path`
285-
or a single string in the same format
286-
287-
Returns:
288-
str: Tensorboard URL
289-
290-
Raises:
291-
AttributeError if invalid inputs are passed
292-
"""
293-
294-
def trim_prefix(s, prefix):
295-
if s.startswith(prefix):
296-
return s[len(prefix) :]
297-
return s
298-
299-
def encode_s3_url(s3_url):
300-
if not s3_url:
301-
raise AttributeError("bucket_paths element should not be empty")
302-
s3_url = trim_prefix(s3_url, S3_PREFIX)
303-
return parse.quote_plus("{}{}".format(S3_PREFIX, s3_url))
304-
305-
if not isinstance(domain, six.string_types):
306-
raise AttributeError("domain parameter should be string")
307-
308-
if len(domain) == 0:
309-
raise AttributeError("domain parameter should not be empty")
310-
311-
if isinstance(bucket_paths, six.string_types):
312-
bucket_paths = [bucket_paths]
313-
elif not isinstance(bucket_paths, list):
314-
raise AttributeError("bucket paths should be a list or a string")
315-
316-
if len(bucket_paths) == 0:
317-
raise AttributeError("bucket_paths parameter should not be empty list")
318-
319-
domain = trim_prefix(domain, HTTPS_PREFIX)
320-
domain = trim_prefix(domain, HTTP_PREFIX)
321-
322-
s3_urls = map(encode_s3_url, bucket_paths)
323-
query = ",".join(s3_urls)
324-
325-
return "https://{}/tensorboard/default?s3urls={}".format(domain, query)
326-
327-
328249
def download_folder(bucket_name, prefix, target, sagemaker_session):
329250
"""Download a folder from S3 to a local path
330251

tests/unit/test_pipeline_model.py

-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
from sagemaker.model import FrameworkModel
1919
from sagemaker.pipeline import PipelineModel
2020
from sagemaker.predictor import Predictor
21-
from sagemaker.session import ModelContainer
2221
from sagemaker.sparkml import SparkMLModel
2322

2423
ENTRY_POINT = "blah.py"
@@ -30,8 +29,6 @@
3029
ROLE = "some-role"
3130
ENV_1 = {"SAGEMAKER_DEFAULT_INVOCATIONS_ACCEPT": "application/json"}
3231
ENV_2 = {"SAGEMAKER_DEFAULT_INVOCATIONS_ACCEPT": "text/csv"}
33-
MODEL_CONTAINER_1 = ModelContainer(image_uri=MODEL_IMAGE_1, model_data=MODEL_DATA_1, env=ENV_1)
34-
MODEL_CONTAINER_2 = ModelContainer(image_uri=MODEL_IMAGE_2, model_data=MODEL_DATA_2, env=ENV_2)
3532
ENDPOINT = "some-ep"
3633

3734

tests/unit/test_utils.py

-111
Original file line numberDiff line numberDiff line change
@@ -103,18 +103,6 @@ def test_unique_name_from_base_truncated():
103103
)
104104

105105

106-
def test_name_from_tuning_arn():
107-
arn = "arn:aws:sagemaker:us-west-2:968277160000:hyper-parameter-tuning-job/resnet-sgd-tuningjob-11-07-34-11"
108-
name = sagemaker.utils.extract_name_from_job_arn(arn)
109-
assert name == "resnet-sgd-tuningjob-11-07-34-11"
110-
111-
112-
def test_name_from_training_arn():
113-
arn = "arn:aws:sagemaker:us-west-2:968277160000:training-job/resnet-sgd-tuningjob-11-22-38-46-002-2927640b"
114-
name = sagemaker.utils.extract_name_from_job_arn(arn)
115-
assert name == "resnet-sgd-tuningjob-11-22-38-46-002-2927640b"
116-
117-
118106
def test_base_from_name():
119107
name = "mxnet-training-2020-06-29-15-19-25-475"
120108
assert "mxnet-training" == sagemaker.utils.base_from_name(name)
@@ -217,105 +205,6 @@ def test_secondary_training_status_message_prev_missing():
217205
)
218206

219207

220-
def test_generate_tensorboard_url_valid_domain_and_bucket_paths():
221-
domain = "jupyterlab.us-east-2.abcdefgh.com"
222-
bucket_paths = ["bucket1/path1", "bucket2/path2"]
223-
expected = "https://{}/tensorboard/default?{}".format(
224-
domain, "s3urls=s3%3A%2F%2Fbucket1%2Fpath1,s3%3A%2F%2Fbucket2%2Fpath2"
225-
)
226-
assert sagemaker.utils.generate_tensorboard_url(domain, bucket_paths) == expected
227-
228-
229-
def test_generate_tensorboard_url_valid_domain_and_bucket_paths_with_s3_prefixes():
230-
domain = "jupyterlab.us-east-2.abcdefgh.com"
231-
bucket_paths = ["s3://bucket1/path1", "s3://bucket2/path2"]
232-
expected = "https://{}/tensorboard/default?{}".format(
233-
domain, "s3urls=s3%3A%2F%2Fbucket1%2Fpath1,s3%3A%2F%2Fbucket2%2Fpath2"
234-
)
235-
assert sagemaker.utils.generate_tensorboard_url(domain, bucket_paths) == expected
236-
237-
238-
def test_generate_tensorboard_url_valid_domain_and_bucket_paths_single():
239-
domain = "jupyterlab.us-east-2.abcdefgh.com"
240-
bucket_paths = ["bucket1/path1"]
241-
expected = "https://{}/tensorboard/default?{}".format(
242-
domain, "s3urls=s3%3A%2F%2Fbucket1%2Fpath1"
243-
)
244-
assert sagemaker.utils.generate_tensorboard_url(domain, bucket_paths) == expected
245-
246-
247-
def test_generate_tensorboard_url_valid_domain_and_bucket_paths_string():
248-
domain = "jupyterlab.us-east-2.abcdefgh.com"
249-
bucket_paths = "bucket1/path1"
250-
expected = "https://{}/tensorboard/default?{}".format(
251-
domain, "s3urls=s3%3A%2F%2Fbucket1%2Fpath1"
252-
)
253-
assert sagemaker.utils.generate_tensorboard_url(domain, bucket_paths) == expected
254-
255-
256-
def test_generate_tensorboard_url_valid_domain_with_http_prefix_and_bucket_paths():
257-
domain = "http://jupyterlab.us-east-2.abcdefgh.com"
258-
bucket_paths = ["bucket1/path1"]
259-
expected = "https://{}/tensorboard/default?{}".format(
260-
"jupyterlab.us-east-2.abcdefgh.com", "s3urls=s3%3A%2F%2Fbucket1%2Fpath1"
261-
)
262-
assert sagemaker.utils.generate_tensorboard_url(domain, bucket_paths) == expected
263-
264-
265-
def test_generate_tensorboard_url_valid_domain_with_https_prefix_and_bucket_paths():
266-
domain = "https://jupyterlab.us-east-2.abcdefgh.com"
267-
bucket_paths = ["bucket1/path1"]
268-
expected = "https://{}/tensorboard/default?{}".format(
269-
"jupyterlab.us-east-2.abcdefgh.com", "s3urls=s3%3A%2F%2Fbucket1%2Fpath1"
270-
)
271-
assert sagemaker.utils.generate_tensorboard_url(domain, bucket_paths) == expected
272-
273-
274-
def test_generate_tensorboard_url_bucket_path_neither_string_nor_list():
275-
domain = "jupyterlab.us-east-2.abcdefgh.com"
276-
bucket_paths = None
277-
try:
278-
sagemaker.utils.generate_tensorboard_url(domain, bucket_paths)
279-
except AttributeError as error:
280-
assert str(error) == "bucket paths should be a list or a string"
281-
282-
283-
def test_generate_tensorboard_url_empty_domain():
284-
domain = ""
285-
bucket_paths = ["bucket1/path1"]
286-
try:
287-
sagemaker.utils.generate_tensorboard_url(domain, bucket_paths)
288-
except AttributeError as error:
289-
assert str(error) == "domain parameter should not be empty"
290-
291-
292-
def test_generate_tensorboard_url_empty_bucket_paths():
293-
domain = "jupyterlab.us-east-2.abcdefgh.com"
294-
bucket_paths = []
295-
try:
296-
sagemaker.utils.generate_tensorboard_url(domain, bucket_paths)
297-
except AttributeError as error:
298-
assert str(error) == "bucket_paths parameter should not be empty list"
299-
300-
301-
def test_generate_tensorboard_url_bucket_paths_with_empty_string():
302-
domain = "jupyterlab.us-east-2.abcdefgh.com"
303-
bucket_paths = [""]
304-
try:
305-
sagemaker.utils.generate_tensorboard_url(domain, bucket_paths)
306-
except AttributeError as error:
307-
assert str(error) == "bucket_paths element should not be empty"
308-
309-
310-
def test_generate_tensorboard_url_domain_non_string():
311-
domain = None
312-
bucket_paths = ["bucket1/path1"]
313-
try:
314-
sagemaker.utils.generate_tensorboard_url(domain, bucket_paths)
315-
except AttributeError as error:
316-
assert str(error) == "domain parameter should be string"
317-
318-
319208
@patch("os.makedirs")
320209
def test_download_folder(makedirs):
321210
boto_mock = Mock(name="boto_session")

0 commit comments

Comments
 (0)