From 637bc2e2b6ec1bf3ff93b69e687e8ab71c6340ab Mon Sep 17 00:00:00 2001 From: Gokul A <166456257+nargokul@users.noreply.github.com> Date: Fri, 20 Dec 2024 09:31:54 -0800 Subject: [PATCH 1/9] Fix Flake8 Violations --- .../model_server/multi_model_server/inference.py | 14 ++++++++++++-- .../serve/model_server/torchserve/inference.py | 14 ++++++++++++-- .../model_server/torchserve/xgboost_inference.py | 14 ++++++++++++-- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/sagemaker/serve/model_server/multi_model_server/inference.py b/src/sagemaker/serve/model_server/multi_model_server/inference.py index 3cece40c5e..1d2440f5f9 100644 --- a/src/sagemaker/serve/model_server/multi_model_server/inference.py +++ b/src/sagemaker/serve/model_server/multi_model_server/inference.py @@ -45,11 +45,21 @@ def input_fn(input_data, content_type): try: if hasattr(schema_builder, "custom_input_translator"): deserialized_data = schema_builder.custom_input_translator.deserialize( - io.BytesIO(input_data) if type(input_data)== bytes else io.BytesIO(input_data.encode('utf-8')), content_type + ( + io.BytesIO(input_data) + if type(input_data) == bytes + else io.BytesIO(input_data.encode("utf-8")) + ), + content_type, ) else: deserialized_data = schema_builder.input_deserializer.deserialize( - io.BytesIO(input_data) if type(input_data)== bytes else io.BytesIO(input_data.encode('utf-8')), content_type[0] + ( + io.BytesIO(input_data) + if type(input_data) == bytes + else io.BytesIO(input_data.encode("utf-8")) + ), + content_type[0], ) # Check if preprocess method is defined and call it diff --git a/src/sagemaker/serve/model_server/torchserve/inference.py b/src/sagemaker/serve/model_server/torchserve/inference.py index 294c032ccc..489cc1bc1e 100644 --- a/src/sagemaker/serve/model_server/torchserve/inference.py +++ b/src/sagemaker/serve/model_server/torchserve/inference.py @@ -67,11 +67,21 @@ def input_fn(input_data, content_type): try: if hasattr(schema_builder, "custom_input_translator"): deserialized_data = schema_builder.custom_input_translator.deserialize( - io.BytesIO(input_data) if type(input_data)== bytes else io.BytesIO(input_data.encode('utf-8')), content_type + ( + io.BytesIO(input_data) + if type(input_data) == bytes + else io.BytesIO(input_data.encode("utf-8")) + ), + content_type, ) else: deserialized_data = schema_builder.input_deserializer.deserialize( - io.BytesIO(input_data) if type(input_data)== bytes else io.BytesIO(input_data.encode('utf-8')), content_type[0] + ( + io.BytesIO(input_data) + if type(input_data) == bytes + else io.BytesIO(input_data.encode("utf-8")) + ), + content_type[0], ) # Check if preprocess method is defined and call it diff --git a/src/sagemaker/serve/model_server/torchserve/xgboost_inference.py b/src/sagemaker/serve/model_server/torchserve/xgboost_inference.py index 6dab9bc6c6..517c774bbc 100644 --- a/src/sagemaker/serve/model_server/torchserve/xgboost_inference.py +++ b/src/sagemaker/serve/model_server/torchserve/xgboost_inference.py @@ -70,11 +70,21 @@ def input_fn(input_data, content_type): try: if hasattr(schema_builder, "custom_input_translator"): return schema_builder.custom_input_translator.deserialize( - io.BytesIO(input_data) if type(input_data)== bytes else io.BytesIO(input_data.encode('utf-8')), content_type + ( + io.BytesIO(input_data) + if type(input_data) == bytes + else io.BytesIO(input_data.encode("utf-8")) + ), + content_type, ) else: return schema_builder.input_deserializer.deserialize( - io.BytesIO(input_data) if type(input_data)== bytes else io.BytesIO(input_data.encode('utf-8')), content_type[0] + ( + io.BytesIO(input_data) + if type(input_data) == bytes + else io.BytesIO(input_data.encode("utf-8")) + ), + content_type[0], ) except Exception as e: raise Exception("Encountered error in deserialize_request.") from e From 8f2611511daee81569967c414f9a3bd4a1d53b84 Mon Sep 17 00:00:00 2001 From: Gokul A Date: Tue, 11 Mar 2025 11:38:12 -0700 Subject: [PATCH 2/9] UPDATE PYTORCH VERSION TO ADDRESS SECURITY RISK **Description** Currently used Pytorch version has a possible vulnerability . Internal - https://tiny.amazon.com/p5i4jla1 **Testing Done** Unit and Integration tests in the CodeBuild --- tests/data/modules/script_mode/requirements.txt | 2 +- tests/data/serve_resources/mlflow/pytorch/conda.yaml | 4 ++-- tests/data/serve_resources/mlflow/pytorch/requirements.txt | 4 ++-- tests/unit/sagemaker/jumpstart/constants.py | 2 +- tox.ini | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/data/modules/script_mode/requirements.txt b/tests/data/modules/script_mode/requirements.txt index da7441eee2..8bc00365b2 100644 --- a/tests/data/modules/script_mode/requirements.txt +++ b/tests/data/modules/script_mode/requirements.txt @@ -1,3 +1,3 @@ numpy -f https://download.pytorch.org/whl/torch_stable.html -torch==2.0.1+cpu +torch>=2.6.0+cpu diff --git a/tests/data/serve_resources/mlflow/pytorch/conda.yaml b/tests/data/serve_resources/mlflow/pytorch/conda.yaml index be61456197..beecdbab08 100644 --- a/tests/data/serve_resources/mlflow/pytorch/conda.yaml +++ b/tests/data/serve_resources/mlflow/pytorch/conda.yaml @@ -17,8 +17,8 @@ dependencies: - pandas==2.2.1 - pyyaml==6.0.1 - requests==2.31.0 - - torch==2.0.1 - - torchvision==0.15.2 + - torch>=2.6.0 + - torchvision>=0.17.0 - tqdm==4.66.2 - scikit-learn==1.3.2 name: mlflow-env diff --git a/tests/data/serve_resources/mlflow/pytorch/requirements.txt b/tests/data/serve_resources/mlflow/pytorch/requirements.txt index 0446ed5053..450bcbfada 100644 --- a/tests/data/serve_resources/mlflow/pytorch/requirements.txt +++ b/tests/data/serve_resources/mlflow/pytorch/requirements.txt @@ -11,6 +11,6 @@ packaging==21.3 pandas==2.2.1 pyyaml==6.0.1 requests==2.32.2 -torch==2.2.0 -torchvision==0.17.0 +torch>=2.6.0 +torchvision>=0.17.0 tqdm==4.66.3 diff --git a/tests/unit/sagemaker/jumpstart/constants.py b/tests/unit/sagemaker/jumpstart/constants.py index 59f38bd189..c3ccdc2626 100644 --- a/tests/unit/sagemaker/jumpstart/constants.py +++ b/tests/unit/sagemaker/jumpstart/constants.py @@ -17391,7 +17391,7 @@ "texttable==1.6.7", "tokenize-rt==5.1.0", "tokenizers==0.13.3", - "torch==2.2.0", + "torch>=2.6.0", "transformers==4.33.3", "triton==2.2.0", "typing-extensions==4.8.0", diff --git a/tox.ini b/tox.ini index b16c0d2f0b..9000787e83 100644 --- a/tox.ini +++ b/tox.ini @@ -83,8 +83,8 @@ passenv = commands = python -c "import os; os.system('install-custom-pkgs --install-boto-wheels')" pip install 'apache-airflow==2.9.3' --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.9.3/constraints-3.8.txt" - pip install 'torch==2.0.1+cpu' -f 'https://download.pytorch.org/whl/torch_stable.html' - pip install 'torchvision==0.15.2+cpu' -f 'https://download.pytorch.org/whl/torch_stable.html' + pip install 'torch>=2.6.0+cpu' -f 'https://download.pytorch.org/whl/torch_stable.html' + pip install 'torchvision>=0.17.0+cpu' -f 'https://download.pytorch.org/whl/torch_stable.html' pip install 'dill>=0.3.8' pytest {posargs} From 4a1701636e0f9ef7fbb526310a7d4dbe56e31552 Mon Sep 17 00:00:00 2001 From: Gokul A Date: Tue, 11 Mar 2025 12:19:19 -0700 Subject: [PATCH 3/9] REvert CPU Versions --- tests/data/modules/script_mode/requirements.txt | 2 +- tox.ini | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/data/modules/script_mode/requirements.txt b/tests/data/modules/script_mode/requirements.txt index 8bc00365b2..da7441eee2 100644 --- a/tests/data/modules/script_mode/requirements.txt +++ b/tests/data/modules/script_mode/requirements.txt @@ -1,3 +1,3 @@ numpy -f https://download.pytorch.org/whl/torch_stable.html -torch>=2.6.0+cpu +torch==2.0.1+cpu diff --git a/tox.ini b/tox.ini index 9000787e83..b16c0d2f0b 100644 --- a/tox.ini +++ b/tox.ini @@ -83,8 +83,8 @@ passenv = commands = python -c "import os; os.system('install-custom-pkgs --install-boto-wheels')" pip install 'apache-airflow==2.9.3' --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.9.3/constraints-3.8.txt" - pip install 'torch>=2.6.0+cpu' -f 'https://download.pytorch.org/whl/torch_stable.html' - pip install 'torchvision>=0.17.0+cpu' -f 'https://download.pytorch.org/whl/torch_stable.html' + pip install 'torch==2.0.1+cpu' -f 'https://download.pytorch.org/whl/torch_stable.html' + pip install 'torchvision==0.15.2+cpu' -f 'https://download.pytorch.org/whl/torch_stable.html' pip install 'dill>=0.3.8' pytest {posargs} From 3ef59584eda8021ae5719d87a3954e690be99830 Mon Sep 17 00:00:00 2001 From: Gokul A Date: Wed, 12 Mar 2025 14:36:56 -0700 Subject: [PATCH 4/9] Test Fix --- .../serve/test_serve_mlflow_pytorch_flavor_happy.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py b/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py index e6beb76d6e..44c21404b1 100644 --- a/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py +++ b/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py @@ -18,6 +18,7 @@ import os import io import numpy as np +from sagemaker import image_uris from sagemaker.lineage.artifact import Artifact from sagemaker.lineage.association import Association @@ -196,6 +197,14 @@ def test_happy_pytorch_sagemaker_endpoint_with_torch_serve( ) model_builder = ModelBuilder( + image_uri=image_uris.retrieve( + framework="pytorch", + region=sagemaker_session.boto_region_name, + version="2.2.0", # Compatible version for py310 + image_scope="inference", + py_version="py310", + instance_type=cpu_instance_type, + ), mode=Mode.SAGEMAKER_ENDPOINT, schema_builder=squeezenet_schema, role_arn=role_arn, From 211eb1866e211ce200fc84fd18362fcc0227573a Mon Sep 17 00:00:00 2001 From: Gokul A Date: Wed, 12 Mar 2025 14:44:24 -0700 Subject: [PATCH 5/9] Codestyle fixes --- tests/integ/sagemaker/experiments/helpers.py | 2 +- .../sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integ/sagemaker/experiments/helpers.py b/tests/integ/sagemaker/experiments/helpers.py index 656cccd8dc..828ecd8868 100644 --- a/tests/integ/sagemaker/experiments/helpers.py +++ b/tests/integ/sagemaker/experiments/helpers.py @@ -55,4 +55,4 @@ def clear_run_context(): f" in experiment {current_run.experiment_name}." " Clearing context manually" ) - _RunContext.drop_current_run() \ No newline at end of file + _RunContext.drop_current_run() diff --git a/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py b/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py index 44c21404b1..216b58b743 100644 --- a/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py +++ b/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py @@ -200,7 +200,7 @@ def test_happy_pytorch_sagemaker_endpoint_with_torch_serve( image_uri=image_uris.retrieve( framework="pytorch", region=sagemaker_session.boto_region_name, - version="2.2.0", # Compatible version for py310 + version="2.2.0", # Compatible version for py310 image_scope="inference", py_version="py310", instance_type=cpu_instance_type, From a60925ccba455ba1670397326aec59e401c6d863 Mon Sep 17 00:00:00 2001 From: Gokul A Date: Thu, 13 Mar 2025 12:46:21 -0700 Subject: [PATCH 6/9] debug attempt --- .../serve/test_serve_mlflow_pytorch_flavor_happy.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py b/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py index 216b58b743..8cbc619152 100644 --- a/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py +++ b/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py @@ -236,10 +236,10 @@ def test_happy_pytorch_sagemaker_endpoint_with_torch_serve( except Exception as e: caught_ex = e finally: - cleanup_model_resources( - sagemaker_session=model_builder.sagemaker_session, - model_name=model.name, - endpoint_name=model.endpoint_name, - ) + # cleanup_model_resources( + # sagemaker_session=model_builder.sagemaker_session, + # model_name=model.name, + # endpoint_name=model.endpoint_name, + # ) if caught_ex: raise caught_ex From b348bdcf64529355bbb559cd350427071182f932 Mon Sep 17 00:00:00 2001 From: Gokul A Date: Thu, 13 Mar 2025 13:23:12 -0700 Subject: [PATCH 7/9] Fixes --- tests/integ/sagemaker/experiments/helpers.py | 3 ++- .../test_serve_mlflow_pytorch_flavor_happy.py | 27 +++++++------------ 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/tests/integ/sagemaker/experiments/helpers.py b/tests/integ/sagemaker/experiments/helpers.py index 828ecd8868..c8f35471b1 100644 --- a/tests/integ/sagemaker/experiments/helpers.py +++ b/tests/integ/sagemaker/experiments/helpers.py @@ -44,10 +44,11 @@ def cleanup_exp_resources(exp_names, sagemaker_session): exp = Experiment.load(experiment_name=exp_name, sagemaker_session=sagemaker_session) exp._delete_all(action="--force") + @pytest.fixture def clear_run_context(): current_run = _RunContext.get_current_run() - if current_run == None: + if current_run is None: return logging.info( diff --git a/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py b/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py index 8cbc619152..a837a58995 100644 --- a/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py +++ b/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py @@ -18,7 +18,6 @@ import os import io import numpy as np -from sagemaker import image_uris from sagemaker.lineage.artifact import Artifact from sagemaker.lineage.association import Association @@ -44,7 +43,7 @@ logger = logging.getLogger(__name__) -ROLE_NAME = "SageMakerRole" +ROLE_NAME = "Admin" @pytest.fixture @@ -167,9 +166,9 @@ def model_builder(request): # ), f"{caught_ex} was thrown when running pytorch squeezenet local container test" -@pytest.mark.skipif( - PYTHON_VERSION_IS_NOT_310, # or NOT_RUNNING_ON_INF_EXP_DEV_PIPELINE, - reason="The goal of these test are to test the serving components of our feature", +@pytest.mark.skip( + reason="Testing against Python version 310 which is not supported anymore" + " https://github.com/aws/deep-learning-containers/blob/master/available_images.md", ) def test_happy_pytorch_sagemaker_endpoint_with_torch_serve( sagemaker_session, @@ -197,14 +196,6 @@ def test_happy_pytorch_sagemaker_endpoint_with_torch_serve( ) model_builder = ModelBuilder( - image_uri=image_uris.retrieve( - framework="pytorch", - region=sagemaker_session.boto_region_name, - version="2.2.0", # Compatible version for py310 - image_scope="inference", - py_version="py310", - instance_type=cpu_instance_type, - ), mode=Mode.SAGEMAKER_ENDPOINT, schema_builder=squeezenet_schema, role_arn=role_arn, @@ -236,10 +227,10 @@ def test_happy_pytorch_sagemaker_endpoint_with_torch_serve( except Exception as e: caught_ex = e finally: - # cleanup_model_resources( - # sagemaker_session=model_builder.sagemaker_session, - # model_name=model.name, - # endpoint_name=model.endpoint_name, - # ) + cleanup_model_resources( + sagemaker_session=model_builder.sagemaker_session, + model_name=model.name, + endpoint_name=model.endpoint_name, + ) if caught_ex: raise caught_ex From 7e49b47d67bd33cdae1195e30766c948924b9474 Mon Sep 17 00:00:00 2001 From: Gokul A Date: Thu, 13 Mar 2025 13:29:52 -0700 Subject: [PATCH 8/9] Fix --- .../sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py b/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py index a837a58995..97d75cd7d5 100644 --- a/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py +++ b/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py @@ -43,7 +43,7 @@ logger = logging.getLogger(__name__) -ROLE_NAME = "Admin" +ROLE_NAME = "SageMakerRole" @pytest.fixture From 2870e2b15ba6ae3e786fee01ab884661d6a17663 Mon Sep 17 00:00:00 2001 From: Gokul A Date: Thu, 13 Mar 2025 13:36:08 -0700 Subject: [PATCH 9/9] Fix --- .../sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py b/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py index 97d75cd7d5..38ef1e28a3 100644 --- a/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py +++ b/tests/integ/sagemaker/serve/test_serve_mlflow_pytorch_flavor_happy.py @@ -168,7 +168,7 @@ def model_builder(request): @pytest.mark.skip( reason="Testing against Python version 310 which is not supported anymore" - " https://github.com/aws/deep-learning-containers/blob/master/available_images.md", + " https://github.com/aws/deep-learning-containers/blob/master/available_images.md", ) def test_happy_pytorch_sagemaker_endpoint_with_torch_serve( sagemaker_session,