From 851452f311c1ab09ec9f26cd43d6825d6b3440a9 Mon Sep 17 00:00:00 2001 From: Lauren Yu <6631887+laurenyu@users.noreply.github.com> Date: Fri, 17 Jul 2020 14:54:06 -0700 Subject: [PATCH 1/5] change: use images_uris.retrieve() for scikit-learn classes --- .../image_uri_config/scikit-learn.json | 62 ++++++++++++ src/sagemaker/sklearn/estimator.py | 11 ++- src/sagemaker/sklearn/model.py | 16 ++-- src/sagemaker/sklearn/processing.py | 24 ++--- tests/conftest.py | 18 +--- tests/integ/test_airflow_config.py | 9 +- tests/integ/test_git.py | 14 +-- tests/integ/test_processing.py | 22 +++-- tests/integ/test_sklearn.py | 50 ++++++---- .../unit/sagemaker/image_uris/test_sklearn.py | 88 +++++++++++++++++ tests/unit/test_processing.py | 43 ++++----- tests/unit/test_sklearn.py | 96 +++++++------------ 12 files changed, 286 insertions(+), 167 deletions(-) create mode 100644 src/sagemaker/image_uri_config/scikit-learn.json create mode 100644 tests/unit/sagemaker/image_uris/test_sklearn.py diff --git a/src/sagemaker/image_uri_config/scikit-learn.json b/src/sagemaker/image_uri_config/scikit-learn.json new file mode 100644 index 0000000000..962c2632e6 --- /dev/null +++ b/src/sagemaker/image_uri_config/scikit-learn.json @@ -0,0 +1,62 @@ +{ + "processors": ["cpu"], + "scope": ["inference", "training"], + "versions": { + "0.20.0": { + "py_versions": ["py3"], + "registries": { + "ap-east-1": "651117190479", + "ap-northeast-1": "354813040037", + "ap-northeast-2": "366743142698", + "ap-south-1": "720646828776", + "ap-southeast-1": "121021644041", + "ap-southeast-2": "783357654285", + "ca-central-1": "341280168497", + "cn-north-1": "450853457545", + "cn-northwest-1": "451049120500", + "eu-central-1": "492215442770", + "eu-north-1": "662702820516", + "eu-west-1": "141502667606", + "eu-west-2": "764974769150", + "eu-west-3": "659782779980", + "me-south-1": "801668240914", + "sa-east-1": "737474898029", + "us-east-1": "683313688378", + "us-east-2": "257758044811", + "us-gov-west-1": "414596584902", + "us-iso-east-1": "833128469047", + "us-west-1": "746614075791", + "us-west-2": "246618743249" + }, + "repository": "sagemaker-scikit-learn" + }, + "0.23-1": { + "py_versions": ["py3"], + "registries": { + "ap-east-1": "651117190479", + "ap-northeast-1": "354813040037", + "ap-northeast-2": "366743142698", + "ap-south-1": "720646828776", + "ap-southeast-1": "121021644041", + "ap-southeast-2": "783357654285", + "ca-central-1": "341280168497", + "cn-north-1": "450853457545", + "cn-northwest-1": "451049120500", + "eu-central-1": "492215442770", + "eu-north-1": "662702820516", + "eu-west-1": "141502667606", + "eu-west-2": "764974769150", + "eu-west-3": "659782779980", + "me-south-1": "801668240914", + "sa-east-1": "737474898029", + "us-east-1": "683313688378", + "us-east-2": "257758044811", + "us-gov-west-1": "414596584902", + "us-iso-east-1": "833128469047", + "us-west-1": "746614075791", + "us-west-2": "246618743249" + }, + "repository": "sagemaker-scikit-learn" + } + } +} diff --git a/src/sagemaker/sklearn/estimator.py b/src/sagemaker/sklearn/estimator.py index 104682d850..1cda0e3b85 100644 --- a/src/sagemaker/sklearn/estimator.py +++ b/src/sagemaker/sklearn/estimator.py @@ -15,8 +15,8 @@ import logging +from sagemaker import image_uris from sagemaker.estimator import Framework -from sagemaker.fw_registry import default_framework_uri from sagemaker.fw_utils import ( framework_name_from_image, framework_version_from_tag, @@ -137,9 +137,12 @@ def __init__( ) if image_uri is None: - image_tag = "{}-{}-{}".format(framework_version, "cpu", py_version) - self.image_uri = default_framework_uri( - SKLearn.__framework_name__, self.sagemaker_session.boto_region_name, image_tag + self.image_uri = image_uris.retrieve( + SKLearn.__framework_name__, + self.sagemaker_session.boto_region_name, + version=self.framework_version, + py_version=self.py_version, + instance_type=instance_type, ) def create_model( diff --git a/src/sagemaker/sklearn/model.py b/src/sagemaker/sklearn/model.py index e7f5d3e891..7597e7bd53 100644 --- a/src/sagemaker/sklearn/model.py +++ b/src/sagemaker/sklearn/model.py @@ -16,8 +16,8 @@ import logging import sagemaker +from sagemaker import image_uris from sagemaker.deserializers import NumpyDeserializer -from sagemaker.fw_registry import default_framework_uri from sagemaker.fw_utils import model_code_key_prefix, validate_version_or_image_args from sagemaker.model import FrameworkModel, MODEL_SERVER_WORKERS_PARAM_NAME from sagemaker.predictor import Predictor @@ -163,17 +163,21 @@ def prepare_container_def(self, instance_type=None, accelerator_type=None): ) return sagemaker.container_def(deploy_image, model_data_uri, deploy_env) - def serving_image_uri(self, region_name, instance_type): # pylint: disable=unused-argument + def serving_image_uri(self, region_name, instance_type): """Create a URI for the serving image. Args: region_name (str): AWS region where the image is uploaded. - instance_type (str): SageMaker instance type. This parameter is unused because - Scikit-learn supports only CPU. + instance_type (str): SageMaker instance type. Returns: str: The appropriate image URI based on the given parameters. """ - image_tag = "{}-{}-{}".format(self.framework_version, "cpu", self.py_version) - return default_framework_uri(self.__framework_name__, region_name, image_tag) + return image_uris.retrieve( + self.__framework_name__, + region_name, + version=self.framework_version, + py_version=self.py_version, + instance_type=instance_type, + ) diff --git a/src/sagemaker/sklearn/processing.py b/src/sagemaker/sklearn/processing.py index 3828cae98b..2722eb2264 100644 --- a/src/sagemaker/sklearn/processing.py +++ b/src/sagemaker/sklearn/processing.py @@ -17,17 +17,14 @@ """ from __future__ import absolute_import -from sagemaker.fw_registry import default_framework_uri - -from sagemaker import Session +from sagemaker import image_uris, Session from sagemaker.processing import ScriptProcessor +from sagemaker.sklearn import defaults class SKLearnProcessor(ScriptProcessor): """Handles Amazon SageMaker processing tasks for jobs using scikit-learn.""" - _valid_framework_versions = ["0.20.0"] - def __init__( self, framework_version, @@ -83,21 +80,14 @@ def __init__( object that configures network isolation, encryption of inter-container traffic, security group IDs, and subnets. """ - session = sagemaker_session or Session() - region = session.boto_region_name - - if framework_version not in self._valid_framework_versions: - raise ValueError( - "scikit-learn version {} is not supported. Supported versions are {}".format( - framework_version, self._valid_framework_versions - ) - ) - if not command: command = ["python3"] - image_tag = "{}-{}-{}".format(framework_version, "cpu", "py3") - image_uri = default_framework_uri("scikit-learn", region, image_tag) + session = sagemaker_session or Session() + region = session.boto_region_name + image_uri = image_uris.retrieve( + defaults.SKLEARN_NAME, region, version=framework_version, instance_type=instance_type + ) super(SKLearnProcessor, self).__init__( role=role, diff --git a/tests/conftest.py b/tests/conftest.py index 0bb36dca06..a7a8597d23 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -141,11 +141,6 @@ def pytorch_eia_py_version(): return "py3" -@pytest.fixture(scope="module", params=["0.20.0"]) -def sklearn_version(request): - return request.param - - @pytest.fixture(scope="module") def xgboost_framework_version(xgboost_version): if xgboost_version in ("1", "latest"): @@ -202,16 +197,6 @@ def rl_ray_full_version(): return RLEstimator.RAY_LATEST_VERSION -@pytest.fixture(scope="module") -def sklearn_full_version(): - return "0.20.0" - - -@pytest.fixture(scope="module") -def sklearn_full_py_version(): - return "py3" - - @pytest.fixture(scope="module") def tf_full_version(tensorflow_training_latest_version, tensorflow_inference_latest_version): """Fixture for TF tests that test both training and inference. @@ -300,8 +285,9 @@ def pytest_generate_tests(metafunc): def _generate_all_framework_version_fixtures(metafunc): - for fw in ("chainer", "mxnet", "pytorch", "tensorflow", "xgboost"): + for fw in ("chainer", "mxnet", "pytorch", "scikit-learn", "tensorflow", "xgboost"): config = image_uris.config_for_framework(fw) + fw = fw.replace("-", "_") # for fixture names if "scope" in config: _parametrize_framework_version_fixtures(metafunc, fw, config) else: diff --git a/tests/integ/test_airflow_config.py b/tests/integ/test_airflow_config.py index 8055947f7d..fc0d07a2a4 100644 --- a/tests/integ/test_airflow_config.py +++ b/tests/integ/test_airflow_config.py @@ -478,7 +478,10 @@ def test_mxnet_airflow_config_uploads_data_source_to_s3( @pytest.mark.canary_quick def test_sklearn_airflow_config_uploads_data_source_to_s3( - sagemaker_session, cpu_instance_type, sklearn_full_version, sklearn_full_py_version + sagemaker_session, + cpu_instance_type, + scikit_learn_latest_version, + scikit_learn_latest_py_version, ): with timeout(seconds=AIRFLOW_CONFIG_TIMEOUT_IN_SECONDS): script_path = os.path.join(DATA_DIR, "sklearn_mnist", "mnist.py") @@ -488,8 +491,8 @@ def test_sklearn_airflow_config_uploads_data_source_to_s3( entry_point=script_path, role=ROLE, instance_type=cpu_instance_type, - framework_version=sklearn_full_version, - py_version=sklearn_full_py_version, + framework_version=scikit_learn_latest_version, + py_version=scikit_learn_latest_py_version, sagemaker_session=sagemaker_session, hyperparameters={"epochs": 1}, ) diff --git a/tests/integ/test_git.py b/tests/integ/test_git.py index bb08f74c4a..cb6e388043 100644 --- a/tests/integ/test_git.py +++ b/tests/integ/test_git.py @@ -138,7 +138,7 @@ def test_private_github( @pytest.mark.local_mode @pytest.mark.skip("needs a secure authentication approach") def test_private_github_with_2fa( - sagemaker_local_session, sklearn_full_version, sklearn_full_py_version + sagemaker_local_session, scikit_learn_latest_version, scikit_learn_latest_py_version ): script_path = "mnist.py" data_path = os.path.join(DATA_DIR, "sklearn_mnist") @@ -155,11 +155,11 @@ def test_private_github_with_2fa( entry_point=script_path, role="SageMakerRole", source_dir=source_dir, - py_version=sklearn_full_py_version, + py_version=scikit_learn_latest_py_version, instance_count=1, instance_type="local", sagemaker_session=sagemaker_local_session, - framework_version=sklearn_full_version, + framework_version=scikit_learn_latest_version, hyperparameters={"epochs": 1}, git_config=git_config, ) @@ -178,7 +178,7 @@ def test_private_github_with_2fa( model_data, "SageMakerRole", entry_point=script_path, - framework_version=sklearn_full_version, + framework_version=scikit_learn_latest_version, source_dir=source_dir, sagemaker_session=sagemaker_local_session, git_config=git_config, @@ -194,7 +194,7 @@ def test_private_github_with_2fa( @pytest.mark.local_mode def test_github_with_ssh_passphrase_not_configured( - sagemaker_local_session, sklearn_full_version, sklearn_full_py_version + sagemaker_local_session, scikit_learn_latest_version, scikit_learn_latest_py_version ): script_path = "mnist.py" data_path = os.path.join(DATA_DIR, "sklearn_mnist") @@ -212,8 +212,8 @@ def test_github_with_ssh_passphrase_not_configured( instance_count=1, instance_type="local", sagemaker_session=sagemaker_local_session, - framework_version=sklearn_full_version, - py_version=sklearn_full_py_version, + framework_version=scikit_learn_latest_version, + py_version=scikit_learn_latest_py_version, hyperparameters={"epochs": 1}, git_config=git_config, ) diff --git a/tests/integ/test_processing.py b/tests/integ/test_processing.py index 1456f2a0f7..29d3e49fb6 100644 --- a/tests/integ/test_processing.py +++ b/tests/integ/test_processing.py @@ -90,12 +90,12 @@ def output_kms_key(sagemaker_session): ) -def test_sklearn(sagemaker_session, sklearn_full_version, cpu_instance_type): +def test_sklearn(sagemaker_session, scikit_learn_latest_version, cpu_instance_type): script_path = os.path.join(DATA_DIR, "dummy_script.py") input_file_path = os.path.join(DATA_DIR, "dummy_input.txt") sklearn_processor = SKLearnProcessor( - framework_version=sklearn_full_version, + framework_version=scikit_learn_latest_version, role=ROLE, instance_type=cpu_instance_type, instance_count=1, @@ -129,12 +129,12 @@ def test_sklearn(sagemaker_session, sklearn_full_version, cpu_instance_type): @pytest.mark.canary_quick def test_sklearn_with_customizations( - sagemaker_session, image_uri, sklearn_full_version, cpu_instance_type, output_kms_key + sagemaker_session, image_uri, scikit_learn_latest_version, cpu_instance_type, output_kms_key ): input_file_path = os.path.join(DATA_DIR, "dummy_input.txt") sklearn_processor = SKLearnProcessor( - framework_version=sklearn_full_version, + framework_version=scikit_learn_latest_version, role=ROLE, command=["python3"], instance_type=cpu_instance_type, @@ -211,14 +211,14 @@ def test_sklearn_with_custom_default_bucket( sagemaker_session_with_custom_bucket, custom_bucket_name, image_uri, - sklearn_full_version, + scikit_learn_latest_version, cpu_instance_type, output_kms_key, ): input_file_path = os.path.join(DATA_DIR, "dummy_input.txt") sklearn_processor = SKLearnProcessor( - framework_version=sklearn_full_version, + framework_version=scikit_learn_latest_version, role=ROLE, command=["python3"], instance_type=cpu_instance_type, @@ -294,10 +294,10 @@ def test_sklearn_with_custom_default_bucket( def test_sklearn_with_no_inputs_or_outputs( - sagemaker_session, image_uri, sklearn_full_version, cpu_instance_type + sagemaker_session, image_uri, scikit_learn_latest_version, cpu_instance_type ): sklearn_processor = SKLearnProcessor( - framework_version=sklearn_full_version, + framework_version=scikit_learn_latest_version, role=ROLE, command=["python3"], instance_type=cpu_instance_type, @@ -646,12 +646,14 @@ def test_processor_with_custom_bucket( assert job_description["StoppingCondition"] == {"MaxRuntimeInSeconds": 3600} -def test_sklearn_with_network_config(sagemaker_session, sklearn_full_version, cpu_instance_type): +def test_sklearn_with_network_config( + sagemaker_session, scikit_learn_latest_version, cpu_instance_type +): script_path = os.path.join(DATA_DIR, "dummy_script.py") input_file_path = os.path.join(DATA_DIR, "dummy_input.txt") sklearn_processor = SKLearnProcessor( - framework_version=sklearn_full_version, + framework_version=scikit_learn_latest_version, role=ROLE, instance_type=cpu_instance_type, instance_count=1, diff --git a/tests/integ/test_sklearn.py b/tests/integ/test_sklearn.py index d34b5fac86..870c5f9402 100644 --- a/tests/integ/test_sklearn.py +++ b/tests/integ/test_sklearn.py @@ -31,16 +31,25 @@ "This test should be fixed. Details in https://github.com/aws/sagemaker-python-sdk/pull/968" ) def sklearn_training_job( - sagemaker_session, sklearn_full_version, sklearn_full_py_version, cpu_instance_type + sagemaker_session, + scikit_learn_latest_version, + scikit_learn_latest_py_version, + cpu_instance_type, ): return _run_mnist_training_job( - sagemaker_session, cpu_instance_type, sklearn_full_version, sklearn_full_py_version + sagemaker_session, + cpu_instance_type, + scikit_learn_latest_version, + scikit_learn_latest_py_version, ) sagemaker_session.boto_region_name def test_training_with_additional_hyperparameters( - sagemaker_session, sklearn_full_version, sklearn_full_py_version, cpu_instance_type + sagemaker_session, + scikit_learn_latest_version, + scikit_learn_latest_py_version, + cpu_instance_type, ): with timeout(minutes=TRAINING_DEFAULT_TIMEOUT_MINUTES): script_path = os.path.join(DATA_DIR, "sklearn_mnist", "mnist.py") @@ -50,8 +59,8 @@ def test_training_with_additional_hyperparameters( entry_point=script_path, role="SageMakerRole", instance_type=cpu_instance_type, - framework_version=sklearn_full_version, - py_version=sklearn_full_py_version, + framework_version=scikit_learn_latest_version, + py_version=scikit_learn_latest_py_version, sagemaker_session=sagemaker_session, hyperparameters={"epochs": 1}, ) @@ -69,7 +78,10 @@ def test_training_with_additional_hyperparameters( def test_training_with_network_isolation( - sagemaker_session, sklearn_full_version, sklearn_full_py_version, cpu_instance_type + sagemaker_session, + scikit_learn_latest_version, + scikit_learn_latest_py_version, + cpu_instance_type, ): with timeout(minutes=TRAINING_DEFAULT_TIMEOUT_MINUTES): script_path = os.path.join(DATA_DIR, "sklearn_mnist", "mnist.py") @@ -79,8 +91,8 @@ def test_training_with_network_isolation( entry_point=script_path, role="SageMakerRole", instance_type=cpu_instance_type, - framework_version=sklearn_full_version, - py_version=sklearn_full_py_version, + framework_version=scikit_learn_latest_version, + py_version=scikit_learn_latest_py_version, sagemaker_session=sagemaker_session, hyperparameters={"epochs": 1}, enable_network_isolation=True, @@ -123,8 +135,8 @@ def test_deploy_model( sklearn_training_job, sagemaker_session, cpu_instance_type, - sklearn_full_version, - sklearn_full_py_version, + scikit_learn_latest_version, + scikit_learn_latest_py_version, ): endpoint_name = "test-sklearn-deploy-model-{}".format(sagemaker_timestamp()) with timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session): @@ -137,7 +149,7 @@ def test_deploy_model( model_data, "SageMakerRole", entry_point=script_path, - framework_version=sklearn_full_version, + framework_version=scikit_learn_latest_version, sagemaker_session=sagemaker_session, ) predictor = model.deploy(1, cpu_instance_type, endpoint_name=endpoint_name) @@ -149,7 +161,10 @@ def test_deploy_model( "This test should be fixed. Details in https://github.com/aws/sagemaker-python-sdk/pull/968" ) def test_async_fit( - sagemaker_session, cpu_instance_type, sklearn_full_version, sklearn_full_py_version + sagemaker_session, + cpu_instance_type, + scikit_learn_latest_version, + scikit_learn_latest_py_version, ): endpoint_name = "test-sklearn-attach-deploy-{}".format(sagemaker_timestamp()) @@ -157,7 +172,7 @@ def test_async_fit( training_job_name = _run_mnist_training_job( sagemaker_session, cpu_instance_type, - sklearn_full_version=sklearn_full_version, + sklearn_version=scikit_learn_latest_version, wait=False, ) @@ -174,7 +189,10 @@ def test_async_fit( def test_failed_training_job( - sagemaker_session, sklearn_full_version, sklearn_full_py_version, cpu_instance_type + sagemaker_session, + scikit_learn_latest_version, + scikit_learn_latest_py_version, + cpu_instance_type, ): with timeout(minutes=TRAINING_DEFAULT_TIMEOUT_MINUTES): script_path = os.path.join(DATA_DIR, "sklearn_mnist", "failure_script.py") @@ -183,8 +201,8 @@ def test_failed_training_job( sklearn = SKLearn( entry_point=script_path, role="SageMakerRole", - framework_version=sklearn_full_version, - py_version=sklearn_full_py_version, + framework_version=scikit_learn_latest_version, + py_version=scikit_learn_latest_py_version, instance_count=1, instance_type=cpu_instance_type, sagemaker_session=sagemaker_session, diff --git a/tests/unit/sagemaker/image_uris/test_sklearn.py b/tests/unit/sagemaker/image_uris/test_sklearn.py new file mode 100644 index 0000000000..e40dd01706 --- /dev/null +++ b/tests/unit/sagemaker/image_uris/test_sklearn.py @@ -0,0 +1,88 @@ +# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). You +# may not use this file except in compliance with the License. A copy of +# the License is located at +# +# http://aws.amazon.com/apache2.0/ +# +# or in the "license" file accompanying this file. This file is +# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +# ANY KIND, either express or implied. See the License for the specific +# language governing permissions and limitations under the License. +from __future__ import absolute_import + +import pytest + +from sagemaker import image_uris +from tests.unit.sagemaker.image_uris import expected_uris, regions + +ACCOUNTS = { + "ap-east-1": "651117190479", + "ap-northeast-1": "354813040037", + "ap-northeast-2": "366743142698", + "ap-south-1": "720646828776", + "ap-southeast-1": "121021644041", + "ap-southeast-2": "783357654285", + "ca-central-1": "341280168497", + "cn-north-1": "450853457545", + "cn-northwest-1": "451049120500", + "eu-central-1": "492215442770", + "eu-north-1": "662702820516", + "eu-west-1": "141502667606", + "eu-west-2": "764974769150", + "eu-west-3": "659782779980", + "me-south-1": "801668240914", + "sa-east-1": "737474898029", + "us-east-1": "683313688378", + "us-east-2": "257758044811", + "us-gov-west-1": "414596584902", + "us-iso-east-1": "833128469047", + "us-west-1": "746614075791", + "us-west-2": "246618743249", +} + + +def test_valid_uris(scikit_learn_version): + for region in regions.regions(): + uri = image_uris.retrieve( + "scikit-learn", + region=region, + version=scikit_learn_version, + py_version="py3", + instance_type="ml.c4.xlarge", + ) + + expected = expected_uris.framework_uri( + "sagemaker-scikit-learn", + scikit_learn_version, + ACCOUNTS[region], + py_version="py3", + region=region, + ) + assert expected == uri + + +def test_py2_error(scikit_learn_version): + with pytest.raises(ValueError) as e: + image_uris.retrieve( + "scikit-learn", + region="us-west-2", + version=scikit_learn_version, + py_version="py2", + instance_type="ml.c4.xlarge", + ) + + assert "Unsupported Python version: py2." in str(e.value) + + +def test_gpu_error(scikit_learn_version): + with pytest.raises(ValueError) as e: + image_uris.retrieve( + "scikit-learn", + region="us-west-2", + version=scikit_learn_version, + instance_type="ml.p2.xlarge", + ) + + assert "Unsupported processor: gpu." in str(e.value) diff --git a/tests/unit/test_processing.py b/tests/unit/test_processing.py index 860b664df9..8179530bf8 100644 --- a/tests/unit/test_processing.py +++ b/tests/unit/test_processing.py @@ -28,7 +28,7 @@ BUCKET_NAME = "mybucket" REGION = "us-west-2" ROLE = "arn:aws:iam::012345678901:role/SageMakerRole" -ECR_PREFIX = "246618743249.dkr.ecr.us-west-2.amazonaws.com" +ECR_HOSTNAME = "ecr.us-west-2.amazonaws.com" CUSTOM_IMAGE_URI = "012345678901.dkr.ecr.us-west-2.amazonaws.com/my-custom-image-uri" PROCESSING_JOB_DESCRIPTION = { @@ -95,16 +95,18 @@ def sagemaker_session(): return session_mock -@patch("sagemaker.fw_registry.get_ecr_image_uri_prefix", return_value=ECR_PREFIX) +@patch("sagemaker.utils._botocore_resolver") @patch("os.path.exists", return_value=True) @patch("os.path.isfile", return_value=True) def test_sklearn_processor_with_required_parameters( - exists_mock, isfile_mock, ecr_prefix, sagemaker_session + exists_mock, isfile_mock, botocore_resolver, sagemaker_session, scikit_learn_version ): + botocore_resolver.return_value.construct_endpoint.return_value = {"hostname": ECR_HOSTNAME} + processor = SKLearnProcessor( role=ROLE, instance_type="ml.m4.xlarge", - framework_version="0.20.0", + framework_version=scikit_learn_version, instance_count=1, sagemaker_session=sagemaker_session, ) @@ -114,20 +116,24 @@ def test_sklearn_processor_with_required_parameters( expected_args = _get_expected_args(processor._current_job_name) sklearn_image_uri = ( - "246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-scikit-learn:0.20.0-cpu-py3" - ) + "246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-scikit-learn:{}-cpu-py3" + ).format(scikit_learn_version) expected_args["app_specification"]["ImageUri"] = sklearn_image_uri sagemaker_session.process.assert_called_with(**expected_args) -@patch("sagemaker.fw_registry.get_ecr_image_uri_prefix", return_value=ECR_PREFIX) +@patch("sagemaker.utils._botocore_resolver") @patch("os.path.exists", return_value=True) @patch("os.path.isfile", return_value=True) -def test_sklearn_with_all_parameters(exists_mock, isfile_mock, ecr_prefix, sagemaker_session): +def test_sklearn_with_all_parameters( + exists_mock, isfile_mock, botocore_resolver, scikit_learn_version, sagemaker_session +): + botocore_resolver.return_value.construct_endpoint.return_value = {"hostname": ECR_HOSTNAME} + processor = SKLearnProcessor( role=ROLE, - framework_version="0.20.0", + framework_version=scikit_learn_version, instance_type="ml.m4.xlarge", instance_count=1, volume_size_in_gb=100, @@ -176,28 +182,13 @@ def test_sklearn_with_all_parameters(exists_mock, isfile_mock, ecr_prefix, sagem expected_args = _get_expected_args_all_parameters(processor._current_job_name) sklearn_image_uri = ( - "246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-scikit-learn:0.20.0-cpu-py3" - ) + "246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-scikit-learn:{}-cpu-py3" + ).format(scikit_learn_version) expected_args["app_specification"]["ImageUri"] = sklearn_image_uri sagemaker_session.process.assert_called_with(**expected_args) -@patch("os.path.exists", return_value=True) -@patch("os.path.isfile", return_value=True) -def test_sklearn_processor_errors_with_invalid_framework_version( - exists_mock, isfile_mock, sagemaker_session -): - with pytest.raises(ValueError): - SKLearnProcessor( - role=ROLE, - framework_version="0.21.0", - instance_type="ml.m4.xlarge", - instance_count=1, - sagemaker_session=sagemaker_session, - ) - - @patch("os.path.exists", return_value=False) def test_script_processor_errors_with_nonexistent_local_code(exists_mock, sagemaker_session): processor = _get_script_processor(sagemaker_session) diff --git a/tests/unit/test_sklearn.py b/tests/unit/test_sklearn.py index 3723616bca..b39dd22d0a 100644 --- a/tests/unit/test_sklearn.py +++ b/tests/unit/test_sklearn.py @@ -141,7 +141,7 @@ def _create_train_job(version): } -def test_train_image(sagemaker_session, sklearn_version): +def test_train_image(sagemaker_session, scikit_learn_version): container_log_level = '"logging.INFO"' source_dir = "s3://mybucket/source" sklearn = SKLearn( @@ -149,21 +149,17 @@ def test_train_image(sagemaker_session, sklearn_version): role=ROLE, sagemaker_session=sagemaker_session, instance_type=INSTANCE_TYPE, - framework_version=sklearn_version, + framework_version=scikit_learn_version, container_log_level=container_log_level, py_version=PYTHON_VERSION, base_job_name="job", source_dir=source_dir, ) - train_image = sklearn.train_image() - assert ( - train_image - == "246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-scikit-learn:0.20.0-cpu-py3" - ) + assert _get_full_cpu_image_uri(scikit_learn_version) == sklearn.train_image() -def test_create_model(sagemaker_session, sklearn_version): +def test_create_model(sagemaker_session, scikit_learn_version): source_dir = "s3://mybucket/source" sklearn_model = SKLearnModel( @@ -171,15 +167,15 @@ def test_create_model(sagemaker_session, sklearn_version): role=ROLE, sagemaker_session=sagemaker_session, entry_point=SCRIPT_PATH, - framework_version=sklearn_version, + framework_version=scikit_learn_version, ) - image_uri = _get_full_cpu_image_uri(sklearn_version) + image_uri = _get_full_cpu_image_uri(scikit_learn_version) model_values = sklearn_model.prepare_container_def(CPU) assert model_values["Image"] == image_uri @patch("sagemaker.model.FrameworkModel._upload_code") -def test_create_model_with_network_isolation(upload, sagemaker_session, sklearn_version): +def test_create_model_with_network_isolation(upload, sagemaker_session, scikit_learn_version): source_dir = "s3://mybucket/source" repacked_model_data = "s3://mybucket/prefix/model.tar.gz" @@ -189,7 +185,7 @@ def test_create_model_with_network_isolation(upload, sagemaker_session, sklearn_ sagemaker_session=sagemaker_session, entry_point=SCRIPT_PATH, enable_network_isolation=True, - framework_version=sklearn_version, + framework_version=scikit_learn_version, ) sklearn_model.uploaded_code = UploadedCode(s3_prefix=repacked_model_data, script_name="script") sklearn_model.repacked_model_data = repacked_model_data @@ -199,7 +195,7 @@ def test_create_model_with_network_isolation(upload, sagemaker_session, sklearn_ @patch("sagemaker.estimator.name_from_base") -def test_create_model_from_estimator(name_from_base, sagemaker_session, sklearn_version): +def test_create_model_from_estimator(name_from_base, sagemaker_session, scikit_learn_version): container_log_level = '"logging.INFO"' source_dir = "s3://mybucket/source" base_job_name = "job" @@ -209,7 +205,7 @@ def test_create_model_from_estimator(name_from_base, sagemaker_session, sklearn_ role=ROLE, sagemaker_session=sagemaker_session, instance_type=INSTANCE_TYPE, - framework_version=sklearn_version, + framework_version=scikit_learn_version, container_log_level=container_log_level, py_version=PYTHON_VERSION, base_job_name=base_job_name, @@ -224,7 +220,7 @@ def test_create_model_from_estimator(name_from_base, sagemaker_session, sklearn_ model = sklearn.create_model() assert model.sagemaker_session == sagemaker_session - assert model.framework_version == sklearn_version + assert model.framework_version == scikit_learn_version assert model.py_version == sklearn.py_version assert model.entry_point == SCRIPT_PATH assert model.role == ROLE @@ -237,7 +233,7 @@ def test_create_model_from_estimator(name_from_base, sagemaker_session, sklearn_ name_from_base.assert_called_with(base_job_name) -def test_create_model_with_optional_params(sagemaker_session, sklearn_version): +def test_create_model_with_optional_params(sagemaker_session, scikit_learn_version): container_log_level = '"logging.INFO"' source_dir = "s3://mybucket/source" enable_cloudwatch_metrics = "true" @@ -247,7 +243,7 @@ def test_create_model_with_optional_params(sagemaker_session, sklearn_version): sagemaker_session=sagemaker_session, instance_type=INSTANCE_TYPE, container_log_level=container_log_level, - framework_version=sklearn_version, + framework_version=scikit_learn_version, py_version=PYTHON_VERSION, base_job_name="job", source_dir=source_dir, @@ -307,14 +303,14 @@ def test_create_model_with_custom_image(sagemaker_session): @patch("time.strftime", return_value=TIMESTAMP) -def test_sklearn(strftime, sagemaker_session, sklearn_version): +def test_sklearn(strftime, sagemaker_session, scikit_learn_version): sklearn = SKLearn( entry_point=SCRIPT_PATH, role=ROLE, sagemaker_session=sagemaker_session, instance_type=INSTANCE_TYPE, py_version=PYTHON_VERSION, - framework_version=sklearn_version, + framework_version=scikit_learn_version, ) inputs = "s3://mybucket/train" @@ -326,7 +322,7 @@ def test_sklearn(strftime, sagemaker_session, sklearn_version): boto_call_names = [c[0] for c in sagemaker_session.boto_session.method_calls] assert boto_call_names == ["resource"] - expected_train_args = _create_train_job(sklearn_version) + expected_train_args = _create_train_job(scikit_learn_version) expected_train_args["input_config"][0]["DataSource"]["S3DataSource"]["S3Uri"] = inputs expected_train_args["experiment_config"] = EXPERIMENT_CONFIG @@ -348,7 +344,7 @@ def test_sklearn(strftime, sagemaker_session, sklearn_version): "SAGEMAKER_REGION": "us-west-2", "SAGEMAKER_CONTAINER_LOG_LEVEL": "20", }, - "Image": expected_image_base.format(sklearn_version, PYTHON_VERSION), + "Image": expected_image_base.format(scikit_learn_version, PYTHON_VERSION), "ModelDataUrl": "s3://m/m.tar.gz", } == model.prepare_container_def(CPU) @@ -357,7 +353,7 @@ def test_sklearn(strftime, sagemaker_session, sklearn_version): assert isinstance(predictor, SKLearnPredictor) -def test_transform_multiple_values_for_entry_point_issue(sagemaker_session, sklearn_version): +def test_transform_multiple_values_for_entry_point_issue(sagemaker_session, scikit_learn_version): # https://github.com/aws/sagemaker-python-sdk/issues/974 sklearn = SKLearn( entry_point=SCRIPT_PATH, @@ -365,7 +361,7 @@ def test_transform_multiple_values_for_entry_point_issue(sagemaker_session, skle sagemaker_session=sagemaker_session, instance_type=INSTANCE_TYPE, py_version=PYTHON_VERSION, - framework_version=sklearn_version, + framework_version=scikit_learn_version, ) inputs = "s3://mybucket/train" @@ -377,7 +373,7 @@ def test_transform_multiple_values_for_entry_point_issue(sagemaker_session, skle assert transformer is not None -def test_fail_distributed_training(sagemaker_session, sklearn_version): +def test_fail_distributed_training(sagemaker_session, scikit_learn_version): with pytest.raises(AttributeError) as error: SKLearn( entry_point=SCRIPT_PATH, @@ -386,12 +382,12 @@ def test_fail_distributed_training(sagemaker_session, sklearn_version): instance_count=DIST_INSTANCE_COUNT, instance_type=INSTANCE_TYPE, py_version=PYTHON_VERSION, - framework_version=sklearn_version, + framework_version=scikit_learn_version, ) assert "Scikit-Learn does not support distributed training." in str(error) -def test_fail_GPU_training(sagemaker_session, sklearn_version): +def test_fail_gpu_training(sagemaker_session, scikit_learn_version): with pytest.raises(ValueError) as error: SKLearn( entry_point=SCRIPT_PATH, @@ -399,50 +395,26 @@ def test_fail_GPU_training(sagemaker_session, sklearn_version): sagemaker_session=sagemaker_session, instance_type=GPU_INSTANCE_TYPE, py_version=PYTHON_VERSION, - framework_version=sklearn_version, + framework_version=scikit_learn_version, ) assert "GPU training in not supported for Scikit-Learn." in str(error) -def test_model(sagemaker_session, sklearn_version): +def test_model(sagemaker_session, scikit_learn_version): model = SKLearnModel( "s3://some/data.tar.gz", role=ROLE, entry_point=SCRIPT_PATH, - framework_version=sklearn_version, + framework_version=scikit_learn_version, sagemaker_session=sagemaker_session, ) predictor = model.deploy(1, CPU) assert isinstance(predictor, SKLearnPredictor) -def test_train_image_default(sagemaker_session, sklearn_version): - sklearn = SKLearn( - entry_point=SCRIPT_PATH, - framework_version=sklearn_version, - py_version=PYTHON_VERSION, - role=ROLE, - sagemaker_session=sagemaker_session, - instance_type=INSTANCE_TYPE, - ) - - assert _get_full_cpu_image_uri(sklearn_version) in sklearn.train_image() - - -def test_train_image_cpu_instances(sagemaker_session, sklearn_version): - sklearn = _sklearn_estimator(sagemaker_session, sklearn_version, instance_type="ml.c2.2xlarge") - assert sklearn.train_image() == _get_full_cpu_image_uri(sklearn_version) - - sklearn = _sklearn_estimator(sagemaker_session, sklearn_version, instance_type="ml.c4.2xlarge") - assert sklearn.train_image() == _get_full_cpu_image_uri(sklearn_version) - - sklearn = _sklearn_estimator(sagemaker_session, sklearn_version, instance_type="ml.m16") - assert sklearn.train_image() == _get_full_cpu_image_uri(sklearn_version) - - -def test_attach(sagemaker_session, sklearn_version): +def test_attach(sagemaker_session, scikit_learn_version): training_image = "1.dkr.ecr.us-west-2.amazonaws.com/sagemaker-scikit-learn:{}-cpu-{}".format( - sklearn_version, PYTHON_VERSION + scikit_learn_version, PYTHON_VERSION ) returned_job_description = { "AlgorithmSpecification": {"TrainingInputMode": "File", "TrainingImage": training_image}, @@ -477,7 +449,7 @@ def test_attach(sagemaker_session, sklearn_version): assert estimator._current_job_name == "neo" assert estimator.latest_training_job.job_name == "neo" assert estimator.py_version == PYTHON_VERSION - assert estimator.framework_version == sklearn_version + assert estimator.framework_version == scikit_learn_version assert estimator.role == "arn:aws:iam::366:role/SageMakerRole" assert estimator.instance_count == 1 assert estimator.max_run == 24 * 60 * 60 @@ -563,7 +535,7 @@ def test_attach_custom_image(sagemaker_session): assert estimator.train_image() == training_image -def test_estimator_py2_raises(sagemaker_session, sklearn_version): +def test_estimator_py2_raises(sagemaker_session, scikit_learn_version): with pytest.raises(AttributeError): SKLearn( entry_point=SCRIPT_PATH, @@ -571,12 +543,12 @@ def test_estimator_py2_raises(sagemaker_session, sklearn_version): sagemaker_session=sagemaker_session, instance_count=INSTANCE_COUNT, instance_type=INSTANCE_TYPE, - framework_version=sklearn_version, + framework_version=scikit_learn_version, py_version="py2", ) -def test_model_py2_raises(sagemaker_session, sklearn_version): +def test_model_py2_raises(sagemaker_session, scikit_learn_version): source_dir = "s3://mybucket/source" with pytest.raises(AttributeError): @@ -585,14 +557,14 @@ def test_model_py2_raises(sagemaker_session, sklearn_version): role=ROLE, entry_point=SCRIPT_PATH, sagemaker_session=sagemaker_session, - framework_version=sklearn_version, + framework_version=scikit_learn_version, py_version="py2", ) -def test_custom_image_estimator_deploy(sagemaker_session, sklearn_version): +def test_custom_image_estimator_deploy(sagemaker_session, scikit_learn_version): custom_image = "mycustomimage:latest" - sklearn = _sklearn_estimator(sagemaker_session, sklearn_version) + sklearn = _sklearn_estimator(sagemaker_session, scikit_learn_version) sklearn.fit(inputs="s3://mybucket/train", job_name="new_name") model = sklearn.create_model(image_uri=custom_image) assert model.image_uri == custom_image From d7a3a61b309630a37f9c5724270ed14372b948cd Mon Sep 17 00:00:00 2001 From: Lauren Yu <6631887+laurenyu@users.noreply.github.com> Date: Mon, 20 Jul 2020 12:46:24 -0700 Subject: [PATCH 2/5] update sklearn training script for 0.23 --- tests/data/sklearn_mnist/mnist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/data/sklearn_mnist/mnist.py b/tests/data/sklearn_mnist/mnist.py index 1faf0aa14d..7b8014269b 100644 --- a/tests/data/sklearn_mnist/mnist.py +++ b/tests/data/sklearn_mnist/mnist.py @@ -16,8 +16,8 @@ import numpy as np import os +import joblib from sklearn import svm -from sklearn.externals import joblib def preprocess_mnist(raw, withlabel, ndim, scale, image_dtype, label_dtype, rgb_format): From 1b38cbce9acd98dcdc5c7b6e94efbc49554111a7 Mon Sep 17 00:00:00 2001 From: Lauren Yu <6631887+laurenyu@users.noreply.github.com> Date: Mon, 20 Jul 2020 13:25:52 -0700 Subject: [PATCH 3/5] update processing integ tests --- tests/integ/test_processing.py | 21 ++++++++++++++------- tests/integ/test_sklearn.py | 2 -- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/tests/integ/test_processing.py b/tests/integ/test_processing.py index 29d3e49fb6..28d1a1784c 100644 --- a/tests/integ/test_processing.py +++ b/tests/integ/test_processing.py @@ -16,9 +16,9 @@ import pytest from botocore.config import Config -from sagemaker import Session -from sagemaker.fw_registry import default_framework_uri +from sagemaker import image_uris, Session +from sagemaker.network import NetworkConfig from sagemaker.processing import ( ProcessingInput, ProcessingOutput, @@ -27,7 +27,6 @@ ProcessingJob, ) from sagemaker.sklearn.processing import SKLearnProcessor -from sagemaker.network import NetworkConfig from tests.integ import DATA_DIR from tests.integ.kms_utils import get_or_create_kms_key @@ -59,10 +58,18 @@ def sagemaker_session_with_custom_bucket( @pytest.fixture(scope="module") -def image_uri(sagemaker_session): - image_tag = "{}-{}-{}".format("0.20.0", "cpu", "py3") - return default_framework_uri( - "scikit-learn", sagemaker_session.boto_session.region_name, image_tag +def image_uri( + scikit_learn_latest_version, + scikit_learn_latest_py_version, + cpu_instance_type, + sagemaker_session, +): + return image_uris.retrieve( + "scikit-learn", + sagemaker_session.boto_region_name, + version=scikit_learn_latest_version, + py_version=scikit_learn_latest_py_version, + instance_type=cpu_instance_type, ) diff --git a/tests/integ/test_sklearn.py b/tests/integ/test_sklearn.py index 870c5f9402..be221ea4fe 100644 --- a/tests/integ/test_sklearn.py +++ b/tests/integ/test_sklearn.py @@ -74,7 +74,6 @@ def test_training_with_additional_hyperparameters( job_name = unique_name_from_base("test-sklearn-hp") sklearn.fit({"train": train_input, "test": test_input}, job_name=job_name) - return sklearn.latest_training_job.name def test_training_with_network_isolation( @@ -110,7 +109,6 @@ def test_training_with_network_isolation( assert sagemaker_session.sagemaker_client.describe_training_job(TrainingJobName=job_name)[ "EnableNetworkIsolation" ] - return sklearn.latest_training_job.name @pytest.mark.canary_quick From b967e494a7d3052e4a830dbdf8f35ee5b6356616 Mon Sep 17 00:00:00 2001 From: Lauren Yu <6631887+laurenyu@users.noreply.github.com> Date: Mon, 20 Jul 2020 15:17:10 -0700 Subject: [PATCH 4/5] change framework name to 'sklearn' --- .../{scikit-learn.json => sklearn.json} | 0 src/sagemaker/sklearn/defaults.py | 2 +- src/sagemaker/sklearn/estimator.py | 2 +- tests/conftest.py | 3 +- tests/integ/test_airflow_config.py | 9 +-- tests/integ/test_git.py | 14 ++-- tests/integ/test_processing.py | 31 ++++---- tests/integ/test_sklearn.py | 50 +++++-------- .../unit/sagemaker/image_uris/test_sklearn.py | 14 ++-- tests/unit/test_fw_registry.py | 3 +- tests/unit/test_processing.py | 12 ++-- tests/unit/test_sklearn.py | 72 +++++++++---------- 12 files changed, 88 insertions(+), 124 deletions(-) rename src/sagemaker/image_uri_config/{scikit-learn.json => sklearn.json} (100%) diff --git a/src/sagemaker/image_uri_config/scikit-learn.json b/src/sagemaker/image_uri_config/sklearn.json similarity index 100% rename from src/sagemaker/image_uri_config/scikit-learn.json rename to src/sagemaker/image_uri_config/sklearn.json diff --git a/src/sagemaker/sklearn/defaults.py b/src/sagemaker/sklearn/defaults.py index 1d58981fb6..d9f41b029f 100644 --- a/src/sagemaker/sklearn/defaults.py +++ b/src/sagemaker/sklearn/defaults.py @@ -13,4 +13,4 @@ """Placeholder docstring""" from __future__ import absolute_import -SKLEARN_NAME = "scikit-learn" +SKLEARN_NAME = "sklearn" diff --git a/src/sagemaker/sklearn/estimator.py b/src/sagemaker/sklearn/estimator.py index 1cda0e3b85..15980b325a 100644 --- a/src/sagemaker/sklearn/estimator.py +++ b/src/sagemaker/sklearn/estimator.py @@ -246,7 +246,7 @@ class constructor init_params["image_uri"] = image_uri return init_params - if framework and framework != cls.__framework_name__: + if framework and framework != "scikit-learn": raise ValueError( "Training job: {} didn't use image for requested framework".format( job_details["TrainingJobName"] diff --git a/tests/conftest.py b/tests/conftest.py index a7a8597d23..3d8e586e9c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -285,9 +285,8 @@ def pytest_generate_tests(metafunc): def _generate_all_framework_version_fixtures(metafunc): - for fw in ("chainer", "mxnet", "pytorch", "scikit-learn", "tensorflow", "xgboost"): + for fw in ("chainer", "mxnet", "pytorch", "sklearn", "tensorflow", "xgboost"): config = image_uris.config_for_framework(fw) - fw = fw.replace("-", "_") # for fixture names if "scope" in config: _parametrize_framework_version_fixtures(metafunc, fw, config) else: diff --git a/tests/integ/test_airflow_config.py b/tests/integ/test_airflow_config.py index fc0d07a2a4..155c03ea66 100644 --- a/tests/integ/test_airflow_config.py +++ b/tests/integ/test_airflow_config.py @@ -478,10 +478,7 @@ def test_mxnet_airflow_config_uploads_data_source_to_s3( @pytest.mark.canary_quick def test_sklearn_airflow_config_uploads_data_source_to_s3( - sagemaker_session, - cpu_instance_type, - scikit_learn_latest_version, - scikit_learn_latest_py_version, + sagemaker_session, cpu_instance_type, sklearn_latest_version, sklearn_latest_py_version, ): with timeout(seconds=AIRFLOW_CONFIG_TIMEOUT_IN_SECONDS): script_path = os.path.join(DATA_DIR, "sklearn_mnist", "mnist.py") @@ -491,8 +488,8 @@ def test_sklearn_airflow_config_uploads_data_source_to_s3( entry_point=script_path, role=ROLE, instance_type=cpu_instance_type, - framework_version=scikit_learn_latest_version, - py_version=scikit_learn_latest_py_version, + framework_version=sklearn_latest_version, + py_version=sklearn_latest_py_version, sagemaker_session=sagemaker_session, hyperparameters={"epochs": 1}, ) diff --git a/tests/integ/test_git.py b/tests/integ/test_git.py index cb6e388043..e2bcdf13b3 100644 --- a/tests/integ/test_git.py +++ b/tests/integ/test_git.py @@ -138,7 +138,7 @@ def test_private_github( @pytest.mark.local_mode @pytest.mark.skip("needs a secure authentication approach") def test_private_github_with_2fa( - sagemaker_local_session, scikit_learn_latest_version, scikit_learn_latest_py_version + sagemaker_local_session, sklearn_latest_version, sklearn_latest_py_version ): script_path = "mnist.py" data_path = os.path.join(DATA_DIR, "sklearn_mnist") @@ -155,11 +155,11 @@ def test_private_github_with_2fa( entry_point=script_path, role="SageMakerRole", source_dir=source_dir, - py_version=scikit_learn_latest_py_version, + py_version=sklearn_latest_py_version, instance_count=1, instance_type="local", sagemaker_session=sagemaker_local_session, - framework_version=scikit_learn_latest_version, + framework_version=sklearn_latest_version, hyperparameters={"epochs": 1}, git_config=git_config, ) @@ -178,7 +178,7 @@ def test_private_github_with_2fa( model_data, "SageMakerRole", entry_point=script_path, - framework_version=scikit_learn_latest_version, + framework_version=sklearn_latest_version, source_dir=source_dir, sagemaker_session=sagemaker_local_session, git_config=git_config, @@ -194,7 +194,7 @@ def test_private_github_with_2fa( @pytest.mark.local_mode def test_github_with_ssh_passphrase_not_configured( - sagemaker_local_session, scikit_learn_latest_version, scikit_learn_latest_py_version + sagemaker_local_session, sklearn_latest_version, sklearn_latest_py_version ): script_path = "mnist.py" data_path = os.path.join(DATA_DIR, "sklearn_mnist") @@ -212,8 +212,8 @@ def test_github_with_ssh_passphrase_not_configured( instance_count=1, instance_type="local", sagemaker_session=sagemaker_local_session, - framework_version=scikit_learn_latest_version, - py_version=scikit_learn_latest_py_version, + framework_version=sklearn_latest_version, + py_version=sklearn_latest_py_version, hyperparameters={"epochs": 1}, git_config=git_config, ) diff --git a/tests/integ/test_processing.py b/tests/integ/test_processing.py index 28d1a1784c..4cdd4acc87 100644 --- a/tests/integ/test_processing.py +++ b/tests/integ/test_processing.py @@ -59,16 +59,13 @@ def sagemaker_session_with_custom_bucket( @pytest.fixture(scope="module") def image_uri( - scikit_learn_latest_version, - scikit_learn_latest_py_version, - cpu_instance_type, - sagemaker_session, + sklearn_latest_version, sklearn_latest_py_version, cpu_instance_type, sagemaker_session, ): return image_uris.retrieve( "scikit-learn", sagemaker_session.boto_region_name, - version=scikit_learn_latest_version, - py_version=scikit_learn_latest_py_version, + version=sklearn_latest_version, + py_version=sklearn_latest_py_version, instance_type=cpu_instance_type, ) @@ -97,12 +94,12 @@ def output_kms_key(sagemaker_session): ) -def test_sklearn(sagemaker_session, scikit_learn_latest_version, cpu_instance_type): +def test_sklearn(sagemaker_session, sklearn_latest_version, cpu_instance_type): script_path = os.path.join(DATA_DIR, "dummy_script.py") input_file_path = os.path.join(DATA_DIR, "dummy_input.txt") sklearn_processor = SKLearnProcessor( - framework_version=scikit_learn_latest_version, + framework_version=sklearn_latest_version, role=ROLE, instance_type=cpu_instance_type, instance_count=1, @@ -136,12 +133,12 @@ def test_sklearn(sagemaker_session, scikit_learn_latest_version, cpu_instance_ty @pytest.mark.canary_quick def test_sklearn_with_customizations( - sagemaker_session, image_uri, scikit_learn_latest_version, cpu_instance_type, output_kms_key + sagemaker_session, image_uri, sklearn_latest_version, cpu_instance_type, output_kms_key ): input_file_path = os.path.join(DATA_DIR, "dummy_input.txt") sklearn_processor = SKLearnProcessor( - framework_version=scikit_learn_latest_version, + framework_version=sklearn_latest_version, role=ROLE, command=["python3"], instance_type=cpu_instance_type, @@ -218,14 +215,14 @@ def test_sklearn_with_custom_default_bucket( sagemaker_session_with_custom_bucket, custom_bucket_name, image_uri, - scikit_learn_latest_version, + sklearn_latest_version, cpu_instance_type, output_kms_key, ): input_file_path = os.path.join(DATA_DIR, "dummy_input.txt") sklearn_processor = SKLearnProcessor( - framework_version=scikit_learn_latest_version, + framework_version=sklearn_latest_version, role=ROLE, command=["python3"], instance_type=cpu_instance_type, @@ -301,10 +298,10 @@ def test_sklearn_with_custom_default_bucket( def test_sklearn_with_no_inputs_or_outputs( - sagemaker_session, image_uri, scikit_learn_latest_version, cpu_instance_type + sagemaker_session, image_uri, sklearn_latest_version, cpu_instance_type ): sklearn_processor = SKLearnProcessor( - framework_version=scikit_learn_latest_version, + framework_version=sklearn_latest_version, role=ROLE, command=["python3"], instance_type=cpu_instance_type, @@ -653,14 +650,12 @@ def test_processor_with_custom_bucket( assert job_description["StoppingCondition"] == {"MaxRuntimeInSeconds": 3600} -def test_sklearn_with_network_config( - sagemaker_session, scikit_learn_latest_version, cpu_instance_type -): +def test_sklearn_with_network_config(sagemaker_session, sklearn_latest_version, cpu_instance_type): script_path = os.path.join(DATA_DIR, "dummy_script.py") input_file_path = os.path.join(DATA_DIR, "dummy_input.txt") sklearn_processor = SKLearnProcessor( - framework_version=scikit_learn_latest_version, + framework_version=sklearn_latest_version, role=ROLE, instance_type=cpu_instance_type, instance_count=1, diff --git a/tests/integ/test_sklearn.py b/tests/integ/test_sklearn.py index be221ea4fe..a98201fd19 100644 --- a/tests/integ/test_sklearn.py +++ b/tests/integ/test_sklearn.py @@ -31,25 +31,16 @@ "This test should be fixed. Details in https://github.com/aws/sagemaker-python-sdk/pull/968" ) def sklearn_training_job( - sagemaker_session, - scikit_learn_latest_version, - scikit_learn_latest_py_version, - cpu_instance_type, + sagemaker_session, sklearn_latest_version, sklearn_latest_py_version, cpu_instance_type, ): return _run_mnist_training_job( - sagemaker_session, - cpu_instance_type, - scikit_learn_latest_version, - scikit_learn_latest_py_version, + sagemaker_session, cpu_instance_type, sklearn_latest_version, sklearn_latest_py_version, ) sagemaker_session.boto_region_name def test_training_with_additional_hyperparameters( - sagemaker_session, - scikit_learn_latest_version, - scikit_learn_latest_py_version, - cpu_instance_type, + sagemaker_session, sklearn_latest_version, sklearn_latest_py_version, cpu_instance_type, ): with timeout(minutes=TRAINING_DEFAULT_TIMEOUT_MINUTES): script_path = os.path.join(DATA_DIR, "sklearn_mnist", "mnist.py") @@ -59,8 +50,8 @@ def test_training_with_additional_hyperparameters( entry_point=script_path, role="SageMakerRole", instance_type=cpu_instance_type, - framework_version=scikit_learn_latest_version, - py_version=scikit_learn_latest_py_version, + framework_version=sklearn_latest_version, + py_version=sklearn_latest_py_version, sagemaker_session=sagemaker_session, hyperparameters={"epochs": 1}, ) @@ -77,10 +68,7 @@ def test_training_with_additional_hyperparameters( def test_training_with_network_isolation( - sagemaker_session, - scikit_learn_latest_version, - scikit_learn_latest_py_version, - cpu_instance_type, + sagemaker_session, sklearn_latest_version, sklearn_latest_py_version, cpu_instance_type, ): with timeout(minutes=TRAINING_DEFAULT_TIMEOUT_MINUTES): script_path = os.path.join(DATA_DIR, "sklearn_mnist", "mnist.py") @@ -90,8 +78,8 @@ def test_training_with_network_isolation( entry_point=script_path, role="SageMakerRole", instance_type=cpu_instance_type, - framework_version=scikit_learn_latest_version, - py_version=scikit_learn_latest_py_version, + framework_version=sklearn_latest_version, + py_version=sklearn_latest_py_version, sagemaker_session=sagemaker_session, hyperparameters={"epochs": 1}, enable_network_isolation=True, @@ -133,8 +121,8 @@ def test_deploy_model( sklearn_training_job, sagemaker_session, cpu_instance_type, - scikit_learn_latest_version, - scikit_learn_latest_py_version, + sklearn_latest_version, + sklearn_latest_py_version, ): endpoint_name = "test-sklearn-deploy-model-{}".format(sagemaker_timestamp()) with timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session): @@ -147,7 +135,7 @@ def test_deploy_model( model_data, "SageMakerRole", entry_point=script_path, - framework_version=scikit_learn_latest_version, + framework_version=sklearn_latest_version, sagemaker_session=sagemaker_session, ) predictor = model.deploy(1, cpu_instance_type, endpoint_name=endpoint_name) @@ -159,10 +147,7 @@ def test_deploy_model( "This test should be fixed. Details in https://github.com/aws/sagemaker-python-sdk/pull/968" ) def test_async_fit( - sagemaker_session, - cpu_instance_type, - scikit_learn_latest_version, - scikit_learn_latest_py_version, + sagemaker_session, cpu_instance_type, sklearn_latest_version, sklearn_latest_py_version, ): endpoint_name = "test-sklearn-attach-deploy-{}".format(sagemaker_timestamp()) @@ -170,7 +155,7 @@ def test_async_fit( training_job_name = _run_mnist_training_job( sagemaker_session, cpu_instance_type, - sklearn_version=scikit_learn_latest_version, + sklearn_version=sklearn_latest_version, wait=False, ) @@ -187,10 +172,7 @@ def test_async_fit( def test_failed_training_job( - sagemaker_session, - scikit_learn_latest_version, - scikit_learn_latest_py_version, - cpu_instance_type, + sagemaker_session, sklearn_latest_version, sklearn_latest_py_version, cpu_instance_type, ): with timeout(minutes=TRAINING_DEFAULT_TIMEOUT_MINUTES): script_path = os.path.join(DATA_DIR, "sklearn_mnist", "failure_script.py") @@ -199,8 +181,8 @@ def test_failed_training_job( sklearn = SKLearn( entry_point=script_path, role="SageMakerRole", - framework_version=scikit_learn_latest_version, - py_version=scikit_learn_latest_py_version, + framework_version=sklearn_latest_version, + py_version=sklearn_latest_py_version, instance_count=1, instance_type=cpu_instance_type, sagemaker_session=sagemaker_session, diff --git a/tests/unit/sagemaker/image_uris/test_sklearn.py b/tests/unit/sagemaker/image_uris/test_sklearn.py index e40dd01706..b0a7654da6 100644 --- a/tests/unit/sagemaker/image_uris/test_sklearn.py +++ b/tests/unit/sagemaker/image_uris/test_sklearn.py @@ -43,19 +43,19 @@ } -def test_valid_uris(scikit_learn_version): +def test_valid_uris(sklearn_version): for region in regions.regions(): uri = image_uris.retrieve( "scikit-learn", region=region, - version=scikit_learn_version, + version=sklearn_version, py_version="py3", instance_type="ml.c4.xlarge", ) expected = expected_uris.framework_uri( "sagemaker-scikit-learn", - scikit_learn_version, + sklearn_version, ACCOUNTS[region], py_version="py3", region=region, @@ -63,12 +63,12 @@ def test_valid_uris(scikit_learn_version): assert expected == uri -def test_py2_error(scikit_learn_version): +def test_py2_error(sklearn_version): with pytest.raises(ValueError) as e: image_uris.retrieve( "scikit-learn", region="us-west-2", - version=scikit_learn_version, + version=sklearn_version, py_version="py2", instance_type="ml.c4.xlarge", ) @@ -76,12 +76,12 @@ def test_py2_error(scikit_learn_version): assert "Unsupported Python version: py2." in str(e.value) -def test_gpu_error(scikit_learn_version): +def test_gpu_error(sklearn_version): with pytest.raises(ValueError) as e: image_uris.retrieve( "scikit-learn", region="us-west-2", - version=scikit_learn_version, + version=sklearn_version, instance_type="ml.p2.xlarge", ) diff --git a/tests/unit/test_fw_registry.py b/tests/unit/test_fw_registry.py index 8a27fc513e..c5efdcde41 100644 --- a/tests/unit/test_fw_registry.py +++ b/tests/unit/test_fw_registry.py @@ -15,10 +15,9 @@ import pytest from sagemaker.fw_registry import registry, default_framework_uri -from sagemaker.sklearn import SKLearn -scikit_learn_framework_name = SKLearn.__framework_name__ +scikit_learn_framework_name = "scikit-learn" def test_registry_sparkml_serving(): diff --git a/tests/unit/test_processing.py b/tests/unit/test_processing.py index 8179530bf8..b0c50ed937 100644 --- a/tests/unit/test_processing.py +++ b/tests/unit/test_processing.py @@ -99,14 +99,14 @@ def sagemaker_session(): @patch("os.path.exists", return_value=True) @patch("os.path.isfile", return_value=True) def test_sklearn_processor_with_required_parameters( - exists_mock, isfile_mock, botocore_resolver, sagemaker_session, scikit_learn_version + exists_mock, isfile_mock, botocore_resolver, sagemaker_session, sklearn_version ): botocore_resolver.return_value.construct_endpoint.return_value = {"hostname": ECR_HOSTNAME} processor = SKLearnProcessor( role=ROLE, instance_type="ml.m4.xlarge", - framework_version=scikit_learn_version, + framework_version=sklearn_version, instance_count=1, sagemaker_session=sagemaker_session, ) @@ -117,7 +117,7 @@ def test_sklearn_processor_with_required_parameters( sklearn_image_uri = ( "246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-scikit-learn:{}-cpu-py3" - ).format(scikit_learn_version) + ).format(sklearn_version) expected_args["app_specification"]["ImageUri"] = sklearn_image_uri sagemaker_session.process.assert_called_with(**expected_args) @@ -127,13 +127,13 @@ def test_sklearn_processor_with_required_parameters( @patch("os.path.exists", return_value=True) @patch("os.path.isfile", return_value=True) def test_sklearn_with_all_parameters( - exists_mock, isfile_mock, botocore_resolver, scikit_learn_version, sagemaker_session + exists_mock, isfile_mock, botocore_resolver, sklearn_version, sagemaker_session ): botocore_resolver.return_value.construct_endpoint.return_value = {"hostname": ECR_HOSTNAME} processor = SKLearnProcessor( role=ROLE, - framework_version=scikit_learn_version, + framework_version=sklearn_version, instance_type="ml.m4.xlarge", instance_count=1, volume_size_in_gb=100, @@ -183,7 +183,7 @@ def test_sklearn_with_all_parameters( expected_args = _get_expected_args_all_parameters(processor._current_job_name) sklearn_image_uri = ( "246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-scikit-learn:{}-cpu-py3" - ).format(scikit_learn_version) + ).format(sklearn_version) expected_args["app_specification"]["ImageUri"] = sklearn_image_uri sagemaker_session.process.assert_called_with(**expected_args) diff --git a/tests/unit/test_sklearn.py b/tests/unit/test_sklearn.py index b39dd22d0a..57925c70d7 100644 --- a/tests/unit/test_sklearn.py +++ b/tests/unit/test_sklearn.py @@ -141,7 +141,7 @@ def _create_train_job(version): } -def test_train_image(sagemaker_session, scikit_learn_version): +def test_train_image(sagemaker_session, sklearn_version): container_log_level = '"logging.INFO"' source_dir = "s3://mybucket/source" sklearn = SKLearn( @@ -149,17 +149,17 @@ def test_train_image(sagemaker_session, scikit_learn_version): role=ROLE, sagemaker_session=sagemaker_session, instance_type=INSTANCE_TYPE, - framework_version=scikit_learn_version, + framework_version=sklearn_version, container_log_level=container_log_level, py_version=PYTHON_VERSION, base_job_name="job", source_dir=source_dir, ) - assert _get_full_cpu_image_uri(scikit_learn_version) == sklearn.train_image() + assert _get_full_cpu_image_uri(sklearn_version) == sklearn.train_image() -def test_create_model(sagemaker_session, scikit_learn_version): +def test_create_model(sagemaker_session, sklearn_version): source_dir = "s3://mybucket/source" sklearn_model = SKLearnModel( @@ -167,15 +167,15 @@ def test_create_model(sagemaker_session, scikit_learn_version): role=ROLE, sagemaker_session=sagemaker_session, entry_point=SCRIPT_PATH, - framework_version=scikit_learn_version, + framework_version=sklearn_version, ) - image_uri = _get_full_cpu_image_uri(scikit_learn_version) + image_uri = _get_full_cpu_image_uri(sklearn_version) model_values = sklearn_model.prepare_container_def(CPU) assert model_values["Image"] == image_uri @patch("sagemaker.model.FrameworkModel._upload_code") -def test_create_model_with_network_isolation(upload, sagemaker_session, scikit_learn_version): +def test_create_model_with_network_isolation(upload, sagemaker_session, sklearn_version): source_dir = "s3://mybucket/source" repacked_model_data = "s3://mybucket/prefix/model.tar.gz" @@ -185,7 +185,7 @@ def test_create_model_with_network_isolation(upload, sagemaker_session, scikit_l sagemaker_session=sagemaker_session, entry_point=SCRIPT_PATH, enable_network_isolation=True, - framework_version=scikit_learn_version, + framework_version=sklearn_version, ) sklearn_model.uploaded_code = UploadedCode(s3_prefix=repacked_model_data, script_name="script") sklearn_model.repacked_model_data = repacked_model_data @@ -195,7 +195,7 @@ def test_create_model_with_network_isolation(upload, sagemaker_session, scikit_l @patch("sagemaker.estimator.name_from_base") -def test_create_model_from_estimator(name_from_base, sagemaker_session, scikit_learn_version): +def test_create_model_from_estimator(name_from_base, sagemaker_session, sklearn_version): container_log_level = '"logging.INFO"' source_dir = "s3://mybucket/source" base_job_name = "job" @@ -205,7 +205,7 @@ def test_create_model_from_estimator(name_from_base, sagemaker_session, scikit_l role=ROLE, sagemaker_session=sagemaker_session, instance_type=INSTANCE_TYPE, - framework_version=scikit_learn_version, + framework_version=sklearn_version, container_log_level=container_log_level, py_version=PYTHON_VERSION, base_job_name=base_job_name, @@ -220,7 +220,7 @@ def test_create_model_from_estimator(name_from_base, sagemaker_session, scikit_l model = sklearn.create_model() assert model.sagemaker_session == sagemaker_session - assert model.framework_version == scikit_learn_version + assert model.framework_version == sklearn_version assert model.py_version == sklearn.py_version assert model.entry_point == SCRIPT_PATH assert model.role == ROLE @@ -233,7 +233,7 @@ def test_create_model_from_estimator(name_from_base, sagemaker_session, scikit_l name_from_base.assert_called_with(base_job_name) -def test_create_model_with_optional_params(sagemaker_session, scikit_learn_version): +def test_create_model_with_optional_params(sagemaker_session, sklearn_version): container_log_level = '"logging.INFO"' source_dir = "s3://mybucket/source" enable_cloudwatch_metrics = "true" @@ -243,7 +243,7 @@ def test_create_model_with_optional_params(sagemaker_session, scikit_learn_versi sagemaker_session=sagemaker_session, instance_type=INSTANCE_TYPE, container_log_level=container_log_level, - framework_version=scikit_learn_version, + framework_version=sklearn_version, py_version=PYTHON_VERSION, base_job_name="job", source_dir=source_dir, @@ -303,14 +303,14 @@ def test_create_model_with_custom_image(sagemaker_session): @patch("time.strftime", return_value=TIMESTAMP) -def test_sklearn(strftime, sagemaker_session, scikit_learn_version): +def test_sklearn(strftime, sagemaker_session, sklearn_version): sklearn = SKLearn( entry_point=SCRIPT_PATH, role=ROLE, sagemaker_session=sagemaker_session, instance_type=INSTANCE_TYPE, py_version=PYTHON_VERSION, - framework_version=scikit_learn_version, + framework_version=sklearn_version, ) inputs = "s3://mybucket/train" @@ -322,7 +322,7 @@ def test_sklearn(strftime, sagemaker_session, scikit_learn_version): boto_call_names = [c[0] for c in sagemaker_session.boto_session.method_calls] assert boto_call_names == ["resource"] - expected_train_args = _create_train_job(scikit_learn_version) + expected_train_args = _create_train_job(sklearn_version) expected_train_args["input_config"][0]["DataSource"]["S3DataSource"]["S3Uri"] = inputs expected_train_args["experiment_config"] = EXPERIMENT_CONFIG @@ -344,7 +344,7 @@ def test_sklearn(strftime, sagemaker_session, scikit_learn_version): "SAGEMAKER_REGION": "us-west-2", "SAGEMAKER_CONTAINER_LOG_LEVEL": "20", }, - "Image": expected_image_base.format(scikit_learn_version, PYTHON_VERSION), + "Image": expected_image_base.format(sklearn_version, PYTHON_VERSION), "ModelDataUrl": "s3://m/m.tar.gz", } == model.prepare_container_def(CPU) @@ -353,7 +353,7 @@ def test_sklearn(strftime, sagemaker_session, scikit_learn_version): assert isinstance(predictor, SKLearnPredictor) -def test_transform_multiple_values_for_entry_point_issue(sagemaker_session, scikit_learn_version): +def test_transform_multiple_values_for_entry_point_issue(sagemaker_session, sklearn_version): # https://github.com/aws/sagemaker-python-sdk/issues/974 sklearn = SKLearn( entry_point=SCRIPT_PATH, @@ -361,7 +361,7 @@ def test_transform_multiple_values_for_entry_point_issue(sagemaker_session, scik sagemaker_session=sagemaker_session, instance_type=INSTANCE_TYPE, py_version=PYTHON_VERSION, - framework_version=scikit_learn_version, + framework_version=sklearn_version, ) inputs = "s3://mybucket/train" @@ -373,7 +373,7 @@ def test_transform_multiple_values_for_entry_point_issue(sagemaker_session, scik assert transformer is not None -def test_fail_distributed_training(sagemaker_session, scikit_learn_version): +def test_fail_distributed_training(sagemaker_session, sklearn_version): with pytest.raises(AttributeError) as error: SKLearn( entry_point=SCRIPT_PATH, @@ -382,12 +382,12 @@ def test_fail_distributed_training(sagemaker_session, scikit_learn_version): instance_count=DIST_INSTANCE_COUNT, instance_type=INSTANCE_TYPE, py_version=PYTHON_VERSION, - framework_version=scikit_learn_version, + framework_version=sklearn_version, ) assert "Scikit-Learn does not support distributed training." in str(error) -def test_fail_gpu_training(sagemaker_session, scikit_learn_version): +def test_fail_gpu_training(sagemaker_session, sklearn_version): with pytest.raises(ValueError) as error: SKLearn( entry_point=SCRIPT_PATH, @@ -395,26 +395,26 @@ def test_fail_gpu_training(sagemaker_session, scikit_learn_version): sagemaker_session=sagemaker_session, instance_type=GPU_INSTANCE_TYPE, py_version=PYTHON_VERSION, - framework_version=scikit_learn_version, + framework_version=sklearn_version, ) assert "GPU training in not supported for Scikit-Learn." in str(error) -def test_model(sagemaker_session, scikit_learn_version): +def test_model(sagemaker_session, sklearn_version): model = SKLearnModel( "s3://some/data.tar.gz", role=ROLE, entry_point=SCRIPT_PATH, - framework_version=scikit_learn_version, + framework_version=sklearn_version, sagemaker_session=sagemaker_session, ) predictor = model.deploy(1, CPU) assert isinstance(predictor, SKLearnPredictor) -def test_attach(sagemaker_session, scikit_learn_version): +def test_attach(sagemaker_session, sklearn_version): training_image = "1.dkr.ecr.us-west-2.amazonaws.com/sagemaker-scikit-learn:{}-cpu-{}".format( - scikit_learn_version, PYTHON_VERSION + sklearn_version, PYTHON_VERSION ) returned_job_description = { "AlgorithmSpecification": {"TrainingInputMode": "File", "TrainingImage": training_image}, @@ -449,7 +449,7 @@ def test_attach(sagemaker_session, scikit_learn_version): assert estimator._current_job_name == "neo" assert estimator.latest_training_job.job_name == "neo" assert estimator.py_version == PYTHON_VERSION - assert estimator.framework_version == scikit_learn_version + assert estimator.framework_version == sklearn_version assert estimator.role == "arn:aws:iam::366:role/SageMakerRole" assert estimator.instance_count == 1 assert estimator.max_run == 24 * 60 * 60 @@ -535,7 +535,7 @@ def test_attach_custom_image(sagemaker_session): assert estimator.train_image() == training_image -def test_estimator_py2_raises(sagemaker_session, scikit_learn_version): +def test_estimator_py2_raises(sagemaker_session, sklearn_version): with pytest.raises(AttributeError): SKLearn( entry_point=SCRIPT_PATH, @@ -543,12 +543,12 @@ def test_estimator_py2_raises(sagemaker_session, scikit_learn_version): sagemaker_session=sagemaker_session, instance_count=INSTANCE_COUNT, instance_type=INSTANCE_TYPE, - framework_version=scikit_learn_version, + framework_version=sklearn_version, py_version="py2", ) -def test_model_py2_raises(sagemaker_session, scikit_learn_version): +def test_model_py2_raises(sagemaker_session, sklearn_version): source_dir = "s3://mybucket/source" with pytest.raises(AttributeError): @@ -557,14 +557,6 @@ def test_model_py2_raises(sagemaker_session, scikit_learn_version): role=ROLE, entry_point=SCRIPT_PATH, sagemaker_session=sagemaker_session, - framework_version=scikit_learn_version, + framework_version=sklearn_version, py_version="py2", ) - - -def test_custom_image_estimator_deploy(sagemaker_session, scikit_learn_version): - custom_image = "mycustomimage:latest" - sklearn = _sklearn_estimator(sagemaker_session, scikit_learn_version) - sklearn.fit(inputs="s3://mybucket/train", job_name="new_name") - model = sklearn.create_model(image_uri=custom_image) - assert model.image_uri == custom_image From 6604fdfb00201dd1716bda863f8d58c397a2046c Mon Sep 17 00:00:00 2001 From: Lauren Yu <6631887+laurenyu@users.noreply.github.com> Date: Mon, 20 Jul 2020 15:53:12 -0700 Subject: [PATCH 5/5] update tests --- tests/integ/test_processing.py | 2 +- tests/unit/sagemaker/image_uris/test_sklearn.py | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/tests/integ/test_processing.py b/tests/integ/test_processing.py index 4cdd4acc87..eda8e3445d 100644 --- a/tests/integ/test_processing.py +++ b/tests/integ/test_processing.py @@ -62,7 +62,7 @@ def image_uri( sklearn_latest_version, sklearn_latest_py_version, cpu_instance_type, sagemaker_session, ): return image_uris.retrieve( - "scikit-learn", + "sklearn", sagemaker_session.boto_region_name, version=sklearn_latest_version, py_version=sklearn_latest_py_version, diff --git a/tests/unit/sagemaker/image_uris/test_sklearn.py b/tests/unit/sagemaker/image_uris/test_sklearn.py index b0a7654da6..75b213d158 100644 --- a/tests/unit/sagemaker/image_uris/test_sklearn.py +++ b/tests/unit/sagemaker/image_uris/test_sklearn.py @@ -46,7 +46,7 @@ def test_valid_uris(sklearn_version): for region in regions.regions(): uri = image_uris.retrieve( - "scikit-learn", + "sklearn", region=region, version=sklearn_version, py_version="py3", @@ -66,7 +66,7 @@ def test_valid_uris(sklearn_version): def test_py2_error(sklearn_version): with pytest.raises(ValueError) as e: image_uris.retrieve( - "scikit-learn", + "sklearn", region="us-west-2", version=sklearn_version, py_version="py2", @@ -79,10 +79,7 @@ def test_py2_error(sklearn_version): def test_gpu_error(sklearn_version): with pytest.raises(ValueError) as e: image_uris.retrieve( - "scikit-learn", - region="us-west-2", - version=sklearn_version, - instance_type="ml.p2.xlarge", + "sklearn", region="us-west-2", version=sklearn_version, instance_type="ml.p2.xlarge", ) assert "Unsupported processor: gpu." in str(e.value)