Skip to content

Commit 42e3f09

Browse files
chuyang-dengajaykarpur
authored andcommitted
fix: shorten base job name to avoid collision (aws#1170)
* fix: shorten job base name to avoid collision * use unique_name_from_base * use unique_name_from_base for integ tests
1 parent 920c072 commit 42e3f09

File tree

3 files changed

+30
-32
lines changed

3 files changed

+30
-32
lines changed

src/sagemaker/automl/automl.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from sagemaker.automl.candidate_estimator import CandidateEstimator
2020
from sagemaker.job import _Job
2121
from sagemaker.session import Session
22-
from sagemaker.utils import name_from_base
22+
from sagemaker.utils import unique_name_from_base
2323

2424

2525
class AutoML(object):
@@ -379,9 +379,9 @@ def _prepare_for_auto_ml_job(self, job_name=None):
379379
if self.base_job_name:
380380
base_name = self.base_job_name
381381
else:
382-
base_name = "sagemaker-auto-ml"
382+
base_name = "automl"
383383
# CreateAutoMLJob API validates that member length less than or equal to 32
384-
self.current_job_name = name_from_base(base_name, max_length=32)
384+
self.current_job_name = unique_name_from_base(base_name, max_length=32)
385385

386386
if self.output_path is None:
387387
self.output_path = "s3://{}/".format(self.sagemaker_session.default_bucket())

tests/integ/test_auto_ml.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,10 @@ def test_auto_ml_fit(sagemaker_session):
5858
max_candidates=3,
5959
)
6060

61+
job_name = unique_name_from_base("auto-ml", max_length=32)
6162
inputs = sagemaker_session.upload_data(path=TRAINING_DATA, key_prefix=PREFIX + "/input")
6263
with timeout(minutes=AUTO_ML_DEFAULT_TIMEMOUT_MINUTES):
63-
auto_ml.fit(inputs)
64+
auto_ml.fit(inputs, job_name=job_name)
6465

6566

6667
@pytest.mark.skipif(
@@ -76,8 +77,9 @@ def test_auto_ml_fit_local_input(sagemaker_session):
7677
)
7778

7879
inputs = TRAINING_DATA
80+
job_name = unique_name_from_base("auto-ml", max_length=32)
7981
with timeout(minutes=AUTO_ML_DEFAULT_TIMEMOUT_MINUTES):
80-
auto_ml.fit(inputs)
82+
auto_ml.fit(inputs, job_name=job_name)
8183

8284

8385
@pytest.mark.skipif(
@@ -91,10 +93,11 @@ def test_auto_ml_input_object_fit(sagemaker_session):
9193
sagemaker_session=sagemaker_session,
9294
max_candidates=1,
9395
)
96+
job_name = unique_name_from_base("auto-ml", max_length=32)
9497
s3_input = sagemaker_session.upload_data(path=TRAINING_DATA, key_prefix=PREFIX + "/input")
9598
inputs = AutoMLInput(inputs=s3_input, target_attribute_name=TARGET_ATTRIBUTE_NAME)
9699
with timeout(minutes=AUTO_ML_DEFAULT_TIMEMOUT_MINUTES):
97-
auto_ml.fit(inputs)
100+
auto_ml.fit(inputs, job_name=job_name)
98101

99102

