sagemaker-core 1.0.62__py3-none-any.whl → 2.3.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- sagemaker/__init__.py +2 -0
- sagemaker/core/__init__.py +16 -0
- sagemaker/core/_studio.py +116 -0
- sagemaker/core/_version.py +11 -0
- sagemaker/core/accept_types.py +131 -0
- sagemaker/core/analytics.py +744 -0
- sagemaker/core/apiutils/__init__.py +13 -0
- sagemaker/core/apiutils/_base_types.py +228 -0
- sagemaker/core/apiutils/_boto_functions.py +130 -0
- sagemaker/core/apiutils/_utils.py +34 -0
- sagemaker/core/base_deserializers.py +35 -0
- sagemaker/core/base_serializers.py +35 -0
- sagemaker/core/clarify/__init__.py +2898 -0
- sagemaker/core/collection.py +467 -0
- sagemaker/core/common_utils.py +2399 -0
- sagemaker/core/compute_resource_requirements/__init__.py +18 -0
- sagemaker/core/compute_resource_requirements/resource_requirements.py +94 -0
- sagemaker/core/config/__init__.py +181 -0
- sagemaker/core/config/config.py +238 -0
- sagemaker/core/config/config_manager.py +595 -0
- sagemaker/core/config/config_schema.py +1220 -0
- sagemaker/core/config/config_utils.py +297 -0
- {sagemaker_core/main → sagemaker/core}/config_schema.py +408 -3
- sagemaker/core/constants.py +73 -0
- sagemaker/core/content_types.py +137 -0
- sagemaker/core/debugger/__init__.py +39 -0
- sagemaker/core/debugger/debugger.py +945 -0
- sagemaker/core/debugger/framework_profile.py +292 -0
- sagemaker/core/debugger/metrics_config.py +468 -0
- sagemaker/core/debugger/profiler.py +42 -0
- sagemaker/core/debugger/profiler_config.py +190 -0
- sagemaker/core/debugger/profiler_constants.py +40 -0
- sagemaker/core/debugger/utils.py +148 -0
- sagemaker/core/deprecations.py +254 -0
- sagemaker/core/deserializers/__init__.py +10 -0
- sagemaker/core/deserializers/base.py +424 -0
- sagemaker/core/deserializers/implementations.py +157 -0
- sagemaker/core/drift_check_baselines.py +106 -0
- sagemaker/core/enums.py +51 -0
- sagemaker/core/environment_variables.py +101 -0
- sagemaker/core/exceptions.py +108 -0
- sagemaker/core/experiments/__init__.py +53 -0
- sagemaker/core/experiments/_api_types.py +251 -0
- sagemaker/core/experiments/_environment.py +124 -0
- sagemaker/core/experiments/_helper.py +294 -0
- sagemaker/core/experiments/_metrics.py +333 -0
- sagemaker/core/experiments/_run_context.py +58 -0
- sagemaker/core/experiments/_utils.py +216 -0
- sagemaker/core/experiments/experiment.py +247 -0
- sagemaker/core/experiments/run.py +970 -0
- sagemaker/core/experiments/trial.py +296 -0
- sagemaker/core/experiments/trial_component.py +387 -0
- sagemaker/core/explainer/__init__.py +24 -0
- sagemaker/core/explainer/clarify_explainer_config.py +298 -0
- sagemaker/core/explainer/explainer_config.py +44 -0
- sagemaker/core/fw_utils.py +1220 -0
- sagemaker/core/git_utils.py +415 -0
- sagemaker/core/helper/pipeline_variable.py +82 -0
- sagemaker/core/helper/session_helper.py +2977 -0
- sagemaker/core/hyperparameters.py +172 -0
- sagemaker/core/image_retriever/__init__.py +3 -0
- sagemaker/core/image_retriever/image_retriever.py +640 -0
- sagemaker/core/image_retriever/image_retriever_utils.py +509 -0
- sagemaker/core/image_retriever/test.py +7 -0
- sagemaker/core/image_uri_config/autogluon.json +1335 -0
- sagemaker/core/image_uri_config/blazingtext.json +50 -0
- sagemaker/core/image_uri_config/chainer.json +104 -0
- sagemaker/core/image_uri_config/clarify.json +39 -0
- sagemaker/core/image_uri_config/coach-mxnet.json +70 -0
- sagemaker/core/image_uri_config/coach-tensorflow.json +186 -0
- sagemaker/core/image_uri_config/data-wrangler.json +91 -0
- sagemaker/core/image_uri_config/debugger.json +34 -0
- sagemaker/core/image_uri_config/detailed-profiler.json +18 -0
- sagemaker/core/image_uri_config/djl-deepspeed.json +385 -0
- sagemaker/core/image_uri_config/djl-fastertransformer.json +167 -0
- sagemaker/core/image_uri_config/djl-lmi.json +136 -0
- sagemaker/core/image_uri_config/djl-neuronx.json +258 -0
- sagemaker/core/image_uri_config/djl-tensorrtllm.json +262 -0
- sagemaker/core/image_uri_config/factorization-machines.json +50 -0
- sagemaker/core/image_uri_config/forecasting-deepar.json +50 -0
- sagemaker/core/image_uri_config/huggingface-llm-neuronx.json +770 -0
- sagemaker/core/image_uri_config/huggingface-llm.json +1267 -0
- sagemaker/core/image_uri_config/huggingface-neuron.json +52 -0
- sagemaker/core/image_uri_config/huggingface-neuronx.json +686 -0
- sagemaker/core/image_uri_config/huggingface-tei-cpu.json +298 -0
- sagemaker/core/image_uri_config/huggingface-tei.json +298 -0
- sagemaker/core/image_uri_config/huggingface-training-compiler.json +195 -0
- sagemaker/core/image_uri_config/huggingface-vllm-neuronx.json +38 -0
- sagemaker/core/image_uri_config/huggingface.json +2287 -0
- sagemaker/core/image_uri_config/hyperpod-recipes-neuron.json +52 -0
- sagemaker/core/image_uri_config/image-classification-neo.json +43 -0
- sagemaker/core/image_uri_config/image-classification.json +50 -0
- sagemaker/core/image_uri_config/inferentia-mxnet.json +88 -0
- sagemaker/core/image_uri_config/inferentia-pytorch.json +127 -0
- sagemaker/core/image_uri_config/inferentia-tensorflow.json +88 -0
- sagemaker/core/image_uri_config/instance_gpu_info.json +782 -0
- sagemaker/core/image_uri_config/ipinsights.json +50 -0
- sagemaker/core/image_uri_config/kmeans.json +50 -0
- sagemaker/core/image_uri_config/knn.json +50 -0
- sagemaker/core/image_uri_config/lda.json +26 -0
- sagemaker/core/image_uri_config/linear-learner.json +50 -0
- sagemaker/core/image_uri_config/model-monitor.json +42 -0
- sagemaker/core/image_uri_config/mxnet.json +1154 -0
- sagemaker/core/image_uri_config/neo-mxnet.json +64 -0
- sagemaker/core/image_uri_config/neo-pytorch.json +341 -0
- sagemaker/core/image_uri_config/neo-tensorflow.json +109 -0
- sagemaker/core/image_uri_config/ntm.json +50 -0
- sagemaker/core/image_uri_config/object-detection.json +50 -0
- sagemaker/core/image_uri_config/object2vec.json +50 -0
- sagemaker/core/image_uri_config/pca.json +50 -0
- sagemaker/core/image_uri_config/pytorch-neuron.json +43 -0
- sagemaker/core/image_uri_config/pytorch-smp.json +218 -0
- sagemaker/core/image_uri_config/pytorch-training-compiler.json +80 -0
- sagemaker/core/image_uri_config/pytorch.json +3101 -0
- sagemaker/core/image_uri_config/randomcutforest.json +50 -0
- sagemaker/core/image_uri_config/ray-pytorch.json +46 -0
- sagemaker/core/image_uri_config/ray-tensorflow.json +194 -0
- sagemaker/core/image_uri_config/sagemaker-base-python.json +46 -0
- sagemaker/core/image_uri_config/sagemaker-distribution.json +37 -0
- sagemaker/core/image_uri_config/sagemaker-geospatial.json +13 -0
- sagemaker/core/image_uri_config/sagemaker-tritonserver.json +252 -0
- sagemaker/core/image_uri_config/semantic-segmentation.json +50 -0
- sagemaker/core/image_uri_config/seq2seq.json +50 -0
- sagemaker/core/image_uri_config/sklearn.json +494 -0
- sagemaker/core/image_uri_config/spark.json +280 -0
- sagemaker/core/image_uri_config/sparkml-serving.json +97 -0
- sagemaker/core/image_uri_config/stabilityai.json +53 -0
- sagemaker/core/image_uri_config/tensorflow.json +5086 -0
- sagemaker/core/image_uri_config/vw.json +25 -0
- sagemaker/core/image_uri_config/xgboost-neo.json +43 -0
- sagemaker/core/image_uri_config/xgboost.json +972 -0
- sagemaker/core/image_uris.py +816 -0
- sagemaker/core/inference_config.py +144 -0
- sagemaker/core/inference_recommender/__init__.py +18 -0
- sagemaker/core/inference_recommender/inference_recommender_mixin.py +622 -0
- sagemaker/core/inputs.py +366 -0
- sagemaker/core/instance_group.py +61 -0
- sagemaker/core/instance_types.py +164 -0
- sagemaker/core/instance_types_gpu_info.py +43 -0
- sagemaker/core/interactive_apps/__init__.py +41 -0
- sagemaker/core/interactive_apps/base_interactive_app.py +204 -0
- sagemaker/core/interactive_apps/detail_profiler_app.py +139 -0
- sagemaker/core/interactive_apps/tensorboard.py +149 -0
- sagemaker/core/iterators.py +197 -0
- sagemaker/core/job.py +380 -0
- sagemaker/core/jumpstart/__init__.py +156 -0
- sagemaker/core/jumpstart/accessors.py +390 -0
- sagemaker/core/jumpstart/artifacts/__init__.py +69 -0
- sagemaker/core/jumpstart/artifacts/environment_variables.py +252 -0
- sagemaker/core/jumpstart/artifacts/hyperparameters.py +120 -0
- sagemaker/core/jumpstart/artifacts/image_uris.py +139 -0
- sagemaker/core/jumpstart/artifacts/incremental_training.py +87 -0
- sagemaker/core/jumpstart/artifacts/instance_types.py +223 -0
- sagemaker/core/jumpstart/artifacts/kwargs.py +289 -0
- sagemaker/core/jumpstart/artifacts/metric_definitions.py +117 -0
- sagemaker/core/jumpstart/artifacts/model_packages.py +202 -0
- sagemaker/core/jumpstart/artifacts/model_uris.py +252 -0
- sagemaker/core/jumpstart/artifacts/payloads.py +96 -0
- sagemaker/core/jumpstart/artifacts/predictors.py +540 -0
- sagemaker/core/jumpstart/artifacts/resource_names.py +86 -0
- sagemaker/core/jumpstart/artifacts/resource_requirements.py +162 -0
- sagemaker/core/jumpstart/artifacts/script_uris.py +172 -0
- sagemaker/core/jumpstart/cache.py +663 -0
- sagemaker/core/jumpstart/configs.py +50 -0
- sagemaker/core/jumpstart/constants.py +198 -0
- sagemaker/core/jumpstart/deserializers.py +81 -0
- sagemaker/core/jumpstart/document.py +76 -0
- sagemaker/core/jumpstart/enums.py +168 -0
- sagemaker/core/jumpstart/exceptions.py +236 -0
- sagemaker/core/jumpstart/factory/utils.py +833 -0
- sagemaker/core/jumpstart/filters.py +597 -0
- sagemaker/core/jumpstart/hub/constants.py +16 -0
- sagemaker/core/jumpstart/hub/hub.py +291 -0
- sagemaker/core/jumpstart/hub/interfaces.py +936 -0
- sagemaker/core/jumpstart/hub/parser_utils.py +70 -0
- sagemaker/core/jumpstart/hub/parsers.py +288 -0
- sagemaker/core/jumpstart/hub/types.py +35 -0
- sagemaker/core/jumpstart/hub/utils.py +260 -0
- sagemaker/core/jumpstart/models.py +501 -0
- sagemaker/core/jumpstart/notebook_utils.py +575 -0
- sagemaker/core/jumpstart/parameters.py +20 -0
- sagemaker/core/jumpstart/payload_utils.py +239 -0
- sagemaker/core/jumpstart/region_config.json +171 -0
- sagemaker/core/jumpstart/search.py +171 -0
- sagemaker/core/jumpstart/serializers.py +81 -0
- sagemaker/core/jumpstart/session_utils.py +234 -0
- sagemaker/core/jumpstart/types.py +3044 -0
- sagemaker/core/jumpstart/utils.py +1731 -0
- sagemaker/core/jumpstart/validators.py +257 -0
- sagemaker/core/lambda_helper.py +312 -0
- sagemaker/core/lineage/__init__.py +42 -0
- sagemaker/core/lineage/_api_types.py +239 -0
- sagemaker/core/lineage/_utils.py +49 -0
- sagemaker/core/lineage/action.py +345 -0
- sagemaker/core/lineage/artifact.py +646 -0
- sagemaker/core/lineage/association.py +190 -0
- sagemaker/core/lineage/context.py +505 -0
- sagemaker/core/lineage/lineage_trial_component.py +191 -0
- sagemaker/core/lineage/query.py +732 -0
- sagemaker/core/lineage/visualizer.py +346 -0
- sagemaker/core/local/__init__.py +18 -0
- sagemaker/core/local/data.py +423 -0
- sagemaker/core/local/entities.py +678 -0
- sagemaker/core/local/exceptions.py +17 -0
- sagemaker/core/local/image.py +1243 -0
- sagemaker/core/local/local_session.py +739 -0
- sagemaker/core/local/utils.py +246 -0
- sagemaker/core/logs.py +181 -0
- sagemaker/core/metadata_properties.py +56 -0
- sagemaker/core/metric_definitions.py +91 -0
- sagemaker/core/mlflow/__init__.py +38 -0
- sagemaker/core/mlflow/forward_sagemaker_metrics.py +44 -0
- sagemaker/core/model_card/__init__.py +26 -0
- sagemaker/core/model_life_cycle.py +51 -0
- sagemaker/core/model_metrics.py +160 -0
- sagemaker/core/model_monitor/__init__.py +66 -0
- sagemaker/core/model_monitor/clarify_model_monitoring.py +1497 -0
- sagemaker/core/model_monitor/cron_expression_generator.py +82 -0
- sagemaker/core/model_monitor/data_capture_config.py +115 -0
- sagemaker/core/model_monitor/data_quality_monitoring_config.py +66 -0
- sagemaker/core/model_monitor/dataset_format.py +102 -0
- sagemaker/core/model_monitor/model_monitoring.py +4266 -0
- sagemaker/core/model_monitor/monitoring_alert.py +76 -0
- sagemaker/core/model_monitor/monitoring_files.py +506 -0
- sagemaker/core/model_monitor/utils.py +793 -0
- sagemaker/core/model_registry.py +480 -0
- sagemaker/core/model_uris.py +97 -0
- sagemaker/core/modules/__init__.py +19 -0
- sagemaker/core/modules/configs.py +239 -0
- sagemaker/core/modules/constants.py +37 -0
- sagemaker/core/modules/distributed.py +182 -0
- sagemaker/core/modules/local_core/local_container.py +605 -0
- sagemaker/core/modules/templates.py +83 -0
- sagemaker/core/modules/train/__init__.py +14 -0
- sagemaker/core/modules/train/container_drivers/__init__.py +14 -0
- sagemaker/core/modules/train/container_drivers/common/__init__.py +14 -0
- sagemaker/core/modules/train/container_drivers/common/utils.py +205 -0
- sagemaker/core/modules/train/container_drivers/distributed_drivers/__init__.py +14 -0
- sagemaker/core/modules/train/container_drivers/distributed_drivers/basic_script_driver.py +81 -0
- sagemaker/core/modules/train/container_drivers/distributed_drivers/mpi_driver.py +123 -0
- sagemaker/core/modules/train/container_drivers/distributed_drivers/mpi_utils.py +302 -0
- sagemaker/core/modules/train/container_drivers/distributed_drivers/torchrun_driver.py +129 -0
- sagemaker/core/modules/train/container_drivers/scripts/__init__.py +14 -0
- sagemaker/core/modules/train/container_drivers/scripts/environment.py +305 -0
- sagemaker/core/modules/train/sm_recipes/__init__.py +0 -0
- sagemaker/core/modules/train/sm_recipes/utils.py +330 -0
- sagemaker/core/modules/types.py +19 -0
- sagemaker/core/modules/utils.py +194 -0
- sagemaker/core/network.py +185 -0
- sagemaker/core/parameter.py +173 -0
- sagemaker/core/payloads.py +185 -0
- sagemaker/core/processing.py +1599 -0
- sagemaker/core/remote_function/__init__.py +19 -0
- sagemaker/core/remote_function/checkpoint_location.py +47 -0
- sagemaker/core/remote_function/client.py +1310 -0
- sagemaker/core/remote_function/core/__init__.py +0 -0
- sagemaker/core/remote_function/core/_custom_dispatch_table.py +72 -0
- sagemaker/core/remote_function/core/pipeline_variables.py +347 -0
- sagemaker/core/remote_function/core/serialization.py +410 -0
- sagemaker/core/remote_function/core/stored_function.py +223 -0
- sagemaker/core/remote_function/custom_file_filter.py +128 -0
- sagemaker/core/remote_function/errors.py +102 -0
- sagemaker/core/remote_function/invoke_function.py +167 -0
- sagemaker/core/remote_function/job.py +2121 -0
- sagemaker/core/remote_function/logging_config.py +38 -0
- sagemaker/core/remote_function/runtime_environment/__init__.py +14 -0
- sagemaker/core/remote_function/runtime_environment/bootstrap_runtime_environment.py +605 -0
- sagemaker/core/remote_function/runtime_environment/mpi_utils_remote.py +252 -0
- sagemaker/core/remote_function/runtime_environment/runtime_environment_manager.py +554 -0
- sagemaker/core/remote_function/runtime_environment/spark_app.py +18 -0
- sagemaker/core/remote_function/spark_config.py +149 -0
- sagemaker/core/resource_requirements.py +168 -0
- {sagemaker_core/main → sagemaker/core}/resources.py +19098 -10895
- sagemaker/core/s3/__init__.py +41 -0
- sagemaker/core/s3/client.py +367 -0
- sagemaker/core/s3/utils.py +175 -0
- sagemaker/core/script_uris.py +93 -0
- sagemaker/core/serializers/__init__.py +11 -0
- sagemaker/core/serializers/base.py +510 -0
- sagemaker/core/serializers/implementations.py +159 -0
- sagemaker/core/serializers/utils.py +223 -0
- sagemaker/core/serverless_inference_config.py +63 -0
- sagemaker/core/session_settings.py +55 -0
- sagemaker/core/shapes/__init__.py +3 -0
- sagemaker/core/shapes/model_card_shapes.py +159 -0
- {sagemaker_core/main → sagemaker/core/shapes}/shapes.py +5810 -1806
- sagemaker/core/spark/__init__.py +16 -0
- sagemaker/core/spark/defaults.py +16 -0
- sagemaker/core/spark/processing.py +1380 -0
- sagemaker/core/telemetry/__init__.py +23 -0
- sagemaker/core/telemetry/constants.py +82 -0
- sagemaker/core/telemetry/telemetry_logging.py +285 -0
- sagemaker/core/tools/__init__.py +1 -0
- {sagemaker_core → sagemaker/core}/tools/codegen.py +4 -4
- {sagemaker_core → sagemaker/core}/tools/constants.py +23 -15
- {sagemaker_core → sagemaker/core}/tools/data_extractor.py +1 -1
- {sagemaker_core → sagemaker/core}/tools/method.py +1 -1
- sagemaker/core/tools/model_card/generate_model_card_from_schema.py +562 -0
- {sagemaker_core → sagemaker/core}/tools/resources_codegen.py +165 -98
- {sagemaker_core → sagemaker/core}/tools/resources_extractor.py +5 -13
- {sagemaker_core → sagemaker/core}/tools/shapes_codegen.py +16 -17
- {sagemaker_core → sagemaker/core}/tools/shapes_extractor.py +29 -67
- {sagemaker_core → sagemaker/core}/tools/templates.py +39 -17
- sagemaker/core/training/__init__.py +14 -0
- sagemaker/core/training/configs.py +345 -0
- sagemaker/core/training/constants.py +37 -0
- sagemaker/core/training/utils.py +77 -0
- sagemaker/core/training_compiler/__init__.py +16 -0
- sagemaker/core/training_compiler/config.py +197 -0
- sagemaker/core/training_compiler_config.py +197 -0
- sagemaker/core/transformer.py +793 -0
- sagemaker/core/user_agent.py +76 -0
- sagemaker/core/utilities/__init__.py +24 -0
- sagemaker/core/utilities/cache.py +169 -0
- sagemaker/core/utilities/search_expression.py +133 -0
- sagemaker/core/utils/__init__.py +48 -0
- sagemaker/core/utils/code_injection/__init__.py +0 -0
- {sagemaker_core/main → sagemaker/core/utils}/code_injection/codec.py +2 -2
- {sagemaker_core/main → sagemaker/core/utils}/code_injection/shape_dag.py +5979 -176
- {sagemaker_core/main → sagemaker/core/utils}/exceptions.py +8 -8
- sagemaker_core/main/default_configs_helper.py → sagemaker/core/utils/intelligent_defaults_helper.py +5 -6
- {sagemaker_core/main → sagemaker/core/utils}/logs.py +1 -2
- {sagemaker_core/main → sagemaker/core/utils}/utils.py +27 -22
- sagemaker/core/workflow/__init__.py +152 -0
- sagemaker/core/workflow/conditions.py +313 -0
- sagemaker/core/workflow/entities.py +58 -0
- sagemaker/core/workflow/execution_variables.py +89 -0
- sagemaker/core/workflow/functions.py +193 -0
- sagemaker/core/workflow/parameters.py +222 -0
- sagemaker/core/workflow/pipeline_context.py +394 -0
- sagemaker/core/workflow/pipeline_definition_config.py +31 -0
- sagemaker/core/workflow/properties.py +285 -0
- sagemaker/core/workflow/step_outputs.py +65 -0
- sagemaker/core/workflow/utilities.py +514 -0
- sagemaker/lineage/__init__.py +33 -0
- sagemaker/lineage/action.py +28 -0
- sagemaker/lineage/artifact.py +28 -0
- sagemaker/lineage/context.py +28 -0
- sagemaker/lineage/lineage_trial_component.py +28 -0
- {sagemaker_core-1.0.62.dist-info → sagemaker_core-2.3.1.dist-info}/METADATA +28 -9
- sagemaker_core-2.3.1.dist-info/RECORD +351 -0
- sagemaker_core-2.3.1.dist-info/top_level.txt +1 -0
- sagemaker_core/_version.py +0 -3
- sagemaker_core/helper/session_helper.py +0 -769
- sagemaker_core/resources/__init__.py +0 -1
- sagemaker_core/shapes/__init__.py +0 -1
- sagemaker_core/tools/__init__.py +0 -1
- sagemaker_core-1.0.62.dist-info/RECORD +0 -35
- sagemaker_core-1.0.62.dist-info/top_level.txt +0 -1
- {sagemaker_core → sagemaker/core/helper}/__init__.py +0 -0
- {sagemaker_core/helper → sagemaker/core/jumpstart/factory}/__init__.py +0 -0
- {sagemaker_core/main → sagemaker/core/jumpstart/hub}/__init__.py +0 -0
- {sagemaker_core/main/code_injection → sagemaker/core/modules/local_core}/__init__.py +0 -0
- {sagemaker_core/main → sagemaker/core/utils}/code_injection/base.py +0 -0
- {sagemaker_core/main → sagemaker/core/utils}/code_injection/constants.py +0 -0
- {sagemaker_core/main → sagemaker/core/utils}/user_agent.py +0 -0
- {sagemaker_core-1.0.62.dist-info → sagemaker_core-2.3.1.dist-info}/WHEEL +0 -0
- {sagemaker_core-1.0.62.dist-info → sagemaker_core-2.3.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
|
5
|
+
# the License is located at
|
|
6
|
+
#
|
|
7
|
+
# http://aws.amazon.com/apache2.0/
|
|
8
|
+
#
|
|
9
|
+
# or in the "license" file accompanying this file. This file is
|
|
10
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
|
11
|
+
# ANY KIND, either express or implied. See the License for the specific
|
|
12
|
+
# language governing permissions and limitations under the License.
|
|
13
|
+
"""This file contains util functions for the sagemaker Defaults Config.
|
|
14
|
+
|
|
15
|
+
These utils may be used inside or outside the config module.
|
|
16
|
+
"""
|
|
17
|
+
from __future__ import absolute_import
|
|
18
|
+
from collections import deque
|
|
19
|
+
|
|
20
|
+
import logging
|
|
21
|
+
import sys
|
|
22
|
+
from typing import Callable, List, TYPE_CHECKING
|
|
23
|
+
import re
|
|
24
|
+
from copy import deepcopy
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from sagemaker.core.common_utils import TagsDict
|
|
28
|
+
|
|
29
|
+
from sagemaker.core.config.config_schema import KEY
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def get_sagemaker_config_logger():
|
|
33
|
+
"""Return a logger with the name 'sagemaker.config'
|
|
34
|
+
|
|
35
|
+
If the logger to be returned has no level or handlers set, this will get level and handler
|
|
36
|
+
attributes. (So if the SDK user has setup loggers in a certain way, that setup will not be
|
|
37
|
+
changed by this function.) It is safe to make repeat calls to this function.
|
|
38
|
+
"""
|
|
39
|
+
sagemaker_config_logger = logging.getLogger("sagemaker.config")
|
|
40
|
+
sagemaker_logger = logging.getLogger("sagemaker")
|
|
41
|
+
|
|
42
|
+
if sagemaker_config_logger.level == logging.NOTSET:
|
|
43
|
+
sagemaker_config_logger.setLevel(logging.INFO)
|
|
44
|
+
|
|
45
|
+
# check sagemaker_logger here as well, so that if handlers were set for the parent logger
|
|
46
|
+
# already, we dont change behavior for the child logger
|
|
47
|
+
if len(sagemaker_config_logger.handlers) == 0 and len(sagemaker_logger.handlers) == 0:
|
|
48
|
+
# use sys.stdout so logs dont show up with a red background in a notebook
|
|
49
|
+
handler = logging.StreamHandler(sys.stdout)
|
|
50
|
+
|
|
51
|
+
formatter = logging.Formatter("%(name)s %(levelname)-4s - %(message)s")
|
|
52
|
+
handler.setFormatter(formatter)
|
|
53
|
+
sagemaker_config_logger.addHandler(handler)
|
|
54
|
+
|
|
55
|
+
# if a handler is being added, we dont want the root handler to also process the same events
|
|
56
|
+
sagemaker_config_logger.propagate = False
|
|
57
|
+
|
|
58
|
+
return sagemaker_config_logger
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _log_sagemaker_config_single_substitution(source_value, config_value, config_key_path: str):
|
|
62
|
+
"""Informs the SDK user whether a config value was present and automatically substituted
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
source_value: The value that will be used if it exists. Usually, this is user-provided
|
|
66
|
+
input to a Class or to a session.py method, or None if no input was provided.
|
|
67
|
+
config_value: The value fetched from sagemaker_config. If it exists, this is the value that
|
|
68
|
+
will be used if direct_input is None.
|
|
69
|
+
config_key_path: A string denoting the path of keys that point to the config value in the
|
|
70
|
+
sagemaker_config.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
None. Logs information to the "sagemaker.config" logger.
|
|
74
|
+
"""
|
|
75
|
+
logger = get_sagemaker_config_logger()
|
|
76
|
+
|
|
77
|
+
source_value_log_copy = deepcopy(source_value)
|
|
78
|
+
config_value_log_copy = deepcopy(config_value)
|
|
79
|
+
|
|
80
|
+
if isinstance(source_value_log_copy, dict):
|
|
81
|
+
for key in source_value_log_copy.keys():
|
|
82
|
+
if re.search(r"(secret|password|key|token)", key, re.IGNORECASE):
|
|
83
|
+
source_value_log_copy[key] = "***"
|
|
84
|
+
|
|
85
|
+
if isinstance(config_value_log_copy, dict):
|
|
86
|
+
for key in config_value_log_copy.keys():
|
|
87
|
+
if re.search(r"(secret|password|key|token)", key, re.IGNORECASE):
|
|
88
|
+
config_value_log_copy[key] = "***"
|
|
89
|
+
|
|
90
|
+
if config_value is not None:
|
|
91
|
+
|
|
92
|
+
if source_value is None:
|
|
93
|
+
# Sagemaker Config value is going to be used. By default the user should know about
|
|
94
|
+
# this scenario because the behavior they expect could change because of a new config
|
|
95
|
+
# value being injected in.
|
|
96
|
+
# However, it may not be safe to log ARNs to stdout by default. We can include more
|
|
97
|
+
# diagnostic info if the user enabled DEBUG logs though.
|
|
98
|
+
if logger.isEnabledFor(logging.DEBUG):
|
|
99
|
+
logger.debug(
|
|
100
|
+
"Applied value\n config key = %s\n config value that will be used = %s",
|
|
101
|
+
config_key_path,
|
|
102
|
+
config_value_log_copy,
|
|
103
|
+
)
|
|
104
|
+
else:
|
|
105
|
+
logger.info(
|
|
106
|
+
"Applied value from config key = %s",
|
|
107
|
+
config_key_path,
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
# The cases below here are logged as just debug statements because this info can be useful
|
|
111
|
+
# when debugging the config, but should not affect current behavior with/without the config.
|
|
112
|
+
|
|
113
|
+
elif source_value is not None and config_value == source_value:
|
|
114
|
+
# Sagemaker Config had a value defined that is NOT going to be used here.
|
|
115
|
+
# Either (1) the config value was already fetched and applied earlier, or
|
|
116
|
+
# (2) the user happened to pass in the same value.
|
|
117
|
+
logger.debug(
|
|
118
|
+
(
|
|
119
|
+
"Skipped value\n"
|
|
120
|
+
" config key = %s\n"
|
|
121
|
+
" config value = %s\n"
|
|
122
|
+
" source value that will be used = %s"
|
|
123
|
+
),
|
|
124
|
+
config_key_path,
|
|
125
|
+
config_value_log_copy,
|
|
126
|
+
source_value_log_copy,
|
|
127
|
+
)
|
|
128
|
+
elif source_value is not None and config_value != source_value:
|
|
129
|
+
# Sagemaker Config had a value defined that is NOT going to be used
|
|
130
|
+
# and the config value has not already been applied earlier (we know because the values
|
|
131
|
+
# are different).
|
|
132
|
+
logger.debug(
|
|
133
|
+
(
|
|
134
|
+
"Skipped value\n"
|
|
135
|
+
" config key = %s\n"
|
|
136
|
+
" config value = %s\n"
|
|
137
|
+
" source value that will be used = %s",
|
|
138
|
+
),
|
|
139
|
+
config_key_path,
|
|
140
|
+
config_value_log_copy,
|
|
141
|
+
source_value_log_copy,
|
|
142
|
+
)
|
|
143
|
+
else:
|
|
144
|
+
# nothing was specified in the config and nothing is being automatically applied
|
|
145
|
+
logger.debug("Skipped value because no value defined\n config key = %s", config_key_path)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def _log_sagemaker_config_merge(
|
|
149
|
+
source_value=None,
|
|
150
|
+
config_value=None,
|
|
151
|
+
merged_source_and_config_value=None,
|
|
152
|
+
config_key_path: str = None,
|
|
153
|
+
):
|
|
154
|
+
"""Informs the SDK user whether a config value was present and automatically substituted
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
source_value: The dict or object that would be used if no default values existed. Usually,
|
|
158
|
+
this is user-provided input to a Class or to a session.py method, or None if no input
|
|
159
|
+
was provided.
|
|
160
|
+
config_value: The dict or object fetched from sagemaker_config. If it exists, this is the
|
|
161
|
+
value that will be used if source_value is None.
|
|
162
|
+
merged_source_and_config_value: The value that results from the merging of source_value and
|
|
163
|
+
original_config_value. This will be the value used.
|
|
164
|
+
config_key_path: A string denoting the path of keys that point to the config value in the
|
|
165
|
+
sagemaker_config.
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
None. Logs information to the "sagemaker.config" logger.
|
|
169
|
+
"""
|
|
170
|
+
logger = get_sagemaker_config_logger()
|
|
171
|
+
|
|
172
|
+
if config_value:
|
|
173
|
+
|
|
174
|
+
if source_value != merged_source_and_config_value:
|
|
175
|
+
# Sagemaker Config value(s) were used and affected the final object/dictionary. By
|
|
176
|
+
# default the user should know about this scenario because the behavior they expect
|
|
177
|
+
# could change because of new config values being injected in.
|
|
178
|
+
# However, it may not be safe to log ARNs to stdout by default. We can include more
|
|
179
|
+
# diagnostic info if the user enabled DEBUG logs though.
|
|
180
|
+
if logger.isEnabledFor(logging.DEBUG):
|
|
181
|
+
logger.debug(
|
|
182
|
+
(
|
|
183
|
+
"Applied value(s)\n"
|
|
184
|
+
" config key = %s\n"
|
|
185
|
+
" config value = %s\n"
|
|
186
|
+
" source value = %s\n"
|
|
187
|
+
" combined value that will be used = %s"
|
|
188
|
+
),
|
|
189
|
+
config_key_path,
|
|
190
|
+
config_value,
|
|
191
|
+
source_value,
|
|
192
|
+
merged_source_and_config_value,
|
|
193
|
+
)
|
|
194
|
+
else:
|
|
195
|
+
logger.info(
|
|
196
|
+
"Applied value(s) from config key = %s",
|
|
197
|
+
config_key_path,
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
# The cases below here are logged as just debug statements because this info can be useful
|
|
201
|
+
# when debugging the config, but should not affect current behavior with/without the config.
|
|
202
|
+
|
|
203
|
+
else:
|
|
204
|
+
# Sagemaker Config had a value defined that is NOT going to be used here.
|
|
205
|
+
# Either (1) the config value was already fetched and applied earlier, or
|
|
206
|
+
# (2) the user happened to pass in the same values.
|
|
207
|
+
logger.debug(
|
|
208
|
+
(
|
|
209
|
+
"Skipped value(s)\n"
|
|
210
|
+
" config key = %s\n"
|
|
211
|
+
" config value = %s\n"
|
|
212
|
+
" source value that will be used = %s"
|
|
213
|
+
),
|
|
214
|
+
config_key_path,
|
|
215
|
+
config_value,
|
|
216
|
+
merged_source_and_config_value,
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
else:
|
|
220
|
+
# nothing was specified in the config and nothing is being automatically applied
|
|
221
|
+
logger.debug("Skipped value because no value defined\n config key = %s", config_key_path)
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def non_repeating_log_factory(logger: logging.Logger, method: str, cache_size=100) -> Callable:
|
|
225
|
+
"""Create log function that filters the repeated messages.
|
|
226
|
+
|
|
227
|
+
By default. It only keeps track of last 100 messages, if a repeated
|
|
228
|
+
message arrives after the ``cache_size`` messages, it will be displayed.
|
|
229
|
+
|
|
230
|
+
Args:
|
|
231
|
+
logger (logging.Logger): the logger to be used to dispatch the message.
|
|
232
|
+
method (str): the log method, can be info, warning or debug.
|
|
233
|
+
cache_size (int): the number of last log messages to keep in cache.
|
|
234
|
+
Default to 100
|
|
235
|
+
|
|
236
|
+
Returns:
|
|
237
|
+
(Callable): the new log method
|
|
238
|
+
"""
|
|
239
|
+
if method not in ["info", "warning", "debug"]:
|
|
240
|
+
raise ValueError("Not supported logging method.")
|
|
241
|
+
|
|
242
|
+
_caches = deque(maxlen=cache_size)
|
|
243
|
+
log_method = getattr(logger, method)
|
|
244
|
+
|
|
245
|
+
def new_log_method(msg, *args, **kwargs):
|
|
246
|
+
key = f"{msg}:{args}"
|
|
247
|
+
if key not in _caches:
|
|
248
|
+
log_method(msg, *args, **kwargs)
|
|
249
|
+
_caches.append(key)
|
|
250
|
+
|
|
251
|
+
return new_log_method
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def _append_sagemaker_config_tags(
|
|
255
|
+
sagemaker_session, tags: List["TagsDict"], config_path_to_tags: str
|
|
256
|
+
):
|
|
257
|
+
"""Appends tags specified in the sagemaker_config to the given list of tags.
|
|
258
|
+
|
|
259
|
+
To minimize the chance of duplicate tags being applied, this is intended to be used
|
|
260
|
+
immediately before calls to sagemaker_client, rather than during initialization of
|
|
261
|
+
classes like EstimatorBase.
|
|
262
|
+
|
|
263
|
+
Args:
|
|
264
|
+
tags: The list of tags to append to.
|
|
265
|
+
config_path_to_tags: The path to look up tags in the config.
|
|
266
|
+
|
|
267
|
+
Returns:
|
|
268
|
+
A list of tags.
|
|
269
|
+
"""
|
|
270
|
+
from sagemaker.core.config.config_manager import SageMakerConfig
|
|
271
|
+
|
|
272
|
+
config_tags = SageMakerConfig().get_sagemaker_config_value(
|
|
273
|
+
sagemaker_session, config_path_to_tags
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
if config_tags is None or len(config_tags) == 0:
|
|
277
|
+
return tags
|
|
278
|
+
|
|
279
|
+
all_tags = tags or []
|
|
280
|
+
for config_tag in config_tags:
|
|
281
|
+
config_tag_key = config_tag[KEY]
|
|
282
|
+
if not any(tag.get("Key", None) == config_tag_key for tag in all_tags):
|
|
283
|
+
# This check prevents new tags with duplicate keys from being added
|
|
284
|
+
# (to prevent API failure and/or overwriting of tags). If there is a conflict,
|
|
285
|
+
# the user-provided tag should take precedence over the config-provided tag.
|
|
286
|
+
# Note: this does not check user-provided tags for conflicts with other
|
|
287
|
+
# user-provided tags.
|
|
288
|
+
all_tags.append(config_tag)
|
|
289
|
+
|
|
290
|
+
_log_sagemaker_config_merge(
|
|
291
|
+
source_value=tags,
|
|
292
|
+
config_value=config_tags,
|
|
293
|
+
merged_source_and_config_value=all_tags,
|
|
294
|
+
config_key_path=config_path_to_tags,
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
return all_tags
|