sagemaker-core 1.0.47__py3-none-any.whl → 2.1.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/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 +2281 -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 +410 -4
- 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 +244 -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 +1176 -0
- sagemaker/core/git_utils.py +349 -0
- sagemaker/core/helper/pipeline_variable.py +82 -0
- sagemaker/core/helper/session_helper.py +2965 -0
- sagemaker/core/huggingface/__init__.py +29 -0
- sagemaker/core/huggingface/llm_utils.py +150 -0
- sagemaker/core/huggingface/processing.py +139 -0
- sagemaker/core/huggingface/training_compiler/config.py +167 -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 +511 -0
- sagemaker/core/image_retriever/test.py +7 -0
- sagemaker/core/image_uri_config/__init__.py +13 -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 +660 -0
- sagemaker/core/image_uri_config/huggingface-llm.json +1158 -0
- sagemaker/core/image_uri_config/huggingface-neuron.json +52 -0
- sagemaker/core/image_uri_config/huggingface-neuronx.json +510 -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.json +2138 -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 +212 -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 +446 -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 +888 -0
- sagemaker/core/image_uris.py +810 -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 +186 -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/__init__.py +0 -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 +499 -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 +163 -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 +413 -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 +245 -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 +1495 -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 +226 -0
- sagemaker/core/modules/constants.py +37 -0
- sagemaker/core/modules/distributed.py +182 -0
- sagemaker/core/modules/local_core/__init__.py +0 -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 +213 -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 +1597 -0
- sagemaker/core/remote_function/__init__.py +19 -0
- sagemaker/core/remote_function/checkpoint_location.py +47 -0
- sagemaker/core/remote_function/client.py +1285 -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 +353 -0
- sagemaker/core/remote_function/core/serialization.py +422 -0
- sagemaker/core/remote_function/core/stored_function.py +226 -0
- sagemaker/core/remote_function/custom_file_filter.py +128 -0
- sagemaker/core/remote_function/errors.py +104 -0
- sagemaker/core/remote_function/invoke_function.py +172 -0
- sagemaker/core/remote_function/job.py +2140 -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 +20121 -11728
- 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 +6384 -1865
- 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 +84 -0
- sagemaker/core/telemetry/telemetry_logging.py +284 -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 +333 -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 +6479 -136
- {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 +25 -20
- 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 +507 -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.47.dist-info → sagemaker_core-2.1.1.dist-info}/METADATA +28 -9
- sagemaker_core-2.1.1.dist-info/RECORD +355 -0
- sagemaker_core-2.1.1.dist-info/top_level.txt +1 -0
- sagemaker_core/__init__.py +0 -4
- 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.47.dist-info/RECORD +0 -35
- sagemaker_core-1.0.47.dist-info/top_level.txt +0 -1
- {sagemaker_core → sagemaker/core}/helper/__init__.py +0 -0
- {sagemaker_core/main → sagemaker/core/huggingface/training_compiler}/__init__.py +0 -0
- {sagemaker_core/main/code_injection → sagemaker/core/jumpstart/factory}/__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.47.dist-info → sagemaker_core-2.1.1.dist-info}/WHEEL +0 -0
- {sagemaker_core-1.0.47.dist-info → sagemaker_core-2.1.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,128 @@
|
|
|
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
|
+
"""SageMaker remote function client."""
|
|
14
|
+
from __future__ import absolute_import
|
|
15
|
+
|
|
16
|
+
import fnmatch
|
|
17
|
+
import os
|
|
18
|
+
import shutil
|
|
19
|
+
from typing import List, Optional, Callable, Union
|
|
20
|
+
|
|
21
|
+
from sagemaker.core.common_utils import resolve_value_from_config
|
|
22
|
+
from sagemaker.core.config.config_schema import REMOTE_FUNCTION_PATH, CUSTOM_FILE_FILTER
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class CustomFileFilter:
|
|
26
|
+
"""Configuration that specifies how the local working directory should be packaged."""
|
|
27
|
+
|
|
28
|
+
def __init__(self, *, ignore_name_patterns: List[str] = None):
|
|
29
|
+
"""Initialize a CustomFileFilter.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
ignore_name_patterns (List[str]): ignore files or directories with names
|
|
33
|
+
that match one of the glob-style patterns. Defaults to None.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
if ignore_name_patterns is None:
|
|
37
|
+
ignore_name_patterns = []
|
|
38
|
+
|
|
39
|
+
self._workdir = os.getcwd()
|
|
40
|
+
self._ignore_name_patterns = ignore_name_patterns
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def ignore_name_patterns(self):
|
|
44
|
+
"""Get the ignore name patterns."""
|
|
45
|
+
return self._ignore_name_patterns
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def workdir(self):
|
|
49
|
+
"""Get the working directory."""
|
|
50
|
+
return self._workdir
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def resolve_custom_file_filter_from_config_file(
|
|
54
|
+
direct_input: Union[Callable[[str, List], List], CustomFileFilter] = None,
|
|
55
|
+
sagemaker_session=None,
|
|
56
|
+
) -> Union[Callable[[str, List], List], CustomFileFilter, None]:
|
|
57
|
+
"""Resolve the CustomFileFilter configuration from the config file.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
direct_input (Callable[[str, List], List], CustomFileFilter): direct input from the user.
|
|
61
|
+
sagemaker_session (sagemaker.core.helper.session.Session): sagemaker session.
|
|
62
|
+
Returns:
|
|
63
|
+
CustomFileFilter: configuration that specifies how the local
|
|
64
|
+
working directory should be packaged.
|
|
65
|
+
"""
|
|
66
|
+
if direct_input is not None:
|
|
67
|
+
return direct_input
|
|
68
|
+
ignore_name_patterns = resolve_value_from_config(
|
|
69
|
+
direct_input=None,
|
|
70
|
+
config_path=".".join([REMOTE_FUNCTION_PATH, CUSTOM_FILE_FILTER, "IgnoreNamePatterns"]),
|
|
71
|
+
default_value=None,
|
|
72
|
+
sagemaker_session=sagemaker_session,
|
|
73
|
+
)
|
|
74
|
+
if ignore_name_patterns is not None:
|
|
75
|
+
return CustomFileFilter(ignore_name_patterns=ignore_name_patterns)
|
|
76
|
+
return None
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def copy_workdir(
|
|
80
|
+
dst: str,
|
|
81
|
+
custom_file_filter: Optional[Union[Callable[[str, List], List], CustomFileFilter]] = None,
|
|
82
|
+
):
|
|
83
|
+
"""Copy the local working directory to the destination.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
dst (str): destination path.
|
|
87
|
+
custom_file_filter (Union[Callable[[str, List], List], CustomFileFilter): configuration that
|
|
88
|
+
specifies how the local working directory should be packaged.
|
|
89
|
+
"""
|
|
90
|
+
|
|
91
|
+
def _ignore_patterns(path: str, names: List): # pylint: disable=unused-argument
|
|
92
|
+
ignored_names = set()
|
|
93
|
+
if custom_file_filter.ignore_name_patterns is not None:
|
|
94
|
+
for pattern in custom_file_filter.ignore_name_patterns:
|
|
95
|
+
ignored_names.update(fnmatch.filter(names, pattern))
|
|
96
|
+
return ignored_names
|
|
97
|
+
|
|
98
|
+
def _filter_non_python_files(path: str, names: List) -> List:
|
|
99
|
+
"""Ignore function for filtering out non python files."""
|
|
100
|
+
to_ignore = []
|
|
101
|
+
for name in names:
|
|
102
|
+
full_path = os.path.join(path, name)
|
|
103
|
+
if os.path.isfile(full_path):
|
|
104
|
+
if not name.endswith(".py"):
|
|
105
|
+
to_ignore.append(name)
|
|
106
|
+
elif os.path.isdir(full_path):
|
|
107
|
+
if name == "__pycache__":
|
|
108
|
+
to_ignore.append(name)
|
|
109
|
+
else:
|
|
110
|
+
to_ignore.append(name)
|
|
111
|
+
|
|
112
|
+
return to_ignore
|
|
113
|
+
|
|
114
|
+
_ignore = None
|
|
115
|
+
_src = os.getcwd()
|
|
116
|
+
if not custom_file_filter:
|
|
117
|
+
_ignore = _filter_non_python_files
|
|
118
|
+
elif callable(custom_file_filter):
|
|
119
|
+
_ignore = custom_file_filter
|
|
120
|
+
elif isinstance(custom_file_filter, CustomFileFilter):
|
|
121
|
+
_ignore = _ignore_patterns
|
|
122
|
+
_src = custom_file_filter.workdir
|
|
123
|
+
|
|
124
|
+
shutil.copytree(
|
|
125
|
+
_src,
|
|
126
|
+
dst,
|
|
127
|
+
ignore=_ignore,
|
|
128
|
+
)
|
|
@@ -0,0 +1,104 @@
|
|
|
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
|
+
"""Definitions for reomote job errors and error handling"""
|
|
14
|
+
from __future__ import absolute_import
|
|
15
|
+
|
|
16
|
+
import os
|
|
17
|
+
|
|
18
|
+
from tblib import pickling_support
|
|
19
|
+
from sagemaker.core.s3 import s3_path_join
|
|
20
|
+
import sagemaker.core.remote_function.core.serialization as serialization
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
DEFAULT_FAILURE_CODE = 1
|
|
24
|
+
FAILURE_REASON_PATH = "/opt/ml/output/failure"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@pickling_support.install
|
|
28
|
+
class RemoteFunctionError(Exception):
|
|
29
|
+
"""The base exception class for remote function exceptions"""
|
|
30
|
+
|
|
31
|
+
def __init__(self, message):
|
|
32
|
+
self.message = message
|
|
33
|
+
super().__init__(self.message)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@pickling_support.install
|
|
37
|
+
class ServiceError(RemoteFunctionError):
|
|
38
|
+
"""Raised when errors encountered during interaction with SageMaker, S3 service APIs"""
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@pickling_support.install
|
|
42
|
+
class SerializationError(RemoteFunctionError):
|
|
43
|
+
"""Raised when errors encountered during serialization of remote function objects"""
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@pickling_support.install
|
|
47
|
+
class DeserializationError(RemoteFunctionError):
|
|
48
|
+
"""Raised when errors encountered during deserialization of remote function objects"""
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _get_valid_failure_exit_code(exit_code) -> int:
|
|
52
|
+
"""Normalize exit code for terminating the process"""
|
|
53
|
+
try:
|
|
54
|
+
valid_exit_code = int(exit_code)
|
|
55
|
+
except (TypeError, ValueError):
|
|
56
|
+
valid_exit_code = DEFAULT_FAILURE_CODE
|
|
57
|
+
|
|
58
|
+
return valid_exit_code
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _write_failure_reason_file(failure_msg):
|
|
62
|
+
"""Create a file 'failure' with failure reason written if remote function execution failed.
|
|
63
|
+
|
|
64
|
+
See: https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo.html
|
|
65
|
+
Args:
|
|
66
|
+
failure_msg: The content of file to be written.
|
|
67
|
+
"""
|
|
68
|
+
if not os.path.exists(FAILURE_REASON_PATH):
|
|
69
|
+
with open(FAILURE_REASON_PATH, "w") as f:
|
|
70
|
+
f.write(failure_msg)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def handle_error(error, sagemaker_session, s3_base_uri, s3_kms_key, hmac_key) -> int:
|
|
74
|
+
"""Handle all exceptions raised during remote function execution.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
error (Exception): The error to be handled.
|
|
78
|
+
sagemaker_session (sagemaker.core.helper.session.Session): The underlying Boto3 session which
|
|
79
|
+
AWS service calls are delegated to.
|
|
80
|
+
s3_base_uri (str): S3 root uri to which resulting serialized exception will be uploaded.
|
|
81
|
+
s3_kms_key (str): KMS key used to encrypt artifacts uploaded to S3.
|
|
82
|
+
hmac_key (str): Key used to calculate hmac hash of the serialized exception.
|
|
83
|
+
Returns :
|
|
84
|
+
exit_code (int): Exit code to terminate current job.
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
failure_reason = repr(error)
|
|
88
|
+
if isinstance(error, RemoteFunctionError):
|
|
89
|
+
exit_code = DEFAULT_FAILURE_CODE
|
|
90
|
+
else:
|
|
91
|
+
error_number = getattr(error, "errno", DEFAULT_FAILURE_CODE)
|
|
92
|
+
exit_code = _get_valid_failure_exit_code(error_number)
|
|
93
|
+
|
|
94
|
+
_write_failure_reason_file(failure_reason)
|
|
95
|
+
|
|
96
|
+
serialization.serialize_exception_to_s3(
|
|
97
|
+
exc=error,
|
|
98
|
+
sagemaker_session=sagemaker_session,
|
|
99
|
+
s3_uri=s3_path_join(s3_base_uri, "exception"),
|
|
100
|
+
hmac_key=hmac_key,
|
|
101
|
+
s3_kms_key=s3_kms_key,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
return exit_code
|
|
@@ -0,0 +1,172 @@
|
|
|
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
|
+
"""An entry point for invoking remote function inside a job."""
|
|
14
|
+
|
|
15
|
+
from __future__ import absolute_import
|
|
16
|
+
|
|
17
|
+
import argparse
|
|
18
|
+
import sys
|
|
19
|
+
import json
|
|
20
|
+
import os
|
|
21
|
+
from typing import TYPE_CHECKING
|
|
22
|
+
|
|
23
|
+
import boto3
|
|
24
|
+
from sagemaker.core.remote_function.job import (
|
|
25
|
+
KEY_EXPERIMENT_NAME,
|
|
26
|
+
KEY_RUN_NAME,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
from sagemaker.core.helper.session_helper import Session
|
|
30
|
+
from sagemaker.core.s3 import s3_path_join
|
|
31
|
+
from sagemaker.core.remote_function.errors import handle_error
|
|
32
|
+
from sagemaker.core.remote_function import logging_config
|
|
33
|
+
from sagemaker.core.remote_function.core.pipeline_variables import Context
|
|
34
|
+
|
|
35
|
+
if TYPE_CHECKING:
|
|
36
|
+
from sagemaker.core.experiments.run import Run
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
SUCCESS_EXIT_CODE = 0
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _parse_args(args):
|
|
43
|
+
"""Parses CLI arguments."""
|
|
44
|
+
parser = argparse.ArgumentParser()
|
|
45
|
+
parser.add_argument("--region", type=str, required=True)
|
|
46
|
+
parser.add_argument("--s3_base_uri", type=str, required=True)
|
|
47
|
+
parser.add_argument("--s3_kms_key", type=str)
|
|
48
|
+
parser.add_argument("--run_in_context", type=str)
|
|
49
|
+
parser.add_argument("--pipeline_step_name", type=str)
|
|
50
|
+
parser.add_argument("--pipeline_execution_id", type=str)
|
|
51
|
+
parser.add_argument("--property_references", nargs="+", type=str, default=[])
|
|
52
|
+
parser.add_argument(
|
|
53
|
+
"--serialize_output_to_json", default=False, type=lambda x: (str(x).lower() == "true")
|
|
54
|
+
)
|
|
55
|
+
parser.add_argument("--func_step_s3_dir", type=str)
|
|
56
|
+
|
|
57
|
+
args, _ = parser.parse_known_args(args)
|
|
58
|
+
return args
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _get_sagemaker_session(region):
|
|
62
|
+
"""Get sagemaker session for interacting with AWS or Sagemaker services"""
|
|
63
|
+
boto_session = boto3.session.Session(region_name=region)
|
|
64
|
+
return Session(boto_session=boto_session)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _load_run_object(run_in_context: str, sagemaker_session: Session) -> "Run":
|
|
68
|
+
"""Load current run in json string into run object"""
|
|
69
|
+
from sagemaker.core.experiments.run import Run
|
|
70
|
+
|
|
71
|
+
run_dict = json.loads(run_in_context)
|
|
72
|
+
return Run(
|
|
73
|
+
experiment_name=run_dict.get(KEY_EXPERIMENT_NAME),
|
|
74
|
+
run_name=run_dict.get(KEY_RUN_NAME),
|
|
75
|
+
sagemaker_session=sagemaker_session,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _load_pipeline_context(args) -> Context:
|
|
80
|
+
"""Load pipeline build or run context into context object"""
|
|
81
|
+
|
|
82
|
+
pipeline_step_name = args.pipeline_step_name
|
|
83
|
+
pipeline_execution_id = args.pipeline_execution_id
|
|
84
|
+
property_references = args.property_references
|
|
85
|
+
serialize_output_to_json = args.serialize_output_to_json
|
|
86
|
+
func_step_s3_dir = args.func_step_s3_dir
|
|
87
|
+
|
|
88
|
+
property_references_dict = {}
|
|
89
|
+
for i in range(0, len(property_references), 2):
|
|
90
|
+
property_references_dict[property_references[i]] = property_references[i + 1]
|
|
91
|
+
return Context(
|
|
92
|
+
step_name=pipeline_step_name,
|
|
93
|
+
execution_id=pipeline_execution_id,
|
|
94
|
+
property_references=property_references_dict,
|
|
95
|
+
serialize_output_to_json=serialize_output_to_json,
|
|
96
|
+
func_step_s3_dir=func_step_s3_dir,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _execute_remote_function(
|
|
101
|
+
sagemaker_session, s3_base_uri, s3_kms_key, run_in_context, hmac_key, context
|
|
102
|
+
):
|
|
103
|
+
"""Execute stored remote function"""
|
|
104
|
+
from sagemaker.core.remote_function.core.stored_function import StoredFunction
|
|
105
|
+
|
|
106
|
+
stored_function = StoredFunction(
|
|
107
|
+
sagemaker_session=sagemaker_session,
|
|
108
|
+
s3_base_uri=s3_base_uri,
|
|
109
|
+
s3_kms_key=s3_kms_key,
|
|
110
|
+
hmac_key=hmac_key,
|
|
111
|
+
context=context,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
if run_in_context:
|
|
115
|
+
run_obj = _load_run_object(run_in_context, sagemaker_session)
|
|
116
|
+
with run_obj:
|
|
117
|
+
stored_function.load_and_invoke()
|
|
118
|
+
else:
|
|
119
|
+
stored_function.load_and_invoke()
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def main(sys_args=None):
|
|
123
|
+
"""Entry point for invoke function script
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
sys_args (list): List of arguments to parse. If not specified, sys.argv is used.
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
logger = logging_config.get_logger()
|
|
130
|
+
|
|
131
|
+
exit_code = SUCCESS_EXIT_CODE
|
|
132
|
+
|
|
133
|
+
try:
|
|
134
|
+
args = _parse_args(sys_args)
|
|
135
|
+
region = args.region
|
|
136
|
+
s3_base_uri = args.s3_base_uri
|
|
137
|
+
s3_kms_key = args.s3_kms_key
|
|
138
|
+
run_in_context = args.run_in_context
|
|
139
|
+
pipeline_context = _load_pipeline_context(args)
|
|
140
|
+
|
|
141
|
+
hmac_key = os.getenv("REMOTE_FUNCTION_SECRET_KEY")
|
|
142
|
+
|
|
143
|
+
sagemaker_session = _get_sagemaker_session(region)
|
|
144
|
+
_execute_remote_function(
|
|
145
|
+
sagemaker_session=sagemaker_session,
|
|
146
|
+
s3_base_uri=s3_base_uri,
|
|
147
|
+
s3_kms_key=s3_kms_key,
|
|
148
|
+
run_in_context=run_in_context,
|
|
149
|
+
hmac_key=hmac_key,
|
|
150
|
+
context=pipeline_context,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
except Exception as e: # pylint: disable=broad-except
|
|
154
|
+
logger.exception("Error encountered while invoking the remote function.")
|
|
155
|
+
s3_uri = (
|
|
156
|
+
s3_path_join(s3_base_uri, pipeline_context.execution_id, pipeline_context.step_name)
|
|
157
|
+
if pipeline_context.step_name
|
|
158
|
+
else s3_base_uri
|
|
159
|
+
)
|
|
160
|
+
exit_code = handle_error(
|
|
161
|
+
error=e,
|
|
162
|
+
sagemaker_session=sagemaker_session,
|
|
163
|
+
s3_base_uri=s3_uri,
|
|
164
|
+
s3_kms_key=s3_kms_key,
|
|
165
|
+
hmac_key=hmac_key,
|
|
166
|
+
)
|
|
167
|
+
finally:
|
|
168
|
+
sys.exit(exit_code)
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
if __name__ == "__main__":
|
|
172
|
+
main(sys.argv[1:])
|