def test_deploy_model_with_accelerator(
    mxnet_training_job,
    sagemaker_session,
    mxnet_eia_latest_version,
    mxnet_eia_py_version,
    cpu_instance_type,
):
    endpoint_name = "test-mxnet-deploy-model-ei-{}".format(sagemaker_timestamp())

    with timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session):
        desc = sagemaker_session.sagemaker_client.describe_training_job(
            TrainingJobName=mxnet_training_job
        )
        model_data = desc["ModelArtifacts"]["S3ModelArtifacts"]
        script_path = os.path.join(DATA_DIR, "mxnet_mnist", "mnist.py")
        model = MXNetModel(
            model_data,
            "SageMakerRole",
            entry_point=script_path,
            framework_version=mxnet_eia_latest_version,
            py_version=mxnet_eia_py_version,
            sagemaker_session=sagemaker_session,
        )
        predictor = model.deploy(
            1, cpu_instance_type, endpoint_name=endpoint_name, accelerator_type="ml.eia1.medium"
        )

        data = numpy.zeros(shape=(1, 1, 28, 28))
        result = predictor.predict(data)
        assert result is not None
def test_deploy_model(
    mxnet_training_job,
    sagemaker_session,
    mxnet_inference_latest_version,
    mxnet_inference_latest_py_version,
    cpu_instance_type,
):
    endpoint_name = "test-mxnet-deploy-model-{}".format(sagemaker_timestamp())

    with timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session):
        desc = sagemaker_session.sagemaker_client.describe_training_job(
            TrainingJobName=mxnet_training_job
        )
        model_data = desc["ModelArtifacts"]["S3ModelArtifacts"]
        script_path = os.path.join(DATA_DIR, "mxnet_mnist", "mnist.py")
        model = MXNetModel(
            model_data,
            "SageMakerRole",
            entry_point=script_path,
            py_version=mxnet_inference_latest_py_version,
            sagemaker_session=sagemaker_session,
            framework_version=mxnet_inference_latest_version,
        )
        predictor = model.deploy(1, cpu_instance_type, endpoint_name=endpoint_name)

        data = numpy.zeros(shape=(1, 1, 28, 28))
        result = predictor.predict(data)
        assert result is not None

    predictor.delete_model()
    with pytest.raises(Exception) as exception:
        sagemaker_session.sagemaker_client.describe_model(ModelName=model.name)
        assert "Could not find model" in str(exception.value)
Example #3
0
def test_git_support_codecommit_with_mxnet(sagemaker_local_session):
    script_path = "mnist.py"
    data_path = os.path.join(DATA_DIR, "mxnet_mnist")
    git_config = {
        "repo": CODECOMMIT_REPO,
        "branch": CODECOMMIT_BRANCH,
        "username": "******",
        "password": "******",
    }
    source_dir = "mxnet"
    dependencies = ["foo/bar.py"]
    mx = MXNet(
        entry_point=script_path,
        role="SageMakerRole",
        source_dir=source_dir,
        dependencies=dependencies,
        framework_version=MXNet.LATEST_VERSION,
        py_version=PYTHON_VERSION,
        train_instance_count=1,
        train_instance_type="local",
        sagemaker_session=sagemaker_local_session,
        git_config=git_config,
    )

    mx.fit(
        {
            "train": "file://" + os.path.join(data_path, "train"),
            "test": "file://" + os.path.join(data_path, "test"),
        }
    )

    files = [file for file in os.listdir(mx.source_dir)]
    assert "some_file" in files
    assert "mnist.py" in files
    assert os.path.exists(mx.dependencies[0])

    with lock.lock(LOCK_PATH):
        try:
            client = sagemaker_local_session.sagemaker_client
            desc = client.describe_training_job(TrainingJobName=mx.latest_training_job.name)
            model_data = desc["ModelArtifacts"]["S3ModelArtifacts"]
            model = MXNetModel(
                model_data,
                "SageMakerRole",
                entry_point=script_path,
                source_dir=source_dir,
                dependencies=dependencies,
                py_version=PYTHON_VERSION,
                sagemaker_session=sagemaker_local_session,
                framework_version=MXNet.LATEST_VERSION,
                git_config=git_config,
            )
            predictor = model.deploy(1, "local")

            data = numpy.zeros(shape=(1, 1, 28, 28))
            result = predictor.predict(data)
            assert result is not None
        finally:
            predictor.delete_endpoint()
