Skip to content

Commit 336b00f

Browse files
authored
Merge branch 'master' into local-gpu
2 parents e6319ac + ea5c34d commit 336b00f

File tree

10 files changed

+579
-137
lines changed

10 files changed

+579
-137
lines changed

CHANGELOG.md

+17
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,22 @@
11
# Changelog
22

3+
## v1.64.0 (2020-06-15)
4+
5+
### Features
6+
7+
* add support for SKLearn 0.23
8+
9+
## v1.63.0 (2020-06-12)
10+
11+
### Features
12+
13+
* Allow selecting inference response content for automl generated models
14+
* Support for multi variant endpoint invocation with target variant param
15+
16+
### Documentation Changes
17+
18+
* improve docstring and remove unavailable links
19+
320
## v1.62.0 (2020-06-11)
421

522
### Features

VERSION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.62.1.dev0
1+
1.64.1.dev0

src/sagemaker/automl/automl.py

+262-100
Large diffs are not rendered by default.

src/sagemaker/fw_utils.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -587,10 +587,18 @@ def empty_framework_version_warning(default_version, latest_version):
587587
"""
588588
msgs = [EMPTY_FRAMEWORK_VERSION_WARNING.format(default_version)]
589589
if default_version != latest_version:
590-
msgs.append(LATER_FRAMEWORK_VERSION_WARNING.format(latest=latest_version))
590+
msgs.append(later_framework_version_warning(latest_version))
591591
return " ".join(msgs)
592592

593593

594+
def later_framework_version_warning(latest_version):
595+
"""
596+
Args:
597+
latest_version:
598+
"""
599+
return LATER_FRAMEWORK_VERSION_WARNING.format(latest=latest_version)
600+
601+
594602
def warn_if_parameter_server_with_multi_gpu(training_instance_type, distributions):
595603
"""Warn the user that training will not fully leverage all the GPU
596604
cores if parameter server is enabled and a multi-GPU instance is selected.

src/sagemaker/sklearn/defaults.py

+5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515

1616
SKLEARN_NAME = "scikit-learn"
1717

18+
# Default SKLearn version for when the framework version is not specified.
19+
# This is no longer updated so as to not break existing workflows.
1820
SKLEARN_VERSION = "0.20.0"
21+
SKLEARN_LATEST_VERSION = "0.23-1"
22+
SKLEARN_SUPPORTED_VERSIONS = [SKLEARN_VERSION, SKLEARN_LATEST_VERSION]
23+
1924

2025
LATEST_PY2_VERSION = "0.20.0"

src/sagemaker/sklearn/estimator.py

