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,257 @@
|
|
|
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 module contains validators related to SageMaker JumpStart."""
|
|
14
|
+
from __future__ import absolute_import
|
|
15
|
+
from typing import Any, Dict, List, Optional
|
|
16
|
+
from sagemaker.core.helper.session_helper import Session
|
|
17
|
+
|
|
18
|
+
from sagemaker.core.jumpstart.enums import (
|
|
19
|
+
HyperparameterValidationMode,
|
|
20
|
+
JumpStartScriptScope,
|
|
21
|
+
VariableScope,
|
|
22
|
+
VariableTypes,
|
|
23
|
+
)
|
|
24
|
+
from sagemaker.core.jumpstart.exceptions import JumpStartHyperparametersError
|
|
25
|
+
from sagemaker.core.jumpstart.types import JumpStartHyperparameter
|
|
26
|
+
from sagemaker.core.jumpstart.utils import get_region_fallback, verify_model_region_and_return_specs
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _validate_hyperparameter(
|
|
30
|
+
hyperparameter_name: str,
|
|
31
|
+
hyperparameter_value: Any,
|
|
32
|
+
hyperparameter_specs: List[JumpStartHyperparameter],
|
|
33
|
+
) -> None:
|
|
34
|
+
"""Perform low-level hyperparameter validation on single parameter.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
hyperparameter_name (str): The name of the hyperparameter to validate.
|
|
38
|
+
hyperparameter_value (Any): The value of the hyperparemter to validate.
|
|
39
|
+
hyperparameter_specs (List[JumpStartHyperparameter]): List of ``JumpStartHyperparameter`` to
|
|
40
|
+
use when validating the hyperparameter.
|
|
41
|
+
|
|
42
|
+
Raises:
|
|
43
|
+
JumpStartHyperparametersError: If the hyperparameter is not formatted correctly,
|
|
44
|
+
according to its specs in the model metadata.
|
|
45
|
+
"""
|
|
46
|
+
hyperparameter_spec = [
|
|
47
|
+
spec for spec in hyperparameter_specs if spec.name == hyperparameter_name
|
|
48
|
+
]
|
|
49
|
+
if len(hyperparameter_spec) == 0:
|
|
50
|
+
raise JumpStartHyperparametersError(
|
|
51
|
+
f"Unable to perform validation -- cannot find hyperparameter '{hyperparameter_name}' "
|
|
52
|
+
"in model specs."
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
if len(hyperparameter_spec) > 1:
|
|
56
|
+
raise JumpStartHyperparametersError(
|
|
57
|
+
"Unable to perform validation -- found multiple hyperparameter "
|
|
58
|
+
f"'{hyperparameter_name}' in model specs."
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
hyperparameter_spec = hyperparameter_spec[0]
|
|
62
|
+
|
|
63
|
+
if hyperparameter_spec.type == VariableTypes.BOOL.value:
|
|
64
|
+
if isinstance(hyperparameter_value, bool):
|
|
65
|
+
return
|
|
66
|
+
if not isinstance(hyperparameter_value, str):
|
|
67
|
+
raise JumpStartHyperparametersError(
|
|
68
|
+
f"Expecting boolean valued hyperparameter, but got '{str(hyperparameter_value)}'."
|
|
69
|
+
)
|
|
70
|
+
if str(hyperparameter_value).lower() not in ["true", "false"]:
|
|
71
|
+
raise JumpStartHyperparametersError(
|
|
72
|
+
f"Expecting boolean valued hyperparameter, but got '{str(hyperparameter_value)}'."
|
|
73
|
+
)
|
|
74
|
+
elif hyperparameter_spec.type == VariableTypes.TEXT.value:
|
|
75
|
+
if not isinstance(hyperparameter_value, str):
|
|
76
|
+
raise JumpStartHyperparametersError(
|
|
77
|
+
"Expecting text valued hyperparameter to have string type."
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
if hasattr(hyperparameter_spec, "options"):
|
|
81
|
+
if hyperparameter_value not in hyperparameter_spec.options:
|
|
82
|
+
raise JumpStartHyperparametersError(
|
|
83
|
+
f"Hyperparameter '{hyperparameter_name}' must have one of the following "
|
|
84
|
+
f"values: {', '.join(hyperparameter_spec.options)}."
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
if hasattr(hyperparameter_spec, "min"):
|
|
88
|
+
if len(hyperparameter_value) < hyperparameter_spec.min:
|
|
89
|
+
raise JumpStartHyperparametersError(
|
|
90
|
+
f"Hyperparameter '{hyperparameter_name}' must have length no less than "
|
|
91
|
+
f"{hyperparameter_spec.min}."
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
if hasattr(hyperparameter_spec, "exclusive_min"):
|
|
95
|
+
if len(hyperparameter_value) <= hyperparameter_spec.exclusive_min:
|
|
96
|
+
raise JumpStartHyperparametersError(
|
|
97
|
+
f"Hyperparameter '{hyperparameter_name}' must have length greater than "
|
|
98
|
+
f"{hyperparameter_spec.exclusive_min}."
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
if hasattr(hyperparameter_spec, "max"):
|
|
102
|
+
if len(hyperparameter_value) > hyperparameter_spec.max:
|
|
103
|
+
raise JumpStartHyperparametersError(
|
|
104
|
+
f"Hyperparameter '{hyperparameter_name}' must have length no greater than "
|
|
105
|
+
f"{hyperparameter_spec.max}."
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
if hasattr(hyperparameter_spec, "exclusive_max"):
|
|
109
|
+
if len(hyperparameter_value) >= hyperparameter_spec.exclusive_max:
|
|
110
|
+
raise JumpStartHyperparametersError(
|
|
111
|
+
f"Hyperparameter '{hyperparameter_name}' must have length less than "
|
|
112
|
+
f"{hyperparameter_spec.exclusive_max}."
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
# validate numeric types
|
|
116
|
+
elif hyperparameter_spec.type in [VariableTypes.INT.value, VariableTypes.FLOAT.value]:
|
|
117
|
+
try:
|
|
118
|
+
numeric_hyperparam_value = float(hyperparameter_value)
|
|
119
|
+
except ValueError:
|
|
120
|
+
raise JumpStartHyperparametersError(
|
|
121
|
+
f"Hyperparameter '{hyperparameter_name}' must be numeric type "
|
|
122
|
+
f"('{hyperparameter_value}')."
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
if hyperparameter_spec.type == VariableTypes.INT.value:
|
|
126
|
+
hyperparameter_value_str = str(hyperparameter_value)
|
|
127
|
+
start_index = 0
|
|
128
|
+
if hyperparameter_value_str[0] in ["+", "-"]:
|
|
129
|
+
start_index = 1
|
|
130
|
+
if not hyperparameter_value_str[start_index:].isdigit():
|
|
131
|
+
raise JumpStartHyperparametersError(
|
|
132
|
+
f"Hyperparameter '{hyperparameter_name}' must be integer type "
|
|
133
|
+
f"('{hyperparameter_value}')."
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
if hasattr(hyperparameter_spec, "min"):
|
|
137
|
+
if numeric_hyperparam_value < hyperparameter_spec.min:
|
|
138
|
+
raise JumpStartHyperparametersError(
|
|
139
|
+
f"Hyperparameter '{hyperparameter_name}' can be no less than "
|
|
140
|
+
f"{hyperparameter_spec.min}."
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
if hasattr(hyperparameter_spec, "max"):
|
|
144
|
+
if numeric_hyperparam_value > hyperparameter_spec.max:
|
|
145
|
+
raise JumpStartHyperparametersError(
|
|
146
|
+
f"Hyperparameter '{hyperparameter_name}' can be no greater than "
|
|
147
|
+
f"{hyperparameter_spec.max}."
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
if hasattr(hyperparameter_spec, "exclusive_min"):
|
|
151
|
+
if numeric_hyperparam_value <= hyperparameter_spec.exclusive_min:
|
|
152
|
+
raise JumpStartHyperparametersError(
|
|
153
|
+
f"Hyperparameter '{hyperparameter_name}' must be greater than "
|
|
154
|
+
f"{hyperparameter_spec.exclusive_min}."
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
if hasattr(hyperparameter_spec, "exclusive_max"):
|
|
158
|
+
if numeric_hyperparam_value >= hyperparameter_spec.exclusive_max:
|
|
159
|
+
raise JumpStartHyperparametersError(
|
|
160
|
+
f"Hyperparameter '{hyperparameter_name}' must be less than "
|
|
161
|
+
f"{hyperparameter_spec.exclusive_max}."
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def validate_hyperparameters(
|
|
166
|
+
model_id: str,
|
|
167
|
+
model_version: str,
|
|
168
|
+
hyperparameters: Dict[str, Any],
|
|
169
|
+
validation_mode: HyperparameterValidationMode = HyperparameterValidationMode.VALIDATE_PROVIDED,
|
|
170
|
+
hub_arn: Optional[str] = None,
|
|
171
|
+
region: Optional[str] = None,
|
|
172
|
+
sagemaker_session: Optional[Session] = None,
|
|
173
|
+
tolerate_vulnerable_model: bool = False,
|
|
174
|
+
tolerate_deprecated_model: bool = False,
|
|
175
|
+
config_name: Optional[str] = None,
|
|
176
|
+
) -> None:
|
|
177
|
+
"""Validate hyperparameters for JumpStart models.
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
model_id (str): Model ID of the model for which to validate hyperparameters.
|
|
181
|
+
model_version (str): Version of the model for which to validate hyperparameters.
|
|
182
|
+
hyperparameters (dict): Hyperparameters to validate.
|
|
183
|
+
validation_mode (HyperparameterValidationMode): Method of validation to use with
|
|
184
|
+
hyperparameters. If set to ``VALIDATE_PROVIDED``, only hyperparameters provided
|
|
185
|
+
to this function will be validated, the missing hyperparameters will be ignored.
|
|
186
|
+
If set to``VALIDATE_ALGORITHM``, all algorithm hyperparameters will be validated.
|
|
187
|
+
If set to ``VALIDATE_ALL``, all hyperparameters for the model will be validated.
|
|
188
|
+
region (str): Region for which to validate hyperparameters. (Default: None).
|
|
189
|
+
sagemaker_session (Optional[Session]): Custom SageMaker Session to use.
|
|
190
|
+
(Default: sagemaker.jumpstart.constants.DEFAULT_JUMPSTART_SAGEMAKER_SESSION).
|
|
191
|
+
tolerate_vulnerable_model (bool): True if vulnerable versions of model
|
|
192
|
+
specifications should be tolerated (exception not raised). If False, raises an
|
|
193
|
+
exception if the script used by this version of the model has dependencies with known
|
|
194
|
+
security vulnerabilities. (Default: False).
|
|
195
|
+
tolerate_deprecated_model (bool): True if deprecated models should be tolerated
|
|
196
|
+
(exception not raised). False if these models should raise an exception.
|
|
197
|
+
(Default: False).
|
|
198
|
+
config_name (Optional[str]): Name of the JumpStart Model config to apply. (Default: None).
|
|
199
|
+
|
|
200
|
+
Raises:
|
|
201
|
+
JumpStartHyperparametersError: If the hyperparameters are not formatted correctly,
|
|
202
|
+
according to their metadata specs.
|
|
203
|
+
|
|
204
|
+
"""
|
|
205
|
+
|
|
206
|
+
region = region or get_region_fallback(
|
|
207
|
+
sagemaker_session=sagemaker_session,
|
|
208
|
+
)
|
|
209
|
+
if validation_mode is None:
|
|
210
|
+
validation_mode = HyperparameterValidationMode.VALIDATE_PROVIDED
|
|
211
|
+
|
|
212
|
+
region = region or get_region_fallback(
|
|
213
|
+
sagemaker_session=sagemaker_session,
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
model_specs = verify_model_region_and_return_specs(
|
|
217
|
+
model_id=model_id,
|
|
218
|
+
version=model_version,
|
|
219
|
+
hub_arn=hub_arn,
|
|
220
|
+
region=region,
|
|
221
|
+
scope=JumpStartScriptScope.TRAINING,
|
|
222
|
+
sagemaker_session=sagemaker_session,
|
|
223
|
+
tolerate_deprecated_model=tolerate_deprecated_model,
|
|
224
|
+
tolerate_vulnerable_model=tolerate_vulnerable_model,
|
|
225
|
+
config_name=config_name,
|
|
226
|
+
)
|
|
227
|
+
hyperparameters_specs = model_specs.hyperparameters
|
|
228
|
+
|
|
229
|
+
if validation_mode == HyperparameterValidationMode.VALIDATE_PROVIDED:
|
|
230
|
+
for hyperparam_name, hyperparam_value in hyperparameters.items():
|
|
231
|
+
_validate_hyperparameter(hyperparam_name, hyperparam_value, hyperparameters_specs)
|
|
232
|
+
|
|
233
|
+
elif validation_mode == HyperparameterValidationMode.VALIDATE_ALGORITHM:
|
|
234
|
+
for hyperparam in hyperparameters_specs:
|
|
235
|
+
if hyperparam.scope == VariableScope.ALGORITHM:
|
|
236
|
+
if hyperparam.name not in hyperparameters:
|
|
237
|
+
raise JumpStartHyperparametersError(
|
|
238
|
+
f"Cannot find algorithm hyperparameter for '{hyperparam.name}'."
|
|
239
|
+
)
|
|
240
|
+
_validate_hyperparameter(
|
|
241
|
+
hyperparam.name, hyperparameters[hyperparam.name], hyperparameters_specs
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
elif validation_mode == HyperparameterValidationMode.VALIDATE_ALL:
|
|
245
|
+
for hyperparam in hyperparameters_specs:
|
|
246
|
+
if hyperparam.name not in hyperparameters:
|
|
247
|
+
raise JumpStartHyperparametersError(
|
|
248
|
+
f"Cannot find hyperparameter for '{hyperparam.name}'."
|
|
249
|
+
)
|
|
250
|
+
_validate_hyperparameter(
|
|
251
|
+
hyperparam.name, hyperparameters[hyperparam.name], hyperparameters_specs
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
else:
|
|
255
|
+
raise NotImplementedError(
|
|
256
|
+
f"Unable to handle validation for the mode '{validation_mode.value}'."
|
|
257
|
+
)
|
|
@@ -0,0 +1,312 @@
|
|
|
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 module contains helper methods related to Lambda."""
|
|
14
|
+
from __future__ import print_function, absolute_import
|
|
15
|
+
|
|
16
|
+
from io import BytesIO
|
|
17
|
+
import zipfile
|
|
18
|
+
import time
|
|
19
|
+
from botocore.exceptions import ClientError
|
|
20
|
+
|
|
21
|
+
from sagemaker.core import s3
|
|
22
|
+
from sagemaker.core.helper.session_helper import Session
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class Lambda:
|
|
26
|
+
"""Contains lambda boto3 wrappers to Create, Update, Delete and Invoke Lambda functions."""
|
|
27
|
+
|
|
28
|
+
def __init__(
|
|
29
|
+
self,
|
|
30
|
+
function_arn: str = None,
|
|
31
|
+
function_name: str = None,
|
|
32
|
+
execution_role_arn: str = None,
|
|
33
|
+
zipped_code_dir: str = None,
|
|
34
|
+
s3_bucket: str = None,
|
|
35
|
+
script: str = None,
|
|
36
|
+
handler: str = None,
|
|
37
|
+
session: Session = None,
|
|
38
|
+
timeout: int = 120,
|
|
39
|
+
memory_size: int = 128,
|
|
40
|
+
runtime: str = "python3.8",
|
|
41
|
+
vpc_config: dict = None,
|
|
42
|
+
environment: dict = None,
|
|
43
|
+
layers: list = None,
|
|
44
|
+
):
|
|
45
|
+
"""Constructs a Lambda instance.
|
|
46
|
+
|
|
47
|
+
This instance represents a Lambda function and provides methods for updating,
|
|
48
|
+
deleting and invoking the function.
|
|
49
|
+
|
|
50
|
+
This class can be used either for creating a new Lambda function or using an existing one.
|
|
51
|
+
When using an existing Lambda function, only the function_arn argument is required.
|
|
52
|
+
When creating a new one the function_name, execution_role_arn and handler arguments
|
|
53
|
+
are required, as well as either script or zipped_code_dir.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
function_arn (str): The arn of the Lambda function.
|
|
57
|
+
function_name (str): The name of the Lambda function.
|
|
58
|
+
Function name must be provided to create a Lambda function.
|
|
59
|
+
execution_role_arn (str): The role to be attached to Lambda function.
|
|
60
|
+
zipped_code_dir (str): The path of the zipped code package of the Lambda function.
|
|
61
|
+
s3_bucket (str): The bucket where zipped code is uploaded.
|
|
62
|
+
If not provided, default session bucket is used to upload zipped_code_dir.
|
|
63
|
+
script (str): The path of Lambda function script for direct zipped upload
|
|
64
|
+
handler (str): The Lambda handler. The format for handler should be
|
|
65
|
+
file_name.function_name. For ex: if the name of the Lambda script is
|
|
66
|
+
hello_world.py and Lambda function definition in that script is
|
|
67
|
+
lambda_handler(event, context), the handler should be hello_world.lambda_handler
|
|
68
|
+
session (sagemaker.session.Session): Session object which manages interactions
|
|
69
|
+
with Amazon SageMaker APIs and any other AWS services needed.
|
|
70
|
+
If not specified, new session is created.
|
|
71
|
+
timeout (int): Timeout of the Lambda function in seconds. Default is 120 seconds.
|
|
72
|
+
memory_size (int): Memory of the Lambda function in megabytes. Default is 128 MB.
|
|
73
|
+
runtime (str): Runtime of the Lambda function. Default is set to python3.8.
|
|
74
|
+
vpc_config (dict): VPC to deploy the Lambda function to. Default is None.
|
|
75
|
+
environment (dict): Environment Variables for the Lambda function. Default is None.
|
|
76
|
+
layers (list): List of Lambda layers for the Lambda function. Default is None.
|
|
77
|
+
"""
|
|
78
|
+
self.function_arn = function_arn
|
|
79
|
+
self.function_name = function_name
|
|
80
|
+
self.zipped_code_dir = zipped_code_dir
|
|
81
|
+
self.s3_bucket = s3_bucket
|
|
82
|
+
self.script = script
|
|
83
|
+
self.handler = handler
|
|
84
|
+
self.execution_role_arn = execution_role_arn
|
|
85
|
+
self.session = session if session is not None else Session()
|
|
86
|
+
self.timeout = timeout
|
|
87
|
+
self.memory_size = memory_size
|
|
88
|
+
self.runtime = runtime
|
|
89
|
+
self.vpc_config = vpc_config or {}
|
|
90
|
+
self.environment = environment or {}
|
|
91
|
+
self.layers = layers or []
|
|
92
|
+
|
|
93
|
+
if function_arn is None and function_name is None:
|
|
94
|
+
raise ValueError("Either function_arn or function_name must be provided.")
|
|
95
|
+
|
|
96
|
+
if function_name is not None:
|
|
97
|
+
if execution_role_arn is None:
|
|
98
|
+
raise ValueError("execution_role_arn must be provided.")
|
|
99
|
+
if zipped_code_dir is None and script is None:
|
|
100
|
+
raise ValueError("Either zipped_code_dir or script must be provided.")
|
|
101
|
+
if zipped_code_dir and script:
|
|
102
|
+
raise ValueError("Provide either script or zipped_code_dir, not both.")
|
|
103
|
+
if handler is None:
|
|
104
|
+
raise ValueError("Lambda handler must be provided.")
|
|
105
|
+
|
|
106
|
+
if function_arn is not None:
|
|
107
|
+
if zipped_code_dir and script:
|
|
108
|
+
raise ValueError("Provide either script or zipped_code_dir, not both.")
|
|
109
|
+
|
|
110
|
+
def create(self):
|
|
111
|
+
"""Method to create a lambda function.
|
|
112
|
+
|
|
113
|
+
Returns: boto3 response from Lambda's create_function method.
|
|
114
|
+
"""
|
|
115
|
+
lambda_client = _get_lambda_client(self.session)
|
|
116
|
+
|
|
117
|
+
if self.function_name is None:
|
|
118
|
+
raise ValueError("FunctionName must be provided to create a Lambda function.")
|
|
119
|
+
|
|
120
|
+
if self.script is not None:
|
|
121
|
+
code = {"ZipFile": _zip_lambda_code(self.script)}
|
|
122
|
+
else:
|
|
123
|
+
bucket, key_prefix = s3.determine_bucket_and_prefix(
|
|
124
|
+
bucket=self.s3_bucket, key_prefix=None, sagemaker_session=self.session
|
|
125
|
+
)
|
|
126
|
+
key = _upload_to_s3(
|
|
127
|
+
s3_client=_get_s3_client(self.session),
|
|
128
|
+
function_name=self.function_name,
|
|
129
|
+
zipped_code_dir=self.zipped_code_dir,
|
|
130
|
+
s3_bucket=bucket,
|
|
131
|
+
s3_key_prefix=key_prefix,
|
|
132
|
+
)
|
|
133
|
+
code = {"S3Bucket": bucket, "S3Key": key}
|
|
134
|
+
|
|
135
|
+
try:
|
|
136
|
+
response = lambda_client.create_function(
|
|
137
|
+
FunctionName=self.function_name,
|
|
138
|
+
Runtime=self.runtime,
|
|
139
|
+
Handler=self.handler,
|
|
140
|
+
Role=self.execution_role_arn,
|
|
141
|
+
Code=code,
|
|
142
|
+
Timeout=self.timeout,
|
|
143
|
+
MemorySize=self.memory_size,
|
|
144
|
+
VpcConfig=self.vpc_config,
|
|
145
|
+
Environment=self.environment,
|
|
146
|
+
Layers=self.layers,
|
|
147
|
+
)
|
|
148
|
+
return response
|
|
149
|
+
except ClientError as e:
|
|
150
|
+
error = e.response["Error"]
|
|
151
|
+
raise ValueError(error)
|
|
152
|
+
|
|
153
|
+
def update(self):
|
|
154
|
+
"""Method to update a lambda function.
|
|
155
|
+
|
|
156
|
+
Returns: boto3 response from Lambda's update_function method.
|
|
157
|
+
"""
|
|
158
|
+
lambda_client = _get_lambda_client(self.session)
|
|
159
|
+
retry_attempts = 7
|
|
160
|
+
for i in range(retry_attempts):
|
|
161
|
+
try:
|
|
162
|
+
if self.script is not None:
|
|
163
|
+
response = lambda_client.update_function_code(
|
|
164
|
+
FunctionName=self.function_name or self.function_arn,
|
|
165
|
+
ZipFile=_zip_lambda_code(self.script),
|
|
166
|
+
)
|
|
167
|
+
else:
|
|
168
|
+
bucket, key_prefix = s3.determine_bucket_and_prefix(
|
|
169
|
+
bucket=self.s3_bucket, key_prefix=None, sagemaker_session=self.session
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
# get function name to be used in S3 upload path
|
|
173
|
+
if self.function_arn:
|
|
174
|
+
versioned_function_name = self.function_arn.split("funtion:")[-1]
|
|
175
|
+
if ":" in versioned_function_name:
|
|
176
|
+
function_name_for_s3 = versioned_function_name.split(":")[0]
|
|
177
|
+
else:
|
|
178
|
+
function_name_for_s3 = versioned_function_name
|
|
179
|
+
else:
|
|
180
|
+
function_name_for_s3 = self.function_name
|
|
181
|
+
|
|
182
|
+
response = lambda_client.update_function_code(
|
|
183
|
+
FunctionName=(self.function_name or self.function_arn),
|
|
184
|
+
S3Bucket=bucket,
|
|
185
|
+
S3Key=_upload_to_s3(
|
|
186
|
+
s3_client=_get_s3_client(self.session),
|
|
187
|
+
function_name=function_name_for_s3,
|
|
188
|
+
zipped_code_dir=self.zipped_code_dir,
|
|
189
|
+
s3_bucket=bucket,
|
|
190
|
+
s3_key_prefix=key_prefix,
|
|
191
|
+
),
|
|
192
|
+
)
|
|
193
|
+
return response
|
|
194
|
+
except ClientError as e:
|
|
195
|
+
error = e.response["Error"]
|
|
196
|
+
code = error["Code"]
|
|
197
|
+
if code == "ResourceConflictException":
|
|
198
|
+
if i == retry_attempts - 1:
|
|
199
|
+
raise ValueError(error)
|
|
200
|
+
# max wait time = 2**0 + 2**1 + .. + 2**6 = 127 seconds
|
|
201
|
+
time.sleep(2**i)
|
|
202
|
+
else:
|
|
203
|
+
raise ValueError(error)
|
|
204
|
+
|
|
205
|
+
def upsert(self):
|
|
206
|
+
"""Method to create a lambda function or update it if it already exists
|
|
207
|
+
|
|
208
|
+
Returns: boto3 response from Lambda's methods.
|
|
209
|
+
"""
|
|
210
|
+
try:
|
|
211
|
+
return self.create()
|
|
212
|
+
except ValueError as error:
|
|
213
|
+
if "ResourceConflictException" in str(error):
|
|
214
|
+
return self.update()
|
|
215
|
+
raise
|
|
216
|
+
|
|
217
|
+
def invoke(self):
|
|
218
|
+
"""Method to invoke a lambda function.
|
|
219
|
+
|
|
220
|
+
Returns: boto3 response from Lambda's invoke method.
|
|
221
|
+
"""
|
|
222
|
+
lambda_client = _get_lambda_client(self.session)
|
|
223
|
+
try:
|
|
224
|
+
response = lambda_client.invoke(
|
|
225
|
+
FunctionName=self.function_name or self.function_arn,
|
|
226
|
+
InvocationType="RequestResponse",
|
|
227
|
+
)
|
|
228
|
+
return response
|
|
229
|
+
except ClientError as e:
|
|
230
|
+
error = e.response["Error"]
|
|
231
|
+
raise ValueError(error)
|
|
232
|
+
|
|
233
|
+
def delete(self):
|
|
234
|
+
"""Method to delete a lambda function.
|
|
235
|
+
|
|
236
|
+
Returns: boto3 response from Lambda's delete_function method.
|
|
237
|
+
"""
|
|
238
|
+
lambda_client = _get_lambda_client(self.session)
|
|
239
|
+
try:
|
|
240
|
+
response = lambda_client.delete_function(
|
|
241
|
+
FunctionName=self.function_name or self.function_arn
|
|
242
|
+
)
|
|
243
|
+
return response
|
|
244
|
+
except ClientError as e:
|
|
245
|
+
error = e.response["Error"]
|
|
246
|
+
raise ValueError(error)
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def _get_s3_client(session):
|
|
250
|
+
"""Method to get a boto3 s3 client.
|
|
251
|
+
|
|
252
|
+
Returns: a s3 client.
|
|
253
|
+
"""
|
|
254
|
+
sagemaker_session = session or Session()
|
|
255
|
+
if sagemaker_session.s3_client is None:
|
|
256
|
+
s3_client = sagemaker_session.boto_session.client(
|
|
257
|
+
"s3", region_name=sagemaker_session.boto_region_name
|
|
258
|
+
)
|
|
259
|
+
else:
|
|
260
|
+
s3_client = sagemaker_session.s3_client
|
|
261
|
+
return s3_client
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def _get_lambda_client(session):
|
|
265
|
+
"""Method to get a boto3 lambda client.
|
|
266
|
+
|
|
267
|
+
Returns: a lambda client.
|
|
268
|
+
"""
|
|
269
|
+
sagemaker_session = session or Session()
|
|
270
|
+
if sagemaker_session.lambda_client is None:
|
|
271
|
+
lambda_client = sagemaker_session.boto_session.client(
|
|
272
|
+
"lambda", region_name=sagemaker_session.boto_region_name
|
|
273
|
+
)
|
|
274
|
+
else:
|
|
275
|
+
lambda_client = sagemaker_session.lambda_client
|
|
276
|
+
return lambda_client
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
def _upload_to_s3(s3_client, function_name, zipped_code_dir, s3_bucket, s3_key_prefix=None):
|
|
280
|
+
"""Upload the zipped code to S3 bucket provided in the Lambda instance.
|
|
281
|
+
|
|
282
|
+
Lambda instance must have a path to the zipped code folder and a S3 bucket to upload
|
|
283
|
+
the code. The key will lambda/function_name/code and the S3 URI where the code is
|
|
284
|
+
uploaded is in this format: s3://bucket_name/lambda/function_name/code.
|
|
285
|
+
|
|
286
|
+
Returns: the S3 key where the code is uploaded.
|
|
287
|
+
"""
|
|
288
|
+
|
|
289
|
+
key = s3.s3_path_join(
|
|
290
|
+
s3_key_prefix,
|
|
291
|
+
"lambda",
|
|
292
|
+
function_name,
|
|
293
|
+
"code",
|
|
294
|
+
)
|
|
295
|
+
s3_client.upload_file(zipped_code_dir, s3_bucket, key)
|
|
296
|
+
return key
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
def _zip_lambda_code(script):
|
|
300
|
+
"""This method zips the lambda function script.
|
|
301
|
+
|
|
302
|
+
Lambda function script is provided in the lambda instance and reads that zipped file.
|
|
303
|
+
|
|
304
|
+
Returns: A buffer of zipped lambda function script.
|
|
305
|
+
"""
|
|
306
|
+
buffer = BytesIO()
|
|
307
|
+
code_dir = script.split("/")[-1]
|
|
308
|
+
|
|
309
|
+
with zipfile.ZipFile(buffer, "w") as z:
|
|
310
|
+
z.write(script, code_dir)
|
|
311
|
+
buffer.seek(0)
|
|
312
|
+
return buffer.read()
|
|
@@ -0,0 +1,42 @@
|
|
|
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 Lineage tracking and artifact management."""
|
|
14
|
+
from __future__ import absolute_import
|
|
15
|
+
|
|
16
|
+
from sagemaker.core.lineage.action import Action # noqa: F401
|
|
17
|
+
from sagemaker.core.lineage.artifact import Artifact # noqa: F401
|
|
18
|
+
from sagemaker.core.lineage.association import Association # noqa: F401
|
|
19
|
+
from sagemaker.core.lineage.context import Context # noqa: F401
|
|
20
|
+
from sagemaker.core.lineage.lineage_trial_component import LineageTrialComponent # noqa: F401
|
|
21
|
+
from sagemaker.core.lineage.query import ( # noqa: F401
|
|
22
|
+
LineageEntityEnum,
|
|
23
|
+
LineageFilter,
|
|
24
|
+
LineageQuery,
|
|
25
|
+
LineageQueryDirectionEnum,
|
|
26
|
+
LineageSourceEnum,
|
|
27
|
+
)
|
|
28
|
+
from sagemaker.core.lineage.visualizer import LineageTableVisualizer # noqa: F401
|
|
29
|
+
|
|
30
|
+
__all__ = [
|
|
31
|
+
"Action",
|
|
32
|
+
"Artifact",
|
|
33
|
+
"Association",
|
|
34
|
+
"Context",
|
|
35
|
+
"LineageEntityEnum",
|
|
36
|
+
"LineageFilter",
|
|
37
|
+
"LineageQuery",
|
|
38
|
+
"LineageQueryDirectionEnum",
|
|
39
|
+
"LineageSourceEnum",
|
|
40
|
+
"LineageTableVisualizer",
|
|
41
|
+
"LineageTrialComponent",
|
|
42
|
+
]
|