def test_deploy_model_with_tags_and_kms(
    mxnet_training_job,
    sagemaker_session,
    mxnet_inference_latest_version,
    mxnet_inference_latest_py_version,
    cpu_instance_type,
):
    endpoint_name = "test-mxnet-deploy-model-{}".format(sagemaker_timestamp())

    with timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session):
        desc = sagemaker_session.sagemaker_client.describe_training_job(
            TrainingJobName=mxnet_training_job
        )
        model_data = desc["ModelArtifacts"]["S3ModelArtifacts"]
        script_path = os.path.join(DATA_DIR, "mxnet_mnist", "mnist.py")
        model = MXNetModel(
            model_data,
            "SageMakerRole",
            entry_point=script_path,
            py_version=mxnet_inference_latest_py_version,
            sagemaker_session=sagemaker_session,
            framework_version=mxnet_inference_latest_version,
        )

        tags = [{"Key": "TagtestKey", "Value": "TagtestValue"}]
        kms_key_arn = get_or_create_kms_key(sagemaker_session)

        model.deploy(
            1, cpu_instance_type, endpoint_name=endpoint_name, tags=tags, kms_key=kms_key_arn
        )

        returned_model = sagemaker_session.sagemaker_client.describe_model(ModelName=model.name)
        returned_model_tags = sagemaker_session.sagemaker_client.list_tags(
            ResourceArn=returned_model["ModelArn"]
        )["Tags"]

        endpoint = sagemaker_session.sagemaker_client.describe_endpoint(EndpointName=endpoint_name)
        endpoint_tags = sagemaker_session.sagemaker_client.list_tags(
            ResourceArn=endpoint["EndpointArn"]
        )["Tags"]

        endpoint_config = sagemaker_session.sagemaker_client.describe_endpoint_config(
            EndpointConfigName=endpoint["EndpointConfigName"]
        )
        endpoint_config_tags = sagemaker_session.sagemaker_client.list_tags(
            ResourceArn=endpoint_config["EndpointConfigArn"]
        )["Tags"]

        production_variants = endpoint_config["ProductionVariants"]

        assert returned_model_tags == tags
        assert endpoint_config_tags == tags
        assert endpoint_tags == tags
        assert production_variants[0]["InstanceType"] == cpu_instance_type
        assert production_variants[0]["InitialInstanceCount"] == 1
        assert endpoint_config["KmsKeyId"] == kms_key_arn
def test_deploy_model(mxnet_training_job, sagemaker_session):
    endpoint_name = 'test-mxnet-deploy-model-{}'.format(sagemaker_timestamp())

    with timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session):
        desc = sagemaker_session.sagemaker_client.describe_training_job(TrainingJobName=mxnet_training_job)
        model_data = desc['ModelArtifacts']['S3ModelArtifacts']
        script_path = os.path.join(DATA_DIR, 'mxnet_mnist', 'mnist.py')
        model = MXNetModel(model_data, 'SageMakerRole', entry_point=script_path, sagemaker_session=sagemaker_session)
        predictor = model.deploy(1, 'ml.m4.xlarge', endpoint_name=endpoint_name)

        data = numpy.zeros(shape=(1, 1, 28, 28))
        predictor.predict(data)
Example #6
0
def test_deploy_model(mxnet_training_job, sagemaker_session):
    endpoint_name = 'test-mxnet-deploy-model-{}'.format(sagemaker_timestamp())

    with timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session, minutes=20):
        desc = sagemaker_session.sagemaker_client.describe_training_job(TrainingJobName=mxnet_training_job)
        model_data = desc['ModelArtifacts']['S3ModelArtifacts']
        script_path = os.path.join(DATA_DIR, 'mxnet_mnist', 'mnist.py')
        model = MXNetModel(model_data, 'SageMakerRole', entry_point=script_path, sagemaker_session=sagemaker_session)
        predictor = model.deploy(1, 'ml.m4.xlarge', endpoint_name=endpoint_name)

        data = numpy.zeros(shape=(1, 1, 28, 28))
        predictor.predict(data)
def predictor(docker_image, sagemaker_local_session, local_instance_type):
    default_handler_path = os.path.join(RESOURCE_PATH, 'default_handlers')
    m = MXNetModel('file://{}'.format(os.path.join(default_handler_path, 'model')), 'SageMakerRole',
                   os.path.join(default_handler_path, 'code', 'empty_module.py'),
                   image=docker_image, sagemaker_session=sagemaker_local_session,
                   model_server_workers=NUM_MODEL_SERVER_WORKERS)
    with local_mode_utils.lock():
        try:
            predictor = m.deploy(1, local_instance_type)
            yield predictor
        finally:
            sagemaker_local_session.delete_endpoint(m.endpoint_name)
