Skip to content

Commit 7eba329

Browse files
authored
Using logging instead of prints (#4133)
1 parent aa5fd00 commit 7eba329

File tree

12 files changed

+189
-177
lines changed

12 files changed

+189
-177
lines changed

src/sagemaker/base_predictor.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@
6363
LOGGER = logging.getLogger("sagemaker")
6464

6565

66+
logger = logging.getLogger(__name__)
67+
68+
6669
class PredictorBase(abc.ABC):
6770
"""An object that encapsulates a deployed model."""
6871

@@ -714,7 +717,7 @@ def list_monitors(self):
714717
endpoint_name=self.endpoint_name
715718
)
716719
if len(monitoring_schedules_dict["MonitoringScheduleSummaries"]) == 0:
717-
print("No monitors found for endpoint. endpoint: {}".format(self.endpoint_name))
720+
logger.debug("No monitors found for endpoint. endpoint: %s", self.endpoint_name)
718721
return []
719722

720723
monitors = []

src/sagemaker/cli/compatibility/v2/files.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222

2323
from sagemaker.cli.compatibility.v2.ast_transformer import ASTTransformer
2424

25-
LOGGER = logging.getLogger(__name__)
25+
# Setting LOGGER for backward compatibility, in case users import this...
26+
logger = LOGGER = logging.getLogger(__name__)
2627

2728

2829
class FileUpdater(object):
@@ -59,7 +60,7 @@ def _make_output_dirs_if_needed(self):
5960
os.makedirs(output_dir)
6061

6162
if os.path.exists(self.output_path):
62-
LOGGER.warning("Overwriting file %s", self.output_path)
63+
logger.warning("Overwriting file %s", self.output_path)
6364

6465

6566
class PyFileUpdater(FileUpdater):

src/sagemaker/fw_utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ def tar_and_upload_dir(
474474
if s3_resource is None:
475475
s3_resource = session.resource("s3", region_name=session.region_name)
476476
else:
477-
print("Using provided s3_resource")
477+
logger.debug("Using provided s3_resource")
478478

479479
s3_resource.Object(bucket, key).upload_file(tar_file, ExtraArgs=extra_args)
480480
finally:

src/sagemaker/inference_recommender/inference_recommender_mixin.py

+10-9
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
"mxnet": "MXNET",
2929
}
3030

31-
LOGGER = logging.getLogger("sagemaker")
31+
# Setting LOGGER for backward compatibility, in case users import it...
32+
logger = LOGGER = logging.getLogger("sagemaker")
3233

3334

3435
class Phase:
@@ -145,10 +146,10 @@ def right_size(
145146
)
146147

147148
if endpoint_configurations or traffic_pattern or stopping_conditions or resource_limit:
148-
LOGGER.info("Advanced Job parameters were specified. Running Advanced job...")
149+
logger.info("Advanced Job parameters were specified. Running Advanced job...")
149150
job_type = "Advanced"
150151
else:
151-
LOGGER.info("Advanced Job parameters were not specified. Running Default job...")
152+
logger.info("Advanced Job parameters were not specified. Running Default job...")
152153
job_type = "Default"
153154

154155
self._init_sagemaker_session_if_does_not_exist()
@@ -173,7 +174,7 @@ def right_size(
173174
vpc_config=self.vpc_config,
174175
enable_network_isolation=self.enable_network_isolation(),
175176
)
176-
LOGGER.warning("Attempting to create new model with name %s", self.name)
177+
logger.warning("Attempting to create new model with name %s", self.name)
177178
self.sagemaker_session.create_model(**create_model_args)
178179

