zenml-nightly 0.66.0.dev20240927__py3-none-any.whl → 0.68.1.dev20241102__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 +18 -12
- RELEASE_NOTES.md +236 -0
- zenml/VERSION +1 -1
- zenml/__init__.py +5 -10
- zenml/analytics/context.py +16 -1
- zenml/analytics/enums.py +0 -13
- zenml/analytics/utils.py +18 -7
- zenml/artifact_stores/base_artifact_store.py +11 -0
- zenml/artifacts/artifact_config.py +19 -65
- zenml/artifacts/external_artifact.py +7 -53
- zenml/artifacts/external_artifact_config.py +21 -40
- zenml/artifacts/load_directory_materializer.py +91 -0
- zenml/artifacts/utils.py +204 -145
- zenml/cli/__init__.py +62 -127
- zenml/cli/base.py +8 -8
- zenml/cli/integration.py +0 -9
- zenml/cli/login.py +951 -0
- zenml/cli/pipeline.py +1 -1
- zenml/cli/served_model.py +8 -1
- zenml/cli/server.py +462 -577
- zenml/cli/service_accounts.py +4 -4
- zenml/cli/stack.py +78 -569
- zenml/cli/stack_components.py +5 -594
- zenml/cli/user_management.py +0 -12
- zenml/cli/utils.py +24 -142
- zenml/client.py +57 -40
- zenml/client_lazy_loader.py +29 -12
- zenml/config/compiler.py +7 -11
- zenml/config/global_config.py +9 -0
- zenml/config/pipeline_configurations.py +2 -1
- zenml/config/pipeline_run_configuration.py +2 -1
- zenml/config/server_config.py +7 -5
- zenml/config/step_configurations.py +2 -0
- zenml/constants.py +6 -42
- zenml/enums.py +1 -4
- zenml/environment.py +1 -315
- zenml/exceptions.py +12 -41
- zenml/hooks/hook_validators.py +1 -8
- zenml/integrations/airflow/orchestrators/airflow_orchestrator.py +2 -3
- zenml/integrations/argilla/__init__.py +1 -1
- zenml/integrations/argilla/annotators/argilla_annotator.py +234 -89
- zenml/integrations/argilla/flavors/argilla_annotator_flavor.py +10 -5
- zenml/integrations/aws/flavors/sagemaker_orchestrator_flavor.py +9 -5
- zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +15 -2
- zenml/integrations/aws/service_connectors/aws_service_connector.py +6 -0
- zenml/integrations/azure/__init__.py +6 -2
- zenml/integrations/azure/flavors/azureml_orchestrator_flavor.py +5 -4
- zenml/integrations/azure/orchestrators/azureml_orchestrator.py +1 -1
- zenml/integrations/bentoml/model_deployers/bentoml_model_deployer.py +85 -19
- zenml/integrations/bentoml/services/__init__.py +15 -4
- zenml/integrations/bentoml/services/bentoml_container_deployment.py +399 -0
- zenml/integrations/bentoml/services/{bentoml_deployment.py → bentoml_local_deployment.py} +81 -40
- zenml/{steps/base_parameters.py → integrations/bentoml/services/deployment_type.py} +8 -5
- zenml/integrations/bentoml/steps/bento_builder.py +1 -0
- zenml/integrations/bentoml/steps/bentoml_deployer.py +93 -41
- zenml/integrations/github/code_repositories/github_code_repository.py +1 -1
- zenml/integrations/gitlab/code_repositories/gitlab_code_repository.py +6 -1
- zenml/integrations/huggingface/__init__.py +1 -6
- zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +3 -3
- zenml/integrations/lightning/orchestrators/lightning_orchestrator.py +3 -3
- zenml/integrations/lightning/orchestrators/lightning_orchestrator_entrypoint.py +2 -2
- zenml/integrations/mlflow/experiment_trackers/mlflow_experiment_tracker.py +6 -3
- zenml/integrations/mlflow/model_registries/mlflow_model_registry.py +6 -0
- zenml/integrations/mlflow/services/mlflow_deployment.py +2 -2
- zenml/integrations/mlflow/steps/mlflow_deployer.py +1 -1
- zenml/integrations/mlflow/steps/mlflow_registry.py +1 -1
- zenml/integrations/neptune/experiment_trackers/run_state.py +2 -2
- zenml/integrations/pytorch/materializers/base_pytorch_materializer.py +8 -2
- zenml/integrations/pytorch/materializers/pytorch_module_materializer.py +4 -1
- zenml/integrations/s3/artifact_stores/s3_artifact_store.py +98 -0
- zenml/integrations/s3/flavors/s3_artifact_store_flavor.py +14 -0
- zenml/integrations/s3/utils.py +40 -0
- zenml/integrations/tensorflow/__init__.py +0 -9
- zenml/logging/step_logging.py +13 -15
- zenml/{new/pipelines → login}/__init__.py +4 -1
- zenml/login/credentials.py +346 -0
- zenml/login/credentials_store.py +603 -0
- zenml/{new → login/pro}/__init__.py +4 -1
- zenml/login/pro/client.py +496 -0
- zenml/login/pro/constants.py +34 -0
- zenml/{lineage_graph/edge.py → login/pro/models.py} +9 -8
- zenml/{zen_server/deploy/terraform/providers → login/pro/organization}/__init__.py +2 -2
- zenml/login/pro/organization/client.py +79 -0
- zenml/{lineage_graph/node/base_node.py → login/pro/organization/models.py} +13 -12
- zenml/{new/steps → login/pro/tenant}/__init__.py +2 -1
- zenml/login/pro/tenant/client.py +92 -0
- zenml/login/pro/tenant/models.py +174 -0
- zenml/login/pro/utils.py +121 -0
- zenml/{cli → login}/web_login.py +64 -28
- zenml/materializers/__init__.py +2 -0
- zenml/materializers/base_materializer.py +43 -9
- zenml/materializers/built_in_materializer.py +1 -1
- zenml/materializers/uuid_materializer.py +79 -0
- zenml/metadata/lazy_load.py +10 -7
- zenml/metadata/metadata_types.py +49 -0
- zenml/model/lazy_load.py +85 -4
- zenml/model/model.py +61 -83
- zenml/model/utils.py +47 -118
- zenml/models/__init__.py +6 -0
- zenml/models/v2/base/base.py +12 -8
- zenml/models/v2/base/filter.py +9 -0
- zenml/models/v2/core/artifact_version.py +53 -25
- zenml/models/v2/core/component.py +54 -19
- zenml/models/v2/core/flavor.py +13 -13
- zenml/models/v2/core/model.py +4 -1
- zenml/models/v2/core/model_version.py +4 -6
- zenml/models/v2/core/model_version_artifact.py +3 -1
- zenml/models/v2/core/model_version_pipeline_run.py +3 -1
- zenml/models/v2/core/pipeline.py +3 -1
- zenml/models/v2/core/pipeline_run.py +24 -3
- zenml/models/v2/core/run_metadata.py +2 -2
- zenml/models/v2/core/run_template.py +3 -1
- zenml/models/v2/core/stack.py +7 -3
- zenml/models/v2/core/step_run.py +58 -14
- zenml/models/v2/misc/auth_models.py +11 -2
- zenml/models/v2/misc/server_models.py +2 -4
- zenml/orchestrators/base_orchestrator.py +41 -4
- zenml/orchestrators/input_utils.py +52 -36
- zenml/orchestrators/step_launcher.py +50 -171
- zenml/orchestrators/step_run_utils.py +574 -0
- zenml/orchestrators/step_runner.py +83 -120
- zenml/orchestrators/utils.py +46 -180
- zenml/pipelines/__init__.py +3 -16
- zenml/{new/pipelines → pipelines}/pipeline_context.py +3 -18
- zenml/pipelines/pipeline_decorator.py +34 -60
- zenml/{new/pipelines/pipeline.py → pipelines/pipeline_definition.py} +210 -207
- zenml/{new/pipelines → pipelines}/run_utils.py +11 -10
- zenml/services/local/local_daemon_entrypoint.py +4 -4
- zenml/services/service.py +2 -2
- zenml/stack/stack.py +3 -108
- zenml/stack/stack_component.py +2 -78
- zenml/stack/utils.py +26 -14
- zenml/stack_deployments/aws_stack_deployment.py +3 -0
- zenml/step_operators/step_operator_entrypoint_configuration.py +1 -1
- zenml/steps/__init__.py +3 -9
- zenml/steps/base_step.py +25 -267
- zenml/steps/entrypoint_function_utils.py +2 -80
- zenml/{new/steps → steps}/step_context.py +12 -66
- zenml/steps/step_decorator.py +42 -89
- zenml/steps/step_invocation.py +16 -60
- zenml/steps/utils.py +4 -23
- zenml/utils/dashboard_utils.py +16 -51
- zenml/utils/materializer_utils.py +1 -1
- zenml/utils/requirements_utils.py +71 -0
- zenml/utils/singleton.py +15 -3
- zenml/utils/source_utils.py +39 -2
- zenml/utils/typing_utils.py +8 -28
- zenml/utils/visualization_utils.py +1 -1
- zenml/zen_server/auth.py +44 -39
- zenml/zen_server/dashboard/assets/{404-Y50hSt65.js → 404-DT4QRUqN.js} +1 -1
- zenml/zen_server/dashboard/assets/@radix-DP6vWzyx.js +85 -0
- zenml/zen_server/dashboard/assets/@react-router-BMhZulnd.js +29 -0
- zenml/zen_server/dashboard/assets/@reactflow-8U9qNlMR.js +17 -0
- zenml/zen_server/dashboard/assets/@tanstack-BUCbhJyH.js +22 -0
- zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-xLR9a1iw.js → AlertDialogDropdownItem-C6N2rGrB.js} +1 -1
- zenml/zen_server/dashboard/assets/{CodeSnippet-IxXNxUDa.js → CodeSnippet-CqybNv0k.js} +1 -1
- zenml/zen_server/dashboard/assets/{CollapsibleCard-BhutZbBL.js → CollapsibleCard-0r_8G2Lj.js} +1 -1
- zenml/zen_server/dashboard/assets/{Commands-Bf-rd1z8.js → Commands-BDjgBQKi.js} +1 -1
- zenml/zen_server/dashboard/assets/ComponentBadge-DUiEYJHu.js +1 -0
- zenml/zen_server/dashboard/assets/ComponentFallbackDialog-BFoH5K4V.js +1 -0
- zenml/zen_server/dashboard/assets/ComponentIcon-CAIoUis2.js +1 -0
- zenml/zen_server/dashboard/assets/{CopyButton-DcFHidFJ.js → CopyButton-C745BrKi.js} +1 -1
- zenml/zen_server/dashboard/assets/{CsvVizualization-QSbjrfxw.js → CsvVizualization-PpAq0CeZ.js} +5 -5
- zenml/zen_server/dashboard/assets/{DialogItem-Cd3HqST4.js → DialogItem-DcVCZEew.js} +1 -1
- zenml/zen_server/dashboard/assets/{DisplayDate-DkCy54Bp.js → DisplayDate-BeXgUG_C.js} +1 -1
- zenml/zen_server/dashboard/assets/{EmptyState-Cs3DEmso.js → EmptyState-DeK7H4pr.js} +1 -1
- zenml/zen_server/dashboard/assets/{Error-BhwdmqK7.js → Error-BMlzibXj.js} +1 -1
- zenml/zen_server/dashboard/assets/{Helpbox-0pBpTwTm.js → Helpbox-BLf40fLV.js} +1 -1
- zenml/zen_server/dashboard/assets/{Infobox-BTK_EUKT.js → Infobox-BwisKifi.js} +1 -1
- zenml/zen_server/dashboard/assets/{InlineAvatar-CA3DFMcM.js → InlineAvatar-jEgodSgX.js} +1 -1
- zenml/zen_server/dashboard/assets/{Lock-CmIn0szs.js → Lock-3lLt1ih0.js} +1 -1
- zenml/zen_server/dashboard/assets/MarkdownVisualization-8O9kTr-2.js +14 -0
- zenml/zen_server/dashboard/assets/{NumberBox-CrN0_kqI.js → NumberBox-T9eELfLZ.js} +1 -1
- zenml/zen_server/dashboard/assets/{Partials-QLOZw624.js → Partials-YPBB3V4q.js} +1 -1
- zenml/zen_server/dashboard/assets/{PasswordChecker-DE71J_3F.js → PasswordChecker-CW0kqY0W.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderIcon-C16CCIN4.js → ProviderIcon-Bb3Xha5A.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderRadio-D3FuCHf3.js → ProviderRadio-BROY1700.js} +1 -1
- zenml/zen_server/dashboard/assets/RunSelector-DCiL3M1c.js +1 -0
- zenml/zen_server/dashboard/assets/SearchField-DfUiGFVd.js +1 -0
- zenml/zen_server/dashboard/assets/{SecretTooltip-BaMwHF-Q.js → SecretTooltip-C_qByGWB.js} +1 -1
- zenml/zen_server/dashboard/assets/{SetPassword-DuIC65H9.js → SetPassword-7pRB00El.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tick-DJTCF0Re.js → Tick-CykQFPj2.js} +1 -1
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-CUm-DMpw.js → UpdatePasswordSchemas-DckMEkFf.js} +1 -1
- zenml/zen_server/dashboard/assets/{UsageReason-CKw0juLF.js → UsageReason-DVceN14P.js} +1 -1
- zenml/zen_server/dashboard/assets/{WizardFooter-Cv9ApYWU.js → WizardFooter-CW0Cvd70.js} +1 -1
- zenml/zen_server/dashboard/assets/{check-circle-DOoS4yhF.js → check-circle-Dwxliy1Z.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-down-Cwb-W_B_.js → chevron-down-8wLBS5pQ.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-right-double-c9H46Kl8.js → chevron-right-double-DoD8iXWM.js} +1 -1
- zenml/zen_server/dashboard/assets/{cloud-only-BB4BVa6E.js → cloud-only-B-s_HMDm.js} +1 -1
- zenml/zen_server/dashboard/assets/{code-browser-BJYErIjr.js → code-browser-CZUQs3Wa.js} +1 -1
- zenml/zen_server/dashboard/assets/{copy-CaGlDsUy.js → copy-CaSMXwiU.js} +1 -1
- zenml/zen_server/dashboard/assets/{create-stack-F29xAUEx.js → create-stack-CEmaPZ4c.js} +1 -1
- zenml/zen_server/dashboard/assets/delete-run-D-LKbGyz.js +1 -0
- zenml/zen_server/dashboard/assets/{docker-BFAFXr2_.js → docker-BFNgg-z3.js} +1 -1
- zenml/zen_server/dashboard/assets/{dots-horizontal-C6K59vUm.js → dots-horizontal-DK5Duzx4.js} +1 -1
- zenml/zen_server/dashboard/assets/{form-schemas-BKXwSDK2.js → form-schemas-1AyOCx90.js} +1 -1
- zenml/zen_server/dashboard/assets/{gcp-Dj6ntk0L.js → gcp-7M2Yf3ZK.js} +1 -1
- zenml/zen_server/dashboard/assets/{help-CwN931fX.js → help-Dam461dC.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-5GJ5ysEZ.js → index-BVJ8n2-j.js} +1 -1
- zenml/zen_server/dashboard/assets/index-Bpmj40BI.js +1 -0
- zenml/zen_server/dashboard/assets/index-CbU4Ln_E.css +1 -0
- zenml/zen_server/dashboard/assets/{index-D-mtoBj3.js → index-DKPhqP2B.js} +1 -1
- zenml/zen_server/dashboard/assets/index-QQb7wQEC.js +55 -0
- zenml/zen_server/dashboard/assets/index.esm-cuVep_NJ.js +1 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-BLGc9T1a.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-ZzOtrSSW.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-D4Vwzodn.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-DH2hs3aW.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-BGBWG807.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-BuzJQFbW.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-BPnxn4xp.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-Dc4VJyIJ.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-BShVwWPj.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-CUiC4oBV.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-Bt9VVOA-.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-CaqZN2hq.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-400-normal-BZzXV7-1.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-400-normal-DxZsaF_h.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-500-normal-CeQXL5ds.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-500-normal-d_eO-yCQ.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-600-normal-CwicyhtI.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-600-normal-Dhlb-90d.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-Bput3-QP.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-DCpCPQOf.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-B6guLgqG.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-M2hEX8vc.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-C9WLioJ8.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-Cnui8OiR.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-400-normal-BOOGhInR.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-400-normal-gitzw0hO.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-500-normal-D2bGa7uu.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-500-normal-deR1Tlfd.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-600-normal-B5cFAncS.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-600-normal-D273HNI0.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-C1t-h-pH.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-hnt3BR84.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-CIS2RHJS.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-UMdmhHu2.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-BnYJhD27.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-CAF0vJDd.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-BUNmGMP1.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-DQPw2Hwd.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-Cm6aH8_k.woff +0 -0
- zenml/zen_server/dashboard/assets/{kubernetes-BjbR6D-1.js → kubernetes--g7r02Zu.js} +1 -1
- zenml/zen_server/dashboard/assets/{layout-Dru15_XR.js → layout-DCSYN7-C.js} +1 -1
- zenml/zen_server/dashboard/assets/{link-external-BT2L8hAQ.js → link-external-CBEk6kEG.js} +1 -1
- zenml/zen_server/dashboard/assets/{login-mutation-ax6iL2Mb.js → login-mutation-DTcAFP1l.js} +1 -1
- zenml/zen_server/dashboard/assets/{logs-GiDJXbLS.js → logs-D5bdJGur.js} +1 -1
- zenml/zen_server/dashboard/assets/not-found-Cc-JkRH2.js +1 -0
- zenml/zen_server/dashboard/assets/{package-DYKZ5jKW.js → package-Cs35Szwh.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-HkVBdZl6.js → page-9yplj5JT.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-uORspyRu.js → page-B-y2XKIc.js} +1 -1
- zenml/zen_server/dashboard/assets/page-BBpOxVcY.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BDg1F-Ug.js → page-BQQKaabe.js} +2 -2
- zenml/zen_server/dashboard/assets/page-BRInM1Lg.js +1 -0
- zenml/zen_server/dashboard/assets/{page-CvKnNK1S.js → page-BjjlMk7s.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BukXK1Aa.js → page-Bvd7YH2A.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DcTjHmYZ.js → page-C0N5q3l7.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CT3Nep8W.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DuqYMYmH.js → page-C_f47pBf.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DRfcRK1w.js → page-ClUVkl-O.js} +1 -1
- zenml/zen_server/dashboard/assets/page-Cmv8C_yM.js +3 -0
- zenml/zen_server/dashboard/assets/{page-p0BhSAWx.js → page-CyN2bdWG.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CzzXH4fs.js +1 -0
- zenml/zen_server/dashboard/assets/{page-6mfzecin.js → page-DH_Z7iW1.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-8kYmrh0B.js → page-DIOXwhiD.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BXarY9K2.js → page-DLixvR-7.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DTlGjgnG.js +1 -0
- zenml/zen_server/dashboard/assets/page-Dbpl86h0.js +1 -0
- zenml/zen_server/dashboard/assets/{page-MAXyfXBq.js → page-Ddgy6kDS.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DtCAfBLy.js +9 -0
- zenml/zen_server/dashboard/assets/{page-CKHNAq7z.js → page-Dx16z7nA.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DMSLXKGT.js → page-DzpVUZ8f.js} +1 -1
- zenml/zen_server/dashboard/assets/page-McUyYbo1.js +1 -0
- zenml/zen_server/dashboard/assets/{page-miU2rhYG.js → page-N4qoPHKb.js} +1 -1
- zenml/zen_server/dashboard/assets/page-T1P3RyAR.js +1 -0
- zenml/zen_server/dashboard/assets/{page-3qPX9WYH.js → page-bKaULTGG.js} +1 -1
- zenml/zen_server/dashboard/assets/page-sbXUJy9t.js +1 -0
- zenml/zen_server/dashboard/assets/{persist-CfJMar_k.js → persist-CP0JmYZ4.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-BxIR2XZs.js → persist-DNb5cdrU.js} +1 -1
- zenml/zen_server/dashboard/assets/{plus-Bc8eLSDM.js → plus-C9IxgN2M.js} +1 -1
- zenml/zen_server/dashboard/assets/{refresh-hfgWPeto.js → refresh-BVu22P_C.js} +1 -1
- zenml/zen_server/dashboard/assets/{rocket-SESCGQXm.js → rocket-CONEmRmB.js} +1 -1
- zenml/zen_server/dashboard/assets/{sharedSchema-vub0rii3.js → sharedSchema-TMLu-nYQ.js} +1 -1
- zenml/zen_server/dashboard/assets/stack-detail-query-xmYxSsUY.js +1 -0
- zenml/zen_server/dashboard/assets/{tick-circle-m-hJG8i9.js → tick-circle-CM1ZScbQ.js} +1 -1
- zenml/zen_server/dashboard/assets/{trash-DUWZWzse.js → trash-DkJHMOg7.js} +1 -1
- zenml/zen_server/dashboard/assets/{update-server-settings-mutation-FGVP7X2U.js → update-server-settings-mutation-DsU8cNVl.js} +1 -1
- zenml/zen_server/dashboard/assets/{url-CbAPzsmT.js → url-D5le3J4q.js} +1 -1
- zenml/zen_server/dashboard/assets/zod-D89GC_vc.js +1 -0
- zenml/zen_server/dashboard/index.html +7 -7
- zenml/zen_server/deploy/__init__.py +7 -16
- zenml/zen_server/deploy/base_provider.py +46 -73
- zenml/zen_server/deploy/{local → daemon}/__init__.py +3 -3
- zenml/zen_server/deploy/{local/local_provider.py → daemon/daemon_provider.py} +44 -63
- zenml/zen_server/deploy/{local/local_zen_server.py → daemon/daemon_zen_server.py} +50 -28
- zenml/zen_server/deploy/deployer.py +90 -171
- zenml/zen_server/deploy/deployment.py +20 -12
- zenml/zen_server/deploy/docker/docker_provider.py +9 -28
- zenml/zen_server/deploy/docker/docker_zen_server.py +19 -9
- zenml/zen_server/deploy/helm/Chart.yaml +1 -1
- zenml/zen_server/deploy/helm/README.md +2 -2
- zenml/zen_server/exceptions.py +11 -0
- zenml/zen_server/feature_gate/zenml_cloud_feature_gate.py +1 -1
- zenml/zen_server/jwt.py +9 -9
- zenml/zen_server/routers/artifact_version_endpoints.py +1 -1
- zenml/zen_server/routers/auth_endpoints.py +30 -8
- zenml/zen_server/routers/runs_endpoints.py +0 -28
- zenml/zen_server/routers/stack_components_endpoints.py +1 -1
- zenml/zen_server/routers/workspaces_endpoints.py +1 -1
- zenml/zen_server/template_execution/runner_entrypoint_configuration.py +7 -4
- zenml/zen_server/template_execution/utils.py +8 -63
- zenml/zen_server/utils.py +67 -69
- zenml/zen_server/zen_server_api.py +107 -17
- zenml/zen_stores/base_zen_store.py +4 -51
- zenml/zen_stores/migrations/versions/0.67.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.68.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.68.1_release.py +23 -0
- zenml/zen_stores/migrations/versions/1d8f30c54477_migrate_to_new_.py +124 -0
- zenml/zen_stores/migrations/versions/c22561cbb3a9_add_artifact_unique_constraints.py +86 -0
- zenml/zen_stores/rest_zen_store.py +325 -147
- zenml/zen_stores/schemas/api_key_schemas.py +9 -4
- zenml/zen_stores/schemas/artifact_schemas.py +21 -2
- zenml/zen_stores/schemas/artifact_visualization_schemas.py +1 -1
- zenml/zen_stores/schemas/component_schemas.py +49 -6
- zenml/zen_stores/schemas/device_schemas.py +9 -4
- zenml/zen_stores/schemas/flavor_schemas.py +1 -1
- zenml/zen_stores/schemas/model_schemas.py +1 -1
- zenml/zen_stores/schemas/pipeline_run_schemas.py +12 -4
- zenml/zen_stores/schemas/service_schemas.py +1 -1
- zenml/zen_stores/schemas/step_run_schemas.py +3 -3
- zenml/zen_stores/schemas/trigger_schemas.py +1 -1
- zenml/zen_stores/sql_zen_store.py +422 -145
- zenml/zen_stores/template_utils.py +3 -1
- {zenml_nightly-0.66.0.dev20240927.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/METADATA +20 -18
- {zenml_nightly-0.66.0.dev20240927.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/RECORD +344 -506
- {zenml_nightly-0.66.0.dev20240927.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/WHEEL +1 -1
- zenml/api.py +0 -60
- zenml/cli/stack_recipes.py +0 -469
- zenml/lineage_graph/__init__.py +0 -34
- zenml/lineage_graph/lineage_graph.py +0 -244
- zenml/lineage_graph/node/__init__.py +0 -32
- zenml/lineage_graph/node/artifact_node.py +0 -51
- zenml/lineage_graph/node/step_node.py +0 -41
- zenml/model/model_version.py +0 -38
- zenml/new/pipelines/code_archive.py +0 -157
- zenml/new/pipelines/pipeline_decorator.py +0 -118
- zenml/new/steps/step_decorator.py +0 -176
- zenml/pipelines/base_pipeline.py +0 -273
- zenml/post_execution/__init__.py +0 -30
- zenml/post_execution/pipeline.py +0 -55
- zenml/post_execution/pipeline_run.py +0 -55
- zenml/services/terraform/__init__.py +0 -14
- zenml/services/terraform/terraform_service.py +0 -441
- zenml/steps/external_artifact.py +0 -26
- zenml/steps/step_environment.py +0 -108
- zenml/steps/step_output.py +0 -36
- zenml/utils/mlstacks_utils.py +0 -635
- zenml/utils/terraform_utils.py +0 -43
- zenml/zen_server/dashboard/assets/@radix-DnFH_oo1.js +0 -85
- zenml/zen_server/dashboard/assets/@react-router-APVeuk-U.js +0 -29
- zenml/zen_server/dashboard/assets/@reactflow-ytavUpwh.js +0 -17
- zenml/zen_server/dashboard/assets/@tanstack-QbMbTrh5.js +0 -22
- zenml/zen_server/dashboard/assets/ComponentBadge-gKR1OIwG.js +0 -1
- zenml/zen_server/dashboard/assets/ExecutionStatus-D6r6aK8J.js +0 -1
- zenml/zen_server/dashboard/assets/MarkdownVisualization-DS05sfBm.js +0 -14
- zenml/zen_server/dashboard/assets/SearchField-BzmfxS0L.js +0 -1
- zenml/zen_server/dashboard/assets/all-pipeline-runs-query-BA3R2Sey.js +0 -1
- zenml/zen_server/dashboard/assets/delete-run-CP0pcJ3U.js +0 -1
- zenml/zen_server/dashboard/assets/index-BhJ6ZJxv.css +0 -1
- zenml/zen_server/dashboard/assets/index-Ci0nJ8EZ.js +0 -55
- zenml/zen_server/dashboard/assets/index.esm-BE1uqCX5.js +0 -1
- zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-Df6ckaLK.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-JrS_4yms.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-BRrLR67x.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-DskEQOpE.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-DDpWG8g5.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-iz1--dBq.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-CzG7Kr3z.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-tyfMZHQw.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-DOnSzjnx.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-Xebo2OyJ.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-DpA2xaRd.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-KAwcVx6H.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-400-normal-DQXyrmoy.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-400-normal-DvIPHDQ7.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-500-normal-BjpBGs91.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-500-normal-CmOavsDc.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-600-normal-B-l8Lzzd.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-600-normal-BLZsI-P3.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-CIdlr5YK.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-_Rr29XE2.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-2pdUafRD.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-Dtavx3qw.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-BmtRFZgT.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-CkBLDEl_.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-400-normal-BT1H-PT_.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-400-normal-Cdi8t5Mu.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-500-normal-D4I8BKCx.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-500-normal-kWhwEdDH.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-600-normal-B2Ssfs8e.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-600-normal-Dbvh0wvx.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-8tIzm-yw.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-D3W-OpO-.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-B9u8Q_zH.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-SuUkSNTU.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-Dg0Bk0Yr.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-ao35dkSb.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-Cnt0N5Vm.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-DIOGfGLL.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-0i6yoQMg.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-5IkPJ6Nk.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-BQ_dbMbg.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-DjnxGF-L.woff2 +0 -0
- zenml/zen_server/dashboard/assets/not-found-DbjllLY_.js +0 -1
- zenml/zen_server/dashboard/assets/page-B1n7_W7z.js +0 -1
- zenml/zen_server/dashboard/assets/page-BZZhLo2u.js +0 -1
- zenml/zen_server/dashboard/assets/page-Bbf_oBjn.js +0 -1
- zenml/zen_server/dashboard/assets/page-BjjuBvZG.js +0 -9
- zenml/zen_server/dashboard/assets/page-CHaQkFK5.js +0 -1
- zenml/zen_server/dashboard/assets/page-CS0SYFK8.js +0 -1
- zenml/zen_server/dashboard/assets/page-DGM1CbYT.js +0 -2
- zenml/zen_server/dashboard/assets/page-DOmIZ2ra.js +0 -1
- zenml/zen_server/dashboard/assets/page-DYVmJ9_w.js +0 -3
- zenml/zen_server/dashboard/assets/page-Dwow2doB.js +0 -1
- zenml/zen_server/dashboard/assets/stack-detail-query-DQcyzG-2.js +0 -1
- zenml/zen_server/dashboard/assets/zod-uFd1wBcd.js +0 -1
- zenml/zen_server/dashboard_legacy/_redirects +0 -1
- zenml/zen_server/dashboard_legacy/asset-manifest.json +0 -131
- zenml/zen_server/dashboard_legacy/favicon.ico +0 -0
- zenml/zen_server/dashboard_legacy/index.html +0 -1
- zenml/zen_server/dashboard_legacy/manifest.json +0 -25
- zenml/zen_server/dashboard_legacy/precache-manifest.6d320abb70db612019dda6c4948e7a90.js +0 -462
- zenml/zen_server/dashboard_legacy/robots.txt +0 -2
- zenml/zen_server/dashboard_legacy/service-worker.js +0 -39
- zenml/zen_server/dashboard_legacy/static/css/2.5b37d44a.chunk.css +0 -16
- zenml/zen_server/dashboard_legacy/static/css/2.5b37d44a.chunk.css.map +0 -1
- zenml/zen_server/dashboard_legacy/static/css/main.e79dff04.chunk.css +0 -2
- zenml/zen_server/dashboard_legacy/static/css/main.e79dff04.chunk.css.map +0 -1
- zenml/zen_server/dashboard_legacy/static/js/2.7934458d.chunk.js +0 -3
- zenml/zen_server/dashboard_legacy/static/js/2.7934458d.chunk.js.LICENSE.txt +0 -95
- zenml/zen_server/dashboard_legacy/static/js/2.7934458d.chunk.js.map +0 -1
- zenml/zen_server/dashboard_legacy/static/js/main.fa9299d5.chunk.js +0 -2
- zenml/zen_server/dashboard_legacy/static/js/main.fa9299d5.chunk.js.map +0 -1
- zenml/zen_server/dashboard_legacy/static/js/runtime-main.bfca2edd.js +0 -2
- zenml/zen_server/dashboard_legacy/static/js/runtime-main.bfca2edd.js.map +0 -1
- zenml/zen_server/dashboard_legacy/static/media/AlertTriangle.28aee535.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/ArrowSquareOut.abfb9bc7.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/Back.86c23a22.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/BookOpen.5cb101ff.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/BoundingBox.1eb98717.svg +0 -10
- zenml/zen_server/dashboard_legacy/static/media/Burger.9b1c67d7.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Cached.2381fb8d.svg +0 -1
- zenml/zen_server/dashboard_legacy/static/media/Calendar.356e11c7.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/ChartBarHorizontal.0247447b.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/ChartLine.0d79e18d.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/ChatDots.2e1c9211.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/Check.dad6beb2.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/CheckCircleFilled.c19566d0.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Checkbox.af50e31e.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/ChevronDown.f860ce32.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/ChevronDownLight.6642d756.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/ChevronLeft.f6edfcdb.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/CircleCheck.f98fd6ca.svg +0 -1
- zenml/zen_server/dashboard_legacy/static/media/Clock.ffc9de95.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Close.74e9efbc.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/CloseWithBorder.6960930a.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/CloseWithoutBorder.cd6f71df.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/CloudArrowUp.0aecb235.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/Code.ef0f33b5.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Config.0be63f8a.svg +0 -1
- zenml/zen_server/dashboard_legacy/static/media/Connector.9fd46ef1.svg +0 -10
- zenml/zen_server/dashboard_legacy/static/media/Copy.36e2112a.svg +0 -1
- zenml/zen_server/dashboard_legacy/static/media/Dashboard.d05787e0.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Data.b1c3b5f8.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Delete.3c361b28.svg +0 -8
- zenml/zen_server/dashboard_legacy/static/media/Docs.7541d478.svg +0 -7
- zenml/zen_server/dashboard_legacy/static/media/Download.fba04d87.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/Edit.490eb294.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/EmptyRightArrow.23749d01.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Example.6396cd37.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/Extension.1394cd4a.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Eye.d9e4ee62.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/Failed.0213c1a0.svg +0 -1
- zenml/zen_server/dashboard_legacy/static/media/FileText.1f15bacd.svg +0 -7
- zenml/zen_server/dashboard_legacy/static/media/Filter.ab6b9c0d.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Folders.12b29887.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/FunnelFill.6df4c143.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/GitCommit.7dd9c2aa.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/GitHub_Logo.cefc2023.png +0 -0
- zenml/zen_server/dashboard_legacy/static/media/Graph.2c63a892.svg +0 -11
- zenml/zen_server/dashboard_legacy/static/media/History.08329240.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Home.0843b0d5.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/ImageBuilder.ea762d9c.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/InProgress.304a0edc.svg +0 -1
- zenml/zen_server/dashboard_legacy/static/media/Info.9fe10c5c.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/KeyboardReturn.491afbe3.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Link.72bbb55d.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/Lock.30f5e1fe.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/Lock2.a769ea52.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/LockKey.92f21621.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/Logs.8bf4d005.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/MinusCircle.4188f418.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/ModelRegistry.f0de050a.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/MultiUser.a2ba7c67.svg +0 -10
- zenml/zen_server/dashboard_legacy/static/media/PaginationFirst.92628634.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/PaginationLast.00d3c732.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/PaginationNext.86158845.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/PaginationPrev.60c18a88.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Pen.f2d831d4.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/PhotoCamera.179d6d4c.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Pipeline.30d298b0.svg +0 -7
- zenml/zen_server/dashboard_legacy/static/media/Plus.5aa1c16b.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/PlusCircle.92d860dd.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/Repositories.71a36b8c.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/RightArrow.f30d3871.svg +0 -29
- zenml/zen_server/dashboard_legacy/static/media/Rocket.63bf7b9d.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/RocketLaunch.1bff2b59.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/Rubik-Medium.c87313aa.ttf +0 -0
- zenml/zen_server/dashboard_legacy/static/media/Rubik-Regular.b3d0902b.ttf +0 -0
- zenml/zen_server/dashboard_legacy/static/media/Run.daec4fb2.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/Search.d1afcce5.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/Settings.59ca73ae.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/Share2.46c3ff66.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/SignOut.6aa718c5.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/SimplePlus.5cf7ec20.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/SingleUser.bef3a095.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/SourceCodePro-Regular.b484b32f.ttf +0 -0
- zenml/zen_server/dashboard_legacy/static/media/Stack.19b604ac.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/StackComponent.b1ba90b5.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/Star.f0c25022.svg +0 -9
- zenml/zen_server/dashboard_legacy/static/media/StarOutline.94ca8cd9.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Storefront.4b4796fe.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Stream.543e3039.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/SupportAgent.510ddf1f.svg +0 -8
- zenml/zen_server/dashboard_legacy/static/media/Table.77033750.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/Tool.d5785486.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/UserPlus.741a99d7.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/Verified.0625b2a0.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/addNew.4fb6c939.svg +0 -8
- zenml/zen_server/dashboard_legacy/static/media/arrowClose.cbd53f3f.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/arrowOpen.6ceef0af.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/check_small.30bc0138.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/circleArrowSideClose.98d6013e.svg +0 -18
- zenml/zen_server/dashboard_legacy/static/media/circleArrowSideOpen.63653df6.svg +0 -18
- zenml/zen_server/dashboard_legacy/static/media/image.104fd14b.png +0 -0
- zenml/zen_server/dashboard_legacy/static/media/imageAddIcon.e83004a9.svg +0 -7
- zenml/zen_server/dashboard_legacy/static/media/logo.93333e5c.svg +0 -1
- zenml/zen_server/dashboard_legacy/static/media/logo_small.4204397d.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/logo_white.d4b4414e.svg +0 -20
- zenml/zen_server/dashboard_legacy/static/media/notConnected.5e2c8ea7.svg +0 -8
- zenml/zen_server/dashboard_legacy/static/media/plugin-fallback.72c294e6.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/share.bcd998b0.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/stars.08a9b19a.svg +0 -8
- zenml/zen_server/deploy/terraform/__init__.py +0 -41
- zenml/zen_server/deploy/terraform/providers/aws_provider.py +0 -61
- zenml/zen_server/deploy/terraform/providers/azure_provider.py +0 -59
- zenml/zen_server/deploy/terraform/providers/gcp_provider.py +0 -59
- zenml/zen_server/deploy/terraform/providers/terraform_provider.py +0 -331
- zenml/zen_server/deploy/terraform/recipes/aws/.gitignore +0 -8
- zenml/zen_server/deploy/terraform/recipes/aws/helm.tf +0 -20
- zenml/zen_server/deploy/terraform/recipes/aws/ingress.tf +0 -30
- zenml/zen_server/deploy/terraform/recipes/aws/outputs.tf +0 -7
- zenml/zen_server/deploy/terraform/recipes/aws/printf.cmd +0 -2
- zenml/zen_server/deploy/terraform/recipes/aws/sql.tf +0 -62
- zenml/zen_server/deploy/terraform/recipes/aws/terraform.tf +0 -44
- zenml/zen_server/deploy/terraform/recipes/aws/variables.tf +0 -167
- zenml/zen_server/deploy/terraform/recipes/aws/vpc.tf +0 -47
- zenml/zen_server/deploy/terraform/recipes/aws/zen_server.tf +0 -103
- zenml/zen_server/deploy/terraform/recipes/azure/.gitignore +0 -8
- zenml/zen_server/deploy/terraform/recipes/azure/helm.tf +0 -20
- zenml/zen_server/deploy/terraform/recipes/azure/ingress.tf +0 -30
- zenml/zen_server/deploy/terraform/recipes/azure/key_vault.tf +0 -73
- zenml/zen_server/deploy/terraform/recipes/azure/outputs.tf +0 -7
- zenml/zen_server/deploy/terraform/recipes/azure/printf.cmd +0 -2
- zenml/zen_server/deploy/terraform/recipes/azure/rg.tf +0 -36
- zenml/zen_server/deploy/terraform/recipes/azure/sql.tf +0 -65
- zenml/zen_server/deploy/terraform/recipes/azure/terraform.tf +0 -52
- zenml/zen_server/deploy/terraform/recipes/azure/variables.tf +0 -176
- zenml/zen_server/deploy/terraform/recipes/azure/zen_server.tf +0 -103
- zenml/zen_server/deploy/terraform/recipes/gcp/.gitignore +0 -8
- zenml/zen_server/deploy/terraform/recipes/gcp/helm.tf +0 -20
- zenml/zen_server/deploy/terraform/recipes/gcp/ingress.tf +0 -30
- zenml/zen_server/deploy/terraform/recipes/gcp/outputs.tf +0 -7
- zenml/zen_server/deploy/terraform/recipes/gcp/printf.cmd +0 -2
- zenml/zen_server/deploy/terraform/recipes/gcp/sql.tf +0 -64
- zenml/zen_server/deploy/terraform/recipes/gcp/terraform.tf +0 -44
- zenml/zen_server/deploy/terraform/recipes/gcp/variables.tf +0 -171
- zenml/zen_server/deploy/terraform/recipes/gcp/zen_server.tf +0 -114
- zenml/zen_server/deploy/terraform/terraform_zen_server.py +0 -246
- /zenml/{new/pipelines → pipelines}/build_utils.py +0 -0
- /zenml/{new/steps → steps}/decorated_step.py +0 -0
- {zenml_nightly-0.66.0.dev20240927.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.66.0.dev20240927.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/entry_points.txt +0 -0
@@ -24,12 +24,20 @@ from zenml.integrations.bentoml.flavors.bentoml_model_deployer_flavor import (
|
|
24
24
|
BentoMLModelDeployerConfig,
|
25
25
|
BentoMLModelDeployerFlavor,
|
26
26
|
)
|
27
|
-
from zenml.integrations.bentoml.services.
|
28
|
-
|
29
|
-
|
27
|
+
from zenml.integrations.bentoml.services.bentoml_container_deployment import (
|
28
|
+
BENTOML_CONTAINER_DEPLOYMENT_SERVICE_NAME,
|
29
|
+
BentoMLContainerDeploymentConfig,
|
30
|
+
BentoMLContainerDeploymentService,
|
31
|
+
)
|
32
|
+
from zenml.integrations.bentoml.services.bentoml_local_deployment import (
|
33
|
+
BENTOML_LOCAL_DEPLOYMENT_SERVICE_NAME,
|
34
|
+
BentoMLLocalDeploymentConfig,
|
35
|
+
BentoMLLocalDeploymentService,
|
30
36
|
)
|
31
37
|
from zenml.logger import get_logger
|
32
38
|
from zenml.model_deployers import BaseModelDeployer, BaseModelDeployerFlavor
|
39
|
+
from zenml.services.container.container_service import ContainerServiceStatus
|
40
|
+
from zenml.services.local.local_service import LocalDaemonServiceStatus
|
33
41
|
from zenml.services.service import BaseService, ServiceConfig
|
34
42
|
from zenml.utils.io_utils import create_dir_recursive_if_not_exists
|
35
43
|
|
@@ -100,8 +108,8 @@ class BentoMLModelDeployer(BaseModelDeployer):
|
|
100
108
|
return self._service_path
|
101
109
|
|
102
110
|
@staticmethod
|
103
|
-
def get_model_server_info(
|
104
|
-
service_instance:
|
111
|
+
def get_model_server_info(
|
112
|
+
service_instance: BaseService,
|
105
113
|
) -> Dict[str, Optional[str]]:
|
106
114
|
"""Return implementation specific information on the model server.
|
107
115
|
|
@@ -110,26 +118,61 @@ class BentoMLModelDeployer(BaseModelDeployer):
|
|
110
118
|
|
111
119
|
Returns:
|
112
120
|
A dictionary containing the model server information.
|
121
|
+
|
122
|
+
Raises:
|
123
|
+
ValueError: If the service type is not supported.
|
113
124
|
"""
|
125
|
+
if (
|
126
|
+
service_instance.SERVICE_TYPE.name
|
127
|
+
== BENTOML_CONTAINER_DEPLOYMENT_SERVICE_NAME
|
128
|
+
):
|
129
|
+
service_instance = cast(
|
130
|
+
BentoMLContainerDeploymentService, service_instance
|
131
|
+
)
|
132
|
+
elif (
|
133
|
+
service_instance.SERVICE_TYPE.name
|
134
|
+
== BENTOML_LOCAL_DEPLOYMENT_SERVICE_NAME
|
135
|
+
):
|
136
|
+
service_instance = cast(
|
137
|
+
BentoMLLocalDeploymentService, service_instance
|
138
|
+
)
|
139
|
+
else:
|
140
|
+
raise ValueError(
|
141
|
+
f"Unsupported service type: {service_instance.SERVICE_TYPE.name}"
|
142
|
+
)
|
143
|
+
|
114
144
|
predictions_apis_urls = ""
|
115
|
-
if service_instance.prediction_apis_urls is not None:
|
145
|
+
if service_instance.prediction_apis_urls is not None: # type: ignore
|
116
146
|
predictions_apis_urls = ", ".join(
|
117
147
|
[
|
118
148
|
api
|
119
|
-
for api in service_instance.prediction_apis_urls
|
149
|
+
for api in service_instance.prediction_apis_urls # type: ignore
|
120
150
|
if api is not None
|
121
151
|
]
|
122
152
|
)
|
123
153
|
|
154
|
+
service_config = service_instance.config
|
155
|
+
assert isinstance(
|
156
|
+
service_config,
|
157
|
+
(BentoMLLocalDeploymentConfig, BentoMLContainerDeploymentConfig),
|
158
|
+
)
|
159
|
+
|
160
|
+
service_status = service_instance.status
|
161
|
+
assert isinstance(
|
162
|
+
service_status, (ContainerServiceStatus, LocalDaemonServiceStatus)
|
163
|
+
)
|
164
|
+
|
124
165
|
return {
|
125
166
|
"HEALTH_CHECK_URL": service_instance.get_healthcheck_url(),
|
126
167
|
"PREDICTION_URL": service_instance.get_prediction_url(),
|
127
|
-
"BENTO_TAG":
|
128
|
-
"MODEL_NAME":
|
129
|
-
"MODEL_URI":
|
130
|
-
"BENTO_URI":
|
131
|
-
"SERVICE_PATH":
|
132
|
-
"DAEMON_PID": str(
|
168
|
+
"BENTO_TAG": service_config.bento_tag,
|
169
|
+
"MODEL_NAME": service_config.model_name,
|
170
|
+
"MODEL_URI": service_config.model_uri,
|
171
|
+
"BENTO_URI": service_config.bento_uri,
|
172
|
+
"SERVICE_PATH": service_status.runtime_path,
|
173
|
+
"DAEMON_PID": str(service_status.pid)
|
174
|
+
if hasattr(service_status, "pid")
|
175
|
+
else None,
|
133
176
|
"PREDICTION_APIS_URLS": predictions_apis_urls,
|
134
177
|
}
|
135
178
|
|
@@ -179,7 +222,6 @@ class BentoMLModelDeployer(BaseModelDeployer):
|
|
179
222
|
The ZenML BentoML deployment service object that can be used to
|
180
223
|
interact with the BentoML model http server.
|
181
224
|
"""
|
182
|
-
config = cast(BentoMLDeploymentConfig, config)
|
183
225
|
service = self._create_new_service(
|
184
226
|
id=id, timeout=timeout, config=config
|
185
227
|
)
|
@@ -190,11 +232,20 @@ class BentoMLModelDeployer(BaseModelDeployer):
|
|
190
232
|
self,
|
191
233
|
timeout: int,
|
192
234
|
force: bool,
|
193
|
-
existing_service:
|
235
|
+
existing_service: BaseService,
|
194
236
|
) -> None:
|
195
237
|
# stop the older service
|
196
238
|
existing_service.stop(timeout=timeout, force=force)
|
197
239
|
|
240
|
+
# assert that the service is either a BentoMLLocalDeploymentService or a BentoMLContainerDeploymentService
|
241
|
+
if not isinstance(
|
242
|
+
existing_service,
|
243
|
+
(BentoMLLocalDeploymentService, BentoMLContainerDeploymentService),
|
244
|
+
):
|
245
|
+
raise ValueError(
|
246
|
+
f"Unsupported service type: {type(existing_service)}"
|
247
|
+
)
|
248
|
+
|
198
249
|
# delete the old configuration file
|
199
250
|
if existing_service.status.runtime_path:
|
200
251
|
shutil.rmtree(existing_service.status.runtime_path)
|
@@ -203,8 +254,8 @@ class BentoMLModelDeployer(BaseModelDeployer):
|
|
203
254
|
# of workers etc.the step implementation will create a new config using
|
204
255
|
# all values from the user and add values like pipeline name, model_uri
|
205
256
|
def _create_new_service(
|
206
|
-
self, id: UUID, timeout: int, config:
|
207
|
-
) ->
|
257
|
+
self, id: UUID, timeout: int, config: ServiceConfig
|
258
|
+
) -> BaseService:
|
208
259
|
"""Creates a new BentoMLDeploymentService.
|
209
260
|
|
210
261
|
Args:
|
@@ -216,11 +267,27 @@ class BentoMLModelDeployer(BaseModelDeployer):
|
|
216
267
|
Returns:
|
217
268
|
The BentoMLDeploymentService object that can be used to interact
|
218
269
|
with the BentoML model server.
|
270
|
+
|
271
|
+
Raises:
|
272
|
+
ValueError: If the service type is not supported.
|
219
273
|
"""
|
274
|
+
assert isinstance(
|
275
|
+
config,
|
276
|
+
(BentoMLLocalDeploymentConfig, BentoMLContainerDeploymentConfig),
|
277
|
+
)
|
220
278
|
# set the root runtime path with the stack component's UUID
|
221
279
|
config.root_runtime_path = self.local_path
|
222
280
|
# create a new service for the new model
|
223
|
-
|
281
|
+
# if the config is of type BentoMLLocalDeploymentConfig, create a
|
282
|
+
# BentoMLLocalDeploymentService, otherwise create a
|
283
|
+
# BentoMLContainerDeploymentService
|
284
|
+
service: BaseService
|
285
|
+
if isinstance(config, BentoMLLocalDeploymentConfig):
|
286
|
+
service = BentoMLLocalDeploymentService(uuid=id, config=config)
|
287
|
+
elif isinstance(config, BentoMLContainerDeploymentConfig):
|
288
|
+
service = BentoMLContainerDeploymentService(uuid=id, config=config)
|
289
|
+
else:
|
290
|
+
raise ValueError(f"Unsupported service type: {type(config)}")
|
224
291
|
service.start(timeout=timeout)
|
225
292
|
|
226
293
|
return service
|
@@ -274,7 +341,6 @@ class BentoMLModelDeployer(BaseModelDeployer):
|
|
274
341
|
timeout: Timeout in seconds to wait for the service to stop.
|
275
342
|
force: If True, force the service to stop.
|
276
343
|
"""
|
277
|
-
service = cast(BentoMLDeploymentService, service)
|
278
344
|
self._clean_up_existing_service(
|
279
345
|
existing_service=service, timeout=timeout, force=force
|
280
346
|
)
|
@@ -13,9 +13,20 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Initialization for BentoML services."""
|
15
15
|
|
16
|
-
from zenml.integrations.bentoml.services.
|
17
|
-
|
18
|
-
|
16
|
+
from zenml.integrations.bentoml.services.bentoml_local_deployment import ( # noqa
|
17
|
+
BentoMLLocalDeploymentConfig,
|
18
|
+
BentoMLLocalDeploymentService,
|
19
19
|
)
|
20
|
+
from zenml.integrations.bentoml.services.bentoml_container_deployment import ( # noqa
|
21
|
+
BentoMLContainerDeploymentConfig,
|
22
|
+
BentoMLContainerDeploymentService,
|
23
|
+
)
|
24
|
+
from zenml.integrations.bentoml.services.deployment_type import BentoMLDeploymentType
|
20
25
|
|
21
|
-
__all__ = [
|
26
|
+
__all__ = [
|
27
|
+
"BentoMLLocalDeploymentConfig",
|
28
|
+
"BentoMLLocalDeploymentService",
|
29
|
+
"BentoMLContainerDeploymentConfig",
|
30
|
+
"BentoMLContainerDeploymentService",
|
31
|
+
"BentoMLDeploymentType",
|
32
|
+
]
|
@@ -0,0 +1,399 @@
|
|
1
|
+
# Copyright (c) ZenML GmbH 2024. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at:
|
6
|
+
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
12
|
+
# or implied. See the License for the specific language governing
|
13
|
+
# permissions and limitations under the License.
|
14
|
+
"""Implementation for the BentoML container deployment service."""
|
15
|
+
|
16
|
+
import os
|
17
|
+
import sys
|
18
|
+
from typing import Any, Dict, List, Optional, Union
|
19
|
+
|
20
|
+
import bentoml
|
21
|
+
import docker.errors as docker_errors
|
22
|
+
from bentoml.client import Client
|
23
|
+
|
24
|
+
from zenml.client import Client as ZenMLClient
|
25
|
+
from zenml.constants import DEFAULT_LOCAL_SERVICE_IP_ADDRESS
|
26
|
+
from zenml.integrations.bentoml.constants import (
|
27
|
+
BENTOML_DEFAULT_PORT,
|
28
|
+
BENTOML_HEALTHCHECK_URL_PATH,
|
29
|
+
BENTOML_PREDICTION_URL_PATH,
|
30
|
+
)
|
31
|
+
from zenml.logger import get_logger
|
32
|
+
from zenml.services.container.container_service import (
|
33
|
+
ContainerService,
|
34
|
+
ContainerServiceConfig,
|
35
|
+
)
|
36
|
+
from zenml.services.container.container_service_endpoint import (
|
37
|
+
ContainerServiceEndpoint,
|
38
|
+
ContainerServiceEndpointConfig,
|
39
|
+
)
|
40
|
+
from zenml.services.service import BaseDeploymentService
|
41
|
+
from zenml.services.service_endpoint import ServiceEndpointProtocol
|
42
|
+
from zenml.services.service_monitor import (
|
43
|
+
HTTPEndpointHealthMonitor,
|
44
|
+
HTTPEndpointHealthMonitorConfig,
|
45
|
+
)
|
46
|
+
from zenml.services.service_status import ServiceState
|
47
|
+
from zenml.services.service_type import ServiceType
|
48
|
+
|
49
|
+
logger = get_logger(__name__)
|
50
|
+
|
51
|
+
BENTOML_CONTAINER_DEPLOYMENT_SERVICE_NAME = "bentoml-container-deployment"
|
52
|
+
|
53
|
+
|
54
|
+
class BentoMLContainerDeploymentConfig(ContainerServiceConfig):
|
55
|
+
"""BentoML container deployment configuration."""
|
56
|
+
|
57
|
+
model_name: str
|
58
|
+
model_uri: str
|
59
|
+
bento_tag: str
|
60
|
+
bento_uri: Optional[str] = None
|
61
|
+
platform: Optional[str] = None
|
62
|
+
image: str = ""
|
63
|
+
image_tag: Optional[str] = None
|
64
|
+
features: Optional[List[str]] = None
|
65
|
+
file: Optional[str] = None
|
66
|
+
apis: List[str] = []
|
67
|
+
working_dir: Optional[str] = None
|
68
|
+
workers: int = 1
|
69
|
+
backlog: int = 2048
|
70
|
+
host: Optional[str] = None
|
71
|
+
port: Optional[int] = None
|
72
|
+
|
73
|
+
|
74
|
+
class BentoMLContainerDeploymentEndpointConfig(ContainerServiceEndpointConfig):
|
75
|
+
"""BentoML container deployment service configuration.
|
76
|
+
|
77
|
+
Attributes:
|
78
|
+
prediction_url_path: URI subpath for prediction requests
|
79
|
+
"""
|
80
|
+
|
81
|
+
prediction_url_path: str
|
82
|
+
|
83
|
+
|
84
|
+
class BentoMLContainerDeploymentEndpoint(ContainerServiceEndpoint):
|
85
|
+
"""A service endpoint exposed by the BentoML container deployment service.
|
86
|
+
|
87
|
+
Attributes:
|
88
|
+
config: service endpoint configuration
|
89
|
+
"""
|
90
|
+
|
91
|
+
config: BentoMLContainerDeploymentEndpointConfig
|
92
|
+
|
93
|
+
@property
|
94
|
+
def prediction_url(self) -> Optional[str]:
|
95
|
+
"""Gets the prediction URL for the endpoint.
|
96
|
+
|
97
|
+
Returns:
|
98
|
+
the prediction URL for the endpoint
|
99
|
+
"""
|
100
|
+
uri = self.status.uri
|
101
|
+
if not uri:
|
102
|
+
return None
|
103
|
+
return os.path.join(uri, self.config.prediction_url_path)
|
104
|
+
|
105
|
+
|
106
|
+
class BentoMLContainerDeploymentService(
|
107
|
+
ContainerService, BaseDeploymentService
|
108
|
+
):
|
109
|
+
"""BentoML container deployment service."""
|
110
|
+
|
111
|
+
SERVICE_TYPE = ServiceType(
|
112
|
+
name=BENTOML_CONTAINER_DEPLOYMENT_SERVICE_NAME,
|
113
|
+
type="model-serving",
|
114
|
+
flavor="bentoml",
|
115
|
+
description="BentoML container prediction service",
|
116
|
+
logo_url="https://public-flavor-logos.s3.eu-central-1.amazonaws.com/model_deployer/bentoml.png",
|
117
|
+
)
|
118
|
+
|
119
|
+
config: BentoMLContainerDeploymentConfig
|
120
|
+
endpoint: BentoMLContainerDeploymentEndpoint
|
121
|
+
|
122
|
+
def __init__(
|
123
|
+
self,
|
124
|
+
config: Union[BentoMLContainerDeploymentConfig, Dict[str, Any]],
|
125
|
+
**attrs: Any,
|
126
|
+
) -> None:
|
127
|
+
"""Initialize the BentoML deployment service.
|
128
|
+
|
129
|
+
Args:
|
130
|
+
config: service configuration
|
131
|
+
attrs: additional attributes to set on the service
|
132
|
+
"""
|
133
|
+
# ensure that the endpoint is created before the service is initialized
|
134
|
+
# TODO [ENG-700]: implement a service factory or builder for BentoML
|
135
|
+
# deployment services
|
136
|
+
if (
|
137
|
+
isinstance(config, BentoMLContainerDeploymentConfig)
|
138
|
+
and "endpoint" not in attrs
|
139
|
+
):
|
140
|
+
endpoint = BentoMLContainerDeploymentEndpoint(
|
141
|
+
config=BentoMLContainerDeploymentEndpointConfig(
|
142
|
+
protocol=ServiceEndpointProtocol.HTTP,
|
143
|
+
port=config.port or BENTOML_DEFAULT_PORT,
|
144
|
+
ip_address=config.host or DEFAULT_LOCAL_SERVICE_IP_ADDRESS,
|
145
|
+
prediction_url_path=BENTOML_PREDICTION_URL_PATH,
|
146
|
+
),
|
147
|
+
monitor=HTTPEndpointHealthMonitor(
|
148
|
+
config=HTTPEndpointHealthMonitorConfig(
|
149
|
+
healthcheck_uri_path=BENTOML_HEALTHCHECK_URL_PATH,
|
150
|
+
)
|
151
|
+
),
|
152
|
+
)
|
153
|
+
attrs["endpoint"] = endpoint
|
154
|
+
super().__init__(config=config, **attrs)
|
155
|
+
|
156
|
+
# override the is_running property to check if the bentoml container is running
|
157
|
+
@property
|
158
|
+
def is_running(self) -> bool:
|
159
|
+
"""Check if the service is currently running.
|
160
|
+
|
161
|
+
This method will actively poll the external service to get its status
|
162
|
+
and will return the result.
|
163
|
+
|
164
|
+
Returns:
|
165
|
+
True if the service is running and active (i.e. the endpoints are
|
166
|
+
responsive, if any are configured), otherwise False.
|
167
|
+
"""
|
168
|
+
self.update_status()
|
169
|
+
return self.status.state == ServiceState.ACTIVE
|
170
|
+
|
171
|
+
# override the container start method to use the root user
|
172
|
+
def _start_container(self) -> None:
|
173
|
+
"""Start the service docker container associated with this service."""
|
174
|
+
container = self.container
|
175
|
+
|
176
|
+
if container:
|
177
|
+
# the container exists, check if it is running
|
178
|
+
if container.status == "running":
|
179
|
+
logger.debug(
|
180
|
+
"Container for service '%s' is already running",
|
181
|
+
self,
|
182
|
+
)
|
183
|
+
return
|
184
|
+
|
185
|
+
# the container is stopped or in an error state, remove it
|
186
|
+
logger.debug(
|
187
|
+
"Removing previous container for service '%s'",
|
188
|
+
self,
|
189
|
+
)
|
190
|
+
container.remove(force=True)
|
191
|
+
|
192
|
+
logger.debug("Starting container for service '%s'...", self)
|
193
|
+
|
194
|
+
try:
|
195
|
+
self.docker_client.images.get(self.config.image)
|
196
|
+
except docker_errors.ImageNotFound:
|
197
|
+
logger.debug(
|
198
|
+
"Pulling container image '%s' for service '%s'...",
|
199
|
+
self.config.image,
|
200
|
+
self,
|
201
|
+
)
|
202
|
+
self.docker_client.images.pull(self.config.image)
|
203
|
+
|
204
|
+
self._setup_runtime_path()
|
205
|
+
|
206
|
+
ports: Dict[int, Optional[int]] = {}
|
207
|
+
if self.endpoint:
|
208
|
+
self.endpoint.prepare_for_start()
|
209
|
+
if self.endpoint.status.port:
|
210
|
+
ports[self.endpoint.status.port] = self.endpoint.status.port
|
211
|
+
|
212
|
+
command, env = self._get_container_cmd()
|
213
|
+
volumes = self._get_container_volumes()
|
214
|
+
|
215
|
+
try:
|
216
|
+
container = self.docker_client.containers.run(
|
217
|
+
name=self.container_id,
|
218
|
+
image=self.config.image,
|
219
|
+
entrypoint=command,
|
220
|
+
detach=True,
|
221
|
+
volumes=volumes,
|
222
|
+
environment=env,
|
223
|
+
remove=False,
|
224
|
+
auto_remove=False,
|
225
|
+
ports=ports,
|
226
|
+
user="root",
|
227
|
+
labels={
|
228
|
+
"zenml-service-uuid": str(self.uuid),
|
229
|
+
},
|
230
|
+
working_dir="/home/bentoml/bento",
|
231
|
+
extra_hosts={"host.docker.internal": "host-gateway"},
|
232
|
+
)
|
233
|
+
|
234
|
+
logger.debug(
|
235
|
+
"Docker container for service '%s' started with ID: %s",
|
236
|
+
self,
|
237
|
+
self.container_id,
|
238
|
+
)
|
239
|
+
except docker_errors.DockerException as e:
|
240
|
+
logger.error(
|
241
|
+
"Docker container for service '%s' failed to start: %s",
|
242
|
+
self,
|
243
|
+
e,
|
244
|
+
)
|
245
|
+
|
246
|
+
def _containerize_and_push_bento(self) -> None:
|
247
|
+
"""Containerize the bento and push it to the container registry.
|
248
|
+
|
249
|
+
Raises:
|
250
|
+
Exception: If the bento containerization fails.
|
251
|
+
"""
|
252
|
+
zenml_client = ZenMLClient()
|
253
|
+
container_registry = zenml_client.active_stack.container_registry
|
254
|
+
# a tuple of config image and image tag
|
255
|
+
if self.config.image and self.config.image_tag:
|
256
|
+
image_tag = (self.config.image, self.config.image_tag)
|
257
|
+
else:
|
258
|
+
# if container registry is present in the stack, name the image
|
259
|
+
# with the container registry uri, else name the image with the bento tag
|
260
|
+
if container_registry:
|
261
|
+
image_name = (
|
262
|
+
f"{container_registry.config.uri}/{self.config.bento_tag}"
|
263
|
+
)
|
264
|
+
image_tag = (image_name,) # type: ignore
|
265
|
+
self.config.image = image_name
|
266
|
+
else:
|
267
|
+
# bentoml will use the bento tag as the name of the image
|
268
|
+
image_tag = (self.config.bento_tag,) # type: ignore
|
269
|
+
self.config.image = self.config.bento_tag
|
270
|
+
try:
|
271
|
+
bentoml.container.build(
|
272
|
+
bento_tag=self.config.bento_tag,
|
273
|
+
backend="docker", # hardcoding docker since container service only supports docker
|
274
|
+
image_tag=image_tag,
|
275
|
+
features=self.config.features,
|
276
|
+
file=self.config.file,
|
277
|
+
platform=self.config.platform,
|
278
|
+
)
|
279
|
+
|
280
|
+
except Exception as e:
|
281
|
+
logger.error(f"Error containerizing the bento: {e}")
|
282
|
+
raise e
|
283
|
+
|
284
|
+
if container_registry:
|
285
|
+
logger.info(
|
286
|
+
f"Pushing bento to container registry {container_registry.config.uri}"
|
287
|
+
)
|
288
|
+
# push the bento to the image registry
|
289
|
+
container_registry.push_image(self.config.image)
|
290
|
+
else:
|
291
|
+
logger.warning(
|
292
|
+
"No container registry found in the active stack. "
|
293
|
+
"Please add a container registry to your stack to push "
|
294
|
+
"the bento to an image registry."
|
295
|
+
)
|
296
|
+
|
297
|
+
def provision(self) -> None:
|
298
|
+
"""Provision the service."""
|
299
|
+
# containerize the bento
|
300
|
+
self._containerize_and_push_bento()
|
301
|
+
# run the container
|
302
|
+
super().provision()
|
303
|
+
|
304
|
+
def run(self) -> None:
|
305
|
+
"""Start the service.
|
306
|
+
|
307
|
+
Raises:
|
308
|
+
FileNotFoundError: If the bento file is not found.
|
309
|
+
subprocess.CalledProcessError: If the bentoml serve command fails.
|
310
|
+
"""
|
311
|
+
from bentoml._internal.service.loader import load
|
312
|
+
|
313
|
+
logger.info("Starting BentoML container deployment service...")
|
314
|
+
|
315
|
+
self.endpoint.prepare_for_start()
|
316
|
+
|
317
|
+
if self.config.working_dir is None:
|
318
|
+
if os.path.isdir(os.path.expanduser(self.config.bento_tag)):
|
319
|
+
self.config.working_dir = os.path.expanduser(
|
320
|
+
self.config.bento_tag
|
321
|
+
)
|
322
|
+
else:
|
323
|
+
self.config.working_dir = "."
|
324
|
+
if sys.path[0] != self.config.working_dir:
|
325
|
+
sys.path.insert(0, self.config.working_dir)
|
326
|
+
|
327
|
+
_ = load(bento_identifier=".", working_dir=self.config.working_dir)
|
328
|
+
# run bentoml serve command inside the container
|
329
|
+
# Use subprocess for better control and error handling
|
330
|
+
import subprocess
|
331
|
+
|
332
|
+
try:
|
333
|
+
subprocess.run(["bentoml", "serve"], check=True)
|
334
|
+
except subprocess.CalledProcessError as e:
|
335
|
+
logger.error(f"Failed to start BentoML service: {e}")
|
336
|
+
raise
|
337
|
+
except FileNotFoundError:
|
338
|
+
logger.error(
|
339
|
+
"BentoML command not found. Make sure it's installed and in the PATH."
|
340
|
+
)
|
341
|
+
raise
|
342
|
+
|
343
|
+
@property
|
344
|
+
def prediction_url(self) -> Optional[str]:
|
345
|
+
"""Get the URI where the http server is running.
|
346
|
+
|
347
|
+
Returns:
|
348
|
+
The URI where the http service can be accessed to get more information
|
349
|
+
about the service and to make predictions.
|
350
|
+
"""
|
351
|
+
if not self.is_running:
|
352
|
+
return None
|
353
|
+
return self.endpoint.prediction_url
|
354
|
+
|
355
|
+
@property
|
356
|
+
def prediction_apis_urls(self) -> Optional[List[str]]:
|
357
|
+
"""Get the URI where the prediction api services is answering requests.
|
358
|
+
|
359
|
+
Returns:
|
360
|
+
The URI where the prediction service apis can be contacted to process
|
361
|
+
HTTP/REST inference requests, or None, if the service isn't running.
|
362
|
+
"""
|
363
|
+
if not self.is_running:
|
364
|
+
return None
|
365
|
+
|
366
|
+
if self.config.apis:
|
367
|
+
return [
|
368
|
+
f"{self.endpoint.prediction_url}/{api}"
|
369
|
+
for api in self.config.apis
|
370
|
+
]
|
371
|
+
return None
|
372
|
+
|
373
|
+
def predict(self, api_endpoint: str, data: Any) -> Any:
|
374
|
+
"""Make a prediction using the service.
|
375
|
+
|
376
|
+
Args:
|
377
|
+
data: data to make a prediction on
|
378
|
+
api_endpoint: the api endpoint to make the prediction on
|
379
|
+
|
380
|
+
Returns:
|
381
|
+
The prediction result.
|
382
|
+
|
383
|
+
Raises:
|
384
|
+
Exception: if the service is not running
|
385
|
+
ValueError: if the prediction endpoint is unknown.
|
386
|
+
"""
|
387
|
+
if not self.is_running:
|
388
|
+
raise Exception(
|
389
|
+
"BentoML prediction service is not running. "
|
390
|
+
"Please start the service before making predictions."
|
391
|
+
)
|
392
|
+
if self.endpoint.prediction_url is not None:
|
393
|
+
client = Client.from_url(
|
394
|
+
self.endpoint.prediction_url.replace("http://", "").rstrip("/")
|
395
|
+
)
|
396
|
+
result = client.call(api_endpoint, data)
|
397
|
+
else:
|
398
|
+
raise ValueError("No endpoint known for prediction.")
|
399
|
+
return result
|