Example #8
0
def predictor(docker_image, sagemaker_local_session, local_instance_type):
    model = MXNetModel('file://{}'.format(MODEL_PATH),
                       'SageMakerRole',
                       SCRIPT_PATH,
                       image=docker_image,
                       sagemaker_session=sagemaker_local_session)

    with local_mode_utils.lock():
        try:
            predictor = model.deploy(1, local_instance_type)
            yield predictor
        finally:
            predictor.delete_endpoint()
Example #9
0
def test_deploy_model_with_accelerator(mxnet_training_job, sagemaker_session, ei_mxnet_full_version):
    endpoint_name = 'test-mxnet-deploy-model-ei-{}'.format(sagemaker_timestamp())

    with timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session):
        desc = sagemaker_session.sagemaker_client.describe_training_job(TrainingJobName=mxnet_training_job)
        model_data = desc['ModelArtifacts']['S3ModelArtifacts']
        script_path = os.path.join(DATA_DIR, 'mxnet_mnist', 'mnist.py')
        model = MXNetModel(model_data, 'SageMakerRole', entry_point=script_path,
                           framework_version=ei_mxnet_full_version, py_version=PYTHON_VERSION,
                           sagemaker_session=sagemaker_session)
        predictor = model.deploy(1, 'ml.m4.xlarge', endpoint_name=endpoint_name, accelerator_type='ml.eia1.medium')

        data = numpy.zeros(shape=(1, 1, 28, 28))
        predictor.predict(data)
def test_deploy_model_with_tags_and_kms(mxnet_training_job, sagemaker_session,
                                        mxnet_full_version):
    endpoint_name = 'test-mxnet-deploy-model-{}'.format(sagemaker_timestamp())

    with timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session):
        desc = sagemaker_session.sagemaker_client.describe_training_job(
            TrainingJobName=mxnet_training_job)
        model_data = desc['ModelArtifacts']['S3ModelArtifacts']
        script_path = os.path.join(DATA_DIR, 'mxnet_mnist', 'mnist.py')
        model = MXNetModel(model_data,
                           'SageMakerRole',
                           entry_point=script_path,
                           py_version=PYTHON_VERSION,
                           sagemaker_session=sagemaker_session,
                           framework_version=mxnet_full_version)

        tags = [{'Key': 'TagtestKey', 'Value': 'TagtestValue'}]
        kms_key_arn = get_or_create_kms_key(sagemaker_session)

        model.deploy(1,
                     'ml.m4.xlarge',
                     endpoint_name=endpoint_name,
                     tags=tags,
                     kms_key=kms_key_arn)

        returned_model = sagemaker_session.describe_model(
            EndpointName=model.name)
        returned_model_tags = sagemaker_session.list_tags(
            ResourceArn=returned_model['ModelArn'])['Tags']

        endpoint = sagemaker_session.describe_endpoint(
            EndpointName=endpoint_name)
        endpoint_tags = sagemaker_session.list_tags(
            ResourceArn=endpoint['EndpointArn'])['Tags']

        endpoint_config = sagemaker_session.describe_endpoint_config(
            EndpointConfigName=endpoint['EndpointConfigName'])
        endpoint_config_tags = sagemaker_session.list_tags(
            ResourceArn=endpoint_config['EndpointConfigArn'])['Tags']

        production_variants = endpoint_config['ProductionVariants']

        assert returned_model_tags == tags
        assert endpoint_config_tags == tags
        assert endpoint_tags == tags
        assert production_variants[0]['InstanceType'] == 'ml.m4.xlarge'
        assert production_variants[0]['InitialInstanceCount'] == 1
        assert endpoint_config['KmsKeyId'] == kms_key_arn
    def create_model(self, model_server_workers=None, role=None):
        """Create a SageMaker ``MXNetModel`` object that can be deployed to an ``Endpoint``.

        Args:
            role (str): The ``ExecutionRoleArn`` IAM Role ARN for the ``Model``, which is also used during
                transform jobs. If not specified, the role from the Estimator will be used.
            model_server_workers (int): Optional. The number of worker processes used by the inference server.
                If None, server will use one worker per vCPU.

        Returns:
            sagemaker.mxnet.model.MXNetModel: A SageMaker ``MXNetModel`` object.
                See :func:`~sagemaker.mxnet.model.MXNetModel` for full details.
        """
        role = role or self.role
        return MXNetModel(
            self.model_data,
            role,
            self.entry_point,
            source_dir=self._model_source_dir(),
            enable_cloudwatch_metrics=self.enable_cloudwatch_metrics,
            name=self._current_job_name,
            container_log_level=self.container_log_level,
            code_location=self.code_location,
            py_version=self.py_version,
            framework_version=self.framework_version,
            image=self.image_name,
            model_server_workers=model_server_workers,
            sagemaker_session=self.sagemaker_session)
