zenml-nightly 0.75.0.dev20250318__py3-none-any.whl → 0.80.0.dev20250321__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/__init__.py +3 -1
- zenml/artifacts/artifact_config.py +2 -2
- zenml/artifacts/utils.py +4 -8
- zenml/cli/__init__.py +6 -6
- zenml/cli/base.py +2 -2
- zenml/cli/login.py +2 -2
- zenml/cli/server.py +6 -4
- zenml/cli/utils.py +3 -3
- zenml/client.py +9 -9
- zenml/config/compiler.py +1 -1
- zenml/config/server_config.py +1 -1
- zenml/constants.py +2 -1
- zenml/enums.py +12 -0
- zenml/integrations/airflow/__init__.py +0 -2
- zenml/integrations/argilla/__init__.py +0 -1
- zenml/integrations/aws/__init__.py +0 -3
- zenml/integrations/azure/__init__.py +0 -2
- zenml/integrations/azure/service_connectors/azure_service_connector.py +1 -1
- zenml/integrations/bentoml/__init__.py +0 -2
- zenml/integrations/bentoml/services/bentoml_container_deployment.py +2 -2
- zenml/integrations/bentoml/services/bentoml_local_deployment.py +1 -1
- zenml/integrations/bentoml/steps/bentoml_deployer.py +1 -1
- zenml/integrations/bitbucket/__init__.py +0 -2
- zenml/integrations/comet/__init__.py +0 -2
- zenml/integrations/databricks/__init__.py +0 -2
- zenml/integrations/databricks/services/databricks_deployment.py +3 -1
- zenml/integrations/deepchecks/__init__.py +0 -2
- zenml/integrations/discord/__init__.py +0 -2
- zenml/integrations/evidently/__init__.py +0 -2
- zenml/integrations/facets/__init__.py +0 -2
- zenml/integrations/feast/__init__.py +0 -2
- zenml/integrations/gcp/__init__.py +0 -3
- zenml/integrations/github/__init__.py +0 -2
- zenml/integrations/github/code_repositories/github_code_repository.py +7 -2
- zenml/integrations/gitlab/__init__.py +0 -1
- zenml/integrations/gitlab/code_repositories/gitlab_code_repository.py +5 -2
- zenml/integrations/great_expectations/__init__.py +0 -3
- zenml/integrations/huggingface/__init__.py +0 -1
- zenml/integrations/huggingface/services/huggingface_deployment.py +3 -1
- zenml/integrations/hyperai/__init__.py +0 -2
- zenml/integrations/kaniko/__init__.py +0 -2
- zenml/integrations/kubeflow/__init__.py +0 -1
- zenml/integrations/kubernetes/__init__.py +0 -2
- zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +4 -0
- zenml/integrations/kubernetes/orchestrators/kube_utils.py +89 -1
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +82 -48
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +44 -10
- zenml/integrations/kubernetes/orchestrators/manifest_utils.py +33 -1
- zenml/integrations/label_studio/__init__.py +0 -2
- zenml/integrations/langchain/__init__.py +0 -2
- zenml/integrations/lightgbm/__init__.py +0 -1
- zenml/integrations/lightning/__init__.py +0 -2
- zenml/integrations/mlflow/__init__.py +1 -3
- zenml/integrations/mlflow/services/mlflow_deployment.py +1 -1
- zenml/integrations/modal/__init__.py +0 -1
- zenml/integrations/neptune/__init__.py +0 -2
- zenml/integrations/neural_prophet/__init__.py +0 -2
- zenml/integrations/numpy/__init__.py +0 -2
- zenml/integrations/openai/__init__.py +0 -1
- zenml/integrations/pandas/__init__.py +0 -2
- zenml/integrations/pigeon/__init__.py +0 -1
- zenml/integrations/pillow/__init__.py +0 -3
- zenml/integrations/polars/__init__.py +0 -2
- zenml/integrations/prodigy/__init__.py +0 -1
- zenml/integrations/pycaret/__init__.py +0 -2
- zenml/integrations/pytorch/__init__.py +0 -1
- zenml/integrations/pytorch_lightning/__init__.py +0 -2
- zenml/integrations/s3/__init__.py +0 -2
- zenml/integrations/scipy/__init__.py +0 -2
- zenml/integrations/seldon/__init__.py +0 -2
- zenml/integrations/seldon/services/seldon_deployment.py +3 -2
- zenml/integrations/sklearn/__init__.py +1 -1
- zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +43 -18
- zenml/integrations/skypilot_aws/__init__.py +1 -3
- zenml/integrations/skypilot_azure/__init__.py +1 -2
- zenml/integrations/skypilot_gcp/__init__.py +1 -3
- zenml/integrations/skypilot_kubernetes/__init__.py +1 -3
- zenml/integrations/skypilot_lambda/__init__.py +1 -3
- zenml/integrations/slack/__init__.py +0 -1
- zenml/integrations/spark/__init__.py +0 -1
- zenml/integrations/tekton/__init__.py +0 -1
- zenml/integrations/tensorboard/__init__.py +0 -2
- zenml/integrations/tensorboard/services/tensorboard_service.py +1 -1
- zenml/integrations/tensorflow/__init__.py +0 -2
- zenml/integrations/vllm/__init__.py +0 -1
- zenml/integrations/vllm/services/vllm_deployment.py +1 -1
- zenml/integrations/wandb/__init__.py +0 -1
- zenml/integrations/whylogs/__init__.py +0 -1
- zenml/integrations/xgboost/__init__.py +0 -2
- zenml/login/credentials.py +1 -1
- zenml/materializers/__init__.py +1 -0
- zenml/model_deployers/base_model_deployer.py +1 -1
- zenml/models/__init__.py +4 -0
- zenml/models/v2/base/filter.py +162 -54
- zenml/models/v2/base/scoped.py +132 -0
- zenml/models/v2/core/artifact_version.py +12 -33
- zenml/models/v2/core/model_version.py +12 -50
- zenml/models/v2/core/pipeline_run.py +12 -32
- zenml/models/v2/core/service.py +2 -2
- zenml/models/v2/core/step_run.py +15 -32
- zenml/{services/service_type.py → models/v2/misc/service.py} +1 -1
- zenml/orchestrators/step_run_utils.py +1 -1
- zenml/orchestrators/utils.py +1 -1
- zenml/services/__init__.py +3 -5
- zenml/services/container/container_service.py +2 -1
- zenml/services/local/local_service.py +2 -1
- zenml/services/service.py +3 -2
- zenml/services/service_endpoint.py +2 -1
- zenml/services/service_monitor.py +1 -1
- zenml/services/service_status.py +1 -12
- zenml/steps/entrypoint_function_utils.py +1 -1
- zenml/utils/dashboard_utils.py +73 -8
- zenml/utils/server_utils.py +52 -0
- zenml/zen_server/dashboard/assets/{404-BbAvjc7Z.js → 404-2I8egBQu.js} +1 -1
- zenml/zen_server/dashboard/assets/@reactflow-BHoFKFSZ.js +17 -0
- zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-XL2NfFgP.js → AlertDialogDropdownItem-D7KZcPFw.js} +1 -1
- zenml/zen_server/dashboard/assets/CodeSnippet-DUkCnBpQ.js +9 -0
- zenml/zen_server/dashboard/assets/{CollapsibleCard-Djtd_ocf.js → CollapsibleCard-B5-5Plnd.js} +1 -1
- zenml/zen_server/dashboard/assets/{Commands-V-hH_IKQ.js → Commands-CbOMmarC.js} +1 -1
- zenml/zen_server/dashboard/assets/{ComponentBadge-CVN2FsiW.js → ComponentBadge-FrujKBC6.js} +1 -1
- zenml/zen_server/dashboard/assets/ComponentIcon-Dx5fBrDX.js +1 -0
- zenml/zen_server/dashboard/assets/{CsvVizualization-CWaQcWIN.js → CsvVizualization-B8E3p9we.js} +1 -1
- zenml/zen_server/dashboard/assets/{DeleteAlertDialog-CTLRrcFM.js → DeleteAlertDialog-BgTZbbAt.js} +1 -1
- zenml/zen_server/dashboard/assets/{DialogItem-ST291Hsl.js → DialogItem-CNWLiJcc.js} +1 -1
- zenml/zen_server/dashboard/assets/{Error-CIBjAdSc.js → Error-BkUP4Luv.js} +1 -1
- zenml/zen_server/dashboard/assets/ExecutionStatus-CD8Vj7sp.js +1 -0
- zenml/zen_server/dashboard/assets/{Helpbox-cwQNH06F.js → Helpbox-DIx6mDOH.js} +1 -1
- zenml/zen_server/dashboard/assets/{Infobox-DYKoAVhW.js → Infobox-BHEdNmME.js} +1 -1
- zenml/zen_server/dashboard/assets/{InlineAvatar-Bk4QLPTU.js → InlineAvatar-Bin9UPKJ.js} +1 -1
- zenml/zen_server/dashboard/assets/{NestedCollapsible-CE4OF670.js → NestedCollapsible-Da-k0Mff.js} +1 -1
- zenml/zen_server/dashboard/assets/{Partials-cL1-u_sT.js → Partials-TNaYjHsV.js} +1 -1
- zenml/zen_server/dashboard/assets/ProBadge-BfPp-B97.js +1 -0
- zenml/zen_server/dashboard/assets/{ProCta-DtUutIul.js → ProCta-7_FtpX3I.js} +1 -1
- zenml/zen_server/dashboard/assets/ProviderIcon-CxeziA5a.js +1 -0
- zenml/zen_server/dashboard/assets/{ProviderRadio-C4bltH6-.js → ProviderRadio-DPmZHff_.js} +1 -1
- zenml/zen_server/dashboard/assets/RunSelector-BVKB4Z8F.js +1 -0
- zenml/zen_server/dashboard/assets/{RunsBody-D2VoO-cR.js → RunsBody-Cj4sIqQB.js} +1 -1
- zenml/zen_server/dashboard/assets/{SearchField-DfNxVtjV.js → SearchField-DjAOZic5.js} +1 -1
- zenml/zen_server/dashboard/assets/SecretTooltip-mMAAP4dM.js +1 -0
- zenml/zen_server/dashboard/assets/{SetPassword-CWl2mwz8.js → SetPassword-B0o5kSJU.js} +1 -1
- zenml/zen_server/dashboard/assets/{StackList-C8KNd00o.js → StackList-5UB8LoEq.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tabs-BEWDPvPV.js → Tabs-AuhCyzle.js} +1 -1
- zenml/zen_server/dashboard/assets/Tick-CHW0jc8Y.js +1 -0
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-DCuCj7NK.js → UpdatePasswordSchemas-Bauivjf-.js} +1 -1
- zenml/zen_server/dashboard/assets/{UsageReason-CwUrEwEz.js → UsageReason-Dr5ca5M4.js} +1 -1
- zenml/zen_server/dashboard/assets/{Wizard-CynnoHg4.js → Wizard-XEp9rGmf.js} +1 -1
- zenml/zen_server/dashboard/assets/{WizardFooter-B2bYs89C.js → WizardFooter-BtL1Gi1k.js} +1 -1
- zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-B509kMlL.js → all-pipeline-runs-query-COvsm3bC.js} +1 -1
- zenml/zen_server/dashboard/assets/configuration-form-BJUCr0wl.js +1 -0
- zenml/zen_server/dashboard/assets/{create-stack-BjWXz5nx.js → create-stack-B2c98UlP.js} +1 -1
- zenml/zen_server/dashboard/assets/{delete-run-CzPWbsBy.js → delete-run-Do3XyF4W.js} +1 -1
- zenml/zen_server/dashboard/assets/flavor-select-D8CranSY.js +1 -0
- zenml/zen_server/dashboard/assets/{form-schemas-B6u3P_a4.js → form-schemas-Bm-dTV3L.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-BCKg1Y5r.css → index-6mLFgFwe.css} +1 -1
- zenml/zen_server/dashboard/assets/{index-Bjeu4_0O.js → index-CzhJC6pc.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-CaRx22lH.js → index-D-n6tspq.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-DWoLoYDY.js → index-DPjvk73v.js} +8 -8
- zenml/zen_server/dashboard/assets/{index-Dba8yULY.js → index-eIIP-0dQ.js} +1 -1
- zenml/zen_server/dashboard/assets/login-mutation-D6uiKsKk.js +1 -0
- zenml/zen_server/dashboard/assets/{not-found-DGQ8rm7B.js → not-found-DFrksY0r.js} +1 -1
- zenml/zen_server/dashboard/assets/page-B-uHUFcm.js +1 -0
- zenml/zen_server/dashboard/assets/page-B0Llmzo_.js +1 -0
- zenml/zen_server/dashboard/assets/page-B150LbzG.js +1 -0
- zenml/zen_server/dashboard/assets/{page-CfeQbejg.js → page-B1Un9vAU.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CxrLV30P.js → page-B80TE04v.js} +1 -1
- zenml/zen_server/dashboard/assets/page-BIseZTJt.js +2 -0
- zenml/zen_server/dashboard/assets/{page-C5xq6rqE.js → page-BJ15SGwt.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-B6msmF1h.js → page-BJrZsPSh.js} +1 -1
- zenml/zen_server/dashboard/assets/page-BMZaECzB.js +1 -0
- zenml/zen_server/dashboard/assets/{page-D1upvSPi.js → page-BTvnIFGR.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DLw1Apss.js → page-BXh1mF-D.js} +1 -1
- zenml/zen_server/dashboard/assets/page-BZUxCBoD.js +1 -0
- zenml/zen_server/dashboard/assets/page-BeFiRx31.js +1 -0
- zenml/zen_server/dashboard/assets/{page-C89bN6VV.js → page-BnUwQBeg.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-k-UXKVnV.js → page-BqQ6y8Hb.js} +1 -1
- zenml/zen_server/dashboard/assets/page-BwAFqFCf.js +1 -0
- zenml/zen_server/dashboard/assets/page-BzlVs5tC.js +1 -0
- zenml/zen_server/dashboard/assets/{page-C3BbJ-5n.js → page-C11vPVkH.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-AnG2ilmi.js → page-CAKBSE9f.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CPe9nQSo.js +1 -0
- zenml/zen_server/dashboard/assets/page-D0Zt2-7X.js +1 -0
- zenml/zen_server/dashboard/assets/page-D2F0Rvak.js +1 -0
- zenml/zen_server/dashboard/assets/{page-2EzZ5aWS.js → page-D5GZlpKq.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CxoG4zme.js → page-DBNBYSwq.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DDvwWgKP.js +6 -0
- zenml/zen_server/dashboard/assets/page-DF9q7ySu.js +1 -0
- zenml/zen_server/dashboard/assets/page-DOzFoJuo.js +1 -0
- zenml/zen_server/dashboard/assets/page-DaHH2ZEF.js +1 -0
- zenml/zen_server/dashboard/assets/{page-B9ELcPAy.js → page-Dd-0y3SU.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Dy6HYsJr.js → page-DhNnHHmX.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CZ_3LB0U.js → page-DkJfgcDi.js} +1 -1
- zenml/zen_server/dashboard/assets/page-EhqRFAZc.js +1 -0
- zenml/zen_server/dashboard/assets/{page-nHAZvd76.js → page-NIWnUdVg.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DazwBcbq.js → page-kYlFrH53.js} +1 -1
- zenml/zen_server/dashboard/assets/page-ygCPGHAV.js +1 -0
- zenml/zen_server/dashboard/assets/{persist-BglceT_t.js → persist-C5RlwSq6.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-CMkLV2Cs.js → persist-DHGuHP2H.js} +1 -1
- zenml/zen_server/dashboard/assets/{service-DNKY_ZYd.js → service-Do7yitqe.js} +1 -1
- zenml/zen_server/dashboard/assets/{sharedSchema-BOmQa793.js → sharedSchema-i_9Y4WcA.js} +1 -1
- zenml/zen_server/dashboard/assets/stack-detail-query-omCumL7U.js +1 -0
- zenml/zen_server/dashboard/assets/update-server-settings-mutation-B4eE33z-.js +1 -0
- zenml/zen_server/dashboard/index.html +4 -4
- zenml/zen_server/deploy/daemon/daemon_zen_server.py +1 -1
- zenml/zen_server/deploy/deployment.py +1 -2
- zenml/zen_server/deploy/docker/docker_zen_server.py +1 -1
- zenml/zen_server/rbac/endpoint_utils.py +1 -2
- zenml/zen_server/routers/projects_endpoints.py +14 -3
- zenml/zen_server/utils.py +2 -86
- zenml/zen_stores/migrations/versions/0.80.0_release.py +23 -0
- zenml/zen_stores/schemas/artifact_visualization_schemas.py +1 -1
- zenml/zen_stores/schemas/model_schemas.py +1 -1
- zenml/zen_stores/schemas/service_schemas.py +1 -1
- zenml/zen_stores/schemas/step_run_schemas.py +1 -1
- zenml/zen_stores/schemas/trigger_schemas.py +1 -1
- zenml/zen_stores/sql_zen_store.py +5 -0
- {zenml_nightly-0.75.0.dev20250318.dist-info → zenml_nightly-0.80.0.dev20250321.dist-info}/METADATA +2 -2
- {zenml_nightly-0.75.0.dev20250318.dist-info → zenml_nightly-0.80.0.dev20250321.dist-info}/RECORD +221 -220
- zenml/zen_server/dashboard/assets/@reactflow-DMaYqp8l.js +0 -17
- zenml/zen_server/dashboard/assets/CodeSnippet-D8ptwPjg.js +0 -9
- zenml/zen_server/dashboard/assets/ComponentIcon-gpMJ2Y2e.js +0 -1
- zenml/zen_server/dashboard/assets/ExecutionStatus-DHiK3Am-.js +0 -1
- zenml/zen_server/dashboard/assets/ProBadge-ypma7R8i.js +0 -1
- zenml/zen_server/dashboard/assets/ProviderIcon-DKN3Gdcg.js +0 -1
- zenml/zen_server/dashboard/assets/RunSelector-CYmRHGdm.js +0 -1
- zenml/zen_server/dashboard/assets/SecretTooltip-CHPWF0bu.js +0 -1
- zenml/zen_server/dashboard/assets/Tick-DgU4udUn.js +0 -1
- zenml/zen_server/dashboard/assets/configuration-form-BEwWCxqY.js +0 -1
- zenml/zen_server/dashboard/assets/flavor-select-C1pyy8gq.js +0 -1
- zenml/zen_server/dashboard/assets/login-mutation-7WFxPe10.js +0 -1
- zenml/zen_server/dashboard/assets/page-BKN4SYXY.js +0 -1
- zenml/zen_server/dashboard/assets/page-BNrOW_3T.js +0 -2
- zenml/zen_server/dashboard/assets/page-BX6ZrAVH.js +0 -1
- zenml/zen_server/dashboard/assets/page-BnOdORy3.js +0 -1
- zenml/zen_server/dashboard/assets/page-BtkfcEI7.js +0 -1
- zenml/zen_server/dashboard/assets/page-Bz_grLBY.js +0 -1
- zenml/zen_server/dashboard/assets/page-CCEwuGU4.js +0 -1
- zenml/zen_server/dashboard/assets/page-COAGXWJu.js +0 -1
- zenml/zen_server/dashboard/assets/page-CaibMa0l.js +0 -1
- zenml/zen_server/dashboard/assets/page-CskoTYOC.js +0 -1
- zenml/zen_server/dashboard/assets/page-Cyoe7AtN.js +0 -1
- zenml/zen_server/dashboard/assets/page-D03wm5f1.js +0 -1
- zenml/zen_server/dashboard/assets/page-D8UimvyP.js +0 -1
- zenml/zen_server/dashboard/assets/page-DEnmFyzi.js +0 -1
- zenml/zen_server/dashboard/assets/page-TiOZeeo0.js +0 -1
- zenml/zen_server/dashboard/assets/page-cveasWUr.js +0 -6
- zenml/zen_server/dashboard/assets/page-iTvxfhgZ.js +0 -1
- zenml/zen_server/dashboard/assets/page-niRD8Hqz.js +0 -1
- zenml/zen_server/dashboard/assets/stack-detail-query-CI_YMUx6.js +0 -1
- zenml/zen_server/dashboard/assets/transform-DKsRLKTv.js +0 -1
- zenml/zen_server/dashboard/assets/update-server-settings-mutation-CNYCc-FU.js +0 -1
- {zenml_nightly-0.75.0.dev20250318.dist-info → zenml_nightly-0.80.0.dev20250321.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.75.0.dev20250318.dist-info → zenml_nightly-0.80.0.dev20250321.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.75.0.dev20250318.dist-info → zenml_nightly-0.80.0.dev20250321.dist-info}/entry_points.txt +0 -0
@@ -318,30 +318,36 @@ class SkypilotBaseOrchestrator(ContainerizedOrchestrator):
|
|
318
318
|
disk_tier=settings.disk_tier,
|
319
319
|
)
|
320
320
|
)
|
321
|
-
#
|
321
|
+
# Do not detach run if logs are being streamed
|
322
|
+
# Otherwise, the logs will not be streamed after the task is submitted
|
323
|
+
# Could also be a parameter in the settings to control this behavior
|
324
|
+
detach_run = not settings.stream_logs
|
325
|
+
|
326
|
+
launch_new_cluster = True
|
322
327
|
if settings.cluster_name:
|
323
|
-
sky.
|
324
|
-
|
325
|
-
settings.cluster_name,
|
326
|
-
down=down,
|
327
|
-
stream_logs=settings.stream_logs,
|
328
|
-
backend=None,
|
329
|
-
detach_run=True,
|
328
|
+
cluster_info = sky.status(
|
329
|
+
refresh=True, cluster_names=settings.cluster_name
|
330
330
|
)
|
331
|
+
if cluster_info:
|
332
|
+
logger.info(
|
333
|
+
f"Found existing cluster {settings.cluster_name}. Reusing..."
|
334
|
+
)
|
335
|
+
launch_new_cluster = False
|
336
|
+
|
337
|
+
else:
|
338
|
+
logger.info(
|
339
|
+
f"Cluster {settings.cluster_name} not found. Launching a new one..."
|
340
|
+
)
|
341
|
+
cluster_name = settings.cluster_name
|
331
342
|
else:
|
332
|
-
# Find existing cluster
|
333
|
-
for i in sky.status(refresh=True):
|
334
|
-
if isinstance(
|
335
|
-
i["handle"].launched_resources.cloud, type(self.cloud)
|
336
|
-
):
|
337
|
-
cluster_name = i["handle"].cluster_name
|
338
|
-
logger.info(
|
339
|
-
f"Found existing cluster {cluster_name}. Reusing..."
|
340
|
-
)
|
341
343
|
cluster_name = self.sanitize_cluster_name(
|
342
344
|
f"{orchestrator_run_name}"
|
343
345
|
)
|
344
|
-
|
346
|
+
logger.info(
|
347
|
+
f"No cluster name provided. Launching a new cluster with name {cluster_name}..."
|
348
|
+
)
|
349
|
+
|
350
|
+
if launch_new_cluster:
|
345
351
|
sky.launch(
|
346
352
|
task,
|
347
353
|
cluster_name,
|
@@ -349,7 +355,26 @@ class SkypilotBaseOrchestrator(ContainerizedOrchestrator):
|
|
349
355
|
idle_minutes_to_autostop=idle_minutes_to_autostop,
|
350
356
|
down=down,
|
351
357
|
stream_logs=settings.stream_logs,
|
358
|
+
backend=None,
|
352
359
|
detach_setup=True,
|
360
|
+
detach_run=detach_run,
|
361
|
+
)
|
362
|
+
else:
|
363
|
+
# Make sure the cluster is up -
|
364
|
+
# If the cluster is already up, this will not do anything
|
365
|
+
sky.start(
|
366
|
+
settings.cluster_name,
|
367
|
+
down=down,
|
368
|
+
idle_minutes_to_autostop=idle_minutes_to_autostop,
|
369
|
+
retry_until_up=settings.retry_until_up,
|
370
|
+
)
|
371
|
+
sky.exec(
|
372
|
+
task,
|
373
|
+
settings.cluster_name,
|
374
|
+
down=down,
|
375
|
+
stream_logs=settings.stream_logs,
|
376
|
+
backend=None,
|
377
|
+
detach_run=detach_run,
|
353
378
|
)
|
354
379
|
|
355
380
|
except Exception as e:
|
@@ -32,7 +32,7 @@ class SkypilotAWSIntegration(Integration):
|
|
32
32
|
|
33
33
|
NAME = SKYPILOT_AWS
|
34
34
|
# all 0.6.x versions of skypilot[aws] are compatible
|
35
|
-
REQUIREMENTS = ["skypilot[aws]~=0.
|
35
|
+
REQUIREMENTS = ["skypilot[aws]~=0.8.0"]
|
36
36
|
APT_PACKAGES = ["openssh-client", "rsync"]
|
37
37
|
|
38
38
|
@classmethod
|
@@ -48,5 +48,3 @@ class SkypilotAWSIntegration(Integration):
|
|
48
48
|
|
49
49
|
return [SkypilotAWSOrchestratorFlavor]
|
50
50
|
|
51
|
-
|
52
|
-
SkypilotAWSIntegration.check_installation()
|
@@ -31,7 +31,7 @@ class SkypilotAzureIntegration(Integration):
|
|
31
31
|
"""Definition of Skypilot (Azure) Integration for ZenML."""
|
32
32
|
|
33
33
|
NAME = SKYPILOT_AZURE
|
34
|
-
REQUIREMENTS = ["skypilot[azure]
|
34
|
+
REQUIREMENTS = ["skypilot[azure]~=0.8.0"]
|
35
35
|
APT_PACKAGES = ["openssh-client", "rsync"]
|
36
36
|
|
37
37
|
@classmethod
|
@@ -47,4 +47,3 @@ class SkypilotAzureIntegration(Integration):
|
|
47
47
|
|
48
48
|
return [SkypilotAzureOrchestratorFlavor]
|
49
49
|
|
50
|
-
SkypilotAzureIntegration.check_installation()
|
@@ -31,7 +31,7 @@ class SkypilotGCPIntegration(Integration):
|
|
31
31
|
"""Definition of Skypilot (GCP) Integration for ZenML."""
|
32
32
|
|
33
33
|
NAME = SKYPILOT_GCP
|
34
|
-
REQUIREMENTS = ["skypilot[gcp]~=0.
|
34
|
+
REQUIREMENTS = ["skypilot[gcp]~=0.8.0"]
|
35
35
|
APT_PACKAGES = ["openssh-client", "rsync"]
|
36
36
|
|
37
37
|
@classmethod
|
@@ -46,5 +46,3 @@ class SkypilotGCPIntegration(Integration):
|
|
46
46
|
)
|
47
47
|
|
48
48
|
return [SkypilotGCPOrchestratorFlavor]
|
49
|
-
|
50
|
-
SkypilotGCPIntegration.check_installation()
|
@@ -32,7 +32,7 @@ class SkypilotKubernetesIntegration(Integration):
|
|
32
32
|
|
33
33
|
NAME = SKYPILOT_KUBERNETES
|
34
34
|
# all 0.6.x versions of skypilot[kubernetes] are compatible
|
35
|
-
REQUIREMENTS = ["skypilot[kubernetes]~=0.
|
35
|
+
REQUIREMENTS = ["skypilot[kubernetes]~=0.8.0"]
|
36
36
|
APT_PACKAGES = ["openssh-client", "rsync"]
|
37
37
|
|
38
38
|
@classmethod
|
@@ -48,5 +48,3 @@ class SkypilotKubernetesIntegration(Integration):
|
|
48
48
|
|
49
49
|
return [SkypilotKubernetesOrchestratorFlavor]
|
50
50
|
|
51
|
-
|
52
|
-
SkypilotKubernetesIntegration.check_installation()
|
@@ -31,7 +31,7 @@ class SkypilotLambdaIntegration(Integration):
|
|
31
31
|
"""Definition of Skypilot Lambda Integration for ZenML."""
|
32
32
|
|
33
33
|
NAME = SKYPILOT_LAMBDA
|
34
|
-
REQUIREMENTS = ["skypilot[lambda]~=0.
|
34
|
+
REQUIREMENTS = ["skypilot[lambda]~=0.8.0"]
|
35
35
|
|
36
36
|
@classmethod
|
37
37
|
def flavors(cls) -> List[Type[Flavor]]:
|
@@ -46,5 +46,3 @@ class SkypilotLambdaIntegration(Integration):
|
|
46
46
|
|
47
47
|
return [SkypilotLambdaOrchestratorFlavor]
|
48
48
|
|
49
|
-
|
50
|
-
SkypilotLambdaIntegration.check_installation()
|
@@ -19,6 +19,7 @@ from typing import Any, Dict, Union
|
|
19
19
|
from tensorboard import default, program # type: ignore [import-untyped]
|
20
20
|
|
21
21
|
from zenml.logger import get_logger
|
22
|
+
from zenml.models.v2.misc.service import ServiceType
|
22
23
|
from zenml.services import (
|
23
24
|
HTTPEndpointHealthMonitor,
|
24
25
|
HTTPEndpointHealthMonitorConfig,
|
@@ -27,7 +28,6 @@ from zenml.services import (
|
|
27
28
|
LocalDaemonServiceEndpoint,
|
28
29
|
LocalDaemonServiceEndpointConfig,
|
29
30
|
ServiceEndpointProtocol,
|
30
|
-
ServiceType,
|
31
31
|
)
|
32
32
|
|
33
33
|
logger = get_logger(__name__)
|
@@ -19,6 +19,7 @@ from typing import Any, List, Optional, Union
|
|
19
19
|
|
20
20
|
from zenml.constants import DEFAULT_LOCAL_SERVICE_IP_ADDRESS
|
21
21
|
from zenml.logger import get_logger
|
22
|
+
from zenml.models.v2.misc.service import ServiceType
|
22
23
|
from zenml.services import (
|
23
24
|
HTTPEndpointHealthMonitor,
|
24
25
|
HTTPEndpointHealthMonitorConfig,
|
@@ -27,7 +28,6 @@ from zenml.services import (
|
|
27
28
|
LocalDaemonServiceEndpoint,
|
28
29
|
LocalDaemonServiceEndpointConfig,
|
29
30
|
ServiceEndpointProtocol,
|
30
|
-
ServiceType,
|
31
31
|
)
|
32
32
|
from zenml.services.service import BaseDeploymentService
|
33
33
|
|
zenml/login/credentials.py
CHANGED
@@ -20,11 +20,11 @@ from uuid import UUID
|
|
20
20
|
|
21
21
|
from pydantic import BaseModel, ConfigDict
|
22
22
|
|
23
|
+
from zenml.enums import ServiceState
|
23
24
|
from zenml.login.pro.constants import ZENML_PRO_API_URL, ZENML_PRO_URL
|
24
25
|
from zenml.login.pro.workspace.models import WorkspaceRead, WorkspaceStatus
|
25
26
|
from zenml.models import ServerModel
|
26
27
|
from zenml.models.v2.misc.server_models import ServerDeploymentType
|
27
|
-
from zenml.services.service_status import ServiceState
|
28
28
|
from zenml.utils.enum_utils import StrEnum
|
29
29
|
from zenml.utils.string_utils import get_human_readable_time
|
30
30
|
from zenml.utils.time_utils import to_local_tz, utc_now
|
zenml/materializers/__init__.py
CHANGED
@@ -33,6 +33,7 @@ from zenml.materializers.pydantic_materializer import PydanticMaterializer
|
|
33
33
|
from zenml.materializers.service_materializer import ServiceMaterializer
|
34
34
|
from zenml.materializers.uuid_materializer import UUIDMaterializer
|
35
35
|
|
36
|
+
|
36
37
|
__all__ = [
|
37
38
|
"BuiltInContainerMaterializer",
|
38
39
|
"BuiltInMaterializer",
|
@@ -30,9 +30,9 @@ from uuid import UUID
|
|
30
30
|
from zenml.client import Client
|
31
31
|
from zenml.enums import StackComponentType
|
32
32
|
from zenml.logger import get_logger
|
33
|
+
from zenml.models.v2.misc.service import ServiceType
|
33
34
|
from zenml.services import BaseService, ServiceConfig
|
34
35
|
from zenml.services.service import BaseDeploymentService
|
35
|
-
from zenml.services.service_type import ServiceType
|
36
36
|
from zenml.stack import StackComponent
|
37
37
|
from zenml.stack.flavor import Flavor
|
38
38
|
from zenml.stack.stack_component import StackComponentConfig
|
zenml/models/__init__.py
CHANGED
@@ -29,6 +29,7 @@ from zenml.models.v2.base.base import (
|
|
29
29
|
)
|
30
30
|
from zenml.models.v2.base.scoped import (
|
31
31
|
TaggableFilter,
|
32
|
+
RunMetadataFilterMixin,
|
32
33
|
UserScopedRequest,
|
33
34
|
UserScopedFilter,
|
34
35
|
UserScopedResponse,
|
@@ -389,6 +390,7 @@ from zenml.models.v2.misc.server_models import (
|
|
389
390
|
ServerDatabaseType,
|
390
391
|
ServerDeploymentType,
|
391
392
|
)
|
393
|
+
from zenml.models.v2.misc.service import ServiceType
|
392
394
|
from zenml.models.v2.core.server_settings import (
|
393
395
|
ServerActivationRequest,
|
394
396
|
ServerSettingsResponse,
|
@@ -516,6 +518,7 @@ __all__ = [
|
|
516
518
|
"NumericFilter",
|
517
519
|
"UUIDFilter",
|
518
520
|
"TaggableFilter",
|
521
|
+
"RunMetadataFilterMixin",
|
519
522
|
"Page",
|
520
523
|
# V2 Core
|
521
524
|
"ActionFilter",
|
@@ -760,6 +763,7 @@ __all__ = [
|
|
760
763
|
"ServerDatabaseType",
|
761
764
|
"ServerDeploymentType",
|
762
765
|
"ServerStatistics",
|
766
|
+
"ServiceType",
|
763
767
|
"StackDeploymentConfig",
|
764
768
|
"StackDeploymentInfo",
|
765
769
|
"OAuthDeviceAuthorizationRequest",
|
zenml/models/v2/base/filter.py
CHANGED
@@ -37,7 +37,7 @@ from pydantic import (
|
|
37
37
|
field_validator,
|
38
38
|
model_validator,
|
39
39
|
)
|
40
|
-
from sqlalchemy import Float, and_, asc, cast, desc
|
40
|
+
from sqlalchemy import Float, and_, asc, cast, desc, or_
|
41
41
|
from sqlmodel import SQLModel
|
42
42
|
|
43
43
|
from zenml.constants import (
|
@@ -171,8 +171,6 @@ class BoolFilter(Filter):
|
|
171
171
|
class StrFilter(Filter):
|
172
172
|
"""Filter for all string fields."""
|
173
173
|
|
174
|
-
json_encode_value: bool = False
|
175
|
-
|
176
174
|
ALLOWED_OPS: ClassVar[List[str]] = [
|
177
175
|
GenericFilterOps.EQUALS,
|
178
176
|
GenericFilterOps.NOT_EQUALS,
|
@@ -201,6 +199,23 @@ class StrFilter(Filter):
|
|
201
199
|
raise ValueError(ONEOF_ERROR)
|
202
200
|
return self
|
203
201
|
|
202
|
+
def _check_if_column_is_json_encoded(self, column: Any) -> bool:
|
203
|
+
"""Check if the column is json encoded.
|
204
|
+
|
205
|
+
Args:
|
206
|
+
column: The column of an SQLModel table on which to filter.
|
207
|
+
|
208
|
+
Returns:
|
209
|
+
True if the column is json encoded, False otherwise.
|
210
|
+
"""
|
211
|
+
from zenml.zen_stores.schemas import RunMetadataSchema
|
212
|
+
|
213
|
+
JSON_ENCODED_COLUMNS = [RunMetadataSchema.value]
|
214
|
+
|
215
|
+
if column in JSON_ENCODED_COLUMNS:
|
216
|
+
return True
|
217
|
+
return False
|
218
|
+
|
204
219
|
def generate_query_conditions_from_column(self, column: Any) -> Any:
|
205
220
|
"""Generate query conditions for a string column.
|
206
221
|
|
@@ -209,70 +224,168 @@ class StrFilter(Filter):
|
|
209
224
|
|
210
225
|
Returns:
|
211
226
|
A list of query conditions.
|
212
|
-
|
213
|
-
Raises:
|
214
|
-
ValueError: the comparison of the column to a numeric value fails.
|
215
227
|
"""
|
228
|
+
# Handle numeric comparisons (GT, LT, GTE, LTE)
|
216
229
|
if self.operation in {
|
217
230
|
GenericFilterOps.GT,
|
218
231
|
GenericFilterOps.LT,
|
219
232
|
GenericFilterOps.GTE,
|
220
233
|
GenericFilterOps.LTE,
|
221
234
|
}:
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
if self.operation == GenericFilterOps.GT:
|
228
|
-
return and_(
|
229
|
-
numeric_column, numeric_column > float(self.value)
|
230
|
-
)
|
231
|
-
if self.operation == GenericFilterOps.LT:
|
232
|
-
return and_(
|
233
|
-
numeric_column, numeric_column < float(self.value)
|
234
|
-
)
|
235
|
-
if self.operation == GenericFilterOps.GTE:
|
236
|
-
return and_(
|
237
|
-
numeric_column, numeric_column >= float(self.value)
|
238
|
-
)
|
239
|
-
if self.operation == GenericFilterOps.LTE:
|
240
|
-
return and_(
|
241
|
-
numeric_column, numeric_column <= float(self.value)
|
242
|
-
)
|
243
|
-
except Exception as e:
|
244
|
-
raise ValueError(
|
245
|
-
f"Failed to compare the column '{column}' to the "
|
246
|
-
f"value '{self.value}' (must be numeric): {e}"
|
247
|
-
)
|
235
|
+
return self._handle_numeric_comparison(column)
|
236
|
+
|
237
|
+
# Handle operations that need special treatment for JSON-encoded columns
|
238
|
+
is_json_encoded = self._check_if_column_is_json_encoded(column)
|
248
239
|
|
240
|
+
# Handle list operations
|
249
241
|
if self.operation == GenericFilterOps.ONEOF:
|
250
242
|
assert isinstance(self.value, list)
|
251
|
-
|
252
|
-
json_list = (
|
253
|
-
[json.dumps(v) for v in self.value]
|
254
|
-
if self.json_encode_value
|
255
|
-
else self.value
|
256
|
-
)
|
257
|
-
return column.in_(json_list)
|
243
|
+
return self._handle_oneof(column, is_json_encoded)
|
258
244
|
|
259
|
-
#
|
260
|
-
# because the quotes around strings will mess with the comparison
|
245
|
+
# Handle pattern matching operations
|
261
246
|
if self.operation == GenericFilterOps.CONTAINS:
|
262
247
|
return column.like(f"%{self.value}%")
|
263
248
|
|
264
|
-
json_value = (
|
265
|
-
json.dumps(self.value) if self.json_encode_value else self.value
|
266
|
-
)
|
267
|
-
|
268
249
|
if self.operation == GenericFilterOps.STARTSWITH:
|
269
|
-
return
|
250
|
+
return self._handle_startswith(column, is_json_encoded)
|
251
|
+
|
270
252
|
if self.operation == GenericFilterOps.ENDSWITH:
|
271
|
-
return
|
253
|
+
return self._handle_endswith(column, is_json_encoded)
|
254
|
+
|
272
255
|
if self.operation == GenericFilterOps.NOT_EQUALS:
|
273
|
-
return column
|
256
|
+
return self._handle_not_equals(column, is_json_encoded)
|
274
257
|
|
275
|
-
|
258
|
+
# Default case (EQUALS)
|
259
|
+
return self._handle_equals(column, is_json_encoded)
|
260
|
+
|
261
|
+
def _handle_numeric_comparison(self, column: Any) -> Any:
|
262
|
+
"""Handle numeric comparison operations.
|
263
|
+
|
264
|
+
Args:
|
265
|
+
column: The column to compare.
|
266
|
+
|
267
|
+
Returns:
|
268
|
+
The query condition.
|
269
|
+
|
270
|
+
Raises:
|
271
|
+
ValueError: If the comparison fails.
|
272
|
+
"""
|
273
|
+
try:
|
274
|
+
numeric_column = cast(column, Float)
|
275
|
+
assert self.value is not None
|
276
|
+
|
277
|
+
operations = {
|
278
|
+
GenericFilterOps.GT: lambda col, val: and_(
|
279
|
+
col, col > float(val)
|
280
|
+
),
|
281
|
+
GenericFilterOps.LT: lambda col, val: and_(
|
282
|
+
col, col < float(val)
|
283
|
+
),
|
284
|
+
GenericFilterOps.GTE: lambda col, val: and_(
|
285
|
+
col, col >= float(val)
|
286
|
+
),
|
287
|
+
GenericFilterOps.LTE: lambda col, val: and_(
|
288
|
+
col, col <= float(val)
|
289
|
+
),
|
290
|
+
}
|
291
|
+
|
292
|
+
return operations[self.operation](numeric_column, self.value) # type: ignore[no-untyped-call]
|
293
|
+
except Exception as e:
|
294
|
+
raise ValueError(
|
295
|
+
f"Failed to compare the column '{column}' to the "
|
296
|
+
f"value '{self.value}' (must be numeric): {e}"
|
297
|
+
)
|
298
|
+
|
299
|
+
def _handle_oneof(self, column: Any, is_json_encoded: bool) -> Any:
|
300
|
+
"""Handle the ONEOF operation.
|
301
|
+
|
302
|
+
Args:
|
303
|
+
column: The column to check.
|
304
|
+
is_json_encoded: Whether the column is JSON encoded.
|
305
|
+
|
306
|
+
Returns:
|
307
|
+
The query condition.
|
308
|
+
"""
|
309
|
+
from sqlalchemy import or_
|
310
|
+
|
311
|
+
conditions = []
|
312
|
+
|
313
|
+
assert isinstance(self.value, list)
|
314
|
+
|
315
|
+
for value in self.value:
|
316
|
+
if is_json_encoded:
|
317
|
+
# For JSON encoded columns, add conditions for both raw and JSON-quoted values
|
318
|
+
conditions.append(column == value)
|
319
|
+
conditions.append(column == f'"{value}"')
|
320
|
+
else:
|
321
|
+
conditions.append(column == value)
|
322
|
+
|
323
|
+
return or_(*conditions)
|
324
|
+
|
325
|
+
def _handle_startswith(self, column: Any, is_json_encoded: bool) -> Any:
|
326
|
+
"""Handle the STARTSWITH operation.
|
327
|
+
|
328
|
+
Args:
|
329
|
+
column: The column to check.
|
330
|
+
is_json_encoded: Whether the column is JSON encoded.
|
331
|
+
|
332
|
+
Returns:
|
333
|
+
The query condition.
|
334
|
+
"""
|
335
|
+
if is_json_encoded:
|
336
|
+
return or_(
|
337
|
+
column.startswith(self.value),
|
338
|
+
column.startswith(f'"{self.value}'),
|
339
|
+
)
|
340
|
+
else:
|
341
|
+
return column.startswith(self.value)
|
342
|
+
|
343
|
+
def _handle_endswith(self, column: Any, is_json_encoded: bool) -> Any:
|
344
|
+
"""Handle the ENDSWITH operation.
|
345
|
+
|
346
|
+
Args:
|
347
|
+
column: The column to check.
|
348
|
+
is_json_encoded: Whether the column is JSON encoded.
|
349
|
+
|
350
|
+
Returns:
|
351
|
+
The query condition.
|
352
|
+
"""
|
353
|
+
if is_json_encoded:
|
354
|
+
return or_(
|
355
|
+
column.endswith(self.value), column.endswith(f'{self.value}"')
|
356
|
+
)
|
357
|
+
else:
|
358
|
+
return column.endswith(self.value)
|
359
|
+
|
360
|
+
def _handle_not_equals(self, column: Any, is_json_encoded: bool) -> Any:
|
361
|
+
"""Handle the NOT_EQUALS operation.
|
362
|
+
|
363
|
+
Args:
|
364
|
+
column: The column to check.
|
365
|
+
is_json_encoded: Whether the column is JSON encoded.
|
366
|
+
|
367
|
+
Returns:
|
368
|
+
The query condition.
|
369
|
+
"""
|
370
|
+
if is_json_encoded:
|
371
|
+
return and_(column != self.value, column != f'"{self.value}"')
|
372
|
+
else:
|
373
|
+
return column != self.value
|
374
|
+
|
375
|
+
def _handle_equals(self, column: Any, is_json_encoded: bool) -> Any:
|
376
|
+
"""Handle the EQUALS operation (default).
|
377
|
+
|
378
|
+
Args:
|
379
|
+
column: The column to check.
|
380
|
+
is_json_encoded: Whether the column is JSON encoded.
|
381
|
+
|
382
|
+
Returns:
|
383
|
+
The query condition.
|
384
|
+
"""
|
385
|
+
if is_json_encoded:
|
386
|
+
return or_(column == self.value, column == f'"{self.value}"')
|
387
|
+
else:
|
388
|
+
return column == self.value
|
276
389
|
|
277
390
|
|
278
391
|
class UUIDFilter(StrFilter):
|
@@ -751,7 +864,6 @@ class BaseFilter(BaseModel):
|
|
751
864
|
value: Any,
|
752
865
|
table: Type[SQLModel],
|
753
866
|
column: str,
|
754
|
-
json_encode_value: bool = False,
|
755
867
|
) -> "ColumnElement[bool]":
|
756
868
|
"""Generate custom filter conditions for a column of a table.
|
757
869
|
|
@@ -759,7 +871,6 @@ class BaseFilter(BaseModel):
|
|
759
871
|
value: The filter value.
|
760
872
|
table: The table which contains the column.
|
761
873
|
column: The column name.
|
762
|
-
json_encode_value: Whether to json encode the value.
|
763
874
|
|
764
875
|
Returns:
|
765
876
|
The query conditions.
|
@@ -768,9 +879,6 @@ class BaseFilter(BaseModel):
|
|
768
879
|
filter_ = FilterGenerator(table).define_filter(
|
769
880
|
column=column, value=value, operator=operator
|
770
881
|
)
|
771
|
-
if isinstance(filter_, StrFilter):
|
772
|
-
filter_.json_encode_value = json_encode_value
|
773
|
-
|
774
882
|
return filter_.generate_query_conditions(table=table)
|
775
883
|
|
776
884
|
@property
|