Skip to content

Commit c8e4dbf

Browse files
authored
Merge branch 'master' into registry
2 parents 3c84ebf + e63fb97 commit c8e4dbf

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+211
-12
lines changed

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
# Changelog
22

3+
## v2.129.0 (2023-01-19)
4+
5+
### Features
6+
7+
* add p2 deprecation for PT>=1.13
8+
* TF2.11 Update to PySDK
9+
10+
### Bug Fixes and Other Changes
11+
12+
* Improve Pipeline integ tests and fix resource leak
13+
* Update TF version to 2.8.4
14+
315
## v2.128.0 (2023-01-10)
416

517
### Features

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.128.1.dev0
1+
2.129.1.dev0

src/sagemaker/fw_utils.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,20 @@ def tar_and_upload_dir(
422422
script_name = script if directory else os.path.basename(script)
423423
dependencies = dependencies or []
424424
key = "%s/sourcedir.tar.gz" % s3_key_prefix
425-
tmp = tempfile.mkdtemp()
425+
if (
426+
settings is not None
427+
and settings.local_download_dir is not None
428+
and not (
429+
os.path.exists(settings.local_download_dir)
430+
and os.path.isdir(settings.local_download_dir)
431+
)
432+
):
433+
raise ValueError(
434+
"Inputted directory for storing newly generated temporary directory does "
435+
f"not exist: '{settings.local_download_dir}'"
436+
)
437+
local_download_dir = None if settings is None else settings.local_download_dir
438+
tmp = tempfile.mkdtemp(dir=local_download_dir)
426439
encrypt_artifact = True if settings is None else settings.encrypt_repacked_artifacts
427440

428441
try:

src/sagemaker/session_settings.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,25 @@
1818
class SessionSettings(object):
1919
"""Optional container class for settings to apply to a SageMaker session."""
2020

21-
def __init__(self, encrypt_repacked_artifacts=True) -> None:
21+
def __init__(self, encrypt_repacked_artifacts=True, local_download_dir=None) -> None:
2222
"""Initialize the ``SessionSettings`` of a SageMaker ``Session``.
2323
2424
Args:
2525
encrypt_repacked_artifacts (bool): Flag to indicate whether to encrypt the artifacts
2626
at rest in S3 using the default AWS managed KMS key for S3 when a custom KMS key
2727
is not provided (Default: True).
28+
local_download_dir (str): Optional. A path specifying the local directory
29+
for downloading artifacts. (Default: None).
2830
"""
2931
self._encrypt_repacked_artifacts = encrypt_repacked_artifacts
32+
self._local_download_dir = local_download_dir
3033

3134
@property
3235
def encrypt_repacked_artifacts(self) -> bool:
3336
"""Return True if repacked artifacts at rest in S3 should be encrypted by default."""
3437
return self._encrypt_repacked_artifacts
38+
39+
@property
40+
def local_download_dir(self) -> str:
41+
"""Return path specifying the local directory for downloading artifacts."""
42+
return self._local_download_dir

src/sagemaker/utils.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ def create_tar_file(source_files, target=None):
358358

359359

360360
@contextlib.contextmanager
361-
def _tmpdir(suffix="", prefix="tmp"):
361+
def _tmpdir(suffix="", prefix="tmp", directory=None):
362362
"""Create a temporary directory with a context manager.
363363
364364
The file is deleted when the context exits.
@@ -369,11 +369,18 @@ def _tmpdir(suffix="", prefix="tmp"):
369369
suffix, otherwise there will be no suffix.
370370
prefix (str): If prefix is specified, the file name will begin with that
371371
prefix; otherwise, a default prefix is used.
372+
directory (str): If a directory is specified, the file will be downloaded
373+
in this directory; otherwise, a default directory is used.
372374
373375
Returns:
374376
str: path to the directory
375377
"""
376-
tmp = tempfile.mkdtemp(suffix=suffix, prefix=prefix, dir=None)
378+
if directory is not None and not (os.path.exists(directory) and os.path.isdir(directory)):
379+
raise ValueError(
380+
"Inputted directory for storing newly generated temporary "
381+
f"directory does not exist: '{directory}'"
382+
)
383+
tmp = tempfile.mkdtemp(suffix=suffix, prefix=prefix, dir=directory)
377384
yield tmp
378385
shutil.rmtree(tmp)
379386

@@ -427,7 +434,13 @@ def repack_model(
427434
"""
428435
dependencies = dependencies or []
429436

430-
with _tmpdir() as tmp:
437+
local_download_dir = (
438+
None
439+
if sagemaker_session.settings is None
440+
or sagemaker_session.settings.local_download_dir is None
441+
else sagemaker_session.settings.local_download_dir
442+
)
443+
with _tmpdir(directory=local_download_dir) as tmp:
431444
model_dir = _extract_model(model_uri, sagemaker_session, tmp)
432445

433446
_create_or_update_code_dir(

tests/unit/sagemaker/automl/test_auto_ml.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from mock import Mock, patch
1919
from sagemaker import AutoML, AutoMLJob, AutoMLInput, CandidateEstimator, PipelineModel
2020
from sagemaker.predictor import Predictor
21+
from sagemaker.session_settings import SessionSettings
2122
from sagemaker.workflow.functions import Join
2223

2324
MODEL_DATA = "s3://bucket/model.tar.gz"
@@ -254,6 +255,7 @@ def sagemaker_session():
254255
boto_region_name=REGION,
255256
config=None,
256257
local_mode=False,
258+
settings=SessionSettings(),
257259
)
258260
sms.default_bucket = Mock(name="default_bucket", return_value=BUCKET_NAME)
259261
sms.upload_data = Mock(name="upload_data", return_value=DEFAULT_S3_INPUT_DATA)

tests/unit/sagemaker/huggingface/test_estimator.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
from mock import MagicMock, Mock, patch
2121

2222
from sagemaker.huggingface import HuggingFace, HuggingFaceModel
23+
from sagemaker.session_settings import SessionSettings
24+
2325

2426
from .huggingface_utils import get_full_gpu_image_uri, GPU_INSTANCE_TYPE, REGION
2527

@@ -63,6 +65,7 @@ def fixture_sagemaker_session():
6365
local_mode=False,
6466
s3_resource=None,
6567
s3_client=None,
68+
settings=SessionSettings(),
6669
)
6770

6871
describe = {"ModelArtifacts": {"S3ModelArtifacts": "s3://m/m.tar.gz"}}

tests/unit/sagemaker/huggingface/test_processing.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
from sagemaker.huggingface.processing import HuggingFaceProcessor
1919
from sagemaker.fw_utils import UploadedCode
20+
from sagemaker.session_settings import SessionSettings
2021

2122
from .huggingface_utils import get_full_gpu_image_uri, GPU_INSTANCE_TYPE, REGION
2223

@@ -42,6 +43,7 @@ def sagemaker_session():
4243
boto_region_name=REGION,
4344
config=None,
4445
local_mode=False,
46+
settings=SessionSettings(),
4547
)
4648
session_mock.default_bucket = Mock(name="default_bucket", return_value=BUCKET_NAME)
4749

tests/unit/sagemaker/image_uris/jumpstart/conftest.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
from mock.mock import Mock
1616
import pytest
1717

18+
from sagemaker.session_settings import SessionSettings
19+
1820
REGION_NAME = "us-west-2"
1921
BUCKET_NAME = "some-bucket-name"
2022

@@ -26,6 +28,7 @@ def session():
2628
boto_session=boto_mock,
2729
boto_region_name=REGION_NAME,
2830
config=None,
31+
settings=SessionSettings(),
2932
)
3033
sms.default_bucket = Mock(return_value=BUCKET_NAME)
3134
return sms

tests/unit/sagemaker/local/test_local_utils.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from mock import patch, Mock
1818

1919
import sagemaker.local.utils
20+
from sagemaker.session_settings import SessionSettings
2021

2122

2223
@patch("sagemaker.local.utils.os.path")
@@ -42,7 +43,9 @@ def test_move_to_destination_local(recursive_copy):
4243
@patch("shutil.rmtree", Mock())
4344
@patch("sagemaker.local.utils.recursive_copy")
4445
def test_move_to_destination_s3(recursive_copy):
45-
sms = Mock()
46+
sms = Mock(
47+
settings=SessionSettings(),
48+
)
4649

4750
# without trailing slash in prefix
4851
sagemaker.local.utils.move_to_destination("/tmp/data", "s3://bucket/path", "job", sms)

tests/unit/sagemaker/model/test_framework_model.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import pytest
2222
from mock import MagicMock, Mock, patch
2323

24+
from sagemaker.session_settings import SessionSettings
25+
2426
MODEL_DATA = "s3://bucket/model.tar.gz"
2527
MODEL_IMAGE = "mi"
2628
ENTRY_POINT = "blah.py"
@@ -89,6 +91,7 @@ def sagemaker_session():
8991
local_mode=False,
9092
s3_client=None,
9193
s3_resource=None,
94+
settings=SessionSettings(),
9295
)
9396
sms.default_bucket = Mock(name="default_bucket", return_value=BUCKET_NAME)
9497
return sms

tests/unit/sagemaker/model/test_model.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -776,3 +776,27 @@ def test_register_calls_model_package_args(get_model_package_args, sagemaker_ses
776776
== get_model_package_args.call_args_list[0][1]["validation_specification"]
777777
), """ValidationSpecification from model.register method is not identical to validation_spec from
778778
get_model_package_args"""
779+
780+
781+
@patch("sagemaker.utils.repack_model")
782+
def test_model_local_download_dir(repack_model, sagemaker_session):
783+
784+
source_dir = "s3://blah/blah/blah"
785+
local_download_dir = "local download dir"
786+
787+
sagemaker_session.settings.local_download_dir = local_download_dir
788+
789+
t = Model(
790+
entry_point=ENTRY_POINT_INFERENCE,
791+
role=ROLE,
792+
sagemaker_session=sagemaker_session,
793+
source_dir=source_dir,
794+
image_uri=IMAGE_URI,
795+
model_data=MODEL_DATA,
796+
)
797+
t.deploy(instance_type=INSTANCE_TYPE, initial_instance_count=INSTANCE_COUNT)
798+
799+
assert (
800+
repack_model.call_args_list[0][1]["sagemaker_session"].settings.local_download_dir
801+
== local_download_dir
802+
)

tests/unit/sagemaker/spark/test_processing.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import pytest
1919

2020
from sagemaker.processing import ProcessingInput, ProcessingOutput
21+
from sagemaker.session_settings import SessionSettings
2122
from sagemaker.spark.processing import (
2223
PySparkProcessor,
2324
SparkJarProcessor,
@@ -57,6 +58,7 @@ def sagemaker_session():
5758
boto_region_name=REGION,
5859
config=None,
5960
local_mode=False,
61+
settings=SessionSettings(),
6062
)
6163
session_mock.default_bucket = Mock(name="default_bucket", return_value=BUCKET_NAME)
6264

tests/unit/sagemaker/tensorflow/test_estimator.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import pytest
2222

2323
from sagemaker.estimator import _TrainingJob
24+
from sagemaker.session_settings import SessionSettings
2425
from sagemaker.tensorflow import TensorFlow
2526
from sagemaker.instance_group import InstanceGroup
2627
from sagemaker.workflow.parameters import ParameterString, ParameterBoolean
@@ -71,6 +72,7 @@ def sagemaker_session():
7172
local_mode=False,
7273
s3_resource=None,
7374
s3_client=None,
75+
settings=SessionSettings(),
7476
)
7577
session.default_bucket = Mock(name="default_bucket", return_value=BUCKET_NAME)
7678
session.expand_role = Mock(name="expand_role", return_value=ROLE)

tests/unit/sagemaker/training_compiler/test_huggingface_pytorch_compiler.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from sagemaker.huggingface import HuggingFace, TrainingCompilerConfig
2525
from sagemaker.huggingface.model import HuggingFaceModel
2626
from sagemaker.instance_group import InstanceGroup
27+
from sagemaker.session_settings import SessionSettings
2728

2829
from tests.unit.sagemaker.training_compiler import EC2_GPU_INSTANCE_CLASSES
2930

@@ -72,6 +73,7 @@ def fixture_sagemaker_session():
7273
local_mode=False,
7374
s3_resource=None,
7475
s3_client=None,
76+
settings=SessionSettings(),
7577
)
7678

7779
describe = {"ModelArtifacts": {"S3ModelArtifacts": "s3://m/m.tar.gz"}}

tests/unit/sagemaker/training_compiler/test_huggingface_tensorflow_compiler.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from sagemaker import image_uris
2323
from sagemaker.huggingface import HuggingFace, TrainingCompilerConfig
2424
from sagemaker.huggingface.model import HuggingFaceModel
25+
from sagemaker.session_settings import SessionSettings
2526

2627
from tests.unit.sagemaker.training_compiler import EC2_GPU_INSTANCE_CLASSES
2728

@@ -70,6 +71,7 @@ def fixture_sagemaker_session():
7071
local_mode=False,
7172
s3_resource=None,
7273
s3_client=None,
74+
settings=SessionSettings(),
7375
)
7476

7577
describe = {"ModelArtifacts": {"S3ModelArtifacts": "s3://m/m.tar.gz"}}

tests/unit/sagemaker/training_compiler/test_pytorch_compiler.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from sagemaker.pytorch import PyTorch, TrainingCompilerConfig
2525
from sagemaker.pytorch.model import PyTorchModel
2626
from sagemaker.instance_group import InstanceGroup
27+
from sagemaker.session_settings import SessionSettings
2728

2829
from tests.unit.sagemaker.training_compiler import EC2_GPU_INSTANCE_CLASSES
2930

@@ -71,6 +72,7 @@ def fixture_sagemaker_session():
7172
local_mode=False,
7273
s3_resource=None,
7374
s3_client=None,
75+
settings=SessionSettings(),
7476
)
7577

7678
describe = {"ModelArtifacts": {"S3ModelArtifacts": "s3://m/m.tar.gz"}}

tests/unit/sagemaker/training_compiler/test_tensorflow_compiler.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from mock import MagicMock, Mock, patch
2222

2323
from sagemaker import image_uris
24+
from sagemaker.session_settings import SessionSettings
2425
from sagemaker.tensorflow import TensorFlow, TrainingCompilerConfig
2526

2627
from tests.unit.sagemaker.training_compiler import EC2_GPU_INSTANCE_CLASSES
@@ -76,6 +77,7 @@ def fixture_sagemaker_session():
7677
local_mode=False,
7778
s3_resource=None,
7879
s3_client=None,
80+
settings=SessionSettings(),
7981
)
8082

8183
describe = {"ModelArtifacts": {"S3ModelArtifacts": "s3://m/m.tar.gz"}}

tests/unit/sagemaker/wrangler/test_processing.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import pytest
1616
from mock import Mock, MagicMock
17+
from sagemaker.session_settings import SessionSettings
1718

1819
from sagemaker.wrangler.processing import DataWranglerProcessor
1920
from sagemaker.processing import ProcessingInput
@@ -36,6 +37,7 @@ def sagemaker_session():
3637
boto_region_name=REGION,
3738
config=None,
3839
local_mode=False,
40+
settings=SessionSettings(),
3941
)
4042
session_mock.expand_role.return_value = ROLE
4143
return session_mock

tests/unit/test_amazon_estimator.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
_build_shards,
2424
FileSystemRecordSet,
2525
)
26+
from sagemaker.session_settings import SessionSettings
2627

2728
COMMON_ARGS = {"role": "myrole", "instance_count": 1, "instance_type": "ml.c4.xlarge"}
2829

@@ -40,6 +41,7 @@ def sagemaker_session():
4041
region_name=REGION,
4142
config=None,
4243
local_mode=False,
44+
settings=SessionSettings(),
4345
)
4446
sms.boto_region_name = REGION
4547
sms.default_bucket = Mock(name="default_bucket", return_value=BUCKET_NAME)

tests/unit/test_analytics.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
HyperparameterTuningJobAnalytics,
2525
TrainingJobAnalytics,
2626
)
27+
from sagemaker.session_settings import SessionSettings
2728

2829
BUCKET_NAME = "mybucket"
2930
REGION = "us-west-2"
@@ -47,6 +48,7 @@ def create_sagemaker_session(
4748
boto_region_name=REGION,
4849
config=None,
4950
local_mode=False,
51+
settings=SessionSettings(),
5052
)
5153
sms.default_bucket = Mock(name="default_bucket", return_value=BUCKET_NAME)
5254
sms.sagemaker_client.describe_hyper_parameter_tuning_job = Mock(

0 commit comments

Comments
 (0)