Example #12
0
    def create_model(self, model_server_workers=None):
        """Create a SageMaker ``MXNetModel`` object that can be deployed to an ``Endpoint``.

        Args:
            model_server_workers (int): Optional. The number of worker processes used by the inference server.
                If None, server will use one worker per vCPU.

        Returns:
            sagemaker.mxnet.model.MXNetModel: A SageMaker ``MXNetModel`` object.
                See :func:`~sagemaker.mxnet.model.MXNetModel` for full details.
        """
        return MXNetModel(
            self.model_data,
            self.role,
            self.entry_point,
            source_dir=self._model_source_dir(),
            enable_cloudwatch_metrics=self.enable_cloudwatch_metrics,
            name=self._current_job_name,
            container_log_level=self.container_log_level,
            code_location=self.code_location,
            py_version=self.py_version,
            framework_version=self.framework_version,
            image=self.image_name,
            model_server_workers=model_server_workers,
            sagemaker_session=self.sagemaker_session)
def _test_hosting_function(ecr_image, sagemaker_session, instance_type, framework_version):
    prefix = 'mxnet-serving/default-handlers'
    model_data = sagemaker_session.upload_data(path=MODEL_PATH, key_prefix=prefix)
    model = MXNetModel(model_data,
                       'SageMakerRole',
                       SCRIPT_PATH,
                       framework_version=framework_version,
                       image_uri=ecr_image,
                       sagemaker_session=sagemaker_session)

    endpoint_name = utils.unique_name_from_base('test-mxnet-serving')
    with timeout.timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session):
        predictor = model.deploy(1, instance_type, endpoint_name=endpoint_name)

        output = predictor.predict([[1, 2]])
        assert [[4.9999918937683105]] == output
def test_hosting(docker_image, sagemaker_local_session, local_instance_type):
    model = MXNetModel('file://{}'.format(MODEL_PATH),
                       'SageMakerRole',
                       SCRIPT_PATH,
                       image=docker_image,
                       sagemaker_session=sagemaker_local_session)

    input = json.dumps({'some': 'json'})

    with local_mode_utils.lock():
        try:
            predictor = model.deploy(1, local_instance_type)
            output = predictor.predict(input)
            assert input == output
        finally:
            sagemaker_local_session.delete_endpoint(model.endpoint_name)
def test_hosting(docker_image, sagemaker_local_session, local_instance_type):
    hosting_resource_path = os.path.join(RESOURCE_PATH, 'dummy_hosting')
    m = MXNetModel('file://{}'.format(os.path.join(hosting_resource_path, 'code')), 'SageMakerRole',
                   os.path.join(hosting_resource_path, 'code', 'dummy_hosting_module.py'),
                   image=docker_image, sagemaker_session=sagemaker_local_session,
                   model_server_workers=NUM_MODEL_SERVER_WORKERS)

    input = json.dumps({'some': 'json'})

    with local_mode_utils.lock():
        try:
            predictor = m.deploy(1, local_instance_type)
            output = predictor.predict(input)
            assert input == output
        finally:
            sagemaker_local_session.delete_endpoint(m.endpoint_name)
def test_inferentia_deploy_model(
    mxnet_training_job,
    sagemaker_session,
    inf_instance_type,
    inf_instance_family,
    inferentia_mxnet_latest_version,
    inferentia_mxnet_latest_py_version,
):
    endpoint_name = unique_name_from_base("test-neo-deploy-model")

    with timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session):
        desc = sagemaker_session.sagemaker_client.describe_training_job(
            TrainingJobName=mxnet_training_job)
        model_data = desc["ModelArtifacts"]["S3ModelArtifacts"]
        script_path = os.path.join(DATA_DIR, "mxnet_mnist", "mnist_neo.py")
        role = "SageMakerRole"
        model = MXNetModel(
            model_data,
            role,
            entry_point=script_path,
            framework_version=inferentia_mxnet_latest_version,
            py_version=inferentia_mxnet_latest_py_version,
            sagemaker_session=sagemaker_session,
        )

        model.compile(
            target_instance_family=inf_instance_family,
            input_shape={
                "data": [1, 1, 28, 28],
                "softmax_label": [1]
            },
            role=role,
            job_name=unique_name_from_base(
                "test-deploy-model-compilation-job"),
            output_path="/".join(model_data.split("/")[:-1]),
        )

        serializer = JSONSerializer()
        serializer.CONTENT_TYPE = "application/vnd+python.numpy+binary"

        predictor = model.deploy(1,
                                 inf_instance_type,
                                 serializer=serializer,
                                 endpoint_name=endpoint_name)

        data = numpy.zeros(shape=(1, 1, 28, 28))
        predictor.predict(data)
