zenml-nightly 0.70.0.dev20241201__py3-none-any.whl → 0.71.0.dev20241220__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.
- README.md +4 -4
- RELEASE_NOTES.md +112 -0
- zenml/VERSION +1 -1
- zenml/artifacts/artifact_config.py +8 -5
- zenml/artifacts/utils.py +3 -1
- zenml/cli/__init__.py +4 -4
- zenml/cli/base.py +1 -1
- zenml/cli/pipeline.py +48 -79
- zenml/cli/server.py +19 -19
- zenml/client.py +54 -2
- zenml/config/secret_reference_mixin.py +1 -1
- zenml/config/server_config.py +4 -0
- zenml/constants.py +10 -0
- zenml/image_builders/base_image_builder.py +5 -2
- zenml/image_builders/build_context.py +7 -16
- zenml/integrations/aws/__init__.py +3 -0
- zenml/integrations/aws/flavors/__init__.py +6 -0
- zenml/integrations/aws/flavors/aws_image_builder_flavor.py +146 -0
- zenml/integrations/aws/image_builders/__init__.py +20 -0
- zenml/integrations/aws/image_builders/aws_image_builder.py +307 -0
- zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +1 -1
- zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +2 -1
- zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +11 -0
- zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +0 -1
- zenml/integrations/lightning/flavors/lightning_orchestrator_flavor.py +11 -0
- zenml/integrations/neptune/experiment_trackers/neptune_experiment_tracker.py +7 -5
- zenml/integrations/neptune/experiment_trackers/run_state.py +69 -53
- zenml/integrations/registry.py +2 -2
- zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +12 -0
- zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +13 -5
- zenml/materializers/built_in_materializer.py +1 -1
- zenml/model/model.py +12 -16
- zenml/model/utils.py +3 -1
- zenml/models/v2/base/filter.py +26 -30
- zenml/models/v2/base/scoped.py +258 -5
- zenml/models/v2/core/artifact_version.py +15 -26
- zenml/models/v2/core/code_repository.py +1 -12
- zenml/models/v2/core/component.py +5 -46
- zenml/models/v2/core/flavor.py +1 -11
- zenml/models/v2/core/model.py +1 -57
- zenml/models/v2/core/model_version.py +5 -33
- zenml/models/v2/core/model_version_artifact.py +11 -3
- zenml/models/v2/core/model_version_pipeline_run.py +14 -3
- zenml/models/v2/core/pipeline.py +47 -55
- zenml/models/v2/core/pipeline_build.py +67 -12
- zenml/models/v2/core/pipeline_deployment.py +0 -10
- zenml/models/v2/core/pipeline_run.py +91 -29
- zenml/models/v2/core/run_template.py +21 -29
- zenml/models/v2/core/schedule.py +0 -10
- zenml/models/v2/core/secret.py +0 -14
- zenml/models/v2/core/service.py +9 -16
- zenml/models/v2/core/service_connector.py +0 -11
- zenml/models/v2/core/stack.py +21 -30
- zenml/models/v2/core/step_run.py +18 -14
- zenml/models/v2/core/trigger.py +19 -3
- zenml/orchestrators/base_orchestrator.py +13 -1
- zenml/orchestrators/output_utils.py +5 -1
- zenml/orchestrators/step_launcher.py +9 -13
- zenml/orchestrators/step_run_utils.py +8 -204
- zenml/orchestrators/utils.py +55 -27
- zenml/pipelines/build_utils.py +12 -0
- zenml/service_connectors/service_connector_utils.py +3 -9
- zenml/stack/stack_component.py +1 -1
- zenml/stack_deployments/aws_stack_deployment.py +22 -0
- zenml/utils/archivable.py +65 -36
- zenml/utils/code_utils.py +8 -4
- zenml/utils/docker_utils.py +9 -0
- zenml/zen_server/auth.py +9 -10
- zenml/zen_server/dashboard/assets/{404-NVXKFp-x.js → 404-Cqu3EDCm.js} +1 -1
- zenml/zen_server/dashboard/assets/{@reactflow-CK0KJUen.js → @reactflow-D2Y7BWwz.js} +1 -1
- zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-DezXKmDf.js → AlertDialogDropdownItem-BHd71pVS.js} +1 -1
- zenml/zen_server/dashboard/assets/{CodeSnippet-JzR8CEtw.js → CodeSnippet-DIonwetW.js} +1 -1
- zenml/zen_server/dashboard/assets/{CollapsibleCard-DQW_ktMO.js → CollapsibleCard-CDnC97pB.js} +1 -1
- zenml/zen_server/dashboard/assets/{Commands-DL2kwkRd.js → Commands-BVEXKAOj.js} +1 -1
- zenml/zen_server/dashboard/assets/{ComponentBadge-D_g62Wv8.js → ComponentBadge-CrRvovox.js} +1 -1
- zenml/zen_server/dashboard/assets/{CopyButton-LNcWaa14.js → CopyButton-B6wGAhQv.js} +1 -1
- zenml/zen_server/dashboard/assets/{CsvVizualization-DknpE5ej.js → CsvVizualization-CjcT7LMm.js} +5 -5
- zenml/zen_server/dashboard/assets/DeleteAlertDialog-D2ELtM2W.js +1 -0
- zenml/zen_server/dashboard/assets/{DialogItem-Bxf8FuAT.js → DialogItem-DXIMhBgU.js} +1 -1
- zenml/zen_server/dashboard/assets/{Error-DYflYyps.js → Error-B8uUfTpL.js} +1 -1
- zenml/zen_server/dashboard/assets/{ExecutionStatus-C7zyIQKZ.js → ExecutionStatus-ibAdY-dG.js} +1 -1
- zenml/zen_server/dashboard/assets/{Helpbox-oYSGpLqd.js → Helpbox-BfAfhKHw.js} +1 -1
- zenml/zen_server/dashboard/assets/{Infobox-Cx4xGoXR.js → Infobox-M_SMOu96.js} +1 -1
- zenml/zen_server/dashboard/assets/{InlineAvatar-DiGOWNKF.js → InlineAvatar-DBA0a0-a.js} +1 -1
- zenml/zen_server/dashboard/assets/{NestedCollapsible-DYbgyKxK.js → NestedCollapsible-DpgmEFKw.js} +1 -1
- zenml/zen_server/dashboard/assets/{Partials-03iZf8-N.js → Partials-D_ldD9if.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProBadge-D_EB8HNo.js → ProBadge-DQbfFotM.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProCta-DqNS4v3x.js → ProCta-Bcpb4rcY.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderIcon-Bki2aw8w.js → ProviderIcon-BZpgPigN.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderRadio-8f43sPD4.js → ProviderRadio-DWPnMuQ1.js} +1 -1
- zenml/zen_server/dashboard/assets/RunSelector-DgRGaAc6.js +1 -0
- zenml/zen_server/dashboard/assets/{RunsBody-07YEO7qI.js → RunsBody-KecfSkjY.js} +1 -1
- zenml/zen_server/dashboard/assets/{SearchField-lp1KgU4e.js → SearchField-n-ILHnaP.js} +1 -1
- zenml/zen_server/dashboard/assets/{SecretTooltip-CgnbyeOx.js → SecretTooltip-B8MrX5yu.js} +1 -1
- zenml/zen_server/dashboard/assets/{SetPassword-CpP418A2.js → SetPassword-B_IVq_wg.js} +1 -1
- zenml/zen_server/dashboard/assets/StackList-TWPBYnkF.js +1 -0
- zenml/zen_server/dashboard/assets/{Tabs-BktHkCJJ.js → Tabs-Rg857zmd.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tick-BlMoIlJT.js → Tick-COg4A-xo.js} +1 -1
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Sc0A0pP-.js → UpdatePasswordSchemas-C6Aj3hm6.js} +1 -1
- zenml/zen_server/dashboard/assets/{UsageReason-YYduL4fj.js → UsageReason-BTLbx7w4.js} +1 -1
- zenml/zen_server/dashboard/assets/{WizardFooter-dgmizSJC.js → WizardFooter-BCAj69Vj.js} +1 -1
- zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-D-c2G6lV.js → all-pipeline-runs-query-DMXkDrV2.js} +1 -1
- zenml/zen_server/dashboard/assets/code-snippets-CqONne41.js +13 -0
- zenml/zen_server/dashboard/assets/{create-stack-DM_JPgef.js → create-stack-HfdbhLs4.js} +1 -1
- zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +1 -0
- zenml/zen_server/dashboard/assets/delete-run-DZ4hIXff.js +1 -0
- zenml/zen_server/dashboard/assets/{form-schemas-K6FYKjwa.js → form-schemas-B0AVEd9b.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-BAkC7FXi.js → index-DPqSWjug.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-CEV4Cvaf.js → index-DScjfBRb.js} +1 -1
- zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +1 -0
- zenml/zen_server/dashboard/assets/{index-CCOPpudF.js → index-FO-p0GU7.js} +5 -5
- zenml/zen_server/dashboard/assets/{index-B1mVPYxf.js → index-I3bKUGUj.js} +1 -1
- zenml/zen_server/dashboard/assets/key-icon-aH-QIa5R.js +1 -0
- zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +1 -0
- zenml/zen_server/dashboard/assets/{login-mutation-hf-lK87O.js → login-mutation-BQeo4wTY.js} +1 -1
- zenml/zen_server/dashboard/assets/{not-found-BGirLjU-.js → not-found-gAJ5aDdR.js} +1 -1
- zenml/zen_server/dashboard/assets/page-9Y9-gig0.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DjRJCGb3.js → page-AUwiQ14W.js} +1 -1
- zenml/zen_server/dashboard/assets/page-B6XU7yYT.js +2 -0
- zenml/zen_server/dashboard/assets/{page-C00YAkaB.js → page-BKZYc2Zv.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CdMWnQak.js → page-BU9FG4sR.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D7S3aCbF.js → page-B_Apk3xg.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Djikxq_S.js → page-BdowiCbr.js} +1 -1
- zenml/zen_server/dashboard/assets/page-Bg8OjTRe.js +1 -0
- zenml/zen_server/dashboard/assets/page-BxL4qD4_.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DakHVWXF.js → page-CWxT5K5J.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CXuQufSe.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DLC-bNBP.js → page-CcQr8CPP.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CD-DcWoy.js → page-Ce4Hrjnr.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CiYxgZP_.js +1 -0
- zenml/zen_server/dashboard/assets/page-Cldq1mpe.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BDigxVpo.js → page-D4wdonLm.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D6uU2ax4.js → page-D8ObrbH8.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DXSTpqRD.js → page-DFuAUGt4.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CbpvrsDL.js → page-DGazBpuP.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-COXXJj1k.js → page-DO1UcqPX.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DRYXdL5o.js +1 -0
- zenml/zen_server/dashboard/assets/{page-Df-Fw0aq.js → page-DYEquBC2.js} +1 -1
- zenml/zen_server/dashboard/assets/page-Dk32IeZm.js +1 -0
- zenml/zen_server/dashboard/assets/{page-yYC9OI-E.js → page-I3nKFGie.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-6m6yHHlE.js → page-M0w-n6vn.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Vcxara9U.js → page-R5dx3xGF.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BR68V0V1.js → page-bT5pOvcB.js} +1 -1
- zenml/zen_server/dashboard/assets/page-hUqK889I.js +6 -0
- zenml/zen_server/dashboard/assets/{page-CjGdWY13.js → page-h_Stveon.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D01JhjQB.js → page-r8XK5vR7.js} +1 -1
- zenml/zen_server/dashboard/assets/page-u_-ZXBKb.js +1 -0
- zenml/zen_server/dashboard/assets/page-zaMqB_ao.js +1 -0
- zenml/zen_server/dashboard/assets/{persist-GjC8PZoC.js → persist-AppN1B0J.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-Coz7ZWvz.js → persist-DAUi_3za.js} +1 -1
- zenml/zen_server/dashboard/assets/service-BqqeXLEe.js +2 -0
- zenml/zen_server/dashboard/assets/{sharedSchema-CQb14VSr.js → sharedSchema-uXN9FLLk.js} +1 -1
- zenml/zen_server/dashboard/assets/{stack-detail-query-OPEW-cDJ.js → stack-detail-query-XfZBiBP2.js} +1 -1
- zenml/zen_server/dashboard/assets/{update-server-settings-mutation-LwuQfHYn.js → update-server-settings-mutation-BWmgVJwA.js} +1 -1
- zenml/zen_server/dashboard/assets/{url-CkvKAnwF.js → url-BLwMbzES.js} +1 -1
- zenml/zen_server/dashboard/index.html +4 -4
- zenml/zen_server/deploy/helm/Chart.yaml +1 -1
- zenml/zen_server/deploy/helm/README.md +2 -2
- zenml/zen_server/rbac/rbac_sql_zen_store.py +173 -0
- zenml/zen_server/routers/auth_endpoints.py +22 -11
- zenml/zen_server/routers/steps_endpoints.py +7 -1
- zenml/zen_server/template_execution/utils.py +3 -1
- zenml/zen_server/utils.py +4 -3
- zenml/zen_stores/base_zen_store.py +10 -2
- zenml/zen_stores/migrations/versions/0.71.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/26351d482b9e_add_step_run_unique_constraint.py +37 -0
- zenml/zen_stores/migrations/versions/a1237ba94fd8_add_model_version_producer_run_unique_.py +68 -0
- zenml/zen_stores/rest_zen_store.py +76 -43
- zenml/zen_stores/schemas/model_schemas.py +42 -6
- zenml/zen_stores/schemas/pipeline_deployment_schemas.py +7 -7
- zenml/zen_stores/schemas/pipeline_run_schemas.py +12 -6
- zenml/zen_stores/schemas/pipeline_schemas.py +5 -0
- zenml/zen_stores/schemas/step_run_schemas.py +8 -1
- zenml/zen_stores/sql_zen_store.py +332 -100
- {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/METADATA +5 -5
- {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/RECORD +179 -164
- zenml/zen_server/dashboard/assets/RunSelector-DkPiIiNr.js +0 -1
- zenml/zen_server/dashboard/assets/StackList-WvuKQusZ.js +0 -1
- zenml/zen_server/dashboard/assets/delete-run-CJdh1P_h.js +0 -1
- zenml/zen_server/dashboard/assets/index-DlGvJQPn.css +0 -1
- zenml/zen_server/dashboard/assets/page-0JE_-Ec1.js +0 -1
- zenml/zen_server/dashboard/assets/page-BRLpxOt0.js +0 -1
- zenml/zen_server/dashboard/assets/page-BU7huvKw.js +0 -6
- zenml/zen_server/dashboard/assets/page-BvqLv2Ky.js +0 -1
- zenml/zen_server/dashboard/assets/page-CwxrFarU.js +0 -1
- zenml/zen_server/dashboard/assets/page-DfbXf_8s.js +0 -1
- zenml/zen_server/dashboard/assets/page-Dnovpa0i.js +0 -3
- zenml/zen_server/dashboard/assets/page-Dot3LPmL.js +0 -1
- zenml/zen_server/dashboard/assets/page-Xynx4btY.js +0 -14
- zenml/zen_server/dashboard/assets/page-YpKAqVSa.js +0 -1
- {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/entry_points.txt +0 -0
@@ -20,7 +20,6 @@ import neptune
|
|
20
20
|
|
21
21
|
import zenml
|
22
22
|
from zenml.client import Client
|
23
|
-
from zenml.integrations.constants import NEPTUNE
|
24
23
|
from zenml.utils.singleton import SingletonMetaClass
|
25
24
|
|
26
25
|
if TYPE_CHECKING:
|
@@ -29,20 +28,38 @@ if TYPE_CHECKING:
|
|
29
28
|
_INTEGRATION_VERSION_KEY = "source_code/integrations/zenml"
|
30
29
|
|
31
30
|
|
32
|
-
class InvalidExperimentTrackerSelected(Exception):
|
33
|
-
"""Raised if a Neptune run is fetched while using a different experiment tracker."""
|
34
|
-
|
35
|
-
|
36
31
|
class RunProvider(metaclass=SingletonMetaClass):
|
37
32
|
"""Singleton object used to store and persist a Neptune run state across the pipeline."""
|
38
33
|
|
39
34
|
def __init__(self) -> None:
|
40
35
|
"""Initialize RunProvider. Called with no arguments."""
|
41
36
|
self._active_run: Optional["Run"] = None
|
42
|
-
self._project: Optional[str]
|
43
|
-
self._run_name: Optional[str]
|
44
|
-
self._token: Optional[str]
|
45
|
-
self._tags: Optional[List[str]]
|
37
|
+
self._project: Optional[str] = None
|
38
|
+
self._run_name: Optional[str] = None
|
39
|
+
self._token: Optional[str] = None
|
40
|
+
self._tags: Optional[List[str]] = None
|
41
|
+
self._initialized = False
|
42
|
+
|
43
|
+
def initialize(
|
44
|
+
self,
|
45
|
+
project: Optional[str] = None,
|
46
|
+
token: Optional[str] = None,
|
47
|
+
run_name: Optional[str] = None,
|
48
|
+
tags: Optional[List[str]] = None,
|
49
|
+
) -> None:
|
50
|
+
"""Initialize the run state.
|
51
|
+
|
52
|
+
Args:
|
53
|
+
project: The neptune project.
|
54
|
+
token: The neptune token.
|
55
|
+
run_name: The neptune run name.
|
56
|
+
tags: Tags for the neptune run.
|
57
|
+
"""
|
58
|
+
self._project = project
|
59
|
+
self._token = token
|
60
|
+
self._run_name = run_name
|
61
|
+
self._tags = tags
|
62
|
+
self._initialized = True
|
46
63
|
|
47
64
|
@property
|
48
65
|
def project(self) -> Optional[Any]:
|
@@ -53,15 +70,6 @@ class RunProvider(metaclass=SingletonMetaClass):
|
|
53
70
|
"""
|
54
71
|
return self._project
|
55
72
|
|
56
|
-
@project.setter
|
57
|
-
def project(self, project: str) -> None:
|
58
|
-
"""Setter for project name.
|
59
|
-
|
60
|
-
Args:
|
61
|
-
project: Neptune project name
|
62
|
-
"""
|
63
|
-
self._project = project
|
64
|
-
|
65
73
|
@property
|
66
74
|
def token(self) -> Optional[Any]:
|
67
75
|
"""Getter for API token.
|
@@ -71,15 +79,6 @@ class RunProvider(metaclass=SingletonMetaClass):
|
|
71
79
|
"""
|
72
80
|
return self._token
|
73
81
|
|
74
|
-
@token.setter
|
75
|
-
def token(self, token: str) -> None:
|
76
|
-
"""Setter for API token.
|
77
|
-
|
78
|
-
Args:
|
79
|
-
token: Neptune API token
|
80
|
-
"""
|
81
|
-
self._token = token
|
82
|
-
|
83
82
|
@property
|
84
83
|
def run_name(self) -> Optional[Any]:
|
85
84
|
"""Getter for run name.
|
@@ -89,15 +88,6 @@ class RunProvider(metaclass=SingletonMetaClass):
|
|
89
88
|
"""
|
90
89
|
return self._run_name
|
91
90
|
|
92
|
-
@run_name.setter
|
93
|
-
def run_name(self, run_name: str) -> None:
|
94
|
-
"""Setter for run name.
|
95
|
-
|
96
|
-
Args:
|
97
|
-
run_name: name of the pipeline run
|
98
|
-
"""
|
99
|
-
self._run_name = run_name
|
100
|
-
|
101
91
|
@property
|
102
92
|
def tags(self) -> Optional[Any]:
|
103
93
|
"""Getter for run tags.
|
@@ -107,14 +97,14 @@ class RunProvider(metaclass=SingletonMetaClass):
|
|
107
97
|
"""
|
108
98
|
return self._tags
|
109
99
|
|
110
|
-
@
|
111
|
-
def
|
112
|
-
"""
|
100
|
+
@property
|
101
|
+
def initialized(self) -> bool:
|
102
|
+
"""If the run state is initialized.
|
113
103
|
|
114
|
-
|
115
|
-
|
104
|
+
Returns:
|
105
|
+
If the run state is initialized.
|
116
106
|
"""
|
117
|
-
self.
|
107
|
+
return self._initialized
|
118
108
|
|
119
109
|
@property
|
120
110
|
def active_run(self) -> "Run":
|
@@ -137,9 +127,14 @@ class RunProvider(metaclass=SingletonMetaClass):
|
|
137
127
|
self._active_run = run
|
138
128
|
return self._active_run
|
139
129
|
|
140
|
-
def
|
141
|
-
"""
|
130
|
+
def reset(self) -> None:
|
131
|
+
"""Reset the run state."""
|
142
132
|
self._active_run = None
|
133
|
+
self._project = None
|
134
|
+
self._run_name = None
|
135
|
+
self._token = None
|
136
|
+
self._tags = None
|
137
|
+
self._initialized = False
|
143
138
|
|
144
139
|
|
145
140
|
def get_neptune_run() -> "Run":
|
@@ -149,14 +144,35 @@ def get_neptune_run() -> "Run":
|
|
149
144
|
Neptune run object
|
150
145
|
|
151
146
|
Raises:
|
152
|
-
|
147
|
+
RuntimeError: When unable to fetch the active neptune run.
|
153
148
|
"""
|
154
|
-
|
155
|
-
|
156
|
-
if experiment_tracker.flavor == NEPTUNE: # type: ignore
|
157
|
-
return experiment_tracker.run_state.active_run # type: ignore
|
158
|
-
raise InvalidExperimentTrackerSelected(
|
159
|
-
"Fetching a Neptune run works only with the 'neptune' flavor of "
|
160
|
-
"the experiment tracker. The flavor currently selected is %s"
|
161
|
-
% experiment_tracker.flavor # type: ignore
|
149
|
+
from zenml.integrations.neptune.experiment_trackers import (
|
150
|
+
NeptuneExperimentTracker,
|
162
151
|
)
|
152
|
+
|
153
|
+
experiment_tracker = Client().active_stack.experiment_tracker
|
154
|
+
|
155
|
+
if not experiment_tracker:
|
156
|
+
raise RuntimeError(
|
157
|
+
"Unable to get neptune run: Missing experiment tracker in the "
|
158
|
+
"active stack."
|
159
|
+
)
|
160
|
+
|
161
|
+
if not isinstance(experiment_tracker, NeptuneExperimentTracker):
|
162
|
+
raise RuntimeError(
|
163
|
+
"Unable to get neptune run: Experiment tracker in the active "
|
164
|
+
f"stack ({experiment_tracker.flavor}) is not a neptune experiment "
|
165
|
+
"tracker."
|
166
|
+
)
|
167
|
+
|
168
|
+
run_state = experiment_tracker.run_state
|
169
|
+
if not run_state.initialized:
|
170
|
+
raise RuntimeError(
|
171
|
+
"Unable to get neptune run: The experiment tracker has not been "
|
172
|
+
"initialized. To solve this, make sure you use the experiment "
|
173
|
+
"tracker in your step. See "
|
174
|
+
"https://docs.zenml.io/stack-components/experiment-trackers/neptune#how-do-you-use-it "
|
175
|
+
"for more information."
|
176
|
+
)
|
177
|
+
|
178
|
+
return experiment_tracker.run_state.active_run
|
zenml/integrations/registry.py
CHANGED
@@ -111,7 +111,7 @@ class IntegrationRegistry(object):
|
|
111
111
|
)
|
112
112
|
else:
|
113
113
|
raise KeyError(
|
114
|
-
f"
|
114
|
+
f"Integration {integration_name} does not exist. "
|
115
115
|
f"Currently the following integrations are implemented. "
|
116
116
|
f"{self.list_integration_names}"
|
117
117
|
)
|
@@ -148,7 +148,7 @@ class IntegrationRegistry(object):
|
|
148
148
|
].get_uninstall_requirements(target_os=target_os)
|
149
149
|
else:
|
150
150
|
raise KeyError(
|
151
|
-
f"
|
151
|
+
f"Integration {integration_name} does not exist. "
|
152
152
|
f"Currently the following integrations are implemented. "
|
153
153
|
f"{self.list_integration_names}"
|
154
154
|
)
|
@@ -144,3 +144,15 @@ class SkypilotBaseOrchestratorConfig(
|
|
144
144
|
True if this config is for a local component, False otherwise.
|
145
145
|
"""
|
146
146
|
return False
|
147
|
+
|
148
|
+
@property
|
149
|
+
def supports_client_side_caching(self) -> bool:
|
150
|
+
"""Whether the orchestrator supports client side caching.
|
151
|
+
|
152
|
+
Returns:
|
153
|
+
Whether the orchestrator supports client side caching.
|
154
|
+
"""
|
155
|
+
# The Skypilot orchestrator runs the entire pipeline in a single VM, or
|
156
|
+
# starts additional VMs from the root VM. Both of those cases are
|
157
|
+
# currently not supported when using client-side caching.
|
158
|
+
return False
|
@@ -23,7 +23,7 @@ from typing import (
|
|
23
23
|
cast,
|
24
24
|
)
|
25
25
|
|
26
|
-
from pydantic import field_validator
|
26
|
+
from pydantic import field_validator, BaseModel
|
27
27
|
|
28
28
|
from zenml.config.base_settings import BaseSettings
|
29
29
|
from zenml.experiment_trackers.base_experiment_tracker import (
|
@@ -60,18 +60,26 @@ class WandbExperimentTrackerSettings(BaseSettings):
|
|
60
60
|
Args:
|
61
61
|
value: The settings.
|
62
62
|
|
63
|
+
Raises:
|
64
|
+
ValueError: If converting the settings failed.
|
65
|
+
|
63
66
|
Returns:
|
64
67
|
Dict representation of the settings.
|
65
68
|
"""
|
66
69
|
import wandb
|
67
70
|
|
68
71
|
if isinstance(value, wandb.Settings):
|
69
|
-
# Depending on the wandb version, either `
|
70
|
-
# is available to convert the settings
|
71
|
-
|
72
|
+
# Depending on the wandb version, either `model_dump`,
|
73
|
+
# `make_static` or `to_dict` is available to convert the settings
|
74
|
+
# to a dictionary
|
75
|
+
if isinstance(value, BaseModel):
|
76
|
+
return value.model_dump()
|
77
|
+
elif hasattr(value, "make_static"):
|
72
78
|
return cast(Dict[str, Any], value.make_static())
|
73
|
-
|
79
|
+
elif hasattr(value, "to_dict"):
|
74
80
|
return value.to_dict()
|
81
|
+
else:
|
82
|
+
raise ValueError("Unable to convert wandb settings to dict.")
|
75
83
|
else:
|
76
84
|
return value
|
77
85
|
|
@@ -429,7 +429,7 @@ class BuiltInContainerMaterializer(BaseMaterializer):
|
|
429
429
|
# doesn't work for non-serializable types as they
|
430
430
|
# are saved as list of lists in different files
|
431
431
|
if _is_serializable(data):
|
432
|
-
return {self.data_path: VisualizationType.JSON}
|
432
|
+
return {self.data_path.replace("\\", "/"): VisualizationType.JSON}
|
433
433
|
return {}
|
434
434
|
|
435
435
|
def extract_metadata(self, data: Any) -> Dict[str, "MetadataType"]:
|
zenml/model/model.py
CHANGED
@@ -509,22 +509,6 @@ class Model(BaseModel):
|
|
509
509
|
raise ValueError(
|
510
510
|
"`model_version_id` field is for internal use only"
|
511
511
|
)
|
512
|
-
|
513
|
-
version = data.get("version", None)
|
514
|
-
|
515
|
-
if (
|
516
|
-
version in [stage.value for stage in ModelStages]
|
517
|
-
and not suppress_class_validation_warnings
|
518
|
-
):
|
519
|
-
logger.info(
|
520
|
-
f"Version `{version}` matches one of the possible "
|
521
|
-
"`ModelStages` and will be fetched using stage."
|
522
|
-
)
|
523
|
-
if str(version).isnumeric() and not suppress_class_validation_warnings:
|
524
|
-
logger.info(
|
525
|
-
f"`version` `{version}` is numeric and will be fetched "
|
526
|
-
"using version number."
|
527
|
-
)
|
528
512
|
data["suppress_class_validation_warnings"] = True
|
529
513
|
return data
|
530
514
|
|
@@ -603,6 +587,18 @@ class Model(BaseModel):
|
|
603
587
|
hydrate=hydrate,
|
604
588
|
)
|
605
589
|
else:
|
590
|
+
if self.version in ModelStages.values():
|
591
|
+
logger.info(
|
592
|
+
f"Version `{self.version}` for model {self.name} matches "
|
593
|
+
"one of the possible `ModelStages` and will be fetched "
|
594
|
+
"using stage."
|
595
|
+
)
|
596
|
+
if str(self.version).isnumeric():
|
597
|
+
logger.info(
|
598
|
+
f"Version `{self.version}` for model {self.name} is "
|
599
|
+
"numeric and will be fetched using version number."
|
600
|
+
)
|
601
|
+
|
606
602
|
mv = zenml_client.get_model_version(
|
607
603
|
model_name_or_id=self.name,
|
608
604
|
model_version_name_or_number_or_id=self.version,
|
zenml/model/utils.py
CHANGED
@@ -56,7 +56,9 @@ def log_model_metadata(
|
|
56
56
|
"""
|
57
57
|
logger.warning(
|
58
58
|
"The `log_model_metadata` function is deprecated and will soon be "
|
59
|
-
"removed.
|
59
|
+
"removed. Instead, you can consider using: "
|
60
|
+
"`log_metadata(metadata={...}, infer_model=True)` instead. For more "
|
61
|
+
"info: https://docs.zenml.io/how-to/model-management-metrics/track-metrics-metadata/attach-metadata-to-a-model"
|
60
62
|
)
|
61
63
|
|
62
64
|
from zenml import log_metadata
|
zenml/models/v2/base/filter.py
CHANGED
@@ -113,7 +113,7 @@ class Filter(BaseModel, ABC):
|
|
113
113
|
def generate_query_conditions(
|
114
114
|
self,
|
115
115
|
table: Type[SQLModel],
|
116
|
-
) ->
|
116
|
+
) -> "ColumnElement[bool]":
|
117
117
|
"""Generate the query conditions for the database.
|
118
118
|
|
119
119
|
This method converts the Filter class into an appropriate SQLModel
|
@@ -291,11 +291,19 @@ class UUIDFilter(StrFilter):
|
|
291
291
|
import sqlalchemy
|
292
292
|
from sqlalchemy_utils.functions import cast_if
|
293
293
|
|
294
|
+
from zenml.utils import uuid_utils
|
295
|
+
|
294
296
|
# For equality checks, compare the UUID directly
|
295
297
|
if self.operation == GenericFilterOps.EQUALS:
|
298
|
+
if not uuid_utils.is_valid_uuid(self.value):
|
299
|
+
return False
|
300
|
+
|
296
301
|
return column == self.value
|
297
302
|
|
298
303
|
if self.operation == GenericFilterOps.NOT_EQUALS:
|
304
|
+
if not uuid_utils.is_valid_uuid(self.value):
|
305
|
+
return True
|
306
|
+
|
299
307
|
return column != self.value
|
300
308
|
|
301
309
|
# For all other operations, cast and handle the column as string
|
@@ -436,7 +444,6 @@ class BaseFilter(BaseModel):
|
|
436
444
|
le=PAGE_SIZE_MAXIMUM,
|
437
445
|
description="Page size",
|
438
446
|
)
|
439
|
-
|
440
447
|
id: Optional[Union[UUID, str]] = Field(
|
441
448
|
default=None,
|
442
449
|
description="Id for this resource",
|
@@ -491,13 +498,13 @@ class BaseFilter(BaseModel):
|
|
491
498
|
)
|
492
499
|
value = column
|
493
500
|
|
494
|
-
if column in cls.
|
501
|
+
if column in cls.CUSTOM_SORTING_OPTIONS:
|
502
|
+
return value
|
503
|
+
elif column in cls.FILTER_EXCLUDE_FIELDS:
|
495
504
|
raise ValueError(
|
496
505
|
f"This resource can not be sorted by this field: '{value}'"
|
497
506
|
)
|
498
|
-
|
499
|
-
return value
|
500
|
-
elif column in cls.CUSTOM_SORTING_OPTIONS:
|
507
|
+
if column in cls.model_fields:
|
501
508
|
return value
|
502
509
|
else:
|
503
510
|
raise ValueError(
|
@@ -703,16 +710,10 @@ class BaseFilter(BaseModel):
|
|
703
710
|
|
704
711
|
conditions = []
|
705
712
|
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
conditions.append(filter_.generate_query_conditions(table=table))
|
711
|
-
except ValueError:
|
712
|
-
# UUID filter with equal operators and no full UUID fail with
|
713
|
-
# a ValueError. In this case, we already know that the filter
|
714
|
-
# will not produce any result and can simply ignore it.
|
715
|
-
pass
|
713
|
+
filter_ = FilterGenerator(table).define_filter(
|
714
|
+
column="id", value=value, operator=operator
|
715
|
+
)
|
716
|
+
conditions.append(filter_.generate_query_conditions(table=table))
|
716
717
|
|
717
718
|
filter_ = FilterGenerator(table).define_filter(
|
718
719
|
column="name", value=value, operator=operator
|
@@ -759,7 +760,7 @@ class BaseFilter(BaseModel):
|
|
759
760
|
return self.size * (self.page - 1)
|
760
761
|
|
761
762
|
def generate_filter(
|
762
|
-
self, table: Type[
|
763
|
+
self, table: Type["AnySchema"]
|
763
764
|
) -> Union["ColumnElement[bool]"]:
|
764
765
|
"""Generate the filter for the query.
|
765
766
|
|
@@ -779,7 +780,7 @@ class BaseFilter(BaseModel):
|
|
779
780
|
filters.append(
|
780
781
|
column_filter.generate_query_conditions(table=table)
|
781
782
|
)
|
782
|
-
for custom_filter in self.get_custom_filters():
|
783
|
+
for custom_filter in self.get_custom_filters(table):
|
783
784
|
filters.append(custom_filter)
|
784
785
|
if self.logical_operator == LogicalOperators.OR:
|
785
786
|
return or_(False, *filters)
|
@@ -788,12 +789,17 @@ class BaseFilter(BaseModel):
|
|
788
789
|
else:
|
789
790
|
raise RuntimeError("No valid logical operator was supplied.")
|
790
791
|
|
791
|
-
def get_custom_filters(
|
792
|
+
def get_custom_filters(
|
793
|
+
self, table: Type["AnySchema"]
|
794
|
+
) -> List["ColumnElement[bool]"]:
|
792
795
|
"""Get custom filters.
|
793
796
|
|
794
797
|
This can be overridden by subclasses to define custom filters that are
|
795
798
|
not based on the columns of the underlying table.
|
796
799
|
|
800
|
+
Args:
|
801
|
+
table: The query table.
|
802
|
+
|
797
803
|
Returns:
|
798
804
|
A list of custom filters.
|
799
805
|
"""
|
@@ -1101,18 +1107,8 @@ class FilterGenerator:
|
|
1101
1107
|
A Filter object.
|
1102
1108
|
|
1103
1109
|
Raises:
|
1104
|
-
ValueError: If the value is not a
|
1110
|
+
ValueError: If the value for a oneof filter is not a list.
|
1105
1111
|
"""
|
1106
|
-
# For equality checks, ensure that the value is a valid UUID.
|
1107
|
-
if operator == GenericFilterOps.EQUALS and not isinstance(value, UUID):
|
1108
|
-
try:
|
1109
|
-
UUID(value)
|
1110
|
-
except ValueError as e:
|
1111
|
-
raise ValueError(
|
1112
|
-
"Invalid value passed as UUID query parameter."
|
1113
|
-
) from e
|
1114
|
-
|
1115
|
-
# For equality checks, ensure that the value is a valid UUID.
|
1116
1112
|
if operator == GenericFilterOps.ONEOF and not isinstance(value, list):
|
1117
1113
|
raise ValueError(ONEOF_ERROR)
|
1118
1114
|
|