zenml-nightly 0.70.0.dev20241125__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/artifact_stores/base_artifact_store.py +2 -2
- zenml/artifacts/artifact_config.py +15 -6
- zenml/artifacts/utils.py +59 -32
- zenml/cli/__init__.py +22 -4
- zenml/cli/base.py +5 -5
- zenml/cli/login.py +26 -0
- zenml/cli/pipeline.py +111 -62
- zenml/cli/server.py +20 -20
- zenml/cli/service_connectors.py +3 -3
- zenml/cli/stack.py +0 -3
- zenml/cli/stack_components.py +0 -1
- zenml/cli/utils.py +0 -5
- zenml/client.py +62 -20
- zenml/config/compiler.py +12 -3
- zenml/config/pipeline_configurations.py +20 -0
- zenml/config/pipeline_run_configuration.py +1 -0
- zenml/config/secret_reference_mixin.py +1 -1
- zenml/config/server_config.py +4 -0
- zenml/config/step_configurations.py +21 -0
- zenml/constants.py +10 -0
- zenml/enums.py +1 -0
- zenml/image_builders/base_image_builder.py +5 -2
- zenml/image_builders/build_context.py +7 -16
- zenml/image_builders/local_image_builder.py +13 -3
- zenml/integrations/__init__.py +1 -0
- 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/aws/orchestrators/sagemaker_orchestrator.py +14 -6
- zenml/integrations/constants.py +1 -0
- zenml/integrations/feast/__init__.py +1 -1
- zenml/integrations/feast/feature_stores/feast_feature_store.py +13 -9
- 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/orchestrators/kube_utils.py +46 -2
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +13 -2
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +3 -1
- zenml/integrations/kubernetes/orchestrators/manifest_utils.py +3 -2
- zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +3 -2
- zenml/integrations/lightning/flavors/lightning_orchestrator_flavor.py +11 -0
- zenml/integrations/modal/__init__.py +46 -0
- zenml/integrations/modal/flavors/__init__.py +26 -0
- zenml/integrations/modal/flavors/modal_step_operator_flavor.py +125 -0
- zenml/integrations/modal/step_operators/__init__.py +22 -0
- zenml/integrations/modal/step_operators/modal_step_operator.py +242 -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/io/filesystem.py +2 -2
- zenml/io/local_filesystem.py +3 -3
- zenml/materializers/built_in_materializer.py +18 -1
- zenml/materializers/structured_string_materializer.py +8 -3
- zenml/model/model.py +23 -101
- zenml/model/utils.py +21 -17
- zenml/models/__init__.py +6 -0
- zenml/models/v2/base/filter.py +26 -30
- zenml/models/v2/base/scoped.py +258 -5
- zenml/models/v2/core/artifact_version.py +21 -29
- zenml/models/v2/core/code_repository.py +1 -12
- zenml/models/v2/core/component.py +5 -68
- zenml/models/v2/core/flavor.py +1 -11
- zenml/models/v2/core/model.py +1 -57
- zenml/models/v2/core/model_version.py +11 -36
- 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 +110 -32
- zenml/models/v2/core/run_metadata.py +30 -9
- 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 +24 -18
- zenml/models/v2/core/trigger.py +19 -3
- zenml/models/v2/misc/run_metadata.py +38 -0
- zenml/orchestrators/base_orchestrator.py +13 -1
- zenml/orchestrators/input_utils.py +19 -6
- zenml/orchestrators/output_utils.py +5 -1
- zenml/orchestrators/publish_utils.py +12 -5
- zenml/orchestrators/step_launcher.py +16 -16
- zenml/orchestrators/step_run_utils.py +18 -197
- zenml/orchestrators/step_runner.py +40 -3
- zenml/orchestrators/utils.py +79 -50
- zenml/pipelines/build_utils.py +12 -0
- zenml/pipelines/pipeline_decorator.py +4 -0
- zenml/pipelines/pipeline_definition.py +26 -8
- zenml/pipelines/run_utils.py +9 -5
- 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/steps/base_step.py +11 -1
- zenml/steps/entrypoint_function_utils.py +7 -3
- zenml/steps/step_decorator.py +4 -0
- zenml/steps/utils.py +23 -7
- zenml/types.py +4 -0
- zenml/utils/archivable.py +65 -36
- zenml/utils/code_utils.py +8 -4
- zenml/utils/docker_utils.py +9 -0
- zenml/utils/metadata_utils.py +186 -153
- zenml/utils/string_utils.py +41 -16
- zenml/utils/visualization_utils.py +4 -1
- zenml/zen_server/auth.py +9 -10
- zenml/zen_server/cloud_utils.py +3 -1
- 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/endpoint_utils.py +6 -4
- zenml/zen_server/rbac/models.py +3 -2
- zenml/zen_server/rbac/rbac_sql_zen_store.py +173 -0
- zenml/zen_server/rbac/utils.py +4 -7
- zenml/zen_server/routers/auth_endpoints.py +22 -11
- zenml/zen_server/routers/steps_endpoints.py +7 -1
- zenml/zen_server/routers/users_endpoints.py +35 -37
- zenml/zen_server/routers/workspaces_endpoints.py +44 -55
- zenml/zen_server/template_execution/utils.py +4 -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/migrations/versions/b73bc71f1106_remove_component_spec_path.py +36 -0
- zenml/zen_stores/migrations/versions/cc269488e5a9_separate_run_metadata.py +135 -0
- zenml/zen_stores/migrations/versions/ec6307720f92_simplify_model_version_links.py +7 -6
- zenml/zen_stores/rest_zen_store.py +76 -43
- zenml/zen_stores/schemas/__init__.py +5 -1
- zenml/zen_stores/schemas/artifact_schemas.py +12 -11
- zenml/zen_stores/schemas/component_schemas.py +0 -3
- zenml/zen_stores/schemas/model_schemas.py +55 -17
- zenml/zen_stores/schemas/pipeline_deployment_schemas.py +7 -7
- zenml/zen_stores/schemas/pipeline_run_schemas.py +52 -18
- zenml/zen_stores/schemas/pipeline_schemas.py +5 -0
- zenml/zen_stores/schemas/run_metadata_schemas.py +66 -31
- zenml/zen_stores/schemas/step_run_schemas.py +40 -13
- zenml/zen_stores/schemas/utils.py +47 -3
- zenml/zen_stores/sql_zen_store.py +462 -134
- {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/METADATA +5 -5
- {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/RECORD +239 -217
- zenml/utils/cloud_utils.py +0 -40
- 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.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/entry_points.txt +0 -0
zenml/model/model.py
CHANGED
@@ -13,14 +13,12 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Model user facing interface to pass into pipeline or step."""
|
15
15
|
|
16
|
-
import datetime
|
17
16
|
from typing import (
|
18
17
|
TYPE_CHECKING,
|
19
18
|
Any,
|
20
19
|
Dict,
|
21
20
|
List,
|
22
21
|
Optional,
|
23
|
-
Tuple,
|
24
22
|
Union,
|
25
23
|
)
|
26
24
|
from uuid import UUID
|
@@ -41,7 +39,6 @@ if TYPE_CHECKING:
|
|
41
39
|
ModelResponse,
|
42
40
|
ModelVersionResponse,
|
43
41
|
PipelineRunResponse,
|
44
|
-
StepRunResponse,
|
45
42
|
)
|
46
43
|
|
47
44
|
logger = get_logger(__name__)
|
@@ -60,7 +57,9 @@ class Model(BaseModel):
|
|
60
57
|
ethics: The ethical implications of the model.
|
61
58
|
tags: Tags associated with the model.
|
62
59
|
version: The version name, version number or stage is optional and points model context
|
63
|
-
to a specific version/stage. If skipped new version will be created.
|
60
|
+
to a specific version/stage. If skipped new version will be created. `version`
|
61
|
+
also supports placeholders: standard `{date}` and `{time}` and any custom placeholders
|
62
|
+
that are passed as substitutions in the pipeline or step decorators.
|
64
63
|
save_models_to_registry: Whether to save all ModelArtifacts to Model Registry,
|
65
64
|
if available in active stack.
|
66
65
|
"""
|
@@ -337,12 +336,16 @@ class Model(BaseModel):
|
|
337
336
|
metadata: The metadata to log.
|
338
337
|
"""
|
339
338
|
from zenml.client import Client
|
339
|
+
from zenml.models import RunMetadataResource
|
340
340
|
|
341
341
|
response = self._get_or_create_model_version()
|
342
342
|
Client().create_run_metadata(
|
343
343
|
metadata=metadata,
|
344
|
-
|
345
|
-
|
344
|
+
resources=[
|
345
|
+
RunMetadataResource(
|
346
|
+
id=response.id, type=MetadataResourceTypes.MODEL_VERSION
|
347
|
+
)
|
348
|
+
],
|
346
349
|
)
|
347
350
|
|
348
351
|
@property
|
@@ -506,22 +509,6 @@ class Model(BaseModel):
|
|
506
509
|
raise ValueError(
|
507
510
|
"`model_version_id` field is for internal use only"
|
508
511
|
)
|
509
|
-
|
510
|
-
version = data.get("version", None)
|
511
|
-
|
512
|
-
if (
|
513
|
-
version in [stage.value for stage in ModelStages]
|
514
|
-
and not suppress_class_validation_warnings
|
515
|
-
):
|
516
|
-
logger.info(
|
517
|
-
f"Version `{version}` matches one of the possible "
|
518
|
-
"`ModelStages` and will be fetched using stage."
|
519
|
-
)
|
520
|
-
if str(version).isnumeric() and not suppress_class_validation_warnings:
|
521
|
-
logger.info(
|
522
|
-
f"`version` `{version}` is numeric and will be fetched "
|
523
|
-
"using version number."
|
524
|
-
)
|
525
512
|
data["suppress_class_validation_warnings"] = True
|
526
513
|
return data
|
527
514
|
|
@@ -537,6 +524,8 @@ class Model(BaseModel):
|
|
537
524
|
from zenml.models import ModelRequest
|
538
525
|
|
539
526
|
zenml_client = Client()
|
527
|
+
# backup logic, if the Model class is used directly from the code
|
528
|
+
self.name = format_name_template(self.name)
|
540
529
|
if self.model_version_id:
|
541
530
|
mv = zenml_client.get_model_version(
|
542
531
|
model_version_name_or_number_or_id=self.model_version_id,
|
@@ -598,6 +587,18 @@ class Model(BaseModel):
|
|
598
587
|
hydrate=hydrate,
|
599
588
|
)
|
600
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
|
+
|
601
602
|
mv = zenml_client.get_model_version(
|
602
603
|
model_name_or_id=self.name,
|
603
604
|
model_version_name_or_number_or_id=self.version,
|
@@ -743,85 +744,6 @@ class Model(BaseModel):
|
|
743
744
|
)
|
744
745
|
)
|
745
746
|
|
746
|
-
def _prepare_model_version_before_step_launch(
|
747
|
-
self,
|
748
|
-
pipeline_run: "PipelineRunResponse",
|
749
|
-
step_run: Optional["StepRunResponse"],
|
750
|
-
return_logs: bool,
|
751
|
-
) -> Tuple[str, "PipelineRunResponse", Optional["StepRunResponse"]]:
|
752
|
-
"""Prepares model version inside pipeline run.
|
753
|
-
|
754
|
-
Args:
|
755
|
-
pipeline_run: pipeline run
|
756
|
-
step_run: step run (passed only if model version is defined in a step explicitly)
|
757
|
-
return_logs: whether to return logs or not
|
758
|
-
|
759
|
-
Returns:
|
760
|
-
Logs related to the Dashboard URL to show later.
|
761
|
-
"""
|
762
|
-
from zenml.client import Client
|
763
|
-
from zenml.models import PipelineRunUpdate, StepRunUpdate
|
764
|
-
|
765
|
-
logs = ""
|
766
|
-
|
767
|
-
# copy Model instance to prevent corrupting configs of the
|
768
|
-
# subsequent runs, if they share the same config object
|
769
|
-
self_copy = self.model_copy()
|
770
|
-
|
771
|
-
# in case request is within the step and no self-configuration is provided
|
772
|
-
# try reuse what's in the pipeline run first
|
773
|
-
if step_run is None and pipeline_run.model_version is not None:
|
774
|
-
self_copy.version = pipeline_run.model_version.name
|
775
|
-
self_copy.model_version_id = pipeline_run.model_version.id
|
776
|
-
# otherwise try to fill the templated name, if needed
|
777
|
-
elif isinstance(self_copy.version, str):
|
778
|
-
if pipeline_run.start_time:
|
779
|
-
start_time = pipeline_run.start_time
|
780
|
-
else:
|
781
|
-
start_time = datetime.datetime.now(datetime.timezone.utc)
|
782
|
-
self_copy.version = format_name_template(
|
783
|
-
self_copy.version,
|
784
|
-
date=start_time.strftime("%Y_%m_%d"),
|
785
|
-
time=start_time.strftime("%H_%M_%S_%f"),
|
786
|
-
)
|
787
|
-
|
788
|
-
# if exact model not yet defined - try to get/create and update it
|
789
|
-
# back to the run accordingly
|
790
|
-
if self_copy.model_version_id is None:
|
791
|
-
model_version_response = self_copy._get_or_create_model_version()
|
792
|
-
|
793
|
-
client = Client()
|
794
|
-
# update the configured model version id in runs accordingly
|
795
|
-
if step_run:
|
796
|
-
step_run = client.zen_store.update_run_step(
|
797
|
-
step_run_id=step_run.id,
|
798
|
-
step_run_update=StepRunUpdate(
|
799
|
-
model_version_id=model_version_response.id
|
800
|
-
),
|
801
|
-
)
|
802
|
-
else:
|
803
|
-
pipeline_run = client.zen_store.update_run(
|
804
|
-
run_id=pipeline_run.id,
|
805
|
-
run_update=PipelineRunUpdate(
|
806
|
-
model_version_id=model_version_response.id
|
807
|
-
),
|
808
|
-
)
|
809
|
-
|
810
|
-
if return_logs:
|
811
|
-
from zenml.utils.cloud_utils import try_get_model_version_url
|
812
|
-
|
813
|
-
if logs_to_show := try_get_model_version_url(
|
814
|
-
model_version_response
|
815
|
-
):
|
816
|
-
logs = logs_to_show
|
817
|
-
else:
|
818
|
-
logs = (
|
819
|
-
"Models can be viewed in the dashboard using ZenML Pro. Sign up "
|
820
|
-
"for a free trial at https://www.zenml.io/pro/"
|
821
|
-
)
|
822
|
-
self.model_version_id = self_copy.model_version_id
|
823
|
-
return logs, pipeline_run, step_run
|
824
|
-
|
825
747
|
@property
|
826
748
|
def _lazy_version(self) -> Optional[str]:
|
827
749
|
"""Get version name for lazy loader.
|
zenml/model/utils.py
CHANGED
@@ -52,29 +52,33 @@ def log_model_metadata(
|
|
52
52
|
`model` in decorator.
|
53
53
|
|
54
54
|
Raises:
|
55
|
-
ValueError: If
|
56
|
-
called inside a step with configured `model` in decorator.
|
55
|
+
ValueError: If the function is not called with proper input.
|
57
56
|
"""
|
58
57
|
logger.warning(
|
59
58
|
"The `log_model_metadata` function is deprecated and will soon be "
|
60
|
-
"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"
|
61
62
|
)
|
62
63
|
|
63
|
-
|
64
|
-
from zenml import Model
|
64
|
+
from zenml import log_metadata
|
65
65
|
|
66
|
-
|
66
|
+
if model_name and model_version:
|
67
|
+
log_metadata(
|
68
|
+
metadata=metadata,
|
69
|
+
model_version=model_version,
|
70
|
+
model_name=model_name,
|
71
|
+
)
|
72
|
+
elif model_name is None and model_version is None:
|
73
|
+
log_metadata(
|
74
|
+
metadata=metadata,
|
75
|
+
infer_model=True,
|
76
|
+
)
|
67
77
|
else:
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
"Model name and version must be provided unless the function is "
|
73
|
-
"called inside a step with configured `model` in decorator."
|
74
|
-
)
|
75
|
-
mv = step_context.model
|
76
|
-
|
77
|
-
mv.log_metadata(metadata)
|
78
|
+
raise ValueError(
|
79
|
+
"You can call `log_model_metadata` by either providing both "
|
80
|
+
"`model_name` and `model_version` or keeping both of them None."
|
81
|
+
)
|
78
82
|
|
79
83
|
|
80
84
|
def link_artifact_version_to_model_version(
|
@@ -107,7 +111,7 @@ def link_artifact_to_model(
|
|
107
111
|
model: The model to link to.
|
108
112
|
|
109
113
|
Raises:
|
110
|
-
RuntimeError: If called outside
|
114
|
+
RuntimeError: If called outside a step.
|
111
115
|
"""
|
112
116
|
if not model:
|
113
117
|
is_issue = False
|
zenml/models/__init__.py
CHANGED
@@ -372,6 +372,10 @@ from zenml.models.v2.misc.auth_models import (
|
|
372
372
|
OAuthRedirectResponse,
|
373
373
|
OAuthTokenResponse,
|
374
374
|
)
|
375
|
+
from zenml.models.v2.misc.run_metadata import (
|
376
|
+
RunMetadataEntry,
|
377
|
+
RunMetadataResource,
|
378
|
+
)
|
375
379
|
from zenml.models.v2.misc.server_models import (
|
376
380
|
ServerModel,
|
377
381
|
ServerDatabaseType,
|
@@ -752,4 +756,6 @@ __all__ = [
|
|
752
756
|
"ServiceConnectorInfo",
|
753
757
|
"ServiceConnectorResourcesInfo",
|
754
758
|
"ResourcesInfo",
|
759
|
+
"RunMetadataEntry",
|
760
|
+
"RunMetadataResource",
|
755
761
|
]
|
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
|
|