def test_gluon_hosting(docker_image, sagemaker_local_session, local_instance_type):
    model = MXNetModel('file://{}'.format(MODEL_PATH),
                       'SageMakerRole',
                       SCRIPT_PATH,
                       image=docker_image,
                       sagemaker_session=sagemaker_local_session)

    with open(os.path.join(RESOURCE_PATH, 'mnist', 'images', '04.json'), 'r') as f:
        input = json.load(f)

    with local_mode_utils.lock():
        try:
            predictor = model.deploy(1, local_instance_type)
            output = predictor.predict(input)
            assert [4.0] == output
        finally:
            predictor.delete_endpoint()
 def create_model(self, model_url):
     from sagemaker.mxnet.model import MXNetModel
     return MXNetModel(model_data=model_url,
                       role=self.role_name,
                       entry_point=self.script,
                       py_version=self.python,
                       name=self.endpoint_name,
                       env=self.environment)
def test_register_model_package_versioned(
    mxnet_training_job,
    sagemaker_session,
    mxnet_inference_latest_version,
    mxnet_inference_latest_py_version,
    cpu_instance_type,
):
    endpoint_name = "test-mxnet-deploy-model-{}".format(sagemaker_timestamp())

    with timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session):
        desc = sagemaker_session.sagemaker_client.describe_training_job(
            TrainingJobName=mxnet_training_job)
        model_package_group_name = "register-model-package-{}".format(
            sagemaker_timestamp())
        sagemaker_session.sagemaker_client.create_model_package_group(
            ModelPackageGroupName=model_package_group_name)
        model_data = desc["ModelArtifacts"]["S3ModelArtifacts"]
        script_path = os.path.join(DATA_DIR, "mxnet_mnist", "mnist.py")
        model = MXNetModel(
            model_data,
            "SageMakerRole",
            entry_point=script_path,
            py_version=mxnet_inference_latest_py_version,
            sagemaker_session=sagemaker_session,
            framework_version=mxnet_inference_latest_version,
        )
        model_pkg = model.register(
            content_types=["application/json"],
            response_types=["application/json"],
            inference_instances=["ml.m5.large"],
            transform_instances=["ml.m5.large"],
            model_package_group_name=model_package_group_name,
            approval_status="Approved",
        )
        assert isinstance(model_pkg, ModelPackage)
        predictor = model.deploy(1,
                                 cpu_instance_type,
                                 endpoint_name=endpoint_name)
        data = numpy.zeros(shape=(1, 1, 28, 28))
        result = predictor.predict(data)
        assert result is not None
        sagemaker_session.sagemaker_client.delete_model_package(
            ModelPackageName=model_pkg.model_package_arn)
        sagemaker_session.sagemaker_client.delete_model_package_group(
            ModelPackageGroupName=model_package_group_name)
Example #20
0
def test_deploy_model(mxnet_training_job, sagemaker_session, mxnet_full_version):
    endpoint_name = 'test-mxnet-deploy-model-{}'.format(sagemaker_timestamp())

    with timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session):
        desc = sagemaker_session.sagemaker_client.describe_training_job(TrainingJobName=mxnet_training_job)
        model_data = desc['ModelArtifacts']['S3ModelArtifacts']
        script_path = os.path.join(DATA_DIR, 'mxnet_mnist', 'mnist.py')
        model = MXNetModel(model_data, 'SageMakerRole', entry_point=script_path,
                           py_version=PYTHON_VERSION, sagemaker_session=sagemaker_session,
                           framework_version=mxnet_full_version)
        predictor = model.deploy(1, 'ml.m4.xlarge', endpoint_name=endpoint_name)

        data = numpy.zeros(shape=(1, 1, 28, 28))
        predictor.predict(data)

    predictor.delete_model()
    with pytest.raises(Exception) as exception:
        sagemaker_session.sagemaker_client.describe_model(ModelName=model.name)
        assert 'Could not find model' in str(exception.value)
