zenml-nightly 0.58.2.dev20240614__py3-none-any.whl → 0.58.2.dev20240622__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.
- zenml/VERSION +1 -1
- zenml/_hub/client.py +8 -5
- zenml/actions/base_action.py +8 -10
- zenml/artifact_stores/base_artifact_store.py +20 -15
- zenml/artifact_stores/local_artifact_store.py +3 -2
- zenml/artifacts/artifact_config.py +34 -19
- zenml/artifacts/external_artifact.py +18 -8
- zenml/artifacts/external_artifact_config.py +14 -6
- zenml/artifacts/unmaterialized_artifact.py +2 -11
- zenml/cli/__init__.py +6 -0
- zenml/cli/artifact.py +20 -2
- zenml/cli/base.py +2 -2
- zenml/cli/served_model.py +0 -1
- zenml/cli/server.py +3 -3
- zenml/cli/utils.py +36 -40
- zenml/cli/web_login.py +2 -2
- zenml/client.py +198 -24
- zenml/client_lazy_loader.py +20 -14
- zenml/config/base_settings.py +5 -6
- zenml/config/build_configuration.py +1 -1
- zenml/config/compiler.py +3 -3
- zenml/config/docker_settings.py +27 -28
- zenml/config/global_config.py +33 -37
- zenml/config/pipeline_configurations.py +8 -11
- zenml/config/pipeline_run_configuration.py +6 -2
- zenml/config/pipeline_spec.py +3 -4
- zenml/config/resource_settings.py +8 -9
- zenml/config/schedule.py +16 -20
- zenml/config/secret_reference_mixin.py +6 -3
- zenml/config/secrets_store_config.py +16 -23
- zenml/config/server_config.py +50 -46
- zenml/config/settings_resolver.py +1 -1
- zenml/config/source.py +45 -35
- zenml/config/step_configurations.py +53 -31
- zenml/config/step_run_info.py +3 -0
- zenml/config/store_config.py +20 -19
- zenml/config/strict_base_model.py +2 -6
- zenml/constants.py +26 -2
- zenml/container_registries/base_container_registry.py +3 -2
- zenml/container_registries/default_container_registry.py +3 -3
- zenml/event_hub/base_event_hub.py +1 -1
- zenml/event_sources/base_event_source.py +11 -16
- zenml/exceptions.py +4 -0
- zenml/integrations/airflow/__init__.py +2 -6
- zenml/integrations/airflow/flavors/airflow_orchestrator_flavor.py +6 -7
- zenml/integrations/airflow/orchestrators/airflow_orchestrator.py +13 -249
- zenml/integrations/airflow/orchestrators/dag_generator.py +5 -3
- zenml/integrations/argilla/flavors/argilla_annotator_flavor.py +5 -4
- zenml/integrations/aws/__init__.py +1 -1
- zenml/integrations/aws/flavors/aws_container_registry_flavor.py +3 -2
- zenml/integrations/aws/flavors/sagemaker_orchestrator_flavor.py +11 -5
- zenml/integrations/aws/flavors/sagemaker_step_operator_flavor.py +6 -2
- zenml/integrations/aws/service_connectors/aws_service_connector.py +5 -4
- zenml/integrations/aws/step_operators/sagemaker_step_operator.py +1 -1
- zenml/integrations/azure/flavors/azureml_step_operator_flavor.py +4 -4
- zenml/integrations/azure/service_connectors/azure_service_connector.py +4 -3
- zenml/integrations/azure/step_operators/azureml_step_operator.py +2 -1
- zenml/integrations/bentoml/steps/bentoml_deployer.py +1 -1
- zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +8 -12
- zenml/integrations/comet/flavors/comet_experiment_tracker_flavor.py +1 -1
- zenml/integrations/constants.py +0 -1
- zenml/integrations/deepchecks/__init__.py +1 -0
- zenml/integrations/evidently/__init__.py +5 -3
- zenml/integrations/evidently/column_mapping.py +11 -3
- zenml/integrations/evidently/data_validators/evidently_data_validator.py +21 -3
- zenml/integrations/evidently/metrics.py +5 -6
- zenml/integrations/evidently/tests.py +5 -6
- zenml/integrations/facets/models.py +2 -6
- zenml/integrations/feast/__init__.py +3 -1
- zenml/integrations/feast/feature_stores/feast_feature_store.py +0 -23
- zenml/integrations/gcp/__init__.py +1 -1
- zenml/integrations/gcp/flavors/vertex_orchestrator_flavor.py +1 -1
- zenml/integrations/gcp/flavors/vertex_step_operator_flavor.py +1 -1
- zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +234 -103
- zenml/integrations/gcp/service_connectors/gcp_service_connector.py +57 -42
- zenml/integrations/gcp/step_operators/vertex_step_operator.py +1 -0
- zenml/integrations/github/code_repositories/github_code_repository.py +1 -1
- zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py +9 -13
- zenml/integrations/great_expectations/__init__.py +1 -1
- zenml/integrations/great_expectations/data_validators/ge_data_validator.py +44 -44
- zenml/integrations/great_expectations/flavors/great_expectations_data_validator_flavor.py +35 -2
- zenml/integrations/great_expectations/ge_store_backend.py +24 -11
- zenml/integrations/great_expectations/materializers/ge_materializer.py +3 -3
- zenml/integrations/great_expectations/utils.py +5 -5
- zenml/integrations/huggingface/__init__.py +3 -0
- zenml/integrations/huggingface/flavors/huggingface_model_deployer_flavor.py +1 -1
- zenml/integrations/huggingface/steps/__init__.py +3 -0
- zenml/integrations/huggingface/steps/accelerate_runner.py +149 -0
- zenml/integrations/huggingface/steps/huggingface_deployer.py +2 -2
- zenml/integrations/hyperai/flavors/hyperai_orchestrator_flavor.py +1 -1
- zenml/integrations/hyperai/service_connectors/hyperai_service_connector.py +4 -3
- zenml/integrations/kubeflow/__init__.py +1 -1
- zenml/integrations/kubeflow/flavors/kubeflow_orchestrator_flavor.py +48 -81
- zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +295 -245
- zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +1 -1
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +11 -2
- zenml/integrations/kubernetes/pod_settings.py +17 -31
- zenml/integrations/kubernetes/service_connectors/kubernetes_service_connector.py +8 -7
- zenml/integrations/label_studio/__init__.py +1 -3
- zenml/integrations/label_studio/annotators/label_studio_annotator.py +3 -4
- zenml/integrations/label_studio/flavors/label_studio_annotator_flavor.py +2 -2
- zenml/integrations/langchain/__init__.py +5 -1
- zenml/integrations/langchain/materializers/document_materializer.py +44 -8
- zenml/integrations/mlflow/__init__.py +9 -3
- zenml/integrations/mlflow/experiment_trackers/mlflow_experiment_tracker.py +1 -1
- zenml/integrations/mlflow/flavors/mlflow_experiment_tracker_flavor.py +29 -37
- zenml/integrations/mlflow/model_registries/mlflow_model_registry.py +4 -4
- zenml/integrations/mlflow/steps/mlflow_deployer.py +1 -1
- zenml/integrations/neptune/flavors/neptune_experiment_tracker_flavor.py +1 -1
- zenml/integrations/neural_prophet/__init__.py +5 -1
- zenml/integrations/pigeon/flavors/pigeon_annotator_flavor.py +1 -1
- zenml/integrations/s3/flavors/s3_artifact_store_flavor.py +9 -8
- zenml/integrations/seldon/seldon_client.py +52 -67
- zenml/integrations/seldon/services/seldon_deployment.py +3 -3
- zenml/integrations/seldon/steps/seldon_deployer.py +4 -4
- zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +15 -5
- zenml/integrations/skypilot_aws/__init__.py +1 -1
- zenml/integrations/skypilot_aws/flavors/skypilot_orchestrator_aws_vm_flavor.py +1 -1
- zenml/integrations/skypilot_azure/__init__.py +1 -1
- zenml/integrations/skypilot_azure/flavors/skypilot_orchestrator_azure_vm_flavor.py +1 -1
- zenml/integrations/skypilot_gcp/__init__.py +2 -1
- zenml/integrations/skypilot_gcp/flavors/skypilot_orchestrator_gcp_vm_flavor.py +1 -1
- zenml/integrations/skypilot_lambda/flavors/skypilot_orchestrator_lambda_vm_flavor.py +2 -2
- zenml/integrations/spark/flavors/spark_step_operator_flavor.py +1 -1
- zenml/integrations/spark/step_operators/spark_step_operator.py +2 -0
- zenml/integrations/tekton/__init__.py +1 -1
- zenml/integrations/tekton/flavors/tekton_orchestrator_flavor.py +66 -23
- zenml/integrations/tekton/orchestrators/tekton_orchestrator.py +547 -233
- zenml/integrations/tensorboard/__init__.py +1 -12
- zenml/integrations/tensorboard/services/tensorboard_service.py +3 -5
- zenml/integrations/tensorboard/visualizers/tensorboard_visualizer.py +6 -6
- zenml/integrations/tensorflow/__init__.py +2 -10
- zenml/integrations/tensorflow/materializers/keras_materializer.py +17 -9
- zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +9 -14
- zenml/integrations/whylogs/flavors/whylogs_data_validator_flavor.py +1 -1
- zenml/lineage_graph/lineage_graph.py +1 -1
- zenml/logging/step_logging.py +15 -7
- zenml/materializers/built_in_materializer.py +3 -3
- zenml/materializers/pydantic_materializer.py +2 -2
- zenml/metadata/lazy_load.py +4 -4
- zenml/metadata/metadata_types.py +64 -4
- zenml/model/model.py +79 -54
- zenml/model_deployers/base_model_deployer.py +14 -12
- zenml/model_registries/base_model_registry.py +17 -15
- zenml/models/__init__.py +79 -206
- zenml/models/v2/base/base.py +54 -41
- zenml/models/v2/base/base_plugin_flavor.py +2 -6
- zenml/models/v2/base/filter.py +91 -76
- zenml/models/v2/base/page.py +2 -12
- zenml/models/v2/base/scoped.py +4 -7
- zenml/models/v2/core/api_key.py +22 -8
- zenml/models/v2/core/artifact.py +2 -2
- zenml/models/v2/core/artifact_version.py +74 -40
- zenml/models/v2/core/code_repository.py +37 -10
- zenml/models/v2/core/component.py +65 -16
- zenml/models/v2/core/device.py +14 -4
- zenml/models/v2/core/event_source.py +1 -2
- zenml/models/v2/core/flavor.py +74 -8
- zenml/models/v2/core/logs.py +68 -8
- zenml/models/v2/core/model.py +8 -4
- zenml/models/v2/core/model_version.py +25 -6
- zenml/models/v2/core/model_version_artifact.py +51 -21
- zenml/models/v2/core/model_version_pipeline_run.py +45 -13
- zenml/models/v2/core/pipeline.py +37 -72
- zenml/models/v2/core/pipeline_build.py +29 -17
- zenml/models/v2/core/pipeline_deployment.py +18 -6
- zenml/models/v2/core/pipeline_namespace.py +113 -0
- zenml/models/v2/core/pipeline_run.py +50 -22
- zenml/models/v2/core/run_metadata.py +59 -36
- zenml/models/v2/core/schedule.py +37 -24
- zenml/models/v2/core/secret.py +31 -12
- zenml/models/v2/core/service.py +64 -36
- zenml/models/v2/core/service_account.py +24 -11
- zenml/models/v2/core/service_connector.py +219 -44
- zenml/models/v2/core/stack.py +45 -17
- zenml/models/v2/core/step_run.py +28 -8
- zenml/models/v2/core/tag.py +8 -4
- zenml/models/v2/core/trigger.py +2 -2
- zenml/models/v2/core/trigger_execution.py +1 -0
- zenml/models/v2/core/user.py +18 -21
- zenml/models/v2/core/workspace.py +13 -3
- zenml/models/v2/misc/build_item.py +3 -3
- zenml/models/v2/misc/external_user.py +2 -6
- zenml/models/v2/misc/hub_plugin_models.py +9 -9
- zenml/models/v2/misc/loaded_visualization.py +2 -2
- zenml/models/v2/misc/service_connector_type.py +8 -17
- zenml/models/v2/misc/user_auth.py +7 -2
- zenml/new/pipelines/build_utils.py +3 -3
- zenml/new/pipelines/pipeline.py +17 -13
- zenml/new/pipelines/run_utils.py +103 -1
- zenml/orchestrators/base_orchestrator.py +10 -7
- zenml/orchestrators/local_docker/local_docker_orchestrator.py +1 -1
- zenml/orchestrators/step_launcher.py +28 -4
- zenml/orchestrators/step_runner.py +3 -6
- zenml/orchestrators/utils.py +1 -1
- zenml/plugins/base_plugin_flavor.py +6 -10
- zenml/plugins/plugin_flavor_registry.py +3 -7
- zenml/secret/base_secret.py +7 -8
- zenml/service_connectors/docker_service_connector.py +4 -3
- zenml/service_connectors/service_connector.py +5 -12
- zenml/service_connectors/service_connector_registry.py +2 -4
- zenml/services/container/container_service.py +1 -1
- zenml/services/container/container_service_endpoint.py +1 -1
- zenml/services/local/local_service.py +1 -1
- zenml/services/local/local_service_endpoint.py +1 -1
- zenml/services/service.py +16 -10
- zenml/services/service_type.py +4 -5
- zenml/services/terraform/terraform_service.py +1 -1
- zenml/stack/flavor.py +2 -6
- zenml/stack/flavor_registry.py +4 -4
- zenml/stack/stack.py +4 -1
- zenml/stack/stack_component.py +55 -31
- zenml/step_operators/step_operator_entrypoint_configuration.py +1 -0
- zenml/steps/base_step.py +34 -28
- zenml/steps/entrypoint_function_utils.py +3 -5
- zenml/steps/utils.py +12 -14
- zenml/utils/cuda_utils.py +50 -0
- zenml/utils/deprecation_utils.py +18 -20
- zenml/utils/dict_utils.py +1 -1
- zenml/utils/filesync_model.py +65 -28
- zenml/utils/function_utils.py +260 -0
- zenml/utils/json_utils.py +131 -0
- zenml/utils/mlstacks_utils.py +2 -2
- zenml/utils/package_utils.py +1 -1
- zenml/utils/pipeline_docker_image_builder.py +9 -0
- zenml/utils/pydantic_utils.py +270 -62
- zenml/utils/secret_utils.py +65 -12
- zenml/utils/source_utils.py +2 -2
- zenml/utils/typed_model.py +5 -3
- zenml/utils/typing_utils.py +243 -0
- zenml/utils/yaml_utils.py +1 -1
- zenml/zen_server/auth.py +2 -2
- zenml/zen_server/cloud_utils.py +6 -6
- zenml/zen_server/deploy/base_provider.py +1 -1
- zenml/zen_server/deploy/deployment.py +6 -8
- zenml/zen_server/deploy/docker/docker_zen_server.py +3 -4
- zenml/zen_server/deploy/local/local_provider.py +0 -1
- zenml/zen_server/deploy/local/local_zen_server.py +6 -6
- zenml/zen_server/deploy/terraform/terraform_zen_server.py +4 -6
- zenml/zen_server/exceptions.py +4 -1
- zenml/zen_server/feature_gate/zenml_cloud_feature_gate.py +1 -1
- zenml/zen_server/pipeline_deployment/utils.py +48 -68
- zenml/zen_server/rbac/models.py +2 -5
- zenml/zen_server/rbac/utils.py +11 -14
- zenml/zen_server/routers/auth_endpoints.py +2 -2
- zenml/zen_server/routers/pipeline_builds_endpoints.py +1 -1
- zenml/zen_server/routers/runs_endpoints.py +1 -1
- zenml/zen_server/routers/secrets_endpoints.py +3 -2
- zenml/zen_server/routers/server_endpoints.py +1 -1
- zenml/zen_server/routers/steps_endpoints.py +1 -1
- zenml/zen_server/routers/workspaces_endpoints.py +1 -1
- zenml/zen_stores/base_zen_store.py +46 -9
- zenml/zen_stores/migrations/utils.py +42 -46
- zenml/zen_stores/migrations/versions/0701da9951a0_added_service_table.py +1 -1
- zenml/zen_stores/migrations/versions/1041bc644e0d_remove_secrets_manager.py +5 -3
- zenml/zen_stores/migrations/versions/10a907dad202_delete_mlmd_tables.py +1 -1
- zenml/zen_stores/migrations/versions/26b776ad583e_redesign_artifacts.py +8 -10
- zenml/zen_stores/migrations/versions/37835ce041d2_optimizing_database.py +3 -3
- zenml/zen_stores/migrations/versions/46506f72f0ed_add_server_settings.py +10 -12
- zenml/zen_stores/migrations/versions/5994f9ad0489_introduce_role_permissions.py +3 -2
- zenml/zen_stores/migrations/versions/6917bce75069_add_pipeline_run_unique_constraint.py +4 -4
- zenml/zen_stores/migrations/versions/728c6369cfaa_add_name_column_to_input_artifact_pk.py +3 -2
- zenml/zen_stores/migrations/versions/743ec82b1b3c_update_size_of_build_images.py +2 -2
- zenml/zen_stores/migrations/versions/7500f434b71c_remove_shared_columns.py +3 -2
- zenml/zen_stores/migrations/versions/7834208cc3f6_artifact_project_scoping.py +8 -7
- zenml/zen_stores/migrations/versions/7b651bf6822e_track_secrets_in_db.py +6 -4
- zenml/zen_stores/migrations/versions/7e4a481d17f7_add_identity_table.py +2 -2
- zenml/zen_stores/migrations/versions/7f603e583dd7_fixed_migration.py +1 -1
- zenml/zen_stores/migrations/versions/a39c4184c8ce_remove_secrets_manager_flavors.py +2 -2
- zenml/zen_stores/migrations/versions/a91762e6be36_artifact_version_table.py +4 -4
- zenml/zen_stores/migrations/versions/alembic_start.py +1 -1
- zenml/zen_stores/migrations/versions/fbd7f18ced1e_increase_step_run_field_lengths.py +4 -4
- zenml/zen_stores/rest_zen_store.py +109 -49
- zenml/zen_stores/schemas/api_key_schemas.py +1 -1
- zenml/zen_stores/schemas/artifact_schemas.py +8 -8
- zenml/zen_stores/schemas/artifact_visualization_schemas.py +3 -3
- zenml/zen_stores/schemas/code_repository_schemas.py +1 -1
- zenml/zen_stores/schemas/component_schemas.py +8 -3
- zenml/zen_stores/schemas/device_schemas.py +8 -6
- zenml/zen_stores/schemas/event_source_schemas.py +3 -4
- zenml/zen_stores/schemas/flavor_schemas.py +5 -3
- zenml/zen_stores/schemas/model_schemas.py +26 -1
- zenml/zen_stores/schemas/pipeline_build_schemas.py +1 -1
- zenml/zen_stores/schemas/pipeline_deployment_schemas.py +4 -4
- zenml/zen_stores/schemas/pipeline_run_schemas.py +6 -6
- zenml/zen_stores/schemas/pipeline_schemas.py +5 -2
- zenml/zen_stores/schemas/run_metadata_schemas.py +2 -2
- zenml/zen_stores/schemas/secret_schemas.py +8 -5
- zenml/zen_stores/schemas/server_settings_schemas.py +3 -1
- zenml/zen_stores/schemas/service_connector_schemas.py +1 -1
- zenml/zen_stores/schemas/service_schemas.py +11 -2
- zenml/zen_stores/schemas/stack_schemas.py +1 -1
- zenml/zen_stores/schemas/step_run_schemas.py +11 -11
- zenml/zen_stores/schemas/tag_schemas.py +6 -2
- zenml/zen_stores/schemas/trigger_schemas.py +2 -2
- zenml/zen_stores/schemas/user_schemas.py +2 -2
- zenml/zen_stores/schemas/workspace_schemas.py +3 -1
- zenml/zen_stores/secrets_stores/aws_secrets_store.py +19 -20
- zenml/zen_stores/secrets_stores/azure_secrets_store.py +17 -20
- zenml/zen_stores/secrets_stores/base_secrets_store.py +79 -12
- zenml/zen_stores/secrets_stores/gcp_secrets_store.py +17 -20
- zenml/zen_stores/secrets_stores/hashicorp_secrets_store.py +4 -8
- zenml/zen_stores/secrets_stores/service_connector_secrets_store.py +10 -7
- zenml/zen_stores/secrets_stores/sql_secrets_store.py +5 -6
- zenml/zen_stores/sql_zen_store.py +196 -120
- zenml/zen_stores/zen_store_interface.py +33 -0
- {zenml_nightly-0.58.2.dev20240614.dist-info → zenml_nightly-0.58.2.dev20240622.dist-info}/METADATA +9 -7
- {zenml_nightly-0.58.2.dev20240614.dist-info → zenml_nightly-0.58.2.dev20240622.dist-info}/RECORD +311 -308
- zenml/integrations/kubeflow/utils.py +0 -95
- zenml/models/v2/base/internal.py +0 -37
- zenml/models/v2/base/update.py +0 -44
- {zenml_nightly-0.58.2.dev20240614.dist-info → zenml_nightly-0.58.2.dev20240622.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.58.2.dev20240614.dist-info → zenml_nightly-0.58.2.dev20240622.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.58.2.dev20240614.dist-info → zenml_nightly-0.58.2.dev20240622.dist-info}/entry_points.txt +0 -0
@@ -61,14 +61,14 @@ def huggingface_model_deployer_step(
|
|
61
61
|
step_name = context.step_run.name
|
62
62
|
|
63
63
|
# update the step configuration with the real pipeline runtime information
|
64
|
-
service_config = service_config.
|
64
|
+
service_config = service_config.model_copy()
|
65
65
|
service_config.pipeline_name = pipeline_name
|
66
66
|
service_config.pipeline_step_name = step_name
|
67
67
|
|
68
68
|
# fetch existing services with same pipeline name, step name and
|
69
69
|
# model name
|
70
70
|
existing_services = model_deployer.find_model_server(
|
71
|
-
config=service_config.
|
71
|
+
config=service_config.model_dump()
|
72
72
|
)
|
73
73
|
|
74
74
|
# even when the deploy decision is negative, if an existing model server
|
@@ -43,7 +43,7 @@ class HyperAIOrchestratorSettings(BaseSettings):
|
|
43
43
|
mounts_from_to: Dict[str, str] = {}
|
44
44
|
|
45
45
|
|
46
|
-
class HyperAIOrchestratorConfig(
|
46
|
+
class HyperAIOrchestratorConfig(
|
47
47
|
BaseOrchestratorConfig, HyperAIOrchestratorSettings
|
48
48
|
):
|
49
49
|
"""Configuration for the HyperAI orchestrator.
|
@@ -22,7 +22,7 @@ import io
|
|
22
22
|
from typing import Any, List, Optional, Type
|
23
23
|
|
24
24
|
import paramiko
|
25
|
-
from pydantic import Field
|
25
|
+
from pydantic import Field
|
26
26
|
|
27
27
|
from zenml.exceptions import AuthorizationException
|
28
28
|
from zenml.integrations.hyperai import (
|
@@ -40,6 +40,7 @@ from zenml.service_connectors.service_connector import (
|
|
40
40
|
ServiceConnector,
|
41
41
|
)
|
42
42
|
from zenml.utils.enum_utils import StrEnum
|
43
|
+
from zenml.utils.secret_utils import PlainSerializedSecretStr
|
43
44
|
|
44
45
|
logger = get_logger(__name__)
|
45
46
|
|
@@ -47,10 +48,10 @@ logger = get_logger(__name__)
|
|
47
48
|
class HyperAICredentials(AuthenticationConfig):
|
48
49
|
"""HyperAI client authentication credentials."""
|
49
50
|
|
50
|
-
base64_ssh_key:
|
51
|
+
base64_ssh_key: PlainSerializedSecretStr = Field(
|
51
52
|
title="SSH key (base64)",
|
52
53
|
)
|
53
|
-
ssh_passphrase: Optional[
|
54
|
+
ssh_passphrase: Optional[PlainSerializedSecretStr] = Field(
|
54
55
|
default=None,
|
55
56
|
title="SSH key passphrase",
|
56
57
|
)
|
@@ -30,7 +30,7 @@ class KubeflowIntegration(Integration):
|
|
30
30
|
"""Definition of Kubeflow Integration for ZenML."""
|
31
31
|
|
32
32
|
NAME = KUBEFLOW
|
33
|
-
REQUIREMENTS = ["kfp
|
33
|
+
REQUIREMENTS = ["kfp>=2.6.0", "kfp-kubernetes>=1.1.0"] # Only 1.x version that supports pyyaml 6
|
34
34
|
|
35
35
|
@classmethod
|
36
36
|
def flavors(cls) -> List[Type[Flavor]]:
|
@@ -15,7 +15,7 @@
|
|
15
15
|
|
16
16
|
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Type, cast
|
17
17
|
|
18
|
-
from pydantic import
|
18
|
+
from pydantic import model_validator
|
19
19
|
|
20
20
|
from zenml.config.base_settings import BaseSettings
|
21
21
|
from zenml.constants import KUBERNETES_CLUSTER_RESOURCE_TYPE
|
@@ -24,6 +24,7 @@ from zenml.integrations.kubernetes.pod_settings import KubernetesPodSettings
|
|
24
24
|
from zenml.logger import get_logger
|
25
25
|
from zenml.models import ServiceConnectorRequirements
|
26
26
|
from zenml.orchestrators import BaseOrchestratorConfig, BaseOrchestratorFlavor
|
27
|
+
from zenml.utils.pydantic_utils import before_validator_handler
|
27
28
|
from zenml.utils.secret_utils import SecretField
|
28
29
|
|
29
30
|
if TYPE_CHECKING:
|
@@ -52,8 +53,6 @@ class KubeflowOrchestratorSettings(BaseSettings):
|
|
52
53
|
and `client_password` need to be set together.
|
53
54
|
user_namespace: The user namespace to use when creating experiments
|
54
55
|
and runs.
|
55
|
-
node_selectors: Deprecated: Node selectors to apply to KFP pods.
|
56
|
-
node_affinity: Deprecated: Node affinities to apply to KFP pods.
|
57
56
|
pod_settings: Pod settings to apply.
|
58
57
|
"""
|
59
58
|
|
@@ -61,99 +60,75 @@ class KubeflowOrchestratorSettings(BaseSettings):
|
|
61
60
|
timeout: int = 1200
|
62
61
|
|
63
62
|
client_args: Dict[str, Any] = {}
|
64
|
-
client_username: Optional[str] = SecretField()
|
65
|
-
client_password: Optional[str] = SecretField()
|
63
|
+
client_username: Optional[str] = SecretField(default=None)
|
64
|
+
client_password: Optional[str] = SecretField(default=None)
|
66
65
|
user_namespace: Optional[str] = None
|
67
|
-
node_selectors: Dict[str, str] = {}
|
68
|
-
node_affinity: Dict[str, List[str]] = {}
|
69
66
|
pod_settings: Optional[KubernetesPodSettings] = None
|
70
67
|
|
71
|
-
@
|
68
|
+
@model_validator(mode="before")
|
69
|
+
@classmethod
|
70
|
+
@before_validator_handler
|
72
71
|
def _validate_and_migrate_pod_settings(
|
73
|
-
cls,
|
72
|
+
cls, data: Dict[str, Any]
|
74
73
|
) -> Dict[str, Any]:
|
75
74
|
"""Validates settings and migrates pod settings from older version.
|
76
75
|
|
77
76
|
Args:
|
78
|
-
|
77
|
+
data: Dict representing user-specified runtime settings.
|
79
78
|
|
80
79
|
Returns:
|
81
80
|
Validated settings.
|
82
81
|
|
83
82
|
Raises:
|
84
|
-
AssertionError: If old and new settings are used together.
|
85
83
|
ValueError: If username and password are not specified together.
|
86
84
|
"""
|
87
|
-
|
88
|
-
|
89
|
-
node_selectors = cast(
|
90
|
-
Dict[str, str], values.get("node_selectors") or {}
|
91
|
-
)
|
85
|
+
node_selectors = cast(Dict[str, str], data.get("node_selectors") or {})
|
92
86
|
node_affinity = cast(
|
93
|
-
Dict[str, List[str]],
|
87
|
+
Dict[str, List[str]], data.get("node_affinity") or {}
|
94
88
|
)
|
95
89
|
|
96
|
-
|
97
|
-
|
98
|
-
if has_old_settings:
|
99
|
-
logger.warning(
|
100
|
-
"The attributes `node_selectors` and `node_affinity` of the "
|
101
|
-
"Kubeflow settings will be deprecated soon. Use the "
|
102
|
-
"attribute `pod_settings` instead.",
|
103
|
-
)
|
104
|
-
|
105
|
-
if has_pod_settings and has_old_settings:
|
106
|
-
raise AssertionError(
|
107
|
-
"Got Kubeflow pod settings using both the deprecated "
|
108
|
-
"attributes `node_selectors` and `node_affinity` as well as "
|
109
|
-
"the new attribute `pod_settings`. Please specify Kubeflow "
|
110
|
-
"pod settings only using the new `pod_settings` attribute."
|
111
|
-
)
|
112
|
-
elif has_old_settings:
|
90
|
+
affinity = {}
|
91
|
+
if node_affinity:
|
113
92
|
from kubernetes import client as k8s_client
|
114
93
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
)
|
133
|
-
]
|
134
|
-
)
|
94
|
+
match_expressions = [
|
95
|
+
k8s_client.V1NodeSelectorRequirement(
|
96
|
+
key=key,
|
97
|
+
operator="In",
|
98
|
+
values=values,
|
99
|
+
)
|
100
|
+
for key, values in node_affinity.items()
|
101
|
+
]
|
102
|
+
|
103
|
+
affinity = k8s_client.V1Affinity(
|
104
|
+
node_affinity=k8s_client.V1NodeAffinity(
|
105
|
+
required_during_scheduling_ignored_during_execution=k8s_client.V1NodeSelector(
|
106
|
+
node_selector_terms=[
|
107
|
+
k8s_client.V1NodeSelectorTerm(
|
108
|
+
match_expressions=match_expressions
|
109
|
+
)
|
110
|
+
]
|
135
111
|
)
|
136
112
|
)
|
137
|
-
pod_settings = KubernetesPodSettings(
|
138
|
-
node_selectors=node_selectors, affinity=affinity
|
139
113
|
)
|
140
|
-
|
141
|
-
|
142
|
-
|
114
|
+
pod_settings = KubernetesPodSettings(
|
115
|
+
node_selectors=node_selectors, affinity=affinity
|
116
|
+
)
|
117
|
+
data["pod_settings"] = pod_settings
|
143
118
|
|
144
119
|
# Validate username and password for auth cookie logic
|
145
|
-
username =
|
146
|
-
password =
|
120
|
+
username = data.get("client_username")
|
121
|
+
password = data.get("client_password")
|
147
122
|
client_creds_error = "`client_username` and `client_password` both need to be set together."
|
148
123
|
if username and password is None:
|
149
124
|
raise ValueError(client_creds_error)
|
150
125
|
if password and username is None:
|
151
126
|
raise ValueError(client_creds_error)
|
152
127
|
|
153
|
-
return
|
128
|
+
return data
|
154
129
|
|
155
130
|
|
156
|
-
class KubeflowOrchestratorConfig(
|
131
|
+
class KubeflowOrchestratorConfig(
|
157
132
|
BaseOrchestratorConfig, KubeflowOrchestratorSettings
|
158
133
|
):
|
159
134
|
"""Configuration for the Kubeflow orchestrator.
|
@@ -170,25 +145,17 @@ class KubeflowOrchestratorConfig( # type: ignore[misc] # https://github.com/pyd
|
|
170
145
|
Kubeflow Pipelines deployment (i.e. when `kubeflow_hostname` is
|
171
146
|
set) or if the stack component is linked to a Kubernetes service
|
172
147
|
connector.
|
173
|
-
local: If `True`, the orchestrator will assume it is connected to a
|
174
|
-
local kubernetes cluster and will perform additional validations and
|
175
|
-
operations to allow using the orchestrator in combination with other
|
176
|
-
local stack components that store data in the local filesystem
|
177
|
-
(i.e. it will mount the local stores directory into the pipeline
|
178
|
-
containers).
|
179
|
-
skip_local_validations: If `True`, the local validations will be
|
180
|
-
skipped.
|
181
148
|
"""
|
182
149
|
|
183
150
|
kubeflow_hostname: Optional[str] = None
|
184
151
|
kubeflow_namespace: str = "kubeflow"
|
185
152
|
kubernetes_context: Optional[str] # TODO: Potential setting
|
186
|
-
local: bool = False
|
187
|
-
skip_local_validations: bool = False
|
188
153
|
|
189
|
-
@
|
154
|
+
@model_validator(mode="before")
|
155
|
+
@classmethod
|
156
|
+
@before_validator_handler
|
190
157
|
def _validate_deprecated_attrs(
|
191
|
-
cls,
|
158
|
+
cls, data: Dict[str, Any]
|
192
159
|
) -> Dict[str, Any]:
|
193
160
|
"""Pydantic root_validator for deprecated attributes.
|
194
161
|
|
@@ -197,7 +164,7 @@ class KubeflowOrchestratorConfig( # type: ignore[misc] # https://github.com/pyd
|
|
197
164
|
mandatory in the meantime.
|
198
165
|
|
199
166
|
Args:
|
200
|
-
|
167
|
+
data: Values passed to the object constructor
|
201
168
|
|
202
169
|
Returns:
|
203
170
|
Values passed to the object constructor
|
@@ -210,10 +177,10 @@ class KubeflowOrchestratorConfig( # type: ignore[misc] # https://github.com/pyd
|
|
210
177
|
|
211
178
|
# remove deprecated attributes from values dict
|
212
179
|
for attr in provisioning_attrs:
|
213
|
-
if attr in
|
214
|
-
del
|
180
|
+
if attr in data:
|
181
|
+
del data[attr]
|
215
182
|
|
216
|
-
return
|
183
|
+
return data
|
217
184
|
|
218
185
|
@property
|
219
186
|
def is_remote(self) -> bool:
|
@@ -226,7 +193,7 @@ class KubeflowOrchestratorConfig( # type: ignore[misc] # https://github.com/pyd
|
|
226
193
|
Returns:
|
227
194
|
True if this config is for a remote component, False otherwise.
|
228
195
|
"""
|
229
|
-
return
|
196
|
+
return True
|
230
197
|
|
231
198
|
@property
|
232
199
|
def is_local(self) -> bool:
|
@@ -235,7 +202,7 @@ class KubeflowOrchestratorConfig( # type: ignore[misc] # https://github.com/pyd
|
|
235
202
|
Returns:
|
236
203
|
True if this config is for a local component, False otherwise.
|
237
204
|
"""
|
238
|
-
return
|
205
|
+
return False
|
239
206
|
|
240
207
|
@property
|
241
208
|
def is_synchronous(self) -> bool:
|