Skip to content

Commit 7174607

Browse files
committed
Merge remote-tracking branch 'origin/dev' into master-jumpstart
2 parents 81b6751 + 90b0b0f commit 7174607

File tree

7 files changed

+123
-33
lines changed

7 files changed

+123
-33
lines changed

src/sagemaker/analytics.py

+5-1
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

+11-2
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

+1-1
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

+89-24
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,8 @@ 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+
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}",
1575+
create_arn,
15261576
)
15271577

15281578
execution = pipeline.start(parameters={})
@@ -1583,7 +1633,8 @@ def test_mxnet_model_registration(
15831633
response = pipeline.create(role)
15841634
create_arn = response["PipelineArn"]
15851635
assert re.match(
1586-
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}", create_arn
1636+
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}",
1637+
create_arn,
15871638
)
15881639

15891640
execution = pipeline.start(parameters={})
@@ -1655,10 +1706,14 @@ def test_sklearn_xgboost_sip_model_registration(
16551706
destination=train_data_path_param,
16561707
),
16571708
ProcessingOutput(
1658-
output_name="val_data", source="/opt/ml/processing/val", destination=val_data_path_param
1709+
output_name="val_data",
1710+
source="/opt/ml/processing/val",
1711+
destination=val_data_path_param,
16591712
),
16601713
ProcessingOutput(
1661-
output_name="model", source="/opt/ml/processing/model", destination=model_path_param
1714+
output_name="model",
1715+
source="/opt/ml/processing/model",
1716+
destination=model_path_param,
16621717
),
16631718
]
16641719

@@ -1775,7 +1830,8 @@ def test_sklearn_xgboost_sip_model_registration(
17751830
response = pipeline.upsert(role_arn=role)
17761831
create_arn = response["PipelineArn"]
17771832
assert re.match(
1778-
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}", create_arn
1833+
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}",
1834+
create_arn,
17791835
)
17801836

17811837
execution = pipeline.start(parameters={})
@@ -1831,7 +1887,9 @@ def test_model_registration_with_drift_check_baselines(
18311887
utils.unique_name_from_base("metrics"),
18321888
)
18331889
metrics_uri = S3Uploader.upload_string_as_file_body(
1834-
body=metrics_data, desired_s3_uri=metrics_base_uri, sagemaker_session=sagemaker_session
1890+
body=metrics_data,
1891+
desired_s3_uri=metrics_base_uri,
1892+
sagemaker_session=sagemaker_session,
18351893
)
18361894
metrics_uri_param = ParameterString(name="metrics_uri", default_value=metrics_uri)
18371895

@@ -2070,7 +2128,8 @@ def test_model_registration_with_model_repack(
20702128
response = pipeline.create(role)
20712129
create_arn = response["PipelineArn"]
20722130
assert re.match(
2073-
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}", create_arn
2131+
rf"arn:aws:sagemaker:{region_name}:\d{{12}}:pipeline/{pipeline_name}",
2132+
create_arn,
20742133
)
20752134

20762135
execution = pipeline.start(parameters={})
@@ -2417,13 +2476,17 @@ def test_one_step_ingestion_pipeline(
24172476
input_name = "features.csv"
24182477
input_file_path = os.path.join(DATA_DIR, "workflow", "features.csv")
24192478
input_data_uri = os.path.join(
2420-
"s3://", sagemaker_session.default_bucket(), "py-sdk-ingestion-test-input/features.csv"
2479+
"s3://",
2480+
sagemaker_session.default_bucket(),
2481+
"py-sdk-ingestion-test-input/features.csv",
24212482
)
24222483

24232484
with open(input_file_path, "r") as data:
24242485
body = data.read()
24252486
S3Uploader.upload_string_as_file_body(
2426-
body=body, desired_s3_uri=input_data_uri, sagemaker_session=sagemaker_session
2487+
body=body,
2488+
desired_s3_uri=input_data_uri,
2489+
sagemaker_session=sagemaker_session,
24272490
)
24282491

24292492
inputs = [
@@ -2735,7 +2798,9 @@ def test_end_to_end_pipeline_successful_execution(
27352798
sagemaker_session=sagemaker_session,
27362799
)
27372800
step_transform = TransformStep(
2738-
name="AbaloneTransform", transformer=transformer, inputs=TransformInput(data=batch_data)
2801+
name="AbaloneTransform",
2802+
transformer=transformer,
2803+
inputs=TransformInput(data=batch_data),
27392804
)
27402805

27412806
# define register model step

tests/integ/test_workflow_retry.py

+8-3
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

+5-1
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

+4-1
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)