diff --git a/src/sagemaker/automl/automl.py b/src/sagemaker/automl/automl.py index 2d08227af2..b84048a800 100644 --- a/src/sagemaker/automl/automl.py +++ b/src/sagemaker/automl/automl.py @@ -19,7 +19,7 @@ from sagemaker.automl.candidate_estimator import CandidateEstimator from sagemaker.job import _Job from sagemaker.session import Session -from sagemaker.utils import name_from_base +from sagemaker.utils import unique_name_from_base class AutoML(object): @@ -379,9 +379,9 @@ def _prepare_for_auto_ml_job(self, job_name=None): if self.base_job_name: base_name = self.base_job_name else: - base_name = "sagemaker-auto-ml" + base_name = "automl" # CreateAutoMLJob API validates that member length less than or equal to 32 - self.current_job_name = name_from_base(base_name, max_length=32) + self.current_job_name = unique_name_from_base(base_name, max_length=32) if self.output_path is None: self.output_path = "s3://{}/".format(self.sagemaker_session.default_bucket()) diff --git a/tests/integ/test_auto_ml.py b/tests/integ/test_auto_ml.py index bdfdf86b00..50ff31ba8f 100644 --- a/tests/integ/test_auto_ml.py +++ b/tests/integ/test_auto_ml.py @@ -58,9 +58,10 @@ def test_auto_ml_fit(sagemaker_session): max_candidates=3, ) + job_name = unique_name_from_base("auto-ml", max_length=32) inputs = sagemaker_session.upload_data(path=TRAINING_DATA, key_prefix=PREFIX + "/input") with timeout(minutes=AUTO_ML_DEFAULT_TIMEMOUT_MINUTES): - auto_ml.fit(inputs) + auto_ml.fit(inputs, job_name=job_name) @pytest.mark.skipif( @@ -76,8 +77,9 @@ def test_auto_ml_fit_local_input(sagemaker_session): ) inputs = TRAINING_DATA + job_name = unique_name_from_base("auto-ml", max_length=32) with timeout(minutes=AUTO_ML_DEFAULT_TIMEMOUT_MINUTES): - auto_ml.fit(inputs) + auto_ml.fit(inputs, job_name=job_name) @pytest.mark.skipif( @@ -91,10 +93,11 @@ def test_auto_ml_input_object_fit(sagemaker_session): sagemaker_session=sagemaker_session, max_candidates=1, ) + job_name = unique_name_from_base("auto-ml", max_length=32) s3_input = sagemaker_session.upload_data(path=TRAINING_DATA, key_prefix=PREFIX + "/input") inputs = AutoMLInput(inputs=s3_input, target_attribute_name=TARGET_ATTRIBUTE_NAME) with timeout(minutes=AUTO_ML_DEFAULT_TIMEMOUT_MINUTES): - auto_ml.fit(inputs) + auto_ml.fit(inputs, job_name=job_name) @pytest.mark.skipif( @@ -134,11 +137,12 @@ def test_auto_ml_invalid_target_attribute(sagemaker_session): auto_ml = AutoML( role=ROLE, target_attribute_name="y", sagemaker_session=sagemaker_session, max_candidates=1 ) + job_name = unique_name_from_base("auto-ml", max_length=32) inputs = sagemaker_session.upload_data(path=TRAINING_DATA, key_prefix=PREFIX + "/input") with pytest.raises( UnexpectedStatusException, match="Could not complete the data builder processing job." ): - auto_ml.fit(inputs) + auto_ml.fit(inputs, job_name=job_name) @pytest.mark.skipif( diff --git a/tests/unit/sagemaker/automl/test_auto_ml.py b/tests/unit/sagemaker/automl/test_auto_ml.py index ecd834cb5a..8553531420 100644 --- a/tests/unit/sagemaker/automl/test_auto_ml.py +++ b/tests/unit/sagemaker/automl/test_auto_ml.py @@ -13,14 +13,13 @@ from __future__ import absolute_import import pytest -from mock import Mock, patch +from mock import Mock from sagemaker import AutoML, AutoMLJob, AutoMLInput, CandidateEstimator MODEL_DATA = "s3://bucket/model.tar.gz" MODEL_IMAGE = "mi" ENTRY_POINT = "blah.py" -TIMESTAMP = "2017-11-06-14:14:15.671" BUCKET_NAME = "mybucket" INSTANCE_COUNT = 1 INSTANCE_TYPE = "ml.c5.2xlarge" @@ -32,7 +31,6 @@ DEFAULT_OUTPUT_PATH = "s3://{}/".format(BUCKET_NAME) LOCAL_DATA_PATH = "file://data" DEFAULT_MAX_CANDIDATES = 500 -DEFAULT_JOB_NAME = "sagemake-{}".format(TIMESTAMP) JOB_NAME = "default-job-name" JOB_NAME_2 = "banana-auto-ml-job" @@ -283,8 +281,7 @@ def test_auto_ml_additional_optional_params(sagemaker_session): } -@patch("time.strftime", return_value=TIMESTAMP) -def test_auto_ml_default_fit(strftime, sagemaker_session): +def test_auto_ml_default_fit(sagemaker_session): auto_ml = AutoML( role=ROLE, target_attribute_name=TARGET_ATTRIBUTE_NAME, sagemaker_session=sagemaker_session ) @@ -292,29 +289,26 @@ def test_auto_ml_default_fit(strftime, sagemaker_session): auto_ml.fit(inputs) sagemaker_session.auto_ml.assert_called_once() _, args = sagemaker_session.auto_ml.call_args - assert args == { - "input_config": [ - { - "DataSource": { - "S3DataSource": {"S3DataType": "S3Prefix", "S3Uri": DEFAULT_S3_INPUT_DATA} - }, - "TargetAttributeName": TARGET_ATTRIBUTE_NAME, - } - ], - "output_config": {"S3OutputPath": DEFAULT_OUTPUT_PATH}, - "auto_ml_job_config": { - "CompletionCriteria": {"MaxCandidates": DEFAULT_MAX_CANDIDATES}, - "SecurityConfig": { - "EnableInterContainerTrafficEncryption": ENCRYPT_INTER_CONTAINER_TRAFFIC + assert args["input_config"] == [ + { + "DataSource": { + "S3DataSource": {"S3DataType": "S3Prefix", "S3Uri": DEFAULT_S3_INPUT_DATA} }, + "TargetAttributeName": TARGET_ATTRIBUTE_NAME, + } + ] + assert args["output_config"] == {"S3OutputPath": DEFAULT_OUTPUT_PATH} + assert args["auto_ml_job_config"] == { + "CompletionCriteria": {"MaxCandidates": DEFAULT_MAX_CANDIDATES}, + "SecurityConfig": { + "EnableInterContainerTrafficEncryption": ENCRYPT_INTER_CONTAINER_TRAFFIC }, - "role": ROLE, - "job_name": DEFAULT_JOB_NAME, - "problem_type": None, - "job_objective": None, - "generate_candidate_definitions_only": GENERATE_CANDIDATE_DEFINITIONS_ONLY, - "tags": None, } + assert args["role"] == ROLE + assert args["problem_type"] is None + assert args["job_objective"] is None + assert args["generate_candidate_definitions_only"] == GENERATE_CANDIDATE_DEFINITIONS_ONLY + assert args["tags"] is None def test_auto_ml_local_input(sagemaker_session):