def test_get_s3_file_upload_extra_args_invalid_json(): os.environ.setdefault( "MLFLOW_S3_UPLOAD_EXTRA_ARGS", '"ServerSideEncryption": "aws:kms", "SSEKMSKeyId": "123456"}') with pytest.raises(ValueError): S3ArtifactRepository.get_s3_file_upload_extra_args()
def test_model_load_from_remote_uri_succeeds(sklearn_knn_model, main_scoped_model_class, tmpdir, mock_s3_bucket, iris_data): artifact_root = "s3://{bucket_name}".format(bucket_name=mock_s3_bucket) artifact_repo = S3ArtifactRepository(artifact_root) sklearn_model_path = os.path.join(str(tmpdir), "sklearn_model") mlflow.sklearn.save_model(sk_model=sklearn_knn_model, path=sklearn_model_path) sklearn_artifact_path = "sk_model" artifact_repo.log_artifacts(sklearn_model_path, artifact_path=sklearn_artifact_path) def test_predict(sk_model, model_input): return sk_model.predict(model_input) * 2 pyfunc_model_path = os.path.join(str(tmpdir), "pyfunc_model") mlflow.pyfunc.save_model( path=pyfunc_model_path, artifacts={"sk_model": sklearn_model_path}, python_model=main_scoped_model_class(test_predict), conda_env=_conda_env()) pyfunc_artifact_path = "pyfunc_model" artifact_repo.log_artifacts(pyfunc_model_path, artifact_path=pyfunc_artifact_path) model_uri = artifact_root + "/" + pyfunc_artifact_path loaded_pyfunc_model = mlflow.pyfunc.load_pyfunc(model_uri=model_uri) np.testing.assert_array_equal( loaded_pyfunc_model.predict(model_input=iris_data[0]), test_predict(sk_model=sklearn_knn_model, model_input=iris_data[0]))
def test_load_model_from_remote_uri_succeeds(saved_tf_iris_model, model_path, mock_s3_bucket): mlflow.tensorflow.save_model( tf_saved_model_dir=saved_tf_iris_model.path, tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, tf_signature_def_key=saved_tf_iris_model.signature_def_key, path=model_path, ) artifact_root = "s3://{bucket_name}".format(bucket_name=mock_s3_bucket) artifact_path = "model" artifact_repo = S3ArtifactRepository(artifact_root) artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) model_uri = artifact_root + "/" + artifact_path infer = mlflow.tensorflow.load_model(model_uri=model_uri) feed_dict = { df_column_name: tf.constant(saved_tf_iris_model.inference_df[df_column_name]) for df_column_name in list(saved_tf_iris_model.inference_df) } raw_preds = infer(**feed_dict) pred_dict = { column_name: raw_preds[column_name].numpy() for column_name in raw_preds.keys() } for col in pred_dict: assert np.allclose( np.array(pred_dict[col], dtype=np.float), np.array(saved_tf_iris_model.raw_results[col], dtype=np.float), )
def _upload_s3(local_model_path, bucket, prefix, region_name, s3_client): """ Upload dir to S3 as .tar.gz. :param local_model_path: Local path to a dir. :param bucket: S3 bucket where to store the data. :param prefix: Path within the bucket. :param region_name: The AWS region in which to upload data to S3. :param s3_client: A boto3 client for S3. :return: S3 path of the uploaded artifact. """ import boto3 sess = boto3.Session(region_name=region_name) with TempDir() as tmp: model_data_file = tmp.path("model.tar.gz") _make_tarfile(model_data_file, local_model_path) with open(model_data_file, "rb") as fobj: key = os.path.join(prefix, "model.tar.gz") obj = sess.resource("s3").Bucket(bucket).Object(key) environ_extra_args = S3ArtifactRepository.get_s3_file_upload_extra_args( ) obj.upload_fileobj(fobj, ExtraArgs=environ_extra_args) response = s3_client.put_object_tagging( Bucket=bucket, Key=key, Tagging={"TagSet": [{ "Key": "SageMaker", "Value": "true" }]}) _logger.info("tag response: %s", response) return "{}/{}/{}".format(s3_client.meta.endpoint_url, bucket, key)
def test_load_model_from_remote_uri_succeeds(saved_tf_iris_model, model_path, mock_s3_bucket): mlflow.tensorflow.save_model( tf_saved_model_dir=saved_tf_iris_model.path, tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, tf_signature_def_key=saved_tf_iris_model.signature_def_key, path=model_path) artifact_root = "s3://{bucket_name}".format(bucket_name=mock_s3_bucket) artifact_path = "model" artifact_repo = S3ArtifactRepository(artifact_root) artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) model_uri = artifact_root + "/" + artifact_path tf_graph = tf.Graph() tf_sess = tf.Session(graph=tf_graph) with tf_graph.as_default(): signature_def = mlflow.tensorflow.load_model(model_uri=model_uri, tf_sess=tf_sess) for _, input_signature in signature_def.inputs.items(): t_input = tf_graph.get_tensor_by_name(input_signature.name) assert t_input is not None for _, output_signature in signature_def.outputs.items(): t_output = tf_graph.get_tensor_by_name(output_signature.name) assert t_output is not None
def test_cli_build_image_with_remote_uri_calls_expected_azure_routines( sklearn_model, model_path, mock_s3_bucket): mlflow.sklearn.save_model(sk_model=sklearn_model, path=model_path) artifact_path = "model" artifact_root = "s3://{bucket_name}".format(bucket_name=mock_s3_bucket) s3_artifact_repo = S3ArtifactRepository(artifact_root) s3_artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) model_uri = artifact_root + "/" + artifact_path with AzureMLMocks() as aml_mocks: result = CliRunner(env={ "LC_ALL": "en_US.UTF-8", "LANG": "en_US.UTF-8" }).invoke( mlflow.azureml.cli.commands, [ "build-image", "-m", model_uri, "-w", "test_workspace", "-i", "image_name", "-n", "model_name", ], ) assert result.exit_code == 0 assert aml_mocks["register_model"].call_count == 1 assert aml_mocks["create_image"].call_count == 1 assert aml_mocks["load_workspace"].call_count == 1
def test_get_s3_file_upload_extra_args(): os.environ.setdefault( "MLFLOW_S3_UPLOAD_EXTRA_ARGS", '{"ServerSideEncryption": "aws:kms", "SSEKMSKeyId": "123456"}', ) parsed_args = S3ArtifactRepository.get_s3_file_upload_extra_args() assert parsed_args == {"ServerSideEncryption": "aws:kms", "SSEKMSKeyId": "123456"}
def test_deploy_cli_creates_sagemaker_transform_job_and_s3_resources_with_expected_names_from_s3( pretrained_model, sagemaker_client): local_model_path = _download_artifact_from_uri(pretrained_model.model_uri) artifact_path = "model" region_name = sagemaker_client.meta.region_name default_bucket = mfs._get_default_s3_bucket(region_name) s3_artifact_repo = S3ArtifactRepository("s3://{}".format(default_bucket)) s3_artifact_repo.log_artifacts(local_model_path, artifact_path=artifact_path) model_s3_uri = "s3://{bucket_name}/{artifact_path}".format( bucket_name=default_bucket, artifact_path=pretrained_model.model_path) job_name = "test-job" result = CliRunner(env={ "LC_ALL": "en_US.UTF-8", "LANG": "en_US.UTF-8" }).invoke( mfscli.commands, [ "deploy-transform-job", "--job-name", job_name, "--model-uri", model_s3_uri, "--input-data-type", "Some Data Type", "--input-uri", "Some Input Uri", "--content-type", "Some Content Type", "--output-path", "Some Output Path", "--archive", ], ) assert result.exit_code == 0 region_name = sagemaker_client.meta.region_name s3_client = boto3.client("s3", region_name=region_name) default_bucket = mfs._get_default_s3_bucket(region_name) transform_job_description = sagemaker_client.describe_transform_job( TransformJobName=job_name) model_name = transform_job_description["ModelName"] assert model_name in [ model["ModelName"] for model in sagemaker_client.list_models()["Models"] ] object_names = [ entry["Key"] for entry in s3_client.list_objects(Bucket=default_bucket)["Contents"] ] assert any([model_name in object_name for object_name in object_names]) assert job_name in [ transform_job["TransformJobName"] for transform_job in sagemaker_client.list_transform_jobs()["TransformJobSummaries"] ]
def test_deploy_cli_creates_sagemaker_and_s3_resources_with_expected_names_and_env_from_s3( pretrained_model, sagemaker_client): local_model_path = _download_artifact_from_uri(pretrained_model.model_uri) artifact_path = "model" region_name = sagemaker_client.meta.region_name default_bucket = mfs._get_default_s3_bucket(region_name) s3_artifact_repo = S3ArtifactRepository("s3://{}".format(default_bucket)) s3_artifact_repo.log_artifacts(local_model_path, artifact_path=artifact_path) model_s3_uri = "s3://{bucket_name}/{artifact_path}".format( bucket_name=default_bucket, artifact_path=pretrained_model.model_path) app_name = "test-app" result = CliRunner(env={ "LC_ALL": "en_US.UTF-8", "LANG": "en_US.UTF-8" }).invoke( mfscli.commands, [ "deploy", "-a", app_name, "-m", model_s3_uri, "--mode", mfs.DEPLOYMENT_MODE_CREATE ], ) assert result.exit_code == 0 region_name = sagemaker_client.meta.region_name s3_client = boto3.client("s3", region_name=region_name) default_bucket = mfs._get_default_s3_bucket(region_name) endpoint_description = sagemaker_client.describe_endpoint( EndpointName=app_name) endpoint_production_variants = endpoint_description["ProductionVariants"] assert len(endpoint_production_variants) == 1 model_name = endpoint_production_variants[0]["VariantName"] assert model_name in [ model["ModelName"] for model in sagemaker_client.list_models()["Models"] ] object_names = [ entry["Key"] for entry in s3_client.list_objects(Bucket=default_bucket)["Contents"] ] assert any([model_name in object_name for object_name in object_names]) assert any([ app_name in config["EndpointConfigName"] for config in sagemaker_client.list_endpoint_configs()["EndpointConfigs"] ]) assert app_name in [ endpoint["EndpointName"] for endpoint in sagemaker_client.list_endpoints()["Endpoints"] ] model_environment = sagemaker_client.describe_model( ModelName=model_name)["PrimaryContainer"]["Environment"] assert model_environment == { "MLFLOW_DEPLOYMENT_FLAVOR_NAME": "python_function", "SERVING_ENVIRONMENT": "SageMaker", }
def test_model_load_from_remote_uri_succeeds(model, model_path, mock_s3_bucket, data, predicted): x, _ = data mlflow.keras.save_model(model, model_path) artifact_root = "s3://{bucket_name}".format(bucket_name=mock_s3_bucket) artifact_path = "model" artifact_repo = S3ArtifactRepository(artifact_root) artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) model_uri = artifact_root + "/" + artifact_path model_loaded = mlflow.keras.load_model(model_uri=model_uri) assert all(model_loaded.predict(x) == predicted)
def test_deploy_cli_creates_sagemaker_and_s3_resources_with_expected_names_from_s3( pretrained_model, sagemaker_client): local_model_path = _download_artifact_from_uri(pretrained_model.model_uri) artifact_path = "model" region_name = sagemaker_client.meta.region_name default_bucket = mfs._get_default_s3_bucket(region_name) s3_artifact_repo = S3ArtifactRepository('s3://{}'.format(default_bucket)) s3_artifact_repo.log_artifacts(local_model_path, artifact_path=artifact_path) model_s3_uri = 's3://{bucket_name}/{artifact_path}'.format( bucket_name=default_bucket, artifact_path=pretrained_model.model_path) app_name = "test-app" result = CliRunner(env={ "LC_ALL": "en_US.UTF-8", "LANG": "en_US.UTF-8" }).invoke(mfscli.commands, [ 'deploy', '-a', app_name, '-m', model_s3_uri, '--mode', mfs.DEPLOYMENT_MODE_CREATE, ]) assert result.exit_code == 0 region_name = sagemaker_client.meta.region_name s3_client = boto3.client("s3", region_name=region_name) default_bucket = mfs._get_default_s3_bucket(region_name) endpoint_description = sagemaker_client.describe_endpoint( EndpointName=app_name) endpoint_production_variants = endpoint_description["ProductionVariants"] assert len(endpoint_production_variants) == 1 model_name = endpoint_production_variants[0]["VariantName"] assert model_name in [ model["ModelName"] for model in sagemaker_client.list_models()["Models"] ] object_names = [ entry["Key"] for entry in s3_client.list_objects(Bucket=default_bucket)["Contents"] ] assert any([model_name in object_name for object_name in object_names]) assert any([ app_name in config["EndpointConfigName"] for config in sagemaker_client.list_endpoint_configs()["EndpointConfigs"] ]) assert app_name in [ endpoint["EndpointName"] for endpoint in sagemaker_client.list_endpoints()["Endpoints"] ]
def test_load_model_from_remote_uri_succeeds( sequential_model, model_path, mock_s3_bucket, data, sequential_predicted ): mlflow.pytorch.save_model(sequential_model, model_path) artifact_root = "s3://{bucket_name}".format(bucket_name=mock_s3_bucket) artifact_path = "model" artifact_repo = S3ArtifactRepository(artifact_root) artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) model_uri = artifact_root + "/" + artifact_path sequential_model_loaded = mlflow.pytorch.load_model(model_uri=model_uri) np.testing.assert_array_equal(_predict(sequential_model_loaded, data), sequential_predicted)
def test_model_load_from_remote_uri_succeeds(reg_model, model_path, mock_s3_bucket): model, inference_dataframe = reg_model mlflow.catboost.save_model(cb_model=model, path=model_path) artifact_root = "s3://{bucket_name}".format(bucket_name=mock_s3_bucket) artifact_repo = S3ArtifactRepository(artifact_root) artifact_path = "model" artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) model_uri = artifact_root + "/" + artifact_path loaded_model = mlflow.catboost.load_model(model_uri=model_uri) np.testing.assert_array_almost_equal( model.predict(inference_dataframe), loaded_model.predict(inference_dataframe), )
def test_diviner_load_from_remote_uri_succeeds(grouped_pmdarima, model_path, mock_s3_bucket): mlflow.diviner.save_model(diviner_model=grouped_pmdarima, path=model_path) artifact_root = f"s3://{mock_s3_bucket}" artifact_path = "model" artifact_repo = S3ArtifactRepository(artifact_root) artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) # NB: cloudpathlib would need to be used here to handle object store uri model_uri = os.path.join(artifact_root, artifact_path) reloaded_model = mlflow.diviner.load_model(model_uri=model_uri) pd.testing.assert_frame_equal(grouped_pmdarima.predict(10), reloaded_model.predict(10))
def test_model_load_from_remote_uri_succeeds(sklearn_knn_model, model_path, mock_s3_bucket): mlflow.sklearn.save_model(sk_model=sklearn_knn_model.model, path=model_path) artifact_root = "s3://{bucket_name}".format(bucket_name=mock_s3_bucket) artifact_path = "model" artifact_repo = S3ArtifactRepository(artifact_root) artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) model_uri = artifact_root + "/" + artifact_path reloaded_knn_model = mlflow.sklearn.load_model(model_uri=model_uri) np.testing.assert_array_equal( sklearn_knn_model.model.predict(sklearn_knn_model.inference_data), reloaded_knn_model.predict(sklearn_knn_model.inference_data))
def test_sparkml_model_load_from_remote_uri_succeeds(spark_model_iris, model_path, mock_s3_bucket): sparkm.save_model(spark_model=spark_model_iris.model, path=model_path) artifact_root = "s3://{bucket_name}".format(bucket_name=mock_s3_bucket) artifact_path = "model" artifact_repo = S3ArtifactRepository(artifact_root) artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) model_uri = artifact_root + "/" + artifact_path reloaded_model = sparkm.load_model(model_uri=model_uri) preds_df = reloaded_model.transform(spark_model_iris.spark_df) preds = [x.prediction for x in preds_df.select("prediction").collect()] assert spark_model_iris.predictions == preds
def test_model_load_from_remote_uri_succeeds(xgb_model, model_path, mock_s3_bucket): mlflow.xgboost.save_model(xgb_model=xgb_model.model, path=model_path) artifact_root = "s3://{bucket_name}".format(bucket_name=mock_s3_bucket) artifact_path = "model" artifact_repo = S3ArtifactRepository(artifact_root) artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) model_uri = artifact_root + "/" + artifact_path reloaded_model = mlflow.xgboost.load_model(model_uri=model_uri) np.testing.assert_array_almost_equal( xgb_model.model.predict(xgb_model.inference_dmatrix), reloaded_model.predict(xgb_model.inference_dmatrix))
def test_model_load_from_remote_uri_succeeds(prophet_model, model_path, mock_s3_bucket): mlflow.prophet.save_model(pr_model=prophet_model.model, path=model_path) artifact_root = "s3://{bucket_name}".format(bucket_name=mock_s3_bucket) artifact_path = "model" artifact_repo = S3ArtifactRepository(artifact_root) artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) model_uri = os.path.join(artifact_root, artifact_path) reloaded_prophet_model = mlflow.prophet.load_model(model_uri=model_uri) np.testing.assert_array_equal( generate_forecast(prophet_model.model, FORECAST_HORIZON), generate_forecast(reloaded_prophet_model, FORECAST_HORIZON), )
def test_model_load_from_remote_uri_succeeds(pd_model, model_path, mock_s3_bucket): mlflow.paddle.save_model(pd_model=pd_model.model, path=model_path) artifact_root = "s3://{bucket_name}".format(bucket_name=mock_s3_bucket) artifact_path = "model" artifact_repo = S3ArtifactRepository(artifact_root) artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) model_uri = artifact_root + "/" + artifact_path reloaded_model = mlflow.paddle.load_model(model_uri=model_uri) np.testing.assert_array_almost_equal( pd_model.model(pd_model.inference_dataframe), reloaded_model(pd_model.inference_dataframe), decimal=5, )
def test_model_load_from_remote_uri_succeeds(arma_model, model_path, mock_s3_bucket): mlflow.statsmodels.save_model(statsmodels_model=arma_model.model, path=model_path) artifact_root = "s3://{bucket_name}".format(bucket_name=mock_s3_bucket) artifact_path = "model" artifact_repo = S3ArtifactRepository(artifact_root) artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) model_uri = artifact_root + "/" + artifact_path reloaded_model = mlflow.statsmodels.load_model(model_uri=model_uri) start_date, end_date = _get_dates_from_df(arma_model.inference_dataframe) np.testing.assert_array_almost_equal( arma_model.model.predict(start=start_date, end=end_date), reloaded_model.predict(start=start_date, end=end_date), )
def test_deploy_with_remote_uri_calls_expected_azure_routines( sklearn_model, model_path, mock_s3_bucket): mlflow.sklearn.save_model(sk_model=sklearn_model, path=model_path) artifact_path = "model" artifact_root = "s3://{bucket_name}".format(bucket_name=mock_s3_bucket) s3_artifact_repo = S3ArtifactRepository(artifact_root) s3_artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) model_uri = artifact_root + "/" + artifact_path with AzureMLMocks() as aml_mocks: workspace = get_azure_workspace() mlflow.azureml.deploy(model_uri=model_uri, workspace=workspace) assert aml_mocks["register_model"].call_count == 1 assert aml_mocks["model_deploy"].call_count == 1
def test_pmdarima_load_from_remote_uri_succeeds(auto_arima_object_model, model_path, mock_s3_bucket): mlflow.pmdarima.save_model(pmdarima_model=auto_arima_object_model, path=model_path) artifact_root = f"s3://{mock_s3_bucket}" artifact_path = "model" artifact_repo = S3ArtifactRepository(artifact_root) artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) model_uri = os.path.join(artifact_root, artifact_path) reloaded_pmdarima_model = mlflow.pmdarima.load_model(model_uri=model_uri) np.testing.assert_array_equal(auto_arima_object_model.predict(30), reloaded_pmdarima_model.predict(30))
def test_create_deployment_creates_sagemaker_and_s3_resources_with_expected_names_and_env_from_s3( pretrained_model, sagemaker_client, sagemaker_deployment_client ): local_model_path = _download_artifact_from_uri(pretrained_model.model_uri) artifact_path = "model" region_name = sagemaker_client.meta.region_name default_bucket = mfs._get_default_s3_bucket(region_name) s3_artifact_repo = S3ArtifactRepository("s3://{}".format(default_bucket)) s3_artifact_repo.log_artifacts(local_model_path, artifact_path=artifact_path) model_s3_uri = "s3://{bucket_name}/{artifact_path}".format( bucket_name=default_bucket, artifact_path=pretrained_model.model_path ) name = "test-app" sagemaker_deployment_client.create_deployment( name=name, model_uri=model_s3_uri, ) endpoint_description = sagemaker_client.describe_endpoint(EndpointName=name) endpoint_production_variants = endpoint_description["ProductionVariants"] assert len(endpoint_production_variants) == 1 model_name = endpoint_production_variants[0]["VariantName"] assert model_name in [model["ModelName"] for model in sagemaker_client.list_models()["Models"]] s3_client = boto3.client("s3", region_name=region_name) object_names = [ entry["Key"] for entry in s3_client.list_objects(Bucket=default_bucket)["Contents"] ] assert any([model_name in object_name for object_name in object_names]) assert any( [ name in config["EndpointConfigName"] for config in sagemaker_client.list_endpoint_configs()["EndpointConfigs"] ] ) assert name in [ endpoint["EndpointName"] for endpoint in sagemaker_client.list_endpoints()["Endpoints"] ] model_environment = sagemaker_client.describe_model(ModelName=model_name)["PrimaryContainer"][ "Environment" ] assert model_environment == { "MLFLOW_DEPLOYMENT_FLAVOR_NAME": "python_function", "SERVING_ENVIRONMENT": "SageMaker", }
def test_model_load_from_remote_uri_succeeds(fastai_model, model_path, mock_s3_bucket): model = fastai_model.model mlflow.fastai.save_model(fastai_learner=fastai_model.model, path=model_path) artifact_root = "s3://{bucket_name}".format(bucket_name=mock_s3_bucket) artifact_path = "model" artifact_repo = S3ArtifactRepository(artifact_root) artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) model_uri = artifact_root + "/" + artifact_path reloaded_model = mlflow.fastai.load_model(model_uri=model_uri) model_wrapper = mlflow.fastai._FastaiModelWrapper(model) reloaded_model_wrapper = mlflow.fastai._FastaiModelWrapper(reloaded_model) compare_wrapper_results( model_wrapper.predict(fastai_model.inference_dataframe), reloaded_model_wrapper.predict(fastai_model.inference_dataframe))
def test_deploy_creates_sagemaker_and_s3_resources_with_expected_names_from_s3( pretrained_model, sagemaker_client): local_model_path = _download_artifact_from_uri(pretrained_model.model_uri) artifact_path = "model" region_name = sagemaker_client.meta.region_name default_bucket = mfs._get_default_s3_bucket(region_name) s3_artifact_repo = S3ArtifactRepository("s3://{}".format(default_bucket)) s3_artifact_repo.log_artifacts(local_model_path, artifact_path=artifact_path) model_s3_uri = "s3://{bucket_name}/{artifact_path}".format( bucket_name=default_bucket, artifact_path=pretrained_model.model_path) app_name = "test-app" mfs.deploy(app_name=app_name, model_uri=model_s3_uri, mode=mfs.DEPLOYMENT_MODE_CREATE) endpoint_description = sagemaker_client.describe_endpoint( EndpointName=app_name) endpoint_production_variants = endpoint_description["ProductionVariants"] assert len(endpoint_production_variants) == 1 model_name = endpoint_production_variants[0]["VariantName"] assert model_name in [ model["ModelName"] for model in sagemaker_client.list_models()["Models"] ] s3_client = boto3.client("s3", region_name=region_name) object_names = [ entry["Key"] for entry in s3_client.list_objects(Bucket=default_bucket)["Contents"] ] assert any([model_name in object_name for object_name in object_names]) assert any([ app_name in config["EndpointConfigName"] for config in sagemaker_client.list_endpoint_configs()["EndpointConfigs"] ]) assert app_name in [ endpoint["EndpointName"] for endpoint in sagemaker_client.list_endpoints()["Endpoints"] ]
def test_deploy_creates_sagemaker_transform_job_and_s3_resources_with_expected_names_from_s3( pretrained_model, sagemaker_client): local_model_path = _download_artifact_from_uri(pretrained_model.model_uri) artifact_path = "model" region_name = sagemaker_client.meta.region_name default_bucket = mfs._get_default_s3_bucket(region_name) s3_artifact_repo = S3ArtifactRepository("s3://{}".format(default_bucket)) s3_artifact_repo.log_artifacts(local_model_path, artifact_path=artifact_path) model_s3_uri = "s3://{bucket_name}/{artifact_path}".format( bucket_name=default_bucket, artifact_path=pretrained_model.model_path) job_name = "test-job" mfs.deploy_transform_job( job_name=job_name, model_uri=model_s3_uri, s3_input_data_type="Some Data Type", s3_input_uri="Some Input Uri", content_type="Some Content Type", s3_output_path="Some Output Path", archive=True, ) transform_job_description = sagemaker_client.describe_transform_job( TransformJobName=job_name) model_name = transform_job_description["ModelName"] assert model_name in [ model["ModelName"] for model in sagemaker_client.list_models()["Models"] ] s3_client = boto3.client("s3", region_name=region_name) object_names = [ entry["Key"] for entry in s3_client.list_objects(Bucket=default_bucket)["Contents"] ] assert any([model_name in object_name for object_name in object_names]) assert job_name in [ transform_job["TransformJobName"] for transform_job in sagemaker_client.list_transform_jobs()["TransformJobSummaries"] ]
def test_model_built_in_high_level_api_load_from_remote_uri_succeeds( pd_model_built_in_high_level_api, model_path, mock_s3_bucket): model = pd_model_built_in_high_level_api.model test_dataset = pd_model_built_in_high_level_api.inference_dataframe mlflow.paddle.save_model(pd_model=model, path=model_path) artifact_root = "s3://{bucket_name}".format(bucket_name=mock_s3_bucket) artifact_path = "model" artifact_repo = S3ArtifactRepository(artifact_root) artifact_repo.log_artifacts(model_path, artifact_path=artifact_path) model_uri = artifact_root + "/" + artifact_path reloaded_model = mlflow.paddle.load_model(model_uri=model_uri) low_level_test_dataset = [x[0] for x in test_dataset] np.testing.assert_array_almost_equal( np.array(model.predict(test_dataset)).squeeze(), np.array(reloaded_model(np.array(low_level_test_dataset))).squeeze(), decimal=5, )
def test_get_s3_file_upload_extra_args_env_var_not_present(): parsed_args = S3ArtifactRepository.get_s3_file_upload_extra_args() assert parsed_args is None