100103
@pytest.mark.skipif(
@@ -134,11 +137,12 @@ def test_auto_ml_invalid_target_attribute(sagemaker_session):
134137
auto_ml = AutoML(
135138
role=ROLE, target_attribute_name="y", sagemaker_session=sagemaker_session, max_candidates=1
136139
)
140+
job_name = unique_name_from_base("auto-ml", max_length=32)
137141
inputs = sagemaker_session.upload_data(path=TRAINING_DATA, key_prefix=PREFIX + "/input")
138142
with pytest.raises(
139143
UnexpectedStatusException, match="Could not complete the data builder processing job."
140144
):
141-
auto_ml.fit(inputs)
145+
auto_ml.fit(inputs, job_name=job_name)
142146

143147

144148
@pytest.mark.skipif(

tests/unit/sagemaker/automl/test_auto_ml.py

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,13 @@
1313
from __future__ import absolute_import
1414

1515
import pytest
16-
from mock import Mock, patch
16+
from mock import Mock
1717
from sagemaker import AutoML, AutoMLJob, AutoMLInput, CandidateEstimator
1818

1919
MODEL_DATA = "s3://bucket/model.tar.gz"
2020
MODEL_IMAGE = "mi"
2121
ENTRY_POINT = "blah.py"
2222

23-
TIMESTAMP = "2017-11-06-14:14:15.671"
2423
BUCKET_NAME = "mybucket"
2524
INSTANCE_COUNT = 1
2625
INSTANCE_TYPE = "ml.c5.2xlarge"
@@ -32,7 +31,6 @@
3231
DEFAULT_OUTPUT_PATH = "s3://{}/".format(BUCKET_NAME)
3332
LOCAL_DATA_PATH = "file://data"
3433
DEFAULT_MAX_CANDIDATES = 500
35-
DEFAULT_JOB_NAME = "sagemake-{}".format(TIMESTAMP)
3634

3735
JOB_NAME = "default-job-name"
3836
JOB_NAME_2 = "banana-auto-ml-job"
@@ -283,38 +281,34 @@ def test_auto_ml_additional_optional_params(sagemaker_session):
283281
}
284282

285283

286-
@patch("time.strftime", return_value=TIMESTAMP)
287-
def test_auto_ml_default_fit(strftime, sagemaker_session):
284+
def test_auto_ml_default_fit(sagemaker_session):
288285
auto_ml = AutoML(
289286
role=ROLE, target_attribute_name=TARGET_ATTRIBUTE_NAME, sagemaker_session=sagemaker_session
290287
)
291288
inputs = DEFAULT_S3_INPUT_DATA
292289
auto_ml.fit(inputs)
293290
sagemaker_session.auto_ml.assert_called_once()
294291
_, args = sagemaker_session.auto_ml.call_args
295-
assert args == {
296-
"input_config": [
297-
{
298-
"DataSource": {
299-
"S3DataSource": {"S3DataType": "S3Prefix", "S3Uri": DEFAULT_S3_INPUT_DATA}
300-
},
301-
"TargetAttributeName": TARGET_ATTRIBUTE_NAME,
302-
}
303-
],
304-
"output_config": {"S3OutputPath": DEFAULT_OUTPUT_PATH},
305-
"auto_ml_job_config": {
306-
"CompletionCriteria": {"MaxCandidates": DEFAULT_MAX_CANDIDATES},
307-
"SecurityConfig": {
308-
"EnableInterContainerTrafficEncryption": ENCRYPT_INTER_CONTAINER_TRAFFIC
292+
assert args["input_config"] == [
293+
{
294+
"DataSource": {
295+
"S3DataSource": {"S3DataType": "S3Prefix", "S3Uri": DEFAULT_S3_INPUT_DATA}
309296
},
297+
"TargetAttributeName": TARGET_ATTRIBUTE_NAME,
298+
}
299+
]
300+
assert args["output_config"] == {"S3OutputPath": DEFAULT_OUTPUT_PATH}
301+
assert args["auto_ml_job_config"] == {
302+
"CompletionCriteria": {"MaxCandidates": DEFAULT_MAX_CANDIDATES},
303+
"SecurityConfig": {
304+
"EnableInterContainerTrafficEncryption": ENCRYPT_INTER_CONTAINER_TRAFFIC
310305
},
311-
"role": ROLE,
312-
"job_name": DEFAULT_JOB_NAME,
313-
"problem_type": None,
314-
"job_objective": None,
315-
"generate_candidate_definitions_only": GENERATE_CANDIDATE_DEFINITIONS_ONLY,
316-
"tags": None,
317306
}
307+
assert args["role"] == ROLE
308+
assert args["problem_type"] is None
309+
assert args["job_objective"] is None
310+
assert args["generate_candidate_definitions_only"] == GENERATE_CANDIDATE_DEFINITIONS_ONLY
311+
assert args["tags"] is None
318312

319313

320314
def test_auto_ml_local_input(sagemaker_session):

0 commit comments

Comments
 (0)