Example #21
0
def deploy_bert(model_data, sagemaker_session, ecr_image, instance_type, framework_version, role, script="bert_inference.py"):
    """
    """
    model = MXNetModel(model_data,
                       role,
                       etnry_point=script,
                       source_dir="code",
                       image_uri=ecr_image,
                       py_version="py3",
                       framework_version=framework_version,
                       sagemaker_session=sagemaker_session)

    endpoint_name = utils.unique_name_from_base('bert')
    print("Deploying...")
    predictor = model.deploy(1, instance_type, endpoint_name=endpoint_name)
    
    print("\nEndpoint Name: {}".format(endpoint_name))
    
    return predictor
def test_deploy_model_and_update_endpoint(
    mxnet_training_job,
    sagemaker_session,
    mxnet_inference_latest_version,
    mxnet_inference_latest_py_version,
    cpu_instance_type,
    alternative_cpu_instance_type,
):
    endpoint_name = "test-mxnet-deploy-model-{}".format(sagemaker_timestamp())

    with timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session):
        desc = sagemaker_session.sagemaker_client.describe_training_job(
            TrainingJobName=mxnet_training_job)
        model_data = desc["ModelArtifacts"]["S3ModelArtifacts"]
        script_path = os.path.join(DATA_DIR, "mxnet_mnist", "mnist.py")
        model = MXNetModel(
            model_data,
            "SageMakerRole",
            entry_point=script_path,
            py_version=mxnet_inference_latest_py_version,
            sagemaker_session=sagemaker_session,
            framework_version=mxnet_inference_latest_version,
        )
        predictor = model.deploy(1,
                                 alternative_cpu_instance_type,
                                 endpoint_name=endpoint_name)
        endpoint_desc = sagemaker_session.sagemaker_client.describe_endpoint(
            EndpointName=endpoint_name)
        old_config_name = endpoint_desc["EndpointConfigName"]

        predictor.update_endpoint(initial_instance_count=1,
                                  instance_type=cpu_instance_type)

        endpoint_desc = sagemaker_session.sagemaker_client.describe_endpoint(
            EndpointName=endpoint_name)
        new_config_name = endpoint_desc["EndpointConfigName"]
        new_config = sagemaker_session.sagemaker_client.describe_endpoint_config(
            EndpointConfigName=new_config_name)

        assert old_config_name != new_config_name
        assert new_config["ProductionVariants"][0][
            "InstanceType"] == cpu_instance_type
        assert new_config["ProductionVariants"][0]["InitialInstanceCount"] == 1
def test_jumpstart_mxnet_image_uri(patched_get_model_specs, session):

    patched_get_model_specs.side_effect = get_prototype_model_spec

    model_id, model_version = "mxnet-semseg-fcn-resnet50-ade", "*"
    instance_type = "ml.p2.xlarge"
    region = "us-west-2"

    model_specs = accessors.JumpStartModelsAccessor.get_model_specs(
        region, model_id, model_version)

    # inference
    uri = image_uris.retrieve(
        framework=None,
        region=region,
        image_scope="inference",
        model_id=model_id,
        model_version=model_version,
        instance_type=instance_type,
    )

    framework_class_uri = MXNetModel(
        role="mock_role",
        model_data="mock_data",
        entry_point="mock_entry_point",
        framework_version=model_specs.hosting_ecr_specs.framework_version,
        py_version=model_specs.hosting_ecr_specs.py_version,
        sagemaker_session=session,
    ).serving_image_uri(region, instance_type)

    assert uri == framework_class_uri
    assert uri == "763104351884.dkr.ecr.us-west-2.amazonaws.com/mxnet-inference:1.7.0-gpu-py3"

    # training
    uri = image_uris.retrieve(
        framework=None,
        region=region,
        image_scope="training",
        model_id=model_id,
        model_version=model_version,
        instance_type=instance_type,
    )

    framework_class_uri = MXNet(
        role="mock_role",
        entry_point="mock_entry_point",
        framework_version=model_specs.training_ecr_specs.framework_version,
        py_version=model_specs.training_ecr_specs.py_version,
        instance_type=instance_type,
        instance_count=1,
        sagemaker_session=session,
    ).training_image_uri(region=region)

    assert uri == framework_class_uri
    assert uri == "763104351884.dkr.ecr.us-west-2.amazonaws.com/mxnet-training:1.7.0-gpu-py3"