+12-5
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
from sagemaker.fw_registry import default_framework_uri
2020
from sagemaker.fw_utils import (
2121
framework_name_from_image,
22-
empty_framework_version_warning,
22+
get_unsupported_framework_version_error,
23+
later_framework_version_warning,
2324
python_deprecation_warning,
2425
)
2526
from sagemaker.sklearn import defaults
@@ -126,11 +127,17 @@ def __init__(
126127

127128
self.py_version = py_version
128129

129-
if framework_version is None:
130-
logger.warning(
131-
empty_framework_version_warning(defaults.SKLEARN_VERSION, defaults.SKLEARN_VERSION)
130+
if framework_version in defaults.SKLEARN_SUPPORTED_VERSIONS:
131+
self.framework_version = framework_version
132+
else:
133+
raise ValueError(
134+
get_unsupported_framework_version_error(
135+
self.__framework_name__, framework_version, defaults.SKLEARN_SUPPORTED_VERSIONS
136+
)
132137
)
133-
self.framework_version = framework_version or defaults.SKLEARN_VERSION
138+
139+
if framework_version != defaults.SKLEARN_LATEST_VERSION:
140+
logger.warning(later_framework_version_warning(defaults.SKLEARN_LATEST_VERSION))
134141

135142
if image_name is None:
136143
image_tag = "{}-{}-{}".format(framework_version, "cpu", py_version)
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
6.4,2.8,5.6,2.2
2+
5.0,2.3,3.3,1.0
3+
4.9,2.5,4.5,1.7
4+
4.9,3.1,1.5,0.1
5+
5.7,3.8,1.7,0.3
6+
4.4,3.2,1.3,0.2
7+
5.4,3.4,1.5,0.4
8+
6.9,3.1,5.1,2.3
9+
6.7,3.1,4.4,1.4
10+
5.1,3.7,1.5,0.4
11+
5.2,2.7,3.9,1.4
12+
6.9,3.1,4.9,1.5
13+
5.8,4.0,1.2,0.2
14+
5.4,3.9,1.7,0.4
15+
7.7,3.8,6.7,2.2

tests/integ/test_auto_ml.py

+71
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,14 @@
3232
DATA_DIR = os.path.join(DATA_DIR, "automl", "data")
3333
TRAINING_DATA = os.path.join(DATA_DIR, "iris_training.csv")
3434
TEST_DATA = os.path.join(DATA_DIR, "iris_test.csv")
35+
TRANSFORM_DATA = os.path.join(DATA_DIR, "iris_transform.csv")
3536
PROBLEM_TYPE = "MultiClassClassification"
3637
BASE_JOB_NAME = "auto-ml"
3738

3839
# use a succeeded AutoML job to test describe and list candidates method, otherwise tests will run too long
3940
AUTO_ML_JOB_NAME = "python-sdk-integ-test-base-job"
41+
DEFAULT_MODEL_NAME = "python-sdk-automl"
42+
4043

4144
EXPECTED_DEFAULT_JOB_CONFIG = {
4245
"CompletionCriteria": {"MaxCandidates": 3},
@@ -180,6 +183,42 @@ def test_auto_ml_describe_auto_ml_job(sagemaker_session):
180183
assert desc["OutputDataConfig"] == expected_default_output_config
181184

182185

186+
@pytest.mark.skipif(
187+
tests.integ.test_region() in tests.integ.NO_AUTO_ML_REGIONS,
188+
reason="AutoML is not supported in the region yet.",
189+
)
190+
def test_auto_ml_attach(sagemaker_session):
191+
expected_default_input_config = [
192+
{
193+
"DataSource": {
194+
"S3DataSource": {
195+
"S3DataType": "S3Prefix",
196+
"S3Uri": "s3://{}/{}/input/iris_training.csv".format(
197+
sagemaker_session.default_bucket(), PREFIX
198+
),
199+
}
200+
},
201+
"TargetAttributeName": TARGET_ATTRIBUTE_NAME,
202+
}
203+
]
204+
expected_default_output_config = {
205+
"S3OutputPath": "s3://{}/".format(sagemaker_session.default_bucket())
206+
}
207+
208+
auto_ml_utils.create_auto_ml_job_if_not_exist(sagemaker_session)
209+
210+
attached_automl_job = AutoML.attach(
211+
auto_ml_job_name=AUTO_ML_JOB_NAME, sagemaker_session=sagemaker_session
212+
)
213+
attached_desc = attached_automl_job.describe_auto_ml_job()
214+
assert attached_desc["AutoMLJobName"] == AUTO_ML_JOB_NAME
215+
assert attached_desc["AutoMLJobStatus"] == "Completed"
216+
assert isinstance(attached_desc["BestCandidate"], dict)
217+
assert attached_desc["InputDataConfig"] == expected_default_input_config
218+
assert attached_desc["AutoMLJobConfig"] == EXPECTED_DEFAULT_JOB_CONFIG
219+
assert attached_desc["OutputDataConfig"] == expected_default_output_config
220+
221+
183222
@pytest.mark.skipif(
184223
tests.integ.test_region() in tests.integ.NO_AUTO_ML_REGIONS,
185224
reason="AutoML is not supported in the region yet.",
@@ -240,6 +279,38 @@ def test_deploy_best_candidate(sagemaker_session, cpu_instance_type):
240279
sagemaker_session.sagemaker_client.delete_endpoint(EndpointName=endpoint_name)
241280

242281

282+
@pytest.mark.skipif(
283+
tests.integ.test_region() in tests.integ.NO_AUTO_ML_REGIONS,
284+
reason="AutoML is not supported in the region yet.",
285+
)
286+
def test_create_model_best_candidate(sagemaker_session, cpu_instance_type):
287+
auto_ml_utils.create_auto_ml_job_if_not_exist(sagemaker_session)
288+
289+
auto_ml = AutoML.attach(auto_ml_job_name=AUTO_ML_JOB_NAME, sagemaker_session=sagemaker_session)
290+
best_candidate = auto_ml.best_candidate()
291+
292+
with timeout(minutes=5):
293+
pipeline_model = auto_ml.create_model(
294+
name=DEFAULT_MODEL_NAME,
295+
candidate=best_candidate,
296+
sagemaker_session=sagemaker_session,
297+
vpc_config=None,
298+
enable_network_isolation=False,
299+
model_kms_key=None,
300+
predictor_cls=None,
301+
)
302+
inputs = sagemaker_session.upload_data(
303+
path=TRANSFORM_DATA, key_prefix=PREFIX + "/transform_input"
304+
)
305+
pipeline_model.transformer(
306+
instance_count=1,
307+
instance_type=cpu_instance_type,
308+
assemble_with="Line",
309+
output_path="s3://{}/{}".format(sagemaker_session.default_bucket(), "transform_test"),
310+
accept="text/csv",
311+
).transform(data=inputs, content_type="text/csv", split_type="Line", join_source="Input")
312+
313+
243314
@pytest.mark.skipif(
244315
tests.integ.test_region() in tests.integ.NO_AUTO_ML_REGIONS,
245316
reason="AutoML is not supported in the region yet.",

0 commit comments

Comments
 (0)