zenml-nightly 0.68.1.dev20241106__py3-none-any.whl → 0.68.1.dev20241108__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/artifacts/external_artifact.py +2 -1
- zenml/artifacts/utils.py +133 -78
- zenml/cli/base.py +4 -4
- zenml/cli/model.py +1 -6
- zenml/cli/stack.py +1 -0
- zenml/client.py +21 -73
- zenml/constants.py +1 -0
- zenml/enums.py +12 -4
- zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +1 -1
- zenml/integrations/azure/orchestrators/azureml_orchestrator.py +1 -1
- zenml/integrations/evidently/__init__.py +1 -1
- zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +1 -1
- zenml/integrations/tensorboard/visualizers/tensorboard_visualizer.py +60 -54
- zenml/integrations/vllm/services/vllm_deployment.py +16 -7
- zenml/metadata/lazy_load.py +20 -7
- zenml/model/model.py +1 -2
- zenml/models/__init__.py +0 -12
- zenml/models/v2/core/artifact_version.py +19 -7
- zenml/models/v2/core/model_version.py +3 -5
- zenml/models/v2/core/pipeline_run.py +3 -5
- zenml/models/v2/core/run_metadata.py +2 -217
- zenml/models/v2/core/step_run.py +40 -24
- zenml/orchestrators/input_utils.py +44 -19
- zenml/orchestrators/step_launcher.py +2 -2
- zenml/orchestrators/step_run_utils.py +19 -15
- zenml/orchestrators/step_runner.py +21 -13
- zenml/steps/base_step.py +1 -1
- zenml/steps/entrypoint_function_utils.py +3 -5
- zenml/steps/step_context.py +3 -2
- zenml/steps/utils.py +8 -2
- zenml/zen_server/rbac/endpoint_utils.py +43 -1
- zenml/zen_server/rbac/utils.py +0 -2
- zenml/zen_server/routers/artifact_version_endpoints.py +27 -1
- zenml/zen_server/routers/workspaces_endpoints.py +3 -4
- zenml/zen_server/zen_server_api.py +0 -2
- zenml/zen_stores/migrations/versions/1cb6477f72d6_move_artifact_save_type.py +99 -0
- zenml/zen_stores/migrations/versions/b557b2871693_update_step_run_input_types.py +33 -0
- zenml/zen_stores/rest_zen_store.py +55 -54
- zenml/zen_stores/schemas/artifact_schemas.py +8 -1
- zenml/zen_stores/schemas/model_schemas.py +2 -2
- zenml/zen_stores/schemas/pipeline_run_schemas.py +1 -1
- zenml/zen_stores/schemas/run_metadata_schemas.py +1 -48
- zenml/zen_stores/schemas/step_run_schemas.py +18 -10
- zenml/zen_stores/sql_zen_store.py +68 -98
- zenml/zen_stores/zen_store_interface.py +15 -42
- {zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241108.dist-info}/METADATA +1 -1
- {zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241108.dist-info}/RECORD +51 -50
- zenml/zen_server/routers/run_metadata_endpoints.py +0 -96
- {zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241108.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241108.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241108.dist-info}/entry_points.txt +0 -0
@@ -87,41 +87,44 @@ class TensorboardVisualizer:
|
|
87
87
|
*args: Additional arguments.
|
88
88
|
**kwargs: Additional keyword arguments.
|
89
89
|
"""
|
90
|
-
for
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
return
|
101
|
-
|
102
|
-
if sys.platform == "win32":
|
103
|
-
# Daemon service functionality is currently not supported
|
104
|
-
# on Windows
|
105
|
-
print(
|
106
|
-
"You can run:\n"
|
107
|
-
f"[italic green] tensorboard --logdir {logdir}"
|
108
|
-
"[/italic green]\n"
|
109
|
-
"...to visualize the TensorBoard logs for your trained model."
|
90
|
+
for output in object.outputs.values():
|
91
|
+
for artifact_view in output:
|
92
|
+
# filter out anything but model artifacts
|
93
|
+
if artifact_view.type == ArtifactType.MODEL:
|
94
|
+
logdir = os.path.dirname(artifact_view.uri)
|
95
|
+
|
96
|
+
# first check if a TensorBoard server is already running for
|
97
|
+
# the same logdir location and use that one
|
98
|
+
running_server = self.find_running_tensorboard_server(
|
99
|
+
logdir
|
110
100
|
)
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
101
|
+
if running_server:
|
102
|
+
self.visualize_tensorboard(running_server.port, height)
|
103
|
+
return
|
104
|
+
|
105
|
+
if sys.platform == "win32":
|
106
|
+
# Daemon service functionality is currently not supported
|
107
|
+
# on Windows
|
108
|
+
print(
|
109
|
+
"You can run:\n"
|
110
|
+
f"[italic green] tensorboard --logdir {logdir}"
|
111
|
+
"[/italic green]\n"
|
112
|
+
"...to visualize the TensorBoard logs for your trained model."
|
117
113
|
)
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
114
|
+
else:
|
115
|
+
# start a new TensorBoard server
|
116
|
+
service = TensorboardService(
|
117
|
+
TensorboardServiceConfig(
|
118
|
+
logdir=logdir,
|
119
|
+
name=f"zenml-tensorboard-{logdir}",
|
120
|
+
)
|
123
121
|
)
|
124
|
-
|
122
|
+
service.start(timeout=60)
|
123
|
+
if service.endpoint.status.port:
|
124
|
+
self.visualize_tensorboard(
|
125
|
+
service.endpoint.status.port, height
|
126
|
+
)
|
127
|
+
return
|
125
128
|
|
126
129
|
def visualize_tensorboard(
|
127
130
|
self,
|
@@ -154,31 +157,34 @@ class TensorboardVisualizer:
|
|
154
157
|
Args:
|
155
158
|
object: StepRunResponseModel fetched from get_step().
|
156
159
|
"""
|
157
|
-
for
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
160
|
+
for output in object.outputs.values():
|
161
|
+
for artifact_view in output:
|
162
|
+
# filter out anything but model artifacts
|
163
|
+
if artifact_view.type == ArtifactType.MODEL:
|
164
|
+
logdir = os.path.dirname(artifact_view.uri)
|
165
|
+
|
166
|
+
# first check if a TensorBoard server is already running for
|
167
|
+
# the same logdir location and use that one
|
168
|
+
running_server = self.find_running_tensorboard_server(
|
169
|
+
logdir
|
170
|
+
)
|
171
|
+
if not running_server:
|
172
|
+
return
|
167
173
|
|
168
|
-
|
169
|
-
|
170
|
-
running_server.pid,
|
171
|
-
)
|
172
|
-
try:
|
173
|
-
p = psutil.Process(running_server.pid)
|
174
|
-
except psutil.Error:
|
175
|
-
logger.error(
|
176
|
-
"Could not find process for PID '%d' ...",
|
174
|
+
logger.debug(
|
175
|
+
"Stopping tensorboard server with PID '%d' ...",
|
177
176
|
running_server.pid,
|
178
177
|
)
|
179
|
-
|
180
|
-
|
181
|
-
|
178
|
+
try:
|
179
|
+
p = psutil.Process(running_server.pid)
|
180
|
+
except psutil.Error:
|
181
|
+
logger.error(
|
182
|
+
"Could not find process for PID '%d' ...",
|
183
|
+
running_server.pid,
|
184
|
+
)
|
185
|
+
continue
|
186
|
+
p.kill()
|
187
|
+
return
|
182
188
|
|
183
189
|
|
184
190
|
def get_step(pipeline_name: str, step_name: str) -> "StepRunResponse":
|
@@ -13,6 +13,7 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Implementation of the vLLM Inference Server Service."""
|
15
15
|
|
16
|
+
import argparse
|
16
17
|
import os
|
17
18
|
from typing import Any, List, Optional, Union
|
18
19
|
|
@@ -137,15 +138,23 @@ class VLLMDeploymentService(LocalDaemonService, BaseDeploymentService):
|
|
137
138
|
self.endpoint.prepare_for_start()
|
138
139
|
|
139
140
|
import uvloop
|
140
|
-
from vllm.entrypoints.openai.api_server import
|
141
|
-
|
142
|
-
|
141
|
+
from vllm.entrypoints.openai.api_server import (
|
142
|
+
run_server,
|
143
|
+
)
|
144
|
+
from vllm.entrypoints.openai.cli_args import (
|
145
|
+
make_arg_parser,
|
146
|
+
)
|
147
|
+
from vllm.utils import (
|
148
|
+
FlexibleArgumentParser,
|
149
|
+
)
|
143
150
|
|
144
151
|
try:
|
145
|
-
parser = make_arg_parser(
|
146
|
-
|
152
|
+
parser: argparse.ArgumentParser = make_arg_parser(
|
153
|
+
FlexibleArgumentParser()
|
154
|
+
)
|
155
|
+
args: argparse.Namespace = parser.parse_args()
|
147
156
|
# Override port with the available port
|
148
|
-
self.config.port = self.endpoint.status.port
|
157
|
+
self.config.port = self.endpoint.status.port or self.config.port
|
149
158
|
# Update the arguments in place
|
150
159
|
args.__dict__.update(self.config.model_dump())
|
151
160
|
uvloop.run(run_server(args=args))
|
@@ -161,7 +170,7 @@ class VLLMDeploymentService(LocalDaemonService, BaseDeploymentService):
|
|
161
170
|
"""
|
162
171
|
if not self.is_running:
|
163
172
|
return None
|
164
|
-
return self.endpoint.
|
173
|
+
return self.endpoint.prediction_url
|
165
174
|
|
166
175
|
def predict(self, data: "Any") -> "Any":
|
167
176
|
"""Make a prediction using the service.
|
zenml/metadata/lazy_load.py
CHANGED
@@ -13,10 +13,25 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Run Metadata Lazy Loader definition."""
|
15
15
|
|
16
|
-
from typing import
|
16
|
+
from typing import Optional
|
17
17
|
|
18
|
-
|
19
|
-
|
18
|
+
from pydantic import BaseModel
|
19
|
+
|
20
|
+
from zenml.metadata.metadata_types import MetadataType
|
21
|
+
|
22
|
+
|
23
|
+
class LazyRunMetadataResponse(BaseModel):
|
24
|
+
"""Lazy run metadata response.
|
25
|
+
|
26
|
+
Used if the run metadata is accessed from the model in
|
27
|
+
a pipeline context available only during pipeline compilation.
|
28
|
+
"""
|
29
|
+
|
30
|
+
lazy_load_artifact_name: Optional[str] = None
|
31
|
+
lazy_load_artifact_version: Optional[str] = None
|
32
|
+
lazy_load_metadata_name: Optional[str] = None
|
33
|
+
lazy_load_model_name: str
|
34
|
+
lazy_load_model_version: Optional[str] = None
|
20
35
|
|
21
36
|
|
22
37
|
class RunMetadataLazyGetter:
|
@@ -47,7 +62,7 @@ class RunMetadataLazyGetter:
|
|
47
62
|
self._lazy_load_artifact_name = _lazy_load_artifact_name
|
48
63
|
self._lazy_load_artifact_version = _lazy_load_artifact_version
|
49
64
|
|
50
|
-
def __getitem__(self, key: str) ->
|
65
|
+
def __getitem__(self, key: str) -> MetadataType:
|
51
66
|
"""Get the metadata for the given key.
|
52
67
|
|
53
68
|
Args:
|
@@ -56,9 +71,7 @@ class RunMetadataLazyGetter:
|
|
56
71
|
Returns:
|
57
72
|
The metadata lazy loader wrapper for the given key.
|
58
73
|
"""
|
59
|
-
|
60
|
-
|
61
|
-
return LazyRunMetadataResponse(
|
74
|
+
return LazyRunMetadataResponse( # type: ignore[return-value]
|
62
75
|
lazy_load_model_name=self._lazy_load_model_name,
|
63
76
|
lazy_load_model_version=self._lazy_load_model_version,
|
64
77
|
lazy_load_artifact_name=self._lazy_load_artifact_name,
|
zenml/model/model.py
CHANGED
@@ -43,7 +43,6 @@ if TYPE_CHECKING:
|
|
43
43
|
ModelResponse,
|
44
44
|
ModelVersionResponse,
|
45
45
|
PipelineRunResponse,
|
46
|
-
RunMetadataResponse,
|
47
46
|
StepRunResponse,
|
48
47
|
)
|
49
48
|
|
@@ -349,7 +348,7 @@ class Model(BaseModel):
|
|
349
348
|
)
|
350
349
|
|
351
350
|
@property
|
352
|
-
def run_metadata(self) -> Dict[str, "
|
351
|
+
def run_metadata(self) -> Dict[str, "MetadataType"]:
|
353
352
|
"""Get model version run metadata.
|
354
353
|
|
355
354
|
Returns:
|
zenml/models/__init__.py
CHANGED
@@ -239,12 +239,7 @@ from zenml.models.v2.core.run_template import (
|
|
239
239
|
)
|
240
240
|
from zenml.models.v2.base.base_plugin_flavor import BasePluginFlavorResponse
|
241
241
|
from zenml.models.v2.core.run_metadata import (
|
242
|
-
LazyRunMetadataResponse,
|
243
242
|
RunMetadataRequest,
|
244
|
-
RunMetadataFilter,
|
245
|
-
RunMetadataResponse,
|
246
|
-
RunMetadataResponseBody,
|
247
|
-
RunMetadataResponseMetadata,
|
248
243
|
)
|
249
244
|
from zenml.models.v2.core.schedule import (
|
250
245
|
ScheduleRequest,
|
@@ -418,7 +413,6 @@ EventSourceResponseResources.model_rebuild()
|
|
418
413
|
FlavorResponseBody.model_rebuild()
|
419
414
|
FlavorResponseMetadata.model_rebuild()
|
420
415
|
LazyArtifactVersionResponse.model_rebuild()
|
421
|
-
LazyRunMetadataResponse.model_rebuild()
|
422
416
|
ModelResponseBody.model_rebuild()
|
423
417
|
ModelResponseMetadata.model_rebuild()
|
424
418
|
ModelVersionResponseBody.model_rebuild()
|
@@ -444,8 +438,6 @@ RunTemplateResponseBody.model_rebuild()
|
|
444
438
|
RunTemplateResponseMetadata.model_rebuild()
|
445
439
|
RunTemplateResponseResources.model_rebuild()
|
446
440
|
RunTemplateResponseBody.model_rebuild()
|
447
|
-
RunMetadataResponseBody.model_rebuild()
|
448
|
-
RunMetadataResponseMetadata.model_rebuild()
|
449
441
|
ScheduleResponseBody.model_rebuild()
|
450
442
|
ScheduleResponseMetadata.model_rebuild()
|
451
443
|
SecretResponseBody.model_rebuild()
|
@@ -637,10 +629,6 @@ __all__ = [
|
|
637
629
|
"RunTemplateResponseResources",
|
638
630
|
"RunTemplateFilter",
|
639
631
|
"RunMetadataRequest",
|
640
|
-
"RunMetadataFilter",
|
641
|
-
"RunMetadataResponse",
|
642
|
-
"RunMetadataResponseBody",
|
643
|
-
"RunMetadataResponseMetadata",
|
644
632
|
"ScheduleRequest",
|
645
633
|
"ScheduleUpdate",
|
646
634
|
"ScheduleFilter",
|
@@ -34,7 +34,7 @@ from pydantic import (
|
|
34
34
|
|
35
35
|
from zenml.config.source import Source, SourceWithValidator
|
36
36
|
from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
|
37
|
-
from zenml.enums import ArtifactType, GenericFilterOps
|
37
|
+
from zenml.enums import ArtifactSaveType, ArtifactType, GenericFilterOps
|
38
38
|
from zenml.logger import get_logger
|
39
39
|
from zenml.metadata.metadata_types import MetadataType
|
40
40
|
from zenml.models.v2.base.filter import StrFilter
|
@@ -57,9 +57,6 @@ if TYPE_CHECKING:
|
|
57
57
|
ArtifactVisualizationResponse,
|
58
58
|
)
|
59
59
|
from zenml.models.v2.core.pipeline_run import PipelineRunResponse
|
60
|
-
from zenml.models.v2.core.run_metadata import (
|
61
|
-
RunMetadataResponse,
|
62
|
-
)
|
63
60
|
from zenml.models.v2.core.step_run import StepRunResponse
|
64
61
|
|
65
62
|
logger = get_logger(__name__)
|
@@ -107,6 +104,9 @@ class ArtifactVersionRequest(WorkspaceScopedRequest):
|
|
107
104
|
visualizations: Optional[List["ArtifactVisualizationRequest"]] = Field(
|
108
105
|
default=None, title="Visualizations of the artifact."
|
109
106
|
)
|
107
|
+
save_type: ArtifactSaveType = Field(
|
108
|
+
title="The save type of the artifact version.",
|
109
|
+
)
|
110
110
|
metadata: Optional[Dict[str, MetadataType]] = Field(
|
111
111
|
default=None, title="Metadata of the artifact version."
|
112
112
|
)
|
@@ -193,6 +193,9 @@ class ArtifactVersionResponseBody(WorkspaceScopedResponseBody):
|
|
193
193
|
title="The ID of the pipeline run that generated this artifact version.",
|
194
194
|
default=None,
|
195
195
|
)
|
196
|
+
save_type: ArtifactSaveType = Field(
|
197
|
+
title="The save type of the artifact version.",
|
198
|
+
)
|
196
199
|
artifact_store_id: Optional[UUID] = Field(
|
197
200
|
title="ID of the artifact store in which this artifact is stored.",
|
198
201
|
default=None,
|
@@ -230,7 +233,7 @@ class ArtifactVersionResponseMetadata(WorkspaceScopedResponseMetadata):
|
|
230
233
|
visualizations: Optional[List["ArtifactVisualizationResponse"]] = Field(
|
231
234
|
default=None, title="Visualizations of the artifact."
|
232
235
|
)
|
233
|
-
run_metadata: Dict[str,
|
236
|
+
run_metadata: Dict[str, MetadataType] = Field(
|
234
237
|
default={}, title="Metadata of the artifact."
|
235
238
|
)
|
236
239
|
|
@@ -313,6 +316,15 @@ class ArtifactVersionResponse(
|
|
313
316
|
"""
|
314
317
|
return self.get_body().producer_pipeline_run_id
|
315
318
|
|
319
|
+
@property
|
320
|
+
def save_type(self) -> ArtifactSaveType:
|
321
|
+
"""The `save_type` property.
|
322
|
+
|
323
|
+
Returns:
|
324
|
+
the value of the property.
|
325
|
+
"""
|
326
|
+
return self.get_body().save_type
|
327
|
+
|
316
328
|
@property
|
317
329
|
def artifact_store_id(self) -> Optional[UUID]:
|
318
330
|
"""The `artifact_store_id` property.
|
@@ -343,7 +355,7 @@ class ArtifactVersionResponse(
|
|
343
355
|
return self.get_metadata().visualizations
|
344
356
|
|
345
357
|
@property
|
346
|
-
def run_metadata(self) -> Dict[str,
|
358
|
+
def run_metadata(self) -> Dict[str, MetadataType]:
|
347
359
|
"""The `metadata` property.
|
348
360
|
|
349
361
|
Returns:
|
@@ -671,7 +683,7 @@ class LazyArtifactVersionResponse(ArtifactVersionResponse):
|
|
671
683
|
)
|
672
684
|
|
673
685
|
@property
|
674
|
-
def run_metadata(self) -> Dict[str,
|
686
|
+
def run_metadata(self) -> Dict[str, MetadataType]:
|
675
687
|
"""The `metadata` property in lazy loading mode.
|
676
688
|
|
677
689
|
Returns:
|
@@ -29,6 +29,7 @@ from pydantic import BaseModel, ConfigDict, Field, PrivateAttr, field_validator
|
|
29
29
|
|
30
30
|
from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
|
31
31
|
from zenml.enums import ModelStages
|
32
|
+
from zenml.metadata.metadata_types import MetadataType
|
32
33
|
from zenml.models.v2.base.filter import AnyQuery
|
33
34
|
from zenml.models.v2.base.page import Page
|
34
35
|
from zenml.models.v2.base.scoped import (
|
@@ -49,9 +50,6 @@ if TYPE_CHECKING:
|
|
49
50
|
from zenml.models.v2.core.artifact_version import ArtifactVersionResponse
|
50
51
|
from zenml.models.v2.core.model import ModelResponse
|
51
52
|
from zenml.models.v2.core.pipeline_run import PipelineRunResponse
|
52
|
-
from zenml.models.v2.core.run_metadata import (
|
53
|
-
RunMetadataResponse,
|
54
|
-
)
|
55
53
|
from zenml.zen_stores.schemas import BaseSchema
|
56
54
|
|
57
55
|
AnySchema = TypeVar("AnySchema", bound=BaseSchema)
|
@@ -193,7 +191,7 @@ class ModelVersionResponseMetadata(WorkspaceScopedResponseMetadata):
|
|
193
191
|
max_length=TEXT_FIELD_MAX_LENGTH,
|
194
192
|
default=None,
|
195
193
|
)
|
196
|
-
run_metadata: Dict[str,
|
194
|
+
run_metadata: Dict[str, MetadataType] = Field(
|
197
195
|
description="Metadata linked to the model version",
|
198
196
|
default={},
|
199
197
|
)
|
@@ -304,7 +302,7 @@ class ModelVersionResponse(
|
|
304
302
|
return self.get_metadata().description
|
305
303
|
|
306
304
|
@property
|
307
|
-
def run_metadata(self) ->
|
305
|
+
def run_metadata(self) -> Dict[str, MetadataType]:
|
308
306
|
"""The `run_metadata` property.
|
309
307
|
|
310
308
|
Returns:
|
@@ -30,6 +30,7 @@ from pydantic import BaseModel, ConfigDict, Field
|
|
30
30
|
from zenml.config.pipeline_configurations import PipelineConfiguration
|
31
31
|
from zenml.constants import STR_FIELD_MAX_LENGTH
|
32
32
|
from zenml.enums import ExecutionStatus
|
33
|
+
from zenml.metadata.metadata_types import MetadataType
|
33
34
|
from zenml.models.v2.base.scoped import (
|
34
35
|
WorkspaceScopedRequest,
|
35
36
|
WorkspaceScopedResponse,
|
@@ -51,9 +52,6 @@ if TYPE_CHECKING:
|
|
51
52
|
from zenml.models.v2.core.pipeline_build import (
|
52
53
|
PipelineBuildResponse,
|
53
54
|
)
|
54
|
-
from zenml.models.v2.core.run_metadata import (
|
55
|
-
RunMetadataResponse,
|
56
|
-
)
|
57
55
|
from zenml.models.v2.core.schedule import ScheduleResponse
|
58
56
|
from zenml.models.v2.core.stack import StackResponse
|
59
57
|
from zenml.models.v2.core.step_run import StepRunResponse
|
@@ -190,7 +188,7 @@ class PipelineRunResponseBody(WorkspaceScopedResponseBody):
|
|
190
188
|
class PipelineRunResponseMetadata(WorkspaceScopedResponseMetadata):
|
191
189
|
"""Response metadata for pipeline runs."""
|
192
190
|
|
193
|
-
run_metadata: Dict[str,
|
191
|
+
run_metadata: Dict[str, MetadataType] = Field(
|
194
192
|
default={},
|
195
193
|
title="Metadata associated with this pipeline run.",
|
196
194
|
)
|
@@ -450,7 +448,7 @@ class PipelineRunResponse(
|
|
450
448
|
return self.get_body().model_version_id
|
451
449
|
|
452
450
|
@property
|
453
|
-
def run_metadata(self) -> Dict[str,
|
451
|
+
def run_metadata(self) -> Dict[str, MetadataType]:
|
454
452
|
"""The `run_metadata` property.
|
455
453
|
|
456
454
|
Returns:
|
@@ -13,21 +13,15 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Models representing run metadata."""
|
15
15
|
|
16
|
-
from typing import
|
16
|
+
from typing import Dict, Optional
|
17
17
|
from uuid import UUID
|
18
18
|
|
19
|
-
from pydantic import Field
|
19
|
+
from pydantic import Field
|
20
20
|
|
21
|
-
from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
|
22
21
|
from zenml.enums import MetadataResourceTypes
|
23
22
|
from zenml.metadata.metadata_types import MetadataType, MetadataTypeEnum
|
24
23
|
from zenml.models.v2.base.scoped import (
|
25
|
-
WorkspaceScopedFilter,
|
26
24
|
WorkspaceScopedRequest,
|
27
|
-
WorkspaceScopedResponse,
|
28
|
-
WorkspaceScopedResponseBody,
|
29
|
-
WorkspaceScopedResponseMetadata,
|
30
|
-
WorkspaceScopedResponseResources,
|
31
25
|
)
|
32
26
|
|
33
27
|
# ------------------ Request Model ------------------
|
@@ -51,212 +45,3 @@ class RunMetadataRequest(WorkspaceScopedRequest):
|
|
51
45
|
types: Dict[str, "MetadataTypeEnum"] = Field(
|
52
46
|
title="The types of the metadata to be created.",
|
53
47
|
)
|
54
|
-
|
55
|
-
|
56
|
-
# ------------------ Update Model ------------------
|
57
|
-
|
58
|
-
# There is no update model for run metadata.
|
59
|
-
|
60
|
-
# ------------------ Response Model ------------------
|
61
|
-
|
62
|
-
|
63
|
-
class RunMetadataResponseBody(WorkspaceScopedResponseBody):
|
64
|
-
"""Response body for run metadata."""
|
65
|
-
|
66
|
-
key: str = Field(title="The key of the metadata.")
|
67
|
-
value: MetadataType = Field(
|
68
|
-
title="The value of the metadata.", union_mode="smart"
|
69
|
-
)
|
70
|
-
type: MetadataTypeEnum = Field(title="The type of the metadata.")
|
71
|
-
|
72
|
-
@field_validator("key", "type")
|
73
|
-
@classmethod
|
74
|
-
def str_field_max_length_check(cls, value: Any) -> Any:
|
75
|
-
"""Checks if the length of the value exceeds the maximum str length.
|
76
|
-
|
77
|
-
Args:
|
78
|
-
value: the value set in the field
|
79
|
-
|
80
|
-
Returns:
|
81
|
-
the value itself.
|
82
|
-
|
83
|
-
Raises:
|
84
|
-
AssertionError: if the length of the field is longer than the
|
85
|
-
maximum threshold.
|
86
|
-
"""
|
87
|
-
assert len(str(value)) < STR_FIELD_MAX_LENGTH, (
|
88
|
-
"The length of the value for this field can not "
|
89
|
-
f"exceed {STR_FIELD_MAX_LENGTH}"
|
90
|
-
)
|
91
|
-
return value
|
92
|
-
|
93
|
-
@field_validator("value")
|
94
|
-
@classmethod
|
95
|
-
def text_field_max_length_check(cls, value: Any) -> Any:
|
96
|
-
"""Checks if the length of the value exceeds the maximum text length.
|
97
|
-
|
98
|
-
Args:
|
99
|
-
value: the value set in the field
|
100
|
-
|
101
|
-
Returns:
|
102
|
-
the value itself.
|
103
|
-
|
104
|
-
Raises:
|
105
|
-
AssertionError: if the length of the field is longer than the
|
106
|
-
maximum threshold.
|
107
|
-
"""
|
108
|
-
assert len(str(value)) < TEXT_FIELD_MAX_LENGTH, (
|
109
|
-
"The length of the value for this field can not "
|
110
|
-
f"exceed {TEXT_FIELD_MAX_LENGTH}"
|
111
|
-
)
|
112
|
-
return value
|
113
|
-
|
114
|
-
|
115
|
-
class RunMetadataResponseMetadata(WorkspaceScopedResponseMetadata):
|
116
|
-
"""Response metadata for run metadata."""
|
117
|
-
|
118
|
-
resource_id: UUID = Field(
|
119
|
-
title="The ID of the resource that this metadata belongs to.",
|
120
|
-
)
|
121
|
-
resource_type: MetadataResourceTypes = Field(
|
122
|
-
title="The type of the resource that this metadata belongs to.",
|
123
|
-
)
|
124
|
-
stack_component_id: Optional[UUID] = Field(
|
125
|
-
title="The ID of the stack component that this metadata belongs to."
|
126
|
-
)
|
127
|
-
|
128
|
-
|
129
|
-
class RunMetadataResponseResources(WorkspaceScopedResponseResources):
|
130
|
-
"""Class for all resource models associated with the run metadata entity."""
|
131
|
-
|
132
|
-
|
133
|
-
class RunMetadataResponse(
|
134
|
-
WorkspaceScopedResponse[
|
135
|
-
RunMetadataResponseBody,
|
136
|
-
RunMetadataResponseMetadata,
|
137
|
-
RunMetadataResponseResources,
|
138
|
-
]
|
139
|
-
):
|
140
|
-
"""Response model for run metadata."""
|
141
|
-
|
142
|
-
def get_hydrated_version(self) -> "RunMetadataResponse":
|
143
|
-
"""Get the hydrated version of this run metadata.
|
144
|
-
|
145
|
-
Returns:
|
146
|
-
an instance of the same entity with the metadata field attached.
|
147
|
-
"""
|
148
|
-
from zenml.client import Client
|
149
|
-
|
150
|
-
return Client().zen_store.get_run_metadata(self.id)
|
151
|
-
|
152
|
-
# Body and metadata properties
|
153
|
-
@property
|
154
|
-
def key(self) -> str:
|
155
|
-
"""The `key` property.
|
156
|
-
|
157
|
-
Returns:
|
158
|
-
the value of the property.
|
159
|
-
"""
|
160
|
-
return self.get_body().key
|
161
|
-
|
162
|
-
@property
|
163
|
-
def value(self) -> MetadataType:
|
164
|
-
"""The `value` property.
|
165
|
-
|
166
|
-
Returns:
|
167
|
-
the value of the property.
|
168
|
-
"""
|
169
|
-
return self.get_body().value
|
170
|
-
|
171
|
-
@property
|
172
|
-
def type(self) -> MetadataTypeEnum:
|
173
|
-
"""The `type` property.
|
174
|
-
|
175
|
-
Returns:
|
176
|
-
the value of the property.
|
177
|
-
"""
|
178
|
-
return self.get_body().type
|
179
|
-
|
180
|
-
@property
|
181
|
-
def resource_id(self) -> UUID:
|
182
|
-
"""The `resource_id` property.
|
183
|
-
|
184
|
-
Returns:
|
185
|
-
the value of the property.
|
186
|
-
"""
|
187
|
-
return self.get_metadata().resource_id
|
188
|
-
|
189
|
-
@property
|
190
|
-
def resource_type(self) -> MetadataResourceTypes:
|
191
|
-
"""The `resource_type` property.
|
192
|
-
|
193
|
-
Returns:
|
194
|
-
the value of the property.
|
195
|
-
"""
|
196
|
-
return MetadataResourceTypes(self.get_metadata().resource_type)
|
197
|
-
|
198
|
-
@property
|
199
|
-
def stack_component_id(self) -> Optional[UUID]:
|
200
|
-
"""The `stack_component_id` property.
|
201
|
-
|
202
|
-
Returns:
|
203
|
-
the value of the property.
|
204
|
-
"""
|
205
|
-
return self.get_metadata().stack_component_id
|
206
|
-
|
207
|
-
|
208
|
-
# ------------------ Filter Model ------------------
|
209
|
-
|
210
|
-
|
211
|
-
class RunMetadataFilter(WorkspaceScopedFilter):
|
212
|
-
"""Model to enable advanced filtering of run metadata."""
|
213
|
-
|
214
|
-
resource_id: Optional[Union[str, UUID]] = Field(
|
215
|
-
default=None, union_mode="left_to_right"
|
216
|
-
)
|
217
|
-
resource_type: Optional[MetadataResourceTypes] = None
|
218
|
-
stack_component_id: Optional[Union[str, UUID]] = Field(
|
219
|
-
default=None, union_mode="left_to_right"
|
220
|
-
)
|
221
|
-
key: Optional[str] = None
|
222
|
-
type: Optional[Union[str, MetadataTypeEnum]] = Field(
|
223
|
-
default=None, union_mode="left_to_right"
|
224
|
-
)
|
225
|
-
|
226
|
-
|
227
|
-
# -------------------- Lazy Loader --------------------
|
228
|
-
|
229
|
-
|
230
|
-
class LazyRunMetadataResponse(RunMetadataResponse):
|
231
|
-
"""Lazy run metadata response.
|
232
|
-
|
233
|
-
Used if the run metadata is accessed from the model in
|
234
|
-
a pipeline context available only during pipeline compilation.
|
235
|
-
"""
|
236
|
-
|
237
|
-
id: Optional[UUID] = None # type: ignore[assignment]
|
238
|
-
lazy_load_artifact_name: Optional[str] = None
|
239
|
-
lazy_load_artifact_version: Optional[str] = None
|
240
|
-
lazy_load_metadata_name: Optional[str] = None
|
241
|
-
lazy_load_model_name: str
|
242
|
-
lazy_load_model_version: Optional[str] = None
|
243
|
-
|
244
|
-
def get_body(self) -> None: # type: ignore[override]
|
245
|
-
"""Protects from misuse of the lazy loader.
|
246
|
-
|
247
|
-
Raises:
|
248
|
-
RuntimeError: always
|
249
|
-
"""
|
250
|
-
raise RuntimeError(
|
251
|
-
"Cannot access run metadata body before pipeline runs."
|
252
|
-
)
|
253
|
-
|
254
|
-
def get_metadata(self) -> None: # type: ignore[override]
|
255
|
-
"""Protects from misuse of the lazy loader.
|
256
|
-
|
257
|
-
Raises:
|
258
|
-
RuntimeError: always
|
259
|
-
"""
|
260
|
-
raise RuntimeError(
|
261
|
-
"Cannot access run metadata metadata before pipeline runs."
|
262
|
-
)
|