179180
ret_name = self.sagemaker_session.create_inference_recommendations_job(
@@ -281,23 +282,23 @@ def _update_params_for_right_size(
281282
if accelerator_type:
282283
raise ValueError("accelerator_type is not compatible with right_size().")
283284
if instance_type or initial_instance_count:
284-
LOGGER.warning(
285+
logger.warning(
285286
"instance_type or initial_instance_count specified."
286287
"Overriding right_size() recommendations."
287288
)
288289
return None
289290
if async_inference_config:
290-
LOGGER.warning(
291+
logger.warning(
291292
"async_inference_config is specified. Overriding right_size() recommendations."
292293
)
293294
return None
294295
if serverless_inference_config:
295-
LOGGER.warning(
296+
logger.warning(
296297
"serverless_inference_config is specified. Overriding right_size() recommendations."
297298
)
298299
return None
299300
if explainer_config:
300-
LOGGER.warning(
301+
logger.warning(
301302
"explainer_config is specified. Overriding right_size() recommendations."
302303
)
303304
return None
@@ -359,7 +360,7 @@ def _update_params_for_recommendation_id(
359360
"""
360361

361362
if instance_type is not None and initial_instance_count is not None:
362-
LOGGER.warning(
363+
logger.warning(
363364
"Both instance_type and initial_instance_count are specified,"
364365
"overriding the recommendation result."
365366
)

src/sagemaker/local/entities.py

+12-9
Original file line numberDiff line numberDiff line change
@@ -683,8 +683,10 @@ def start(self, **kwargs):
683683
)
684684

685685
self._executions[execution_id] = execution
686-
print(
687-
f"Starting execution for pipeline {self.pipeline.name}. Execution ID is {execution_id}"
686+
logger.info(
687+
"Starting execution for pipeline %s. Execution ID is %s",
688+
self.pipeline.name,
689+
execution_id,
688690
)
689691
self.last_modified_time = datetime.datetime.now().timestamp()
690692

@@ -771,31 +773,32 @@ def update_execution_success(self):
771773
"""Mark execution as succeeded."""
772774
self.status = _LocalExecutionStatus.SUCCEEDED.value
773775
self.last_modified_time = datetime.datetime.now().timestamp()
774-
print(f"Pipeline execution {self.pipeline_execution_name} SUCCEEDED")
776+
logger.info("Pipeline execution %s SUCCEEDED", self.pipeline_execution_name)
775777

776778
def update_execution_failure(self, step_name, failure_message):
777779
"""Mark execution as failed."""
778780
self.status = _LocalExecutionStatus.FAILED.value
779781
self.failure_reason = f"Step '{step_name}' failed with message: {failure_message}"
780782
self.last_modified_time = datetime.datetime.now().timestamp()
781-
print(
782-
f"Pipeline execution {self.pipeline_execution_name} FAILED because step "
783-
f"'{step_name}' failed."
783+
logger.info(
784+
"Pipeline execution %s FAILED because step '%s' failed.",
785+
self.pipeline_execution_name,
786+
step_name,
784787
)
785788

786789
def update_step_properties(self, step_name, step_properties):
787790
"""Update pipeline step execution output properties."""
788791
self.step_execution.get(step_name).update_step_properties(step_properties)
789-
print(f"Pipeline step '{step_name}' SUCCEEDED.")
792+
logger.info("Pipeline step '%s' SUCCEEDED.", step_name)
790793

791794
def update_step_failure(self, step_name, failure_message):
792795
"""Mark step_name as failed."""
793-
print(f"Pipeline step '{step_name}' FAILED. Failure message is: {failure_message}")
796+
logger.info("Pipeline step '%s' FAILED. Failure message is: %s", step_name, failure_message)
794797
self.step_execution.get(step_name).update_step_failure(failure_message)
795798

796799
def mark_step_executing(self, step_name):
797800
"""Update pipelines step's status to EXECUTING and start_time to now."""
798-
print(f"Starting pipeline step: '{step_name}'")
801+
logger.info("Starting pipeline step: '%s'", step_name)
799802
self.step_execution.get(step_name).mark_step_executing()
800803

801804
def _initialize_step_execution(self, steps):

src/sagemaker/local/image.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ def process(
230230

231231
# Print our Job Complete line to have a similar experience to training on SageMaker where
232232
# you see this line at the end.
233-
print("===== Job Complete =====")
233+
logger.info("===== Job Complete =====")
234234

235235
def train(self, input_data_config, output_data_config, hyperparameters, environment, job_name):
236236
"""Run a training job locally using docker-compose.
@@ -310,7 +310,7 @@ def train(self, input_data_config, output_data_config, hyperparameters, environm
310310

311311
# Print our Job Complete line to have a similar experience to training on SageMaker where
312312
# you see this line at the end.
313-
print("===== Job Complete =====")
313+
logger.info("===== Job Complete =====")
314314
return artifacts
315315

316316
def serve(self, model_dir, environment):

src/sagemaker/model.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@
7777
from sagemaker.enums import EndpointType
7878
from sagemaker.session import get_add_model_package_inference_args
7979

80-
LOGGER = logging.getLogger("sagemaker")
80+
# Setting LOGGER for backward compatibility, in case users import it...
81+
logger = LOGGER = logging.getLogger("sagemaker")
8182

8283
NEO_ALLOWED_FRAMEWORKS = set(
8384
["mxnet", "tensorflow", "keras", "pytorch", "onnx", "xgboost", "tflite"]
@@ -737,7 +738,7 @@ def _upload_code(self, key_prefix: str, repack: bool = False) -> None:
737738
script_name=os.path.basename(self.entry_point),
738739
)
739740

740-
LOGGER.info(
741+
logger.info(
741742
"Repacking model artifact (%s), script artifact "
742743
"(%s), and dependencies (%s) "
743744
"into single tar.gz file located at %s. "
@@ -1258,13 +1259,13 @@ def compile(
12581259
self.image_uri = job_status.get("InferenceImage", None)
12591260
self._is_compiled_model = True
12601261
else:
1261-
LOGGER.warning(
1262+
logger.warning(
12621263
"The instance type %s is not supported for deployment via SageMaker."
12631264
"Please deploy the model manually.",
12641265
target_instance_family,
12651266
)
12661267
else:
1267-
LOGGER.warning(
1268+
logger.warning(
12681269
"Devices described by Target Platform OS, Architecture and Accelerator are not"
12691270
"supported for deployment via SageMaker. Please deploy the model manually."
12701271
)
@@ -1484,7 +1485,7 @@ def deploy(
14841485
and instance_type.startswith("ml.inf")
14851486
and not self._is_compiled_model
14861487
):
1487-
LOGGER.warning(
1488+
logger.warning(
14881489
"Your model is not compiled. Please compile your model before using Inferentia."
14891490
)
14901491

src/sagemaker/model_monitor/clarify_model_monitoring.py

+19-18
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@
2929
from sagemaker.clarify import SageMakerClarifyProcessor, ModelPredictedLabelConfig
3030
from sagemaker.lineage._utils import get_resource_name_from_arn
3131

32-
_LOGGER = logging.getLogger(__name__)
32+
# Setting _LOGGER for backward compatibility, in case users import it...
33+
logger = _LOGGER = logging.getLogger(__name__)
3334

3435

3536
class ClarifyModelMonitor(mm.ModelMonitor):
@@ -223,7 +224,7 @@ def _upload_analysis_config(self, analysis_config, output_s3_uri, job_definition
223224
str(uuid.uuid4()),
224225
"analysis_config.json",
225226
)
226-
_LOGGER.info("Uploading analysis config to {s3_uri}.")
227+
logger.info("Uploading analysis config to {s3_uri}.")
227228
return s3.S3Uploader.upload_string_as_file_body(
228229
json.dumps(analysis_config),
229230
desired_s3_uri=s3_uri,
@@ -604,7 +605,7 @@ def create_monitoring_schedule(
604605
"Monitoring Schedule. To create another, first delete the existing one "
605606
"using my_monitor.delete_monitoring_schedule()."
606607
)
607-
_LOGGER.error(message)
608+
logger.error(message)
608609
raise ValueError(message)
609610

610611
if (batch_transform_input is not None) ^ (endpoint_input is None):
@@ -613,7 +614,7 @@ def create_monitoring_schedule(
613614
"Amazon Model Monitoring Schedule. "
614615
"Please provide only one of the above required inputs"
615616
)
616-
_LOGGER.error(message)
617+
logger.error(message)
617618
raise ValueError(message)
618619

619620
self._check_monitoring_schedule_cron_validity(
@@ -667,15 +668,15 @@ def create_monitoring_schedule(
667668
self.job_definition_name = new_job_definition_name
668669
self.monitoring_schedule_name = monitor_schedule_name
669670
except Exception:
670-
_LOGGER.exception("Failed to create monitoring schedule.")
671+
logger.exception("Failed to create monitoring schedule.")
671672
# noinspection PyBroadException
672673
try:
673674
self.sagemaker_session.sagemaker_client.delete_model_bias_job_definition(
674675
JobDefinitionName=new_job_definition_name
675676
)
676677
except Exception: # pylint: disable=W0703
677678
message = "Failed to delete job definition {}.".format(new_job_definition_name)
678-
_LOGGER.exception(message)
679+
logger.exception(message)
679680
raise
680681

681682
# noinspection PyMethodOverriding
@@ -756,7 +757,7 @@ def update_monitoring_schedule(
756757
"Amazon Model Monitoring Schedule. "
757758
"Please provide only one of the above required inputs"
758759
)
759-
_LOGGER.error(message)
760+
logger.error(message)
760761
raise ValueError(message)
761762

762763
# Only need to update schedule expression
@@ -820,15 +821,15 @@ def update_monitoring_schedule(
820821
if network_config is not None:
821822
self.network_config = network_config
822823
except Exception:
823-
_LOGGER.exception("Failed to update monitoring schedule.")
824+
logger.exception("Failed to update monitoring schedule.")
824825
# noinspection PyBroadException
825826
try:
826827
self.sagemaker_session.sagemaker_client.delete_model_bias_job_definition(
827828
JobDefinitionName=new_job_definition_name
828829
)
829830
except Exception: # pylint: disable=W0703
830831
message = "Failed to delete job definition {}.".format(new_job_definition_name)
831-
_LOGGER.exception(message)
832+
logger.exception(message)
832833
raise
833834

834835
def delete_monitoring_schedule(self):
@@ -838,7 +839,7 @@ def delete_monitoring_schedule(self):
838839
message = "Deleting Model Bias Job Definition with name: {}".format(
839840
self.job_definition_name
840841
)
841-
_LOGGER.info(message)
842+
logger.info(message)
842843
self.sagemaker_session.sagemaker_client.delete_model_bias_job_definition(
843844
JobDefinitionName=self.job_definition_name
844845
)
@@ -1045,7 +1046,7 @@ def create_monitoring_schedule(
10451046
"Monitoring Schedule. To create another, first delete the existing one "
10461047
"using my_monitor.delete_monitoring_schedule()."
10471048
)
1048-
_LOGGER.error(message)
1049+
logger.error(message)
10491050
raise ValueError(message)
10501051

10511052
if (batch_transform_input is not None) ^ (endpoint_input is None):
@@ -1054,7 +1055,7 @@ def create_monitoring_schedule(
10541055
"Amazon Model Monitoring Schedule."
10551056
"Please provide only one of the above required inputs"
10561057
)
1057-
_LOGGER.error(message)
1058+
logger.error(message)
10581059
raise ValueError(message)
10591060

10601061
self._check_monitoring_schedule_cron_validity(
@@ -1107,15 +1108,15 @@ def create_monitoring_schedule(
11071108
self.job_definition_name = new_job_definition_name
11081109
self.monitoring_schedule_name = monitor_schedule_name
11091110
except Exception:
1110-
_LOGGER.exception("Failed to create monitoring schedule.")
1111+
logger.exception("Failed to create monitoring schedule.")
11111112
# noinspection PyBroadException
11121113
try:
11131114
self.sagemaker_session.sagemaker_client.delete_model_explainability_job_definition(
11141115
JobDefinitionName=new_job_definition_name
11151116
)
11161117
except Exception: # pylint: disable=W0703
11171118
message = "Failed to delete job definition {}.".format(new_job_definition_name)
1118-
_LOGGER.exception(message)
1119+
logger.exception(message)
11191120
raise
11201121

11211122
# noinspection PyMethodOverriding
@@ -1198,7 +1199,7 @@ def update_monitoring_schedule(
11981199
"Amazon Model Monitoring Schedule. "
11991200
"Please provide only one of the above required inputs"
12001201
)
1201-
_LOGGER.error(message)
1202+
logger.error(message)
12021203
raise ValueError(message)
12031204

12041205
# Only need to update schedule expression
@@ -1265,15 +1266,15 @@ def update_monitoring_schedule(
12651266
if network_config is not None:
12661267
self.network_config = network_config
12671268
except Exception:
1268-
_LOGGER.exception("Failed to update monitoring schedule.")
1269+
logger.exception("Failed to update monitoring schedule.")
12691270
# noinspection PyBroadException
12701271
try:
12711272
self.sagemaker_session.sagemaker_client.delete_model_explainability_job_definition(
12721273
JobDefinitionName=new_job_definition_name
12731274
)
12741275
except Exception: # pylint: disable=W0703
12751276
message = "Failed to delete job definition {}.".format(new_job_definition_name)
1276-
_LOGGER.exception(message)
1277+
logger.exception(message)
12771278
raise
12781279

12791280
def delete_monitoring_schedule(self):
@@ -1283,7 +1284,7 @@ def delete_monitoring_schedule(self):
12831284
message = "Deleting Model Explainability Job Definition with name: {}".format(
12841285
self.job_definition_name
12851286
)
1286-
_LOGGER.info(message)
1287+
logger.info(message)
12871288
self.sagemaker_session.sagemaker_client.delete_model_explainability_job_definition(
12881289
JobDefinitionName=self.job_definition_name
12891290
)

0 commit comments

Comments
 (0)