Skip to content

Commit bb2a1f5

Browse files
committed
bring in latest changes from master
2 parents 81b6751 + 90b0b0f commit bb2a1f5

File tree

7 files changed

+122
-33
lines changed

7 files changed

+122
-33
lines changed

src/sagemaker/analytics.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,11 @@ def training_job_summaries(self, force_refresh=False):
261261
)
262262
new_output = raw_result["TrainingJobSummaries"]
263263
output.extend(new_output)
264-
logger.debug("Got %d more TrainingJobs. Total so far: %d", len(new_output), len(output))
264+
logger.debug(
265+
"Got %d more TrainingJobs. Total so far: %d",
266+
len(new_output),
267+
len(output),
268+
)
265269
if ("NextToken" in raw_result) and (len(new_output) > 0):
266270
next_args["NextToken"] = raw_result["NextToken"]
267271
else:

src/sagemaker/utils.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,12 @@ def repack_model(
413413
model_dir = _extract_model(model_uri, sagemaker_session, tmp)
414414

415415
_create_or_update_code_dir(
416-
model_dir, inference_script, source_directory, dependencies, sagemaker_session, tmp
416+
model_dir,
417+
inference_script,
418+
source_directory,
419+
dependencies,
420+
sagemaker_session,
421+
tmp,
417422
)
418423

419424
tmp_model_path = os.path.join(tmp, "temp-model.tar.gz")
@@ -544,7 +549,11 @@ def sts_regional_endpoint(region):
544549
return "https://{}".format(endpoint_data["hostname"])
545550

546551

547-
def retries(max_retry_count, exception_message_prefix, seconds_to_sleep=DEFAULT_SLEEP_TIME_SECONDS):
552+
def retries(
553+
max_retry_count,
554+
exception_message_prefix,
555+
seconds_to_sleep=DEFAULT_SLEEP_TIME_SECONDS,
556+
):
548557
"""Retries until max retry count is reached.
549558
550559
Args:

tests/data/multimodel/container/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ RUN apt-get update && \
1515
curl \
1616
vim \
1717
&& rm -rf /var/lib/apt/lists/* \
18-
&& curl -O https://bootstrap.pypa.io/get-pip.py \
18+
&& curl -O https://bootstrap.pypa.io/pip/3.6/get-pip.py \
1919
&& python3 get-pip.py
2020

2121
RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 1

tests/integ/test_workflow.py

Lines changed: 88 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,22 @@
6767
ConditionLessThanOrEqualTo,
6868
)
6969
from sagemaker.workflow.condition_step import ConditionStep
70-
from sagemaker.workflow.callback_step import CallbackStep, CallbackOutput, CallbackOutputTypeEnum
71-
from sagemaker.workflow.lambda_step import LambdaStep, LambdaOutput, LambdaOutputTypeEnum
70+
from sagemaker.workflow.callback_step import (
71+
CallbackStep,
72+
CallbackOutput,
73+
CallbackOutputTypeEnum,
74+
)
75+
from sagemaker.workflow.lambda_step import (
76+
LambdaStep,
77+
LambdaOutput,
78+
LambdaOutputTypeEnum,
79+
)
7280
from sagemaker.workflow.emr_step import EMRStep, EMRStepConfig
7381
from sagemaker.wrangler.processing import DataWranglerProcessor
74-
from sagemaker.dataset_definition.inputs import DatasetDefinition, AthenaDatasetDefinition
82+
from sagemaker.dataset_definition.inputs import (
83+
DatasetDefinition,
84+
AthenaDatasetDefinition,
85+
)
7586
from sagemaker.workflow.execution_variables import ExecutionVariables
7687
from sagemaker.workflow.functions import Join, JsonGet
7788
from sagemaker.wrangler.ingestion import generate_data_ingestion_flow_from_s3_input
@@ -92,7 +103,11 @@
92103
from sagemaker.workflow.step_collections import RegisterModel
93104
from sagemaker.workflow.pipeline import Pipeline
94105
from sagemaker.lambda_helper import Lambda
95-
from sagemaker.feature_store.feature_group import FeatureGroup, FeatureDefinition, FeatureTypeEnum
106+
from sagemaker.feature_store.feature_group import (
107+
FeatureGroup,
108+
FeatureDefinition,
109+
FeatureTypeEnum,
110+
)
96111
from tests.integ import DATA_DIR
97112
from tests.integ.kms_utils import get_or_create_kms_key
98113
from tests.integ.retry import retries
@@ -262,7 +277,10 @@ def build_jar():
262277
)
263278
else:
264279
subprocess.run(
265-
["javac", os.path.join(jar_file_path, java_file_path, "HelloJavaSparkApp.java")]
280+
[
281+
"javac",
282+
os.path.join(jar_file_path, java_file_path, "HelloJavaSparkApp.java"),
283+
]
266284
)
267285

268286
subprocess.run(
@@ -383,10 +401,20 @@ def test_three_step_definition(
383401
assert set(tuple(param.items()) for param in definition["Parameters"]) == set(
384402
[
385403
tuple(
386-
{"Name": "InstanceType", "Type": "String", "DefaultValue": "ml.m5.xlarge"}.items()
404+
{
405+
"Name": "InstanceType",
406+
"Type": "String",
407+
"DefaultValue": "ml.m5.xlarge",
408+
}.items()
387409
),
388410
tuple({"Name": "InstanceCount", "Type": "Integer", "DefaultValue": 1}.items()),
389-
tuple({"Name": "OutputPrefix", "Type": "String", "DefaultValue": "output"}.items()),
411+
tuple(
412+
{
413+
"Name": "OutputPrefix",
414+
"Type": "String",
415+
"DefaultValue": "output",
416+
}.items()
417+
),
390418
]
391419
)
392420

@@ -740,7 +768,13 @@ def test_one_step_pyspark_processing_pipeline(
740768

741769

742770
def test_one_step_sparkjar_processing_pipeline(
743-
sagemaker_session, role, cpu_instance_type, pipeline_name, region_name, configuration, build_jar
771+
sagemaker_session,
772+
role,
773+
cpu_instance_type,
774+
pipeline_name,
775+
region_name,
776+
configuration,
777+
build_jar,
744778
):
745779
instance_count = ParameterInteger(name="InstanceCount", default_value=2)
746780
cache_config = CacheConfig(enable_caching=True, expire_after="T30m")
@@ -758,7 +792,9 @@ def test_one_step_sparkjar_processing_pipeline(
758792
body = data.read()
759793
input_data_uri = f"s3://{bucket}/spark/input/data.jsonl"
760794
S3Uploader.upload_string_as_file_body(
761-
body=body, desired_s3_uri=input_data_uri, sagemaker_session=sagemaker_session
795+
body=body,
796+
desired_s3_uri=input_data_uri,
797+
sagemaker_session=sagemaker_session,
762798
)
763799
output_data_uri = f"s3://{bucket}/spark/output/sales/{datetime.now().isoformat()}"
764800

@@ -877,7 +913,12 @@ def test_one_step_callback_pipeline(sagemaker_session, role, pipeline_name, regi
877913

878914

879915
def test_steps_with_map_params_pipeline(
880-
sagemaker_session, role, script_dir, pipeline_name, region_name, athena_dataset_definition
916+
sagemaker_session,
917+
role,
918+
script_dir,
919+
pipeline_name,
920+
region_name,
921+
athena_dataset_definition,
881922
):
882923
instance_count = ParameterInteger(name="InstanceCount", default_value=2)
883924
framework_version = "0.20.0"
@@ -1184,7 +1225,8 @@ def test_two_steps_emr_pipeline(sagemaker_session, role, pipeline_name, region_n
11841225
response = pipeline.create(role)
11851226
create_arn = response["PipelineArn"]
11861227
assert re.match(
1187-
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}", create_arn
1228+
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}",
1229+
create_arn,
11881230
)
11891231
finally:
11901232
try:
@@ -1267,7 +1309,12 @@ def test_conditional_pytorch_training_model_registration(
12671309

12681310
pipeline = Pipeline(
12691311
name=pipeline_name,
1270-
parameters=[in_condition_input, good_enough_input, instance_count, instance_type],
1312+
parameters=[
1313+
in_condition_input,
1314+
good_enough_input,
1315+
instance_count,
1316+
instance_type,
1317+
],
12711318
steps=[step_cond],
12721319
sagemaker_session=sagemaker_session,
12731320
)
@@ -1276,7 +1323,8 @@ def test_conditional_pytorch_training_model_registration(
12761323
response = pipeline.create(role)
12771324
create_arn = response["PipelineArn"]
12781325
assert re.match(
1279-
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}", create_arn
1326+
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}",
1327+
create_arn,
12801328
)
12811329

12821330
execution = pipeline.start(parameters={})
@@ -1395,7 +1443,8 @@ def test_tuning_single_algo(
13951443
response = pipeline.create(role)
13961444
create_arn = response["PipelineArn"]
13971445
assert re.match(
1398-
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}", create_arn
1446+
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}",
1447+
create_arn,
13991448
)
14001449

14011450
execution = pipeline.start(parameters={})
@@ -1522,7 +1571,7 @@ def test_tuning_multi_algos(
15221571
response = pipeline.create(role)
15231572
create_arn = response["PipelineArn"]
15241573
assert re.match(
1525-
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}", create_arn
1574+
fr"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}", create_arn
15261575
)
15271576

15281577
execution = pipeline.start(parameters={})
@@ -1583,7 +1632,8 @@ def test_mxnet_model_registration(
15831632
response = pipeline.create(role)
15841633
create_arn = response["PipelineArn"]
15851634
assert re.match(
1586-
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}", create_arn
1635+
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}",
1636+
create_arn,
15871637
)
15881638

15891639
execution = pipeline.start(parameters={})
@@ -1655,10 +1705,14 @@ def test_sklearn_xgboost_sip_model_registration(
16551705
destination=train_data_path_param,
16561706
),
16571707
ProcessingOutput(
1658-
output_name="val_data", source="/opt/ml/processing/val", destination=val_data_path_param
1708+
output_name="val_data",
1709+
source="/opt/ml/processing/val",
1710+
destination=val_data_path_param,
16591711
),
16601712
ProcessingOutput(
1661-
output_name="model", source="/opt/ml/processing/model", destination=model_path_param
1713+
output_name="model",
1714+
source="/opt/ml/processing/model",
1715+
destination=model_path_param,
16621716
),
16631717
]
16641718

@@ -1775,7 +1829,8 @@ def test_sklearn_xgboost_sip_model_registration(
17751829
response = pipeline.upsert(role_arn=role)
17761830
create_arn = response["PipelineArn"]
17771831
assert re.match(
1778-
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}", create_arn
1832+
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}",
1833+
create_arn,
17791834
)
17801835

17811836
execution = pipeline.start(parameters={})
@@ -1831,7 +1886,9 @@ def test_model_registration_with_drift_check_baselines(
18311886
utils.unique_name_from_base("metrics"),
18321887
)
18331888
metrics_uri = S3Uploader.upload_string_as_file_body(
1834-
body=metrics_data, desired_s3_uri=metrics_base_uri, sagemaker_session=sagemaker_session
1889+
body=metrics_data,
1890+
desired_s3_uri=metrics_base_uri,
1891+
sagemaker_session=sagemaker_session,
18351892
)
18361893
metrics_uri_param = ParameterString(name="metrics_uri", default_value=metrics_uri)
18371894

@@ -2070,7 +2127,8 @@ def test_model_registration_with_model_repack(
20702127
response = pipeline.create(role)
20712128
create_arn = response["PipelineArn"]
20722129
assert re.match(
2073-
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}", create_arn
2130+
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}",
2131+
create_arn,
20742132
)
20752133

20762134
execution = pipeline.start(parameters={})
@@ -2417,13 +2475,17 @@ def test_one_step_ingestion_pipeline(
24172475
input_name = "features.csv"
24182476
input_file_path = os.path.join(DATA_DIR, "workflow", "features.csv")
24192477
input_data_uri = os.path.join(
2420-
"s3://", sagemaker_session.default_bucket(), "py-sdk-ingestion-test-input/features.csv"
2478+
"s3://",
2479+
sagemaker_session.default_bucket(),
2480+
"py-sdk-ingestion-test-input/features.csv",
24212481
)
24222482

24232483
with open(input_file_path, "r") as data:
24242484
body = data.read()
24252485
S3Uploader.upload_string_as_file_body(
2426-
body=body, desired_s3_uri=input_data_uri, sagemaker_session=sagemaker_session
2486+
body=body,
2487+
desired_s3_uri=input_data_uri,
2488+
sagemaker_session=sagemaker_session,
24272489
)
24282490

24292491
inputs = [
@@ -2735,7 +2797,9 @@ def test_end_to_end_pipeline_successful_execution(
27352797
sagemaker_session=sagemaker_session,
27362798
)
27372799
step_transform = TransformStep(
2738-
name="AbaloneTransform", transformer=transformer, inputs=TransformInput(data=batch_data)
2800+
name="AbaloneTransform",
2801+
transformer=transformer,
2802+
inputs=TransformInput(data=batch_data),
27392803
)
27402804

27412805
# define register model step

tests/integ/test_workflow_retry.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@
2222
from sagemaker.processing import ProcessingInput
2323
from sagemaker.session import get_execution_role
2424
from sagemaker.sklearn.processing import SKLearnProcessor
25-
from sagemaker.dataset_definition.inputs import DatasetDefinition, AthenaDatasetDefinition
25+
from sagemaker.dataset_definition.inputs import (
26+
DatasetDefinition,
27+
AthenaDatasetDefinition,
28+
)
2629
from sagemaker.workflow.parameters import (
2730
ParameterInteger,
2831
ParameterString,
@@ -134,7 +137,8 @@ def test_pipeline_execution_processing_step_with_retry(
134137
expire_after_mins=5,
135138
),
136139
SageMakerJobStepRetryPolicy(
137-
exception_types=[SageMakerJobExceptionTypeEnum.CAPACITY_ERROR], max_attempts=10
140+
exception_types=[SageMakerJobExceptionTypeEnum.CAPACITY_ERROR],
141+
max_attempts=10,
138142
),
139143
],
140144
)
@@ -252,7 +256,8 @@ def test_model_registration_with_model_repack(
252256
response = pipeline.create(role)
253257
create_arn = response["PipelineArn"]
254258
assert re.match(
255-
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}", create_arn
259+
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}",
260+
create_arn,
256261
)
257262

258263
execution = pipeline.start(parameters={})

tests/unit/sagemaker/feature_store/test_feature_store.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,11 @@ def test_load_feature_definition(sagemaker_session_mock):
175175
names = [fd.feature_name for fd in feature_definitions]
176176
types = [fd.feature_type for fd in feature_definitions]
177177
assert names == ["float", "int", "string"]
178-
assert types == [FeatureTypeEnum.FRACTIONAL, FeatureTypeEnum.INTEGRAL, FeatureTypeEnum.STRING]
178+
assert types == [
179+
FeatureTypeEnum.FRACTIONAL,
180+
FeatureTypeEnum.INTEGRAL,
181+
FeatureTypeEnum.STRING,
182+
]
179183

180184

181185
def test_load_feature_definition_unsupported_types(sagemaker_session_mock):

tox.ini

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ markers =
5959
timeout: mark a test as a timeout.
6060

6161
[testenv]
62+
pip_version = pip==20.2
6263
passenv =
6364
AWS_ACCESS_KEY_ID
6465
AWS_SECRET_ACCESS_KEY
@@ -87,7 +88,7 @@ commands = flake8
8788
skipdist = true
8889
skip_install = true
8990
deps =
90-
pylint
91+
pylint==2.6.2
9192
astroid==2.4.2
9293
commands =
9394
python -m pylint --rcfile=.pylintrc -j 0 src/sagemaker
@@ -116,6 +117,8 @@ changedir = doc
116117
# pip install requirements.txt is separate as RTD does it in separate steps
117118
# having the requirements.txt installed in deps above results in Double Requirement exception
118119
# https://github.com/pypa/pip/issues/988
120+
deps =
121+
pip==20.2
119122
commands =
120123
pip install --exists-action=w -r requirements.txt
121124
sphinx-build -T -W -b html -d _build/doctrees-readthedocs -D language=en . _build/html

0 commit comments

Comments
 (0)