def test_hosting(docker_image, sagemaker_local_session, local_instance_type,
                 framework_version):
    model = MXNetModel(model_data="file://{}".format(MODEL_PATH),
                       image_uri=docker_image,
                       role='SageMakerRole',
                       entry_point=SCRIPT_PATH,
                       framework_version=framework_version,
                       sagemaker_session=sagemaker_local_session)

    with local_mode_utils.lock():
        try:
            predictor = model.deploy(1,
                                     local_instance_type,
                                     deserializer=StringDeserializer())

            input = 'some data'
            output = predictor.predict(input)
            assert '"' + input + '"' == output
        finally:
            predictor.delete_endpoint()
Example #25
0
def test_hosting(docker_image, sagemaker_local_session, local_instance_type):
    model = MXNetModel('file://{}'.format(MODEL_PATH),
                       'SageMakerRole',
                       SCRIPT_PATH,
                       image=docker_image,
                       sagemaker_session=sagemaker_local_session)

    with local_mode_utils.lock():
        try:
            predictor = model.deploy(1, local_instance_type)
            predictor.serializer = None
            predictor.deserializer = StringDeserializer()
            predictor.accept = None
            predictor.content_type = None

            input = 'some data'
            output = predictor.predict(input)
            assert input == output
        finally:
            predictor.delete_endpoint()
Example #26
0
    def create_model(
        self,
        model_server_workers=None,
        role=None,
        vpc_config_override=VPC_CONFIG_DEFAULT,
        entry_point=None,
        source_dir=None,
        dependencies=None,
    ):
        """Create a SageMaker ``MXNetModel`` object that can be deployed to an
        ``Endpoint``.

        Args:
            model_server_workers (int): Optional. The number of worker processes
                used by the inference server. If None, server will use one
                worker per vCPU.
            role (str): The ``ExecutionRoleArn`` IAM Role ARN for the ``Model``,
                which is also used during transform jobs. If not specified, the
                role from the Estimator will be used.
            vpc_config_override (dict[str, list[str]]): Optional override for VpcConfig set on
                the model. Default: use subnets and security groups from this Estimator.
                * 'Subnets' (list[str]): List of subnet ids.
                * 'SecurityGroupIds' (list[str]): List of security group ids.
            entry_point (str): Path (absolute or relative) to the local Python source file which
                should be executed as the entry point to training. If not specified, the training
                entry point is used.
            source_dir (str): Path (absolute or relative) to a directory with any other serving
                source code dependencies aside from the entry point file.
                If not specified, the model source directory from training is used.
            dependencies (list[str]): A list of paths to directories (absolute or relative) with
                any additional libraries that will be exported to the container.
                If not specified, the dependencies from training are used.

        Returns:
            sagemaker.mxnet.model.MXNetModel: A SageMaker ``MXNetModel`` object.
            See :func:`~sagemaker.mxnet.model.MXNetModel` for full details.
        """
        return MXNetModel(
            self.model_data,
            role or self.role,
            entry_point or self.entry_point,
            source_dir=(source_dir or self._model_source_dir()),
            enable_cloudwatch_metrics=self.enable_cloudwatch_metrics,
            name=self._current_job_name,
            container_log_level=self.container_log_level,
            code_location=self.code_location,
            py_version=self.py_version,
            framework_version=self.framework_version,
            image=self.image_name,
            model_server_workers=model_server_workers,
            sagemaker_session=self.sagemaker_session,
            vpc_config=self.get_vpc_config(vpc_config_override),
            dependencies=(dependencies or self.dependencies),
        )
Example #27
0
def test_batch_transform(sagemaker_session, ecr_image, instance_type, framework_version):
    s3_prefix = 'mxnet-serving/mnist'
    model_data = sagemaker_session.upload_data(path=MODEL_PATH, key_prefix=s3_prefix)
    model = MXNetModel(model_data,
                       'SageMakerRole',
                       SCRIPT_PATH,
                       image=ecr_image,
                       framework_version=framework_version,
                       sagemaker_session=sagemaker_session)

    transformer = model.transformer(1, instance_type)
    with timeout.timeout_and_delete_model_with_transformer(transformer, sagemaker_session, minutes=20):
        input_data = sagemaker_session.upload_data(path=DATA_PATH, key_prefix=s3_prefix)

        job_name = utils.unique_name_from_base('test-mxnet-serving-batch')
        transformer.transform(input_data, content_type='text/csv', job_name=job_name)
        transformer.wait()

    prediction = _transform_result(sagemaker_session.boto_session, transformer.output_path)
    assert prediction == 7
