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,216 @@
|
|
|
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
|
+
"""Contains the SageMaker Experiment utility methods."""
|
|
14
|
+
from __future__ import absolute_import
|
|
15
|
+
|
|
16
|
+
import logging
|
|
17
|
+
import os
|
|
18
|
+
|
|
19
|
+
import mimetypes
|
|
20
|
+
import urllib
|
|
21
|
+
from functools import wraps
|
|
22
|
+
from typing import Optional
|
|
23
|
+
|
|
24
|
+
from sagemaker.core.helper.session_helper import Session
|
|
25
|
+
from sagemaker.core.apiutils import _utils
|
|
26
|
+
from sagemaker.core.experiments._environment import _RunEnvironment, _EnvironmentType
|
|
27
|
+
from sagemaker.core.experiments.trial_component import _TrialComponent
|
|
28
|
+
from sagemaker.core.utilities.search_expression import Filter, Operator, SearchExpression
|
|
29
|
+
from sagemaker.core.common_utils import retry_with_backoff
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def resolve_artifact_name(file_path):
|
|
33
|
+
"""Resolve artifact name from given file path.
|
|
34
|
+
|
|
35
|
+
If not specified, will auto create one.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
file_path (str): Path to the file.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
str: The resolved artifact name.
|
|
42
|
+
"""
|
|
43
|
+
_, filename = os.path.split(file_path)
|
|
44
|
+
if filename:
|
|
45
|
+
return filename
|
|
46
|
+
|
|
47
|
+
return _utils.name("artifact")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def guess_media_type(file_path):
|
|
51
|
+
"""Infer the media type of a file based on its file name.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
file_path (str): Path to the file.
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
str: The guessed media type.
|
|
58
|
+
"""
|
|
59
|
+
file_url = urllib.parse.urljoin("file:", urllib.request.pathname2url(file_path))
|
|
60
|
+
guessed_media_type, _ = mimetypes.guess_type(file_url, strict=False)
|
|
61
|
+
return guessed_media_type
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def verify_length_of_true_and_predicted(true_labels, predicted_attrs, predicted_attrs_name):
|
|
65
|
+
"""Verify if lengths match between lists of true labels and predicted attributes.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
true_labels (list or array): The list of the true labels.
|
|
69
|
+
predicted_attrs (list or array): The list of the predicted labels/probabilities/scores.
|
|
70
|
+
predicted_attrs_name (str): The name of the predicted attributes.
|
|
71
|
+
|
|
72
|
+
Raises:
|
|
73
|
+
ValueError: If lengths mismatch between true labels and predicted attributes.
|
|
74
|
+
"""
|
|
75
|
+
if len(true_labels) != len(predicted_attrs):
|
|
76
|
+
raise ValueError(
|
|
77
|
+
"Lengths mismatch between true labels and {}: "
|
|
78
|
+
"({} vs {}).".format(predicted_attrs_name, len(true_labels), len(predicted_attrs))
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def validate_invoked_inside_run_context(func):
|
|
83
|
+
"""A Decorator to force the decorated method called under Run context."""
|
|
84
|
+
|
|
85
|
+
@wraps(func)
|
|
86
|
+
def wrapper(*args, **kwargs):
|
|
87
|
+
self_instance = args[0]
|
|
88
|
+
if not self_instance._inside_load_context and not self_instance._inside_init_context:
|
|
89
|
+
raise RuntimeError("This method should be called inside context of 'with' statement.")
|
|
90
|
+
return func(*args, **kwargs)
|
|
91
|
+
|
|
92
|
+
return wrapper
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def is_already_exist_error(error):
|
|
96
|
+
"""Check if the error indicates resource already exists
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
error (dict): The "Error" field in the response of the
|
|
100
|
+
`botocore.exceptions.ClientError`
|
|
101
|
+
"""
|
|
102
|
+
return error["Code"] == "ValidationException" and "already exists" in error["Message"]
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def get_tc_and_exp_config_from_job_env(
|
|
106
|
+
environment: _RunEnvironment,
|
|
107
|
+
sagemaker_session: Session,
|
|
108
|
+
) -> dict:
|
|
109
|
+
"""Retrieve an experiment config from the job environment.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
environment (_RunEnvironment): The run environment object with job specific data.
|
|
113
|
+
sagemaker_session (sagemaker.core.helper.session_helper.Session): Session object which
|
|
114
|
+
manages interactions with Amazon SageMaker APIs and any other
|
|
115
|
+
AWS services needed. If not specified, one is created using the
|
|
116
|
+
default AWS configuration chain.
|
|
117
|
+
"""
|
|
118
|
+
job_name = environment.source_arn.split("/")[-1]
|
|
119
|
+
if environment.environment_type == _EnvironmentType.SageMakerTrainingJob:
|
|
120
|
+
job_response = retry_with_backoff(
|
|
121
|
+
callable_func=lambda: sagemaker_session.describe_training_job(job_name),
|
|
122
|
+
num_attempts=4,
|
|
123
|
+
)
|
|
124
|
+
elif environment.environment_type == _EnvironmentType.SageMakerProcessingJob:
|
|
125
|
+
job_response = retry_with_backoff(
|
|
126
|
+
callable_func=lambda: sagemaker_session.describe_processing_job(job_name),
|
|
127
|
+
num_attempts=4,
|
|
128
|
+
)
|
|
129
|
+
else: # environment.environment_type == _EnvironmentType.SageMakerTransformJob
|
|
130
|
+
job_response = retry_with_backoff(
|
|
131
|
+
callable_func=lambda: sagemaker_session.describe_transform_job(job_name),
|
|
132
|
+
num_attempts=4,
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
job_exp_config = job_response.get("ExperimentConfig", dict())
|
|
136
|
+
from sagemaker.core.experiments.run import RUN_NAME
|
|
137
|
+
|
|
138
|
+
if job_exp_config.get(RUN_NAME, None):
|
|
139
|
+
return job_exp_config
|
|
140
|
+
raise RuntimeError(
|
|
141
|
+
"Not able to fetch RunName in ExperimentConfig of the sagemaker job. "
|
|
142
|
+
"Please make sure the ExperimentConfig is correctly set."
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def verify_load_input_names(
|
|
147
|
+
run_name: Optional[str] = None,
|
|
148
|
+
experiment_name: Optional[str] = None,
|
|
149
|
+
):
|
|
150
|
+
"""Verify the run_name and the experiment_name inputs in load_run.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
run_name (str): The run_name supplied by the user (default: None).
|
|
154
|
+
experiment_name (str): The experiment_name supplied by the user
|
|
155
|
+
(default: None).
|
|
156
|
+
|
|
157
|
+
Raises:
|
|
158
|
+
ValueError: If run_name is supplied while experiment_name is not.
|
|
159
|
+
"""
|
|
160
|
+
if not run_name and experiment_name:
|
|
161
|
+
logging.warning(
|
|
162
|
+
"No run_name is supplied. Ignoring the provided experiment_name "
|
|
163
|
+
"since it only takes effect along with run_name. "
|
|
164
|
+
"Will load the Run object from the job environment or current Run context."
|
|
165
|
+
)
|
|
166
|
+
if run_name and not experiment_name:
|
|
167
|
+
raise ValueError(
|
|
168
|
+
"Invalid input: experiment_name is missing when run_name is supplied. "
|
|
169
|
+
"Please supply a valid experiment_name when the run_name is not None."
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def is_run_trial_component(trial_component_name: str, sagemaker_session: Session) -> bool:
|
|
174
|
+
"""Check if a trial component is generated by `sagemaker.experiments.Run`
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
trial_component_name (str): The name of the trial component.
|
|
178
|
+
sagemaker_session (sagemaker.core.helper.session_helper.Session): Session object which
|
|
179
|
+
manages interactions with Amazon SageMaker APIs and any other
|
|
180
|
+
AWS services needed. If not specified, one is created using the
|
|
181
|
+
default AWS configuration chain.
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
bool: Indicate whether the trial component is created by
|
|
185
|
+
`sagemaker.experiments.Run` or not.
|
|
186
|
+
"""
|
|
187
|
+
search_filter = Filter(
|
|
188
|
+
name="TrialComponentName",
|
|
189
|
+
operator=Operator.EQUALS,
|
|
190
|
+
value=trial_component_name,
|
|
191
|
+
)
|
|
192
|
+
search_expression = SearchExpression(filters=[search_filter])
|
|
193
|
+
|
|
194
|
+
def search():
|
|
195
|
+
return list(
|
|
196
|
+
_TrialComponent.search(
|
|
197
|
+
search_expression=search_expression,
|
|
198
|
+
max_results=1, # TrialComponentName is unique in an account
|
|
199
|
+
sagemaker_session=sagemaker_session,
|
|
200
|
+
)
|
|
201
|
+
)[0]
|
|
202
|
+
|
|
203
|
+
try:
|
|
204
|
+
tc_search_res = retry_with_backoff(search, 4)
|
|
205
|
+
from sagemaker.core.experiments.run import RUN_TC_TAG
|
|
206
|
+
|
|
207
|
+
if not tc_search_res.tags or RUN_TC_TAG not in tc_search_res.tags:
|
|
208
|
+
return False
|
|
209
|
+
return True
|
|
210
|
+
except Exception as ex: # pylint: disable=broad-except
|
|
211
|
+
logging.warning(
|
|
212
|
+
"Failed to inspect the type of the trial component (%s), due to (%s)",
|
|
213
|
+
trial_component_name,
|
|
214
|
+
str(ex),
|
|
215
|
+
)
|
|
216
|
+
return False
|
|
@@ -0,0 +1,247 @@
|
|
|
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
|
+
"""Contains the SageMaker Experiment class."""
|
|
14
|
+
from __future__ import absolute_import
|
|
15
|
+
|
|
16
|
+
import time
|
|
17
|
+
|
|
18
|
+
from botocore.exceptions import ClientError
|
|
19
|
+
|
|
20
|
+
from sagemaker.core.apiutils import _base_types
|
|
21
|
+
from sagemaker.core.experiments.trial import _Trial
|
|
22
|
+
from sagemaker.core.experiments.trial_component import _TrialComponent
|
|
23
|
+
from sagemaker.core.common_utils import format_tags
|
|
24
|
+
from sagemaker.core.telemetry.telemetry_logging import _telemetry_emitter
|
|
25
|
+
from sagemaker.core.telemetry.constants import Feature
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Experiment(_base_types.Record):
|
|
29
|
+
"""An Amazon SageMaker experiment, which is a collection of related trials.
|
|
30
|
+
|
|
31
|
+
New experiments are created by calling `experiments.experiment.Experiment.create`.
|
|
32
|
+
Existing experiments can be reloaded by calling `experiments.experiment.Experiment.load`.
|
|
33
|
+
|
|
34
|
+
Attributes:
|
|
35
|
+
experiment_name (str): The name of the experiment. The name must be unique
|
|
36
|
+
within an account.
|
|
37
|
+
display_name (str): Name of the experiment that will appear in UI,
|
|
38
|
+
such as SageMaker Studio.
|
|
39
|
+
description (str): A description of the experiment.
|
|
40
|
+
tags (List[Dict[str, str]]): A list of tags to associate with the experiment.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
experiment_name = None
|
|
44
|
+
display_name = None
|
|
45
|
+
description = None
|
|
46
|
+
tags = None
|
|
47
|
+
|
|
48
|
+
_boto_create_method = "create_experiment"
|
|
49
|
+
_boto_load_method = "describe_experiment"
|
|
50
|
+
_boto_update_method = "update_experiment"
|
|
51
|
+
_boto_delete_method = "delete_experiment"
|
|
52
|
+
|
|
53
|
+
_boto_update_members = ["experiment_name", "description", "display_name"]
|
|
54
|
+
_boto_delete_members = ["experiment_name"]
|
|
55
|
+
|
|
56
|
+
_MAX_DELETE_ALL_ATTEMPTS = 3
|
|
57
|
+
|
|
58
|
+
def save(self):
|
|
59
|
+
"""Save the state of this Experiment to SageMaker.
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
dict: Update experiment API response.
|
|
63
|
+
"""
|
|
64
|
+
return self._invoke_api(self._boto_update_method, self._boto_update_members)
|
|
65
|
+
|
|
66
|
+
def delete(self):
|
|
67
|
+
"""Delete this Experiment from SageMaker.
|
|
68
|
+
|
|
69
|
+
Deleting an Experiment does not delete associated Trials and their Trial Components.
|
|
70
|
+
It requires that each Trial in the Experiment is first deleted.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
dict: Delete experiment API response.
|
|
74
|
+
"""
|
|
75
|
+
return self._invoke_api(self._boto_delete_method, self._boto_delete_members)
|
|
76
|
+
|
|
77
|
+
@classmethod
|
|
78
|
+
def load(cls, experiment_name, sagemaker_session=None):
|
|
79
|
+
"""Load an existing experiment and return an `Experiment` object representing it.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
experiment_name: (str): Name of the experiment
|
|
83
|
+
sagemaker_session (sagemaker.core.helper.session_helper.Session): Session object which
|
|
84
|
+
manages interactions with Amazon SageMaker APIs and any other
|
|
85
|
+
AWS services needed. If not specified, one is created using the
|
|
86
|
+
default AWS configuration chain.
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
experiments.experiment.Experiment: A SageMaker `Experiment` object
|
|
90
|
+
"""
|
|
91
|
+
return cls._construct(
|
|
92
|
+
cls._boto_load_method,
|
|
93
|
+
experiment_name=experiment_name,
|
|
94
|
+
sagemaker_session=sagemaker_session,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
@classmethod
|
|
98
|
+
@_telemetry_emitter(feature=Feature.MLOPS, func_name="experiment.create")
|
|
99
|
+
def create(
|
|
100
|
+
cls,
|
|
101
|
+
experiment_name,
|
|
102
|
+
display_name=None,
|
|
103
|
+
description=None,
|
|
104
|
+
tags=None,
|
|
105
|
+
sagemaker_session=None,
|
|
106
|
+
):
|
|
107
|
+
"""Create a new experiment in SageMaker and return an `Experiment` object.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
experiment_name: (str): Name of the experiment. Must be unique. Required.
|
|
111
|
+
display_name: (str): Name of the experiment that will appear in UI,
|
|
112
|
+
such as SageMaker Studio (default: None).
|
|
113
|
+
description: (str): Description of the experiment (default: None).
|
|
114
|
+
sagemaker_session (sagemaker.core.helper.session_helper.Session): Session object which
|
|
115
|
+
manages interactions with Amazon SageMaker APIs and any other
|
|
116
|
+
AWS services needed. If not specified, one is created using the
|
|
117
|
+
default AWS configuration chain.
|
|
118
|
+
tags (Optional[Tags]): A list of tags to associate with the experiment
|
|
119
|
+
(default: None).
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
experiments.experiment.Experiment: A SageMaker `Experiment` object
|
|
123
|
+
"""
|
|
124
|
+
return cls._construct(
|
|
125
|
+
cls._boto_create_method,
|
|
126
|
+
experiment_name=experiment_name,
|
|
127
|
+
display_name=display_name,
|
|
128
|
+
description=description,
|
|
129
|
+
tags=format_tags(tags),
|
|
130
|
+
sagemaker_session=sagemaker_session,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
@classmethod
|
|
134
|
+
def _load_or_create(
|
|
135
|
+
cls,
|
|
136
|
+
experiment_name,
|
|
137
|
+
display_name=None,
|
|
138
|
+
description=None,
|
|
139
|
+
tags=None,
|
|
140
|
+
sagemaker_session=None,
|
|
141
|
+
):
|
|
142
|
+
"""Load an experiment by name and create a new one if it does not exist.
|
|
143
|
+
|
|
144
|
+
Args:
|
|
145
|
+
experiment_name: (str): Name of the experiment. Must be unique. Required.
|
|
146
|
+
display_name: (str): Name of the experiment that will appear in UI,
|
|
147
|
+
such as SageMaker Studio (default: None). This is used only when the
|
|
148
|
+
given `experiment_name` does not exist and a new experiment has to be created.
|
|
149
|
+
description: (str): Description of the experiment (default: None).
|
|
150
|
+
This is used only when the given `experiment_name` does not exist and
|
|
151
|
+
a new experiment has to be created.
|
|
152
|
+
sagemaker_session (sagemaker.core.helper.session_helper.Session): Session object which
|
|
153
|
+
manages interactions with Amazon SageMaker APIs and any other
|
|
154
|
+
AWS services needed. If not specified, one is created using the
|
|
155
|
+
default AWS configuration chain.
|
|
156
|
+
tags (Optional[Tags]): A list of tags to associate with the experiment
|
|
157
|
+
(default: None). This is used only when the given `experiment_name` does not
|
|
158
|
+
exist and a new experiment has to be created.
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
experiments.experiment.Experiment: A SageMaker `Experiment` object
|
|
162
|
+
"""
|
|
163
|
+
try:
|
|
164
|
+
experiment = Experiment.create(
|
|
165
|
+
experiment_name=experiment_name,
|
|
166
|
+
display_name=display_name,
|
|
167
|
+
description=description,
|
|
168
|
+
tags=format_tags(tags),
|
|
169
|
+
sagemaker_session=sagemaker_session,
|
|
170
|
+
)
|
|
171
|
+
except ClientError as ce:
|
|
172
|
+
error_code = ce.response["Error"]["Code"]
|
|
173
|
+
error_message = ce.response["Error"]["Message"]
|
|
174
|
+
if not (error_code == "ValidationException" and "already exists" in error_message):
|
|
175
|
+
raise ce
|
|
176
|
+
# already exists
|
|
177
|
+
experiment = Experiment.load(experiment_name, sagemaker_session)
|
|
178
|
+
return experiment
|
|
179
|
+
|
|
180
|
+
def list_trials(self, created_before=None, created_after=None, sort_by=None, sort_order=None):
|
|
181
|
+
"""List trials in this experiment matching the specified criteria.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
created_before (datetime.datetime): Return trials created before this instant
|
|
185
|
+
(default: None).
|
|
186
|
+
created_after (datetime.datetime): Return trials created after this instant
|
|
187
|
+
(default: None).
|
|
188
|
+
sort_by (str): Which property to sort results by. One of 'Name', 'CreationTime'
|
|
189
|
+
(default: None).
|
|
190
|
+
sort_order (str): One of 'Ascending', or 'Descending' (default: None).
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
collections.Iterator[experiments._api_types.TrialSummary] :
|
|
194
|
+
An iterator over trials matching the criteria.
|
|
195
|
+
"""
|
|
196
|
+
return _Trial.list(
|
|
197
|
+
experiment_name=self.experiment_name,
|
|
198
|
+
created_before=created_before,
|
|
199
|
+
created_after=created_after,
|
|
200
|
+
sort_by=sort_by,
|
|
201
|
+
sort_order=sort_order,
|
|
202
|
+
sagemaker_session=self.sagemaker_session,
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
def _delete_all(self, action):
|
|
206
|
+
"""Force to delete the experiment and associated trials, trial components.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
action (str): The string '--force' is required to pass in to confirm recursively
|
|
210
|
+
delete the experiments, and all its trials and trial components.
|
|
211
|
+
"""
|
|
212
|
+
if action != "--force":
|
|
213
|
+
raise ValueError(
|
|
214
|
+
"Must confirm with string '--force' in order to delete the experiment and "
|
|
215
|
+
"associated trials, trial components."
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
delete_attempt_count = 0
|
|
219
|
+
last_exception = None
|
|
220
|
+
while True:
|
|
221
|
+
if delete_attempt_count == self._MAX_DELETE_ALL_ATTEMPTS:
|
|
222
|
+
raise Exception("Failed to delete, please try again.") from last_exception
|
|
223
|
+
try:
|
|
224
|
+
for trial_summary in self.list_trials():
|
|
225
|
+
trial = _Trial.load(
|
|
226
|
+
sagemaker_session=self.sagemaker_session,
|
|
227
|
+
trial_name=trial_summary.trial_name,
|
|
228
|
+
)
|
|
229
|
+
for (
|
|
230
|
+
trial_component_summary
|
|
231
|
+
) in trial.list_trial_components(): # pylint: disable=no-member
|
|
232
|
+
tc = _TrialComponent.load(
|
|
233
|
+
sagemaker_session=self.sagemaker_session,
|
|
234
|
+
trial_component_name=trial_component_summary.trial_component_name,
|
|
235
|
+
)
|
|
236
|
+
tc.delete(force_disassociate=True)
|
|
237
|
+
# to prevent throttling
|
|
238
|
+
time.sleep(1.2)
|
|
239
|
+
trial.delete() # pylint: disable=no-member
|
|
240
|
+
# to prevent throttling
|
|
241
|
+
time.sleep(1.2)
|
|
242
|
+
self.delete()
|
|
243
|
+
break
|
|
244
|
+
except Exception as ex: # pylint: disable=broad-except
|
|
245
|
+
last_exception = ex
|
|
246
|
+
finally:
|
|
247
|
+
delete_attempt_count = delete_attempt_count + 1
|