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
zenml/model/model.py
CHANGED
@@ -24,12 +24,13 @@ from typing import (
|
|
24
24
|
)
|
25
25
|
from uuid import UUID
|
26
26
|
|
27
|
-
from pydantic import BaseModel, PrivateAttr,
|
27
|
+
from pydantic import BaseModel, ConfigDict, Field, PrivateAttr, model_validator
|
28
28
|
|
29
29
|
from zenml.constants import MAX_RETRIES_FOR_VERSIONED_ENTITY_CREATION
|
30
30
|
from zenml.enums import MetadataResourceTypes, ModelStages
|
31
31
|
from zenml.exceptions import EntityExistsError
|
32
32
|
from zenml.logger import get_logger
|
33
|
+
from zenml.utils.pydantic_utils import before_validator_handler
|
33
34
|
|
34
35
|
if TYPE_CHECKING:
|
35
36
|
from zenml.metadata.metadata_types import MetadataType
|
@@ -73,7 +74,9 @@ class Model(BaseModel):
|
|
73
74
|
trade_offs: Optional[str] = None
|
74
75
|
ethics: Optional[str] = None
|
75
76
|
tags: Optional[List[str]] = None
|
76
|
-
version: Optional[Union[ModelStages, int, str]] =
|
77
|
+
version: Optional[Union[ModelStages, int, str]] = Field(
|
78
|
+
default=None, union_mode="smart"
|
79
|
+
)
|
77
80
|
save_models_to_registry: bool = True
|
78
81
|
model_version_id: Optional[UUID] = None
|
79
82
|
|
@@ -83,6 +86,14 @@ class Model(BaseModel):
|
|
83
86
|
_model_id: UUID = PrivateAttr(None)
|
84
87
|
_number: int = PrivateAttr(None)
|
85
88
|
|
89
|
+
# TODO: In Pydantic v2, the `model_` is a protected namespaces for all
|
90
|
+
# fields defined under base models. If not handled, this raises a warning.
|
91
|
+
# It is possible to suppress this warning message with the following
|
92
|
+
# configuration, however the ultimate solution is to rename these fields.
|
93
|
+
# Even though they do not cause any problems right now, if we are not
|
94
|
+
# careful we might overwrite some fields protected by pydantic.
|
95
|
+
model_config = ConfigDict(protected_namespaces=())
|
96
|
+
|
86
97
|
#########################
|
87
98
|
# Public methods #
|
88
99
|
#########################
|
@@ -106,8 +117,8 @@ class Model(BaseModel):
|
|
106
117
|
self.model_version_id = mv.id
|
107
118
|
except RuntimeError as e:
|
108
119
|
raise RuntimeError(
|
109
|
-
f"Version `{self.version}` of `{self.name}` model doesn't
|
110
|
-
"and cannot be fetched from the Model Control Plane."
|
120
|
+
f"Version `{self.version}` of `{self.name}` model doesn't "
|
121
|
+
"exist and cannot be fetched from the Model Control Plane."
|
111
122
|
) from e
|
112
123
|
return self.model_version_id
|
113
124
|
|
@@ -137,8 +148,8 @@ class Model(BaseModel):
|
|
137
148
|
self._get_or_create_model_version()
|
138
149
|
except RuntimeError:
|
139
150
|
logger.info(
|
140
|
-
f"Version `{self.version}` of `{self.name}` model doesn't
|
141
|
-
"and cannot be fetched from the Model Control Plane."
|
151
|
+
f"Version `{self.version}` of `{self.name}` model doesn't "
|
152
|
+
"exist and cannot be fetched from the Model Control Plane."
|
142
153
|
)
|
143
154
|
return self._number
|
144
155
|
|
@@ -158,8 +169,8 @@ class Model(BaseModel):
|
|
158
169
|
return ModelStages(stage)
|
159
170
|
except RuntimeError:
|
160
171
|
logger.info(
|
161
|
-
f"Version `{self.version}` of `{self.name}` model doesn't
|
162
|
-
"and cannot be fetched from the Model Control Plane."
|
172
|
+
f"Version `{self.version}` of `{self.name}` model doesn't "
|
173
|
+
"exist and cannot be fetched from the Model Control Plane."
|
163
174
|
)
|
164
175
|
return None
|
165
176
|
|
@@ -199,10 +210,12 @@ class Model(BaseModel):
|
|
199
210
|
|
200
211
|
Args:
|
201
212
|
name: The name of the artifact to retrieve.
|
202
|
-
version: The version of the artifact to retrieve (None for
|
213
|
+
version: The version of the artifact to retrieve (None for
|
214
|
+
latest/non-versioned)
|
203
215
|
|
204
216
|
Returns:
|
205
|
-
Specific version of the artifact or placeholder in the design time
|
217
|
+
Specific version of the artifact or placeholder in the design time
|
218
|
+
of the pipeline.
|
206
219
|
"""
|
207
220
|
if lazy := self._lazy_artifact_get(name, version):
|
208
221
|
return lazy
|
@@ -221,10 +234,12 @@ class Model(BaseModel):
|
|
221
234
|
|
222
235
|
Args:
|
223
236
|
name: The name of the model artifact to retrieve.
|
224
|
-
version: The version of the model artifact to retrieve (None for
|
237
|
+
version: The version of the model artifact to retrieve (None for
|
238
|
+
latest/non-versioned)
|
225
239
|
|
226
240
|
Returns:
|
227
|
-
Specific version of the model artifact or placeholder in the design
|
241
|
+
Specific version of the model artifact or placeholder in the design
|
242
|
+
time of the pipeline.
|
228
243
|
"""
|
229
244
|
if lazy := self._lazy_artifact_get(name, version):
|
230
245
|
return lazy
|
@@ -243,10 +258,12 @@ class Model(BaseModel):
|
|
243
258
|
|
244
259
|
Args:
|
245
260
|
name: The name of the data artifact to retrieve.
|
246
|
-
version: The version of the data artifact to retrieve (None for
|
261
|
+
version: The version of the data artifact to retrieve (None for
|
262
|
+
latest/non-versioned)
|
247
263
|
|
248
264
|
Returns:
|
249
|
-
Specific version of the data artifact or placeholder in the design
|
265
|
+
Specific version of the data artifact or placeholder in the design
|
266
|
+
time of the pipeline.
|
250
267
|
"""
|
251
268
|
if lazy := self._lazy_artifact_get(name, version):
|
252
269
|
return lazy
|
@@ -265,10 +282,12 @@ class Model(BaseModel):
|
|
265
282
|
|
266
283
|
Args:
|
267
284
|
name: The name of the deployment artifact to retrieve.
|
268
|
-
version: The version of the deployment artifact to retrieve (None
|
285
|
+
version: The version of the deployment artifact to retrieve (None
|
286
|
+
for latest/non-versioned)
|
269
287
|
|
270
288
|
Returns:
|
271
|
-
Specific version of the deployment artifact or placeholder in the
|
289
|
+
Specific version of the deployment artifact or placeholder in the
|
290
|
+
design time of the pipeline.
|
272
291
|
"""
|
273
292
|
if lazy := self._lazy_artifact_get(name, version):
|
274
293
|
return lazy
|
@@ -296,7 +315,8 @@ class Model(BaseModel):
|
|
296
315
|
|
297
316
|
Args:
|
298
317
|
stage: the target stage for model version.
|
299
|
-
force: whether to force archiving of current model version in
|
318
|
+
force: whether to force archiving of current model version in
|
319
|
+
target stage or raise.
|
300
320
|
"""
|
301
321
|
self._get_or_create_model_version().set_stage(stage=stage, force=force)
|
302
322
|
|
@@ -362,7 +382,8 @@ class Model(BaseModel):
|
|
362
382
|
The model version run metadata.
|
363
383
|
"""
|
364
384
|
logger.warning(
|
365
|
-
"Model `metadata` property is deprecated. Please use
|
385
|
+
"Model `metadata` property is deprecated. Please use "
|
386
|
+
"`run_metadata` instead."
|
366
387
|
)
|
367
388
|
return {k: v.value for k, v in self.run_metadata.items()}
|
368
389
|
|
@@ -378,10 +399,12 @@ class Model(BaseModel):
|
|
378
399
|
|
379
400
|
Args:
|
380
401
|
name: The name of the artifact to delete.
|
381
|
-
version: The version of the artifact to delete (None for
|
402
|
+
version: The version of the artifact to delete (None for
|
403
|
+
latest/non-versioned)
|
382
404
|
only_link: Whether to only delete the link to the artifact.
|
383
405
|
delete_metadata: Whether to delete the metadata of the artifact.
|
384
|
-
delete_from_artifact_store: Whether to delete the artifact from the
|
406
|
+
delete_from_artifact_store: Whether to delete the artifact from the
|
407
|
+
artifact store.
|
385
408
|
"""
|
386
409
|
from zenml.client import Client
|
387
410
|
from zenml.models import ArtifactVersionResponse
|
@@ -409,7 +432,8 @@ class Model(BaseModel):
|
|
409
432
|
|
410
433
|
Args:
|
411
434
|
only_link: Whether to only delete the link to the artifact.
|
412
|
-
delete_from_artifact_store: Whether to delete the artifact from
|
435
|
+
delete_from_artifact_store: Whether to delete the artifact from
|
436
|
+
the artifact store.
|
413
437
|
"""
|
414
438
|
from zenml.client import Client
|
415
439
|
|
@@ -429,15 +453,6 @@ class Model(BaseModel):
|
|
429
453
|
|
430
454
|
client.delete_all_model_version_artifact_links(self.id, only_link)
|
431
455
|
|
432
|
-
#########################
|
433
|
-
# Internal methods #
|
434
|
-
#########################
|
435
|
-
|
436
|
-
class Config:
|
437
|
-
"""Config class."""
|
438
|
-
|
439
|
-
smart_union = True
|
440
|
-
|
441
456
|
def _lazy_artifact_get(
|
442
457
|
self,
|
443
458
|
name: str,
|
@@ -451,9 +466,9 @@ class Model(BaseModel):
|
|
451
466
|
try:
|
452
467
|
get_pipeline_context()
|
453
468
|
return LazyArtifactVersionResponse(
|
454
|
-
|
455
|
-
|
456
|
-
|
469
|
+
lazy_load_name=name,
|
470
|
+
lazy_load_version=version,
|
471
|
+
lazy_load_model=Model(
|
457
472
|
name=self.name, version=self.version or self.number
|
458
473
|
),
|
459
474
|
)
|
@@ -481,34 +496,38 @@ class Model(BaseModel):
|
|
481
496
|
other_mv = other._get_or_create_model_version()
|
482
497
|
return self_mv.id == other_mv.id
|
483
498
|
|
484
|
-
@
|
485
|
-
|
499
|
+
@model_validator(mode="before")
|
500
|
+
@classmethod
|
501
|
+
@before_validator_handler
|
502
|
+
def _root_validator(cls, data: Dict[str, Any]) -> Dict[str, Any]:
|
486
503
|
"""Validate all in one.
|
487
504
|
|
488
505
|
Args:
|
489
|
-
|
506
|
+
data: Dict of values.
|
490
507
|
|
491
508
|
Returns:
|
492
509
|
Dict of validated values.
|
493
510
|
"""
|
494
|
-
suppress_class_validation_warnings =
|
511
|
+
suppress_class_validation_warnings = data.get(
|
495
512
|
"suppress_class_validation_warnings", False
|
496
513
|
)
|
497
|
-
version =
|
514
|
+
version = data.get("version", None)
|
498
515
|
|
499
516
|
if (
|
500
517
|
version in [stage.value for stage in ModelStages]
|
501
518
|
and not suppress_class_validation_warnings
|
502
519
|
):
|
503
520
|
logger.info(
|
504
|
-
f"`version` `{version}` matches one of the possible
|
521
|
+
f"`version` `{version}` matches one of the possible "
|
522
|
+
"`ModelStages` and will be fetched using stage."
|
505
523
|
)
|
506
524
|
if str(version).isnumeric() and not suppress_class_validation_warnings:
|
507
525
|
logger.info(
|
508
|
-
f"`version` `{version}` is numeric and will be fetched
|
526
|
+
f"`version` `{version}` is numeric and will be fetched "
|
527
|
+
"using version number."
|
509
528
|
)
|
510
|
-
|
511
|
-
return
|
529
|
+
data["suppress_class_validation_warnings"] = True
|
530
|
+
return data
|
512
531
|
|
513
532
|
def _validate_config_in_runtime(self) -> "ModelVersionResponse":
|
514
533
|
"""Validate that config doesn't conflict with runtime environment.
|
@@ -555,7 +574,7 @@ class Model(BaseModel):
|
|
555
574
|
workspace=zenml_client.active_workspace.id,
|
556
575
|
save_models_to_registry=self.save_models_to_registry,
|
557
576
|
)
|
558
|
-
model_request = ModelRequest.
|
577
|
+
model_request = ModelRequest.model_validate(model_request)
|
559
578
|
try:
|
560
579
|
model = zenml_client.zen_store.create_model(
|
561
580
|
model=model_request
|
@@ -627,15 +646,20 @@ class Model(BaseModel):
|
|
627
646
|
) -> "ModelVersionResponse":
|
628
647
|
"""This method should get or create a model and a model version from Model Control Plane.
|
629
648
|
|
630
|
-
A new model is created implicitly if missing, otherwise existing model
|
631
|
-
name is controlled by the `name` parameter.
|
649
|
+
A new model is created implicitly if missing, otherwise existing model
|
650
|
+
is fetched. Model name is controlled by the `name` parameter.
|
632
651
|
|
633
652
|
Model Version returned by this method is resolved based on model version:
|
634
|
-
- If `version` is None, a new model version is created, if not created
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
- If `version` is set to
|
653
|
+
- If `version` is None, a new model version is created, if not created
|
654
|
+
by other steps in same run.
|
655
|
+
- If `version` is not None a model version will be fetched based on the
|
656
|
+
version:
|
657
|
+
- If `version` is set to an integer or digit string, the model
|
658
|
+
version with the matching number will be fetched.
|
659
|
+
- If `version` is set to a string, the model version with the
|
660
|
+
matching version will be fetched.
|
661
|
+
- If `version` is set to a `ModelStage`, the model version with the
|
662
|
+
matching stage will be fetched.
|
639
663
|
|
640
664
|
Args:
|
641
665
|
hydrate: Whether to return a hydrated version of the model version.
|
@@ -644,8 +668,9 @@ class Model(BaseModel):
|
|
644
668
|
The model version based on configuration.
|
645
669
|
|
646
670
|
Raises:
|
647
|
-
RuntimeError: if the model version needs to be created, but
|
648
|
-
|
671
|
+
RuntimeError: if the model version needs to be created, but
|
672
|
+
provided name is reserved.
|
673
|
+
RuntimeError: if the model version cannot be created.
|
649
674
|
"""
|
650
675
|
from zenml.client import Client
|
651
676
|
from zenml.models import ModelVersionRequest
|
@@ -656,12 +681,12 @@ class Model(BaseModel):
|
|
656
681
|
model_version_request = ModelVersionRequest(
|
657
682
|
user=zenml_client.active_user.id,
|
658
683
|
workspace=zenml_client.active_workspace.id,
|
659
|
-
name=self.version,
|
684
|
+
name=str(self.version) if self.version else None,
|
660
685
|
description=self.description,
|
661
686
|
model=model.id,
|
662
687
|
tags=self.tags,
|
663
688
|
)
|
664
|
-
mv_request = ModelVersionRequest.
|
689
|
+
mv_request = ModelVersionRequest.model_validate(model_version_request)
|
665
690
|
try:
|
666
691
|
if not self.version:
|
667
692
|
try:
|
@@ -173,7 +173,7 @@ class BaseModelDeployer(StackComponent, ABC):
|
|
173
173
|
if not continuous_deployment_mode:
|
174
174
|
# Find existing model server
|
175
175
|
services = self.find_model_server(
|
176
|
-
config=config.
|
176
|
+
config=config.model_dump(),
|
177
177
|
service_type=service_type,
|
178
178
|
)
|
179
179
|
if len(services) > 0:
|
@@ -196,7 +196,7 @@ class BaseModelDeployer(StackComponent, ABC):
|
|
196
196
|
service = services[0]
|
197
197
|
self.delete_model_server(service.uuid)
|
198
198
|
logger.info(
|
199
|
-
f"Deploying model server for {config.model_name} with the following configuration: {config.
|
199
|
+
f"Deploying model server for {config.model_name} with the following configuration: {config.model_dump()}"
|
200
200
|
)
|
201
201
|
service_response = client.create_service(
|
202
202
|
config=config,
|
@@ -220,10 +220,12 @@ class BaseModelDeployer(StackComponent, ABC):
|
|
220
220
|
client.update_service(
|
221
221
|
id=service.uuid,
|
222
222
|
name=service.config.service_name,
|
223
|
-
service_source=service.
|
223
|
+
service_source=service.model_dump().get("type"),
|
224
224
|
admin_state=service.admin_state,
|
225
|
-
status=service.status.
|
226
|
-
endpoint=service.endpoint.
|
225
|
+
status=service.status.model_dump(),
|
226
|
+
endpoint=service.endpoint.model_dump()
|
227
|
+
if service.endpoint
|
228
|
+
else None,
|
227
229
|
# labels=service.config.get_service_labels() # TODO: fix labels in services and config
|
228
230
|
prediction_url=service.get_prediction_url(),
|
229
231
|
health_check_url=service.get_healthcheck_url(),
|
@@ -343,12 +345,12 @@ class BaseModelDeployer(StackComponent, ABC):
|
|
343
345
|
continue
|
344
346
|
service = BaseDeploymentService.from_model(service_response)
|
345
347
|
service.update_status()
|
346
|
-
if service.status.
|
348
|
+
if service.status.model_dump() != service_response.status:
|
347
349
|
client.update_service(
|
348
350
|
id=service.uuid,
|
349
351
|
admin_state=service.admin_state,
|
350
|
-
status=service.status.
|
351
|
-
endpoint=service.endpoint.
|
352
|
+
status=service.status.model_dump(),
|
353
|
+
endpoint=service.endpoint.model_dump()
|
352
354
|
if service.endpoint
|
353
355
|
else None,
|
354
356
|
)
|
@@ -411,8 +413,8 @@ class BaseModelDeployer(StackComponent, ABC):
|
|
411
413
|
client.update_service(
|
412
414
|
id=updated_service.uuid,
|
413
415
|
admin_state=updated_service.admin_state,
|
414
|
-
status=updated_service.status.
|
415
|
-
endpoint=updated_service.endpoint.
|
416
|
+
status=updated_service.status.model_dump(),
|
417
|
+
endpoint=updated_service.endpoint.model_dump()
|
416
418
|
if updated_service.endpoint
|
417
419
|
else None,
|
418
420
|
)
|
@@ -461,8 +463,8 @@ class BaseModelDeployer(StackComponent, ABC):
|
|
461
463
|
client.update_service(
|
462
464
|
id=updated_service.uuid,
|
463
465
|
admin_state=updated_service.admin_state,
|
464
|
-
status=updated_service.status.
|
465
|
-
endpoint=updated_service.endpoint.
|
466
|
+
status=updated_service.status.model_dump(),
|
467
|
+
endpoint=updated_service.endpoint.model_dump()
|
466
468
|
if updated_service.endpoint
|
467
469
|
else None,
|
468
470
|
)
|
@@ -18,7 +18,7 @@ from datetime import datetime
|
|
18
18
|
from enum import Enum
|
19
19
|
from typing import Any, Dict, List, Optional, Type, cast
|
20
20
|
|
21
|
-
from pydantic import BaseModel
|
21
|
+
from pydantic import BaseModel, ConfigDict
|
22
22
|
|
23
23
|
from zenml.enums import StackComponentType
|
24
24
|
from zenml.stack import Flavor, StackComponent
|
@@ -79,13 +79,11 @@ class ModelRegistryModelMetadata(BaseModel):
|
|
79
79
|
"""
|
80
80
|
# Return all attributes that are not explicitly defined as Pydantic
|
81
81
|
# fields in this class
|
82
|
-
|
83
|
-
k: str(v)
|
84
|
-
|
85
|
-
if k not in self.__fields__.keys()
|
86
|
-
}
|
82
|
+
if self.model_extra:
|
83
|
+
return {k: str(v) for k, v in self.model_extra.items()}
|
84
|
+
return {}
|
87
85
|
|
88
|
-
def
|
86
|
+
def model_dump(
|
89
87
|
self,
|
90
88
|
*,
|
91
89
|
exclude_unset: bool = False,
|
@@ -94,7 +92,7 @@ class ModelRegistryModelMetadata(BaseModel):
|
|
94
92
|
) -> Dict[str, str]:
|
95
93
|
"""Returns a dictionary representation of the metadata.
|
96
94
|
|
97
|
-
This method overrides the default Pydantic `
|
95
|
+
This method overrides the default Pydantic `model_dump` method to allow
|
98
96
|
for the exclusion of fields with a value of None.
|
99
97
|
|
100
98
|
Args:
|
@@ -109,18 +107,14 @@ class ModelRegistryModelMetadata(BaseModel):
|
|
109
107
|
return {
|
110
108
|
k: v
|
111
109
|
for k, v in super()
|
112
|
-
.
|
110
|
+
.model_dump(exclude_unset=exclude_unset, **kwargs)
|
113
111
|
.items()
|
114
112
|
if v is not None
|
115
113
|
}
|
116
114
|
else:
|
117
|
-
return super().
|
115
|
+
return super().model_dump(exclude_unset=exclude_unset, **kwargs)
|
118
116
|
|
119
|
-
|
120
|
-
"""Pydantic configuration class."""
|
121
|
-
|
122
|
-
# Allow extra attributes to be set in the metadata
|
123
|
-
extra = "allow"
|
117
|
+
model_config = ConfigDict(extra="allow")
|
124
118
|
|
125
119
|
|
126
120
|
class RegistryModelVersion(BaseModel):
|
@@ -165,6 +159,14 @@ class RegistryModelVersion(BaseModel):
|
|
165
159
|
stage: ModelVersionStage = ModelVersionStage.NONE
|
166
160
|
metadata: Optional[ModelRegistryModelMetadata] = None
|
167
161
|
|
162
|
+
# TODO: In Pydantic v2, the `model_` is a protected namespaces for all
|
163
|
+
# fields defined under base models. If not handled, this raises a warning.
|
164
|
+
# It is possible to suppress this warning message with the following
|
165
|
+
# configuration, however the ultimate solution is to rename these fields.
|
166
|
+
# Even though they do not cause any problems right now, if we are not
|
167
|
+
# careful we might overwrite some fields protected by pydantic.
|
168
|
+
model_config = ConfigDict(protected_namespaces=())
|
169
|
+
|
168
170
|
|
169
171
|
class BaseModelRegistryConfig(StackComponentConfig):
|
170
172
|
"""Base config for model registries."""
|