Example #28
0
def test_gluon_hosting(docker_image, sagemaker_local_session,
                       local_instance_type):
    gluon_path = os.path.join(RESOURCE_PATH, 'gluon_hosting')
    m = MXNetModel('file://{}'.format(os.path.join(gluon_path, 'model')),
                   'SageMakerRole',
                   os.path.join(gluon_path, 'code', 'gluon.py'),
                   image=docker_image,
                   sagemaker_session=sagemaker_local_session,
                   model_server_workers=NUM_MODEL_SERVER_WORKERS)

    with open(os.path.join(RESOURCE_PATH, 'mnist_images', '04.json'),
              'r') as f:
        input = json.load(f)

    with local_mode_utils.lock():
        try:
            predictor = m.deploy(1, local_instance_type)
            output = predictor.predict(input)
            assert [4.0] == output
        finally:
            sagemaker_local_session.delete_endpoint(m.endpoint_name)
def test_default_model_fn(docker_image, sagemaker_local_session,
                          local_instance_type):
    default_handler_path = os.path.join(RESOURCE_PATH, 'default_handlers')
    m = MXNetModel('file://{}'.format(
        os.path.join(default_handler_path, 'model')),
                   'SageMakerRole',
                   os.path.join(default_handler_path, 'code',
                                'empty_module.py'),
                   image=docker_image,
                   sagemaker_session=sagemaker_local_session,
                   model_server_workers=NUM_MODEL_SERVER_WORKERS)

    input = [[1, 2]]

    with local_mode_utils.lock():
        try:
            predictor = m.deploy(1, local_instance_type)
            output = predictor.predict(input)
            assert [[4.9999918937683105]] == output
        finally:
            sagemaker_local_session.delete_endpoint(m.endpoint_name)
def test_deploy_model_with_update_endpoint(mxnet_training_job,
                                           sagemaker_session,
                                           mxnet_full_version):
    endpoint_name = 'test-mxnet-deploy-model-{}'.format(sagemaker_timestamp())

    with timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session):
        desc = sagemaker_session.sagemaker_client.describe_training_job(
            TrainingJobName=mxnet_training_job)
        model_data = desc['ModelArtifacts']['S3ModelArtifacts']
        script_path = os.path.join(DATA_DIR, 'mxnet_mnist', 'mnist.py')
        model = MXNetModel(model_data,
                           'SageMakerRole',
                           entry_point=script_path,
                           py_version=PYTHON_VERSION,
                           sagemaker_session=sagemaker_session,
                           framework_version=mxnet_full_version)
        model.deploy(1, 'ml.t2.medium', endpoint_name=endpoint_name)
        old_endpoint = sagemaker_session.describe_endpoint(
            EndpointName=endpoint_name)
        old_config_name = old_endpoint['EndpointConfigName']

        model.deploy(1,
                     'ml.m4.xlarge',
                     update_endpoint=True,
                     endpoint_name=endpoint_name)
        new_endpoint = sagemaker_session.describe_endpoint(
            EndpointName=endpoint_name)['ProductionVariants']
        new_production_variants = new_endpoint['ProductionVariants']
        new_config_name = new_endpoint['EndpointConfigName']

        assert old_config_name != new_config_name
        assert new_production_variants['InstanceType'] == 'ml.m4.xlarge'
        assert new_production_variants['InitialInstanceCount'] == 1
        assert new_production_variants['AcceleratorType'] is None
def test_deploy_model_with_update_non_existing_endpoint(
        mxnet_training_job, sagemaker_session, mxnet_full_version):
    endpoint_name = 'test-mxnet-deploy-model-{}'.format(sagemaker_timestamp())
    expected_error_message = 'Endpoint with name "{}" does not exist; ' \
                             'please use an existing endpoint name'.format(endpoint_name)

    with timeout_and_delete_endpoint_by_name(endpoint_name, sagemaker_session):
        desc = sagemaker_session.sagemaker_client.describe_training_job(
            TrainingJobName=mxnet_training_job)
        model_data = desc['ModelArtifacts']['S3ModelArtifacts']
        script_path = os.path.join(DATA_DIR, 'mxnet_mnist', 'mnist.py')
        model = MXNetModel(model_data,
                           'SageMakerRole',
                           entry_point=script_path,
                           py_version=PYTHON_VERSION,
                           sagemaker_session=sagemaker_session,
                           framework_version=mxnet_full_version)
        model.deploy(1, 'ml.t2.medium', endpoint_name=endpoint_name)
        sagemaker_session.describe_endpoint(EndpointName=endpoint_name)

        with pytest.raises(ValueError, message=expected_error_message):
            model.deploy(1,
                         'ml.m4.xlarge',
                         update_endpoint=True,
                         endpoint_name='non-existing-endpoint')