zenml-nightly 0.63.0.dev20240801__py3-none-any.whl → 0.64.0.dev20240811__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.
Files changed (198) hide show
  1. README.md +2 -2
  2. RELEASE_NOTES.md +79 -0
  3. zenml/VERSION +1 -1
  4. zenml/__init__.py +0 -4
  5. zenml/analytics/enums.py +0 -6
  6. zenml/cli/__init__.py +0 -61
  7. zenml/cli/base.py +1 -1
  8. zenml/cli/web_login.py +8 -0
  9. zenml/client.py +0 -4
  10. zenml/config/build_configuration.py +43 -17
  11. zenml/config/docker_settings.py +80 -57
  12. zenml/config/source.py +58 -0
  13. zenml/constants.py +9 -2
  14. zenml/entrypoints/base_entrypoint_configuration.py +53 -8
  15. zenml/enums.py +1 -1
  16. zenml/environment.py +25 -9
  17. zenml/image_builders/base_image_builder.py +1 -1
  18. zenml/image_builders/build_context.py +25 -72
  19. zenml/integrations/azure/__init__.py +4 -0
  20. zenml/integrations/azure/flavors/__init__.py +11 -0
  21. zenml/integrations/azure/flavors/azureml_orchestrator_flavor.py +263 -0
  22. zenml/{_hub → integrations/azure/orchestrators}/__init__.py +7 -2
  23. zenml/integrations/azure/orchestrators/azureml_orchestrator.py +544 -0
  24. zenml/integrations/azure/orchestrators/azureml_orchestrator_entrypoint_config.py +86 -0
  25. zenml/integrations/azure/step_operators/azureml_step_operator.py +3 -0
  26. zenml/integrations/databricks/flavors/databricks_orchestrator_flavor.py +9 -0
  27. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +7 -2
  28. zenml/integrations/gcp/service_connectors/gcp_service_connector.py +123 -6
  29. zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +1 -1
  30. zenml/integrations/mlflow/__init__.py +1 -1
  31. zenml/integrations/mlflow/experiment_trackers/mlflow_experiment_tracker.py +3 -1
  32. zenml/integrations/mlflow/flavors/mlflow_experiment_tracker_flavor.py +3 -0
  33. zenml/logger.py +13 -0
  34. zenml/models/__init__.py +0 -12
  35. zenml/models/v2/core/pipeline_deployment.py +21 -29
  36. zenml/models/v2/core/pipeline_run.py +13 -0
  37. zenml/models/v2/core/server_settings.py +12 -0
  38. zenml/models/v2/core/user.py +0 -21
  39. zenml/models/v2/misc/server_models.py +7 -1
  40. zenml/models/v2/misc/user_auth.py +0 -7
  41. zenml/new/pipelines/build_utils.py +193 -38
  42. zenml/new/pipelines/code_archive.py +157 -0
  43. zenml/new/pipelines/pipeline.py +29 -2
  44. zenml/new/pipelines/run_utils.py +67 -1
  45. zenml/service_connectors/service_connector_utils.py +14 -0
  46. zenml/stack_deployments/aws_stack_deployment.py +26 -3
  47. zenml/stack_deployments/azure_stack_deployment.py +11 -6
  48. zenml/stack_deployments/gcp_stack_deployment.py +24 -2
  49. zenml/stack_deployments/stack_deployment.py +17 -2
  50. zenml/steps/base_step.py +3 -0
  51. zenml/utils/archivable.py +149 -0
  52. zenml/utils/code_utils.py +244 -0
  53. zenml/utils/notebook_utils.py +122 -0
  54. zenml/utils/pipeline_docker_image_builder.py +3 -96
  55. zenml/utils/source_utils.py +109 -1
  56. zenml/zen_server/dashboard/assets/{404-CI13wQp4.js → 404-CRAA_Lew.js} +1 -1
  57. zenml/zen_server/dashboard/assets/@radix-BXWm7HOa.js +85 -0
  58. zenml/zen_server/dashboard/assets/{@react-router-CO-OsFwI.js → @react-router-l3lMcXA2.js} +1 -1
  59. zenml/zen_server/dashboard/assets/{@reactflow-DIYUhKYX.js → @reactflow-CeVxyqYT.js} +2 -2
  60. zenml/zen_server/dashboard/assets/{@tanstack-k96lU_C-.js → @tanstack-FmcYZMuX.js} +4 -4
  61. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-ErO9aOgK.js +1 -0
  62. zenml/zen_server/dashboard/assets/{AwarenessChannel-BNg5uWgI.js → AwarenessChannel-CLXo5rKM.js} +1 -1
  63. zenml/zen_server/dashboard/assets/{CodeSnippet-Cyp7f4dM.js → CodeSnippet-D0VLxT2A.js} +1 -1
  64. zenml/zen_server/dashboard/assets/{CollapsibleCard-Cu_A9W57.js → CollapsibleCard-BaUPiVg0.js} +1 -1
  65. zenml/zen_server/dashboard/assets/{Commands-DmQwTXjj.js → Commands-JrcZK-3j.js} +1 -1
  66. zenml/zen_server/dashboard/assets/CopyButton-Dbo52T1K.js +2 -0
  67. zenml/zen_server/dashboard/assets/{CsvVizualization-BvqItd-O.js → CsvVizualization-D3kAypDj.js} +3 -3
  68. zenml/zen_server/dashboard/assets/DisplayDate-DizbSeT-.js +1 -0
  69. zenml/zen_server/dashboard/assets/EditSecretDialog-Bd7mFLS4.js +1 -0
  70. zenml/zen_server/dashboard/assets/{EmptyState-BMLnFVlB.js → EmptyState-BHblM39I.js} +1 -1
  71. zenml/zen_server/dashboard/assets/{Error-DbXCTGua.js → Error-C6LeJSER.js} +1 -1
  72. zenml/zen_server/dashboard/assets/{ExecutionStatus-9zM7eaLh.js → ExecutionStatus-jH4OrWBq.js} +1 -1
  73. zenml/zen_server/dashboard/assets/{Helpbox-BIiNc-uH.js → Helpbox-aAB2XP-z.js} +1 -1
  74. zenml/zen_server/dashboard/assets/{Infobox-iv1Nu1A0.js → Infobox-BQ0aty32.js} +1 -1
  75. zenml/zen_server/dashboard/assets/{InlineAvatar-BvBtO2Dp.js → InlineAvatar-DpTLgM3Q.js} +1 -1
  76. zenml/zen_server/dashboard/assets/Lock-CNyJvf2r.js +1 -0
  77. zenml/zen_server/dashboard/assets/{MarkdownVisualization-xp3hhULl.js → MarkdownVisualization-Bajxn0HY.js} +1 -1
  78. zenml/zen_server/dashboard/assets/NumberBox-BmKE0qnO.js +1 -0
  79. zenml/zen_server/dashboard/assets/{PasswordChecker-DUveqlva.js → PasswordChecker-yGGoJSB-.js} +1 -1
  80. zenml/zen_server/dashboard/assets/{ProviderRadio-pSAvrGRS.js → ProviderRadio-BBqkIuTd.js} +1 -1
  81. zenml/zen_server/dashboard/assets/RadioItem-xLhXoiFV.js +1 -0
  82. zenml/zen_server/dashboard/assets/SearchField-C9R0mdaX.js +1 -0
  83. zenml/zen_server/dashboard/assets/{SetPassword-BOxpgh6N.js → SetPassword-52sNxNiO.js} +1 -1
  84. zenml/zen_server/dashboard/assets/{SuccessStep-CTSKN2lp.js → SuccessStep-DlkItqYG.js} +1 -1
  85. zenml/zen_server/dashboard/assets/{Tick-Bnr2TpW6.js → Tick-uxv80Q6a.js} +1 -1
  86. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-BeCeaRW5.js → UpdatePasswordSchemas-oN4G3sKz.js} +1 -1
  87. zenml/zen_server/dashboard/assets/{aws-BgKTfTfx.js → aws-0_3UsPif.js} +1 -1
  88. zenml/zen_server/dashboard/assets/{check-circle-i56092KI.js → check-circle-1_I207rW.js} +1 -1
  89. zenml/zen_server/dashboard/assets/{chevron-down-D_ZlKMqH.js → chevron-down-BpaF8JqM.js} +1 -1
  90. zenml/zen_server/dashboard/assets/{chevron-right-double-CZBOf6JM.js → chevron-right-double-Dk8e2L99.js} +1 -1
  91. zenml/zen_server/dashboard/assets/{cloud-only-qelmY92E.js → cloud-only-BkUuI0lZ.js} +1 -1
  92. zenml/zen_server/dashboard/assets/components-Br2ezRib.js +1 -0
  93. zenml/zen_server/dashboard/assets/{copy-BXNk6BjL.js → copy-f3XGPPxt.js} +1 -1
  94. zenml/zen_server/dashboard/assets/{database-1xWSgZfO.js → database-cXYNX9tt.js} +1 -1
  95. zenml/zen_server/dashboard/assets/{docker-CQMVm_4d.js → docker-8uj__HHK.js} +1 -1
  96. zenml/zen_server/dashboard/assets/{dots-horizontal-BObFzD5l.js → dots-horizontal-sKQlWEni.js} +1 -1
  97. zenml/zen_server/dashboard/assets/edit-C0MVvPD2.js +1 -0
  98. zenml/zen_server/dashboard/assets/{file-text-CqD_iu6l.js → file-text-B9JibxTs.js} +1 -1
  99. zenml/zen_server/dashboard/assets/{help-bu_DgLKI.js → help-FuHlZwn0.js} +1 -1
  100. zenml/zen_server/dashboard/assets/index-Bd1xgUQG.js +1 -0
  101. zenml/zen_server/dashboard/assets/index-DaGknux4.css +1 -0
  102. zenml/zen_server/dashboard/assets/{index-KsTz2dHG.js → index-DhIZtpxB.js} +5 -5
  103. zenml/zen_server/dashboard/assets/{index.esm-CbHNSeVw.js → index.esm-DT4uyn2i.js} +1 -1
  104. zenml/zen_server/dashboard/assets/layout-D6oiSbfd.js +1 -0
  105. zenml/zen_server/dashboard/assets/{login-mutation-DRpbESS7.js → login-mutation-13A_JSVA.js} +1 -1
  106. zenml/zen_server/dashboard/assets/{logs-D8k8BVFf.js → logs-CgeE2vZP.js} +1 -1
  107. zenml/zen_server/dashboard/assets/{not-found-Dfx9hfkf.js → not-found-B0Mmb90p.js} +1 -1
  108. zenml/zen_server/dashboard/assets/{package-ClbU3KUi.js → package-DdkziX79.js} +1 -1
  109. zenml/zen_server/dashboard/assets/page-7-v2OBm-.js +1 -0
  110. zenml/zen_server/dashboard/assets/{page-f3jBVI5Z.js → page-B3ozwdD1.js} +1 -1
  111. zenml/zen_server/dashboard/assets/{page-DYBNGxJt.js → page-BGwA9B1M.js} +1 -1
  112. zenml/zen_server/dashboard/assets/{page-C176KxyB.js → page-BkjAUyTA.js} +1 -1
  113. zenml/zen_server/dashboard/assets/page-BnacgBiy.js +1 -0
  114. zenml/zen_server/dashboard/assets/{page-CzucfYPo.js → page-BxF_KMQ3.js} +2 -2
  115. zenml/zen_server/dashboard/assets/page-C4POHC0K.js +1 -0
  116. zenml/zen_server/dashboard/assets/page-C9kudd44.js +9 -0
  117. zenml/zen_server/dashboard/assets/page-CA1j3GpJ.js +1 -0
  118. zenml/zen_server/dashboard/assets/page-CCY6yfmu.js +1 -0
  119. zenml/zen_server/dashboard/assets/page-CgTe7Bme.js +1 -0
  120. zenml/zen_server/dashboard/assets/{page-DtpwnNXq.js → page-Cgn-6v2Y.js} +1 -1
  121. zenml/zen_server/dashboard/assets/page-CxQmQqDw.js +1 -0
  122. zenml/zen_server/dashboard/assets/page-D2Goey3H.js +1 -0
  123. zenml/zen_server/dashboard/assets/page-DLpOnf7u.js +1 -0
  124. zenml/zen_server/dashboard/assets/{page-DVPxY5fT.js → page-DSTQnBk-.js} +1 -1
  125. zenml/zen_server/dashboard/assets/{page-BoFtUD9H.js → page-DTysUGOy.js} +1 -1
  126. zenml/zen_server/dashboard/assets/{page-p2hLJdS2.js → page-D_EXUFJb.js} +1 -1
  127. zenml/zen_server/dashboard/assets/page-Db15QzsM.js +1 -0
  128. zenml/zen_server/dashboard/assets/{page-Btu39x7k.js → page-DugsjcQ_.js} +1 -1
  129. zenml/zen_server/dashboard/assets/{page-CZe9GEBF.js → page-OFKSPyN7.js} +1 -1
  130. zenml/zen_server/dashboard/assets/{page-CDgZmwxP.js → page-RnG-qhv9.js} +1 -1
  131. zenml/zen_server/dashboard/assets/{page-Cjn97HMv.js → page-T2BtjwPl.js} +1 -1
  132. zenml/zen_server/dashboard/assets/page-TXe1Eo3Z.js +1 -0
  133. zenml/zen_server/dashboard/assets/{page-BxiWdeyg.js → page-YiF_fNbe.js} +1 -1
  134. zenml/zen_server/dashboard/assets/{page-399pVZHU.js → page-hQaiQXfg.js} +1 -1
  135. zenml/zen_server/dashboard/assets/persist-3-5nOJ6m.js +1 -0
  136. zenml/zen_server/dashboard/assets/{play-circle-CNtZKDnW.js → play-circle-XSkLR12B.js} +1 -1
  137. zenml/zen_server/dashboard/assets/{plus-DOeLmm7C.js → plus-FB9-lEq_.js} +1 -1
  138. zenml/zen_server/dashboard/assets/refresh-COb6KYDi.js +1 -0
  139. zenml/zen_server/dashboard/assets/sharedSchema-BoYx_B_L.js +14 -0
  140. zenml/zen_server/dashboard/assets/{stack-detail-query-Ck7j7BP_.js → stack-detail-query-B-US_-wa.js} +1 -1
  141. zenml/zen_server/dashboard/assets/{terminal-By9cErXc.js → terminal-grtjrIEJ.js} +1 -1
  142. zenml/zen_server/dashboard/assets/trash-Cd5CSFqA.js +1 -0
  143. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-f3ZT7psb.js → update-server-settings-mutation-B8GB_ubU.js} +1 -1
  144. zenml/zen_server/dashboard/assets/{url-rGEp5Umh.js → url-hcMJkz8p.js} +1 -1
  145. zenml/zen_server/dashboard/assets/{zod-BtSyGx4C.js → zod-CnykDKJj.js} +1 -1
  146. zenml/zen_server/dashboard/index.html +7 -7
  147. zenml/zen_server/dashboard_legacy/asset-manifest.json +4 -4
  148. zenml/zen_server/dashboard_legacy/index.html +1 -1
  149. zenml/zen_server/dashboard_legacy/{precache-manifest.2fa6e528a6e7447caaf35dadfe7514bb.js → precache-manifest.9c473c96a43298343a7ce1256183123b.js} +4 -4
  150. zenml/zen_server/dashboard_legacy/service-worker.js +1 -1
  151. zenml/zen_server/dashboard_legacy/static/js/{main.4aab7e98.chunk.js → main.463c90b9.chunk.js} +2 -2
  152. zenml/zen_server/dashboard_legacy/static/js/{main.4aab7e98.chunk.js.map → main.463c90b9.chunk.js.map} +1 -1
  153. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  154. zenml/zen_server/deploy/helm/README.md +2 -2
  155. zenml/zen_server/routers/stack_deployment_endpoints.py +6 -0
  156. zenml/zen_server/routers/users_endpoints.py +0 -7
  157. zenml/zen_server/utils.py +75 -0
  158. zenml/zen_server/zen_server_api.py +52 -1
  159. zenml/zen_stores/base_zen_store.py +7 -1
  160. zenml/zen_stores/migrations/versions/0.64.0_release.py +23 -0
  161. zenml/zen_stores/migrations/versions/026d4577b6a0_add_code_path.py +39 -0
  162. zenml/zen_stores/migrations/versions/3dcc5d20e82f_add_last_user_activity.py +51 -0
  163. zenml/zen_stores/migrations/versions/909550c7c4da_remove_user_hub_token.py +36 -0
  164. zenml/zen_stores/rest_zen_store.py +5 -3
  165. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +3 -0
  166. zenml/zen_stores/schemas/pipeline_run_schemas.py +3 -0
  167. zenml/zen_stores/schemas/server_settings_schemas.py +2 -0
  168. zenml/zen_stores/schemas/user_schemas.py +0 -2
  169. zenml/zen_stores/sql_zen_store.py +25 -1
  170. {zenml_nightly-0.63.0.dev20240801.dist-info → zenml_nightly-0.64.0.dev20240811.dist-info}/METADATA +3 -3
  171. {zenml_nightly-0.63.0.dev20240801.dist-info → zenml_nightly-0.64.0.dev20240811.dist-info}/RECORD +174 -157
  172. zenml/_hub/client.py +0 -289
  173. zenml/_hub/constants.py +0 -21
  174. zenml/_hub/utils.py +0 -79
  175. zenml/cli/hub.py +0 -1116
  176. zenml/models/v2/misc/hub_plugin_models.py +0 -79
  177. zenml/zen_server/dashboard/assets/@radix-CFOkMR_E.js +0 -85
  178. zenml/zen_server/dashboard/assets/CopyButton-B3sWVJ4Z.js +0 -2
  179. zenml/zen_server/dashboard/assets/DisplayDate-DYgIjlDF.js +0 -1
  180. zenml/zen_server/dashboard/assets/SearchField-CXoBknpt.js +0 -1
  181. zenml/zen_server/dashboard/assets/components-DWe4cTjS.js +0 -1
  182. zenml/zen_server/dashboard/assets/index-vfjX_fJV.css +0 -1
  183. zenml/zen_server/dashboard/assets/page-C6tXXjnK.js +0 -1
  184. zenml/zen_server/dashboard/assets/page-CP9obrnG.js +0 -1
  185. zenml/zen_server/dashboard/assets/page-CaTOsNNw.js +0 -1
  186. zenml/zen_server/dashboard/assets/page-CmXmB_5i.js +0 -1
  187. zenml/zen_server/dashboard/assets/page-CvGAOfad.js +0 -1
  188. zenml/zen_server/dashboard/assets/page-D0bbc-qr.js +0 -5
  189. zenml/zen_server/dashboard/assets/page-DLEtD2ex.js +0 -1
  190. zenml/zen_server/dashboard/assets/page-DupV0aBd.js +0 -1
  191. zenml/zen_server/dashboard/assets/page-EweAR81y.js +0 -1
  192. zenml/zen_server/dashboard/assets/page-w-YaL77M.js +0 -9
  193. zenml/zen_server/dashboard/assets/persist-BReKApOc.js +0 -14
  194. zenml/zen_server/dashboard/assets/secrets-video-OBJ6irhH.svg +0 -21
  195. zenml/zen_server/dashboard/assets/stacks-video-7gfxpAq4.svg +0 -21
  196. {zenml_nightly-0.63.0.dev20240801.dist-info → zenml_nightly-0.64.0.dev20240811.dist-info}/LICENSE +0 -0
  197. {zenml_nightly-0.63.0.dev20240801.dist-info → zenml_nightly-0.64.0.dev20240811.dist-info}/WHEEL +0 -0
  198. {zenml_nightly-0.63.0.dev20240801.dist-info → zenml_nightly-0.64.0.dev20240811.dist-info}/entry_points.txt +0 -0
README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  <div align="center">
2
2
  <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=0fcbab94-8fbe-4a38-93e8-c2348450a42e" />
3
- <h1 align="center">Create an internal MLOps platform for your entire machine learning team.
3
+ <h1 align="center">Connecting data science teams seamlessly to cloud infrastructure.
4
4
  </h1>
5
5
  </div>
6
6
 
@@ -327,7 +327,7 @@ the Apache License Version 2.0.
327
327
  <a href="https://github.com/zenml-io/zenml-projects">Projects Showcase</a>
328
328
  <br />
329
329
  <br />
330
- 🎉 Version 0.63.0 is out. Check out the release notes
330
+ 🎉 Version 0.64.0 is out. Check out the release notes
331
331
  <a href="https://github.com/zenml-io/zenml/releases">here</a>.
332
332
  <br />
333
333
  🖥️ Download our VS Code Extension <a href="https://marketplace.visualstudio.com/items?itemName=ZenML.zenml-vscode">here</a>.
RELEASE_NOTES.md CHANGED
@@ -1,5 +1,84 @@
1
1
  <!-- markdown-link-check-disable -->
2
2
 
3
+ # 0.64.0
4
+
5
+ ## New Features and Improvements
6
+
7
+ ### Notebook Integration
8
+
9
+ ZenML now supports running steps defined in notebook cells with remote
10
+ orchestrators and step operators. This feature enhances the development
11
+ workflow by allowing seamless transition from experimentation to production.
12
+
13
+ - **Details**: [Running remote pipelines from notebooks](https://docs.zenml.io/v/docs/how-to/run-remote-pipelines-from-notebooks)
14
+
15
+ ### Reduced Docker Builds with Code Uploads
16
+
17
+ We've introduced an option to upload code to the artifact store, enabling
18
+ Docker build reuse. This feature can significantly speed up iteration,
19
+ especially when working with remote stacks.
20
+
21
+ - **Default**: Enabled
22
+ - **Configuration**: To disable, set `DockerSettings.allow_download_from_artifact_store=False`
23
+ for steps or pipelines
24
+ - **Benefits**:
25
+ - Faster development cycles
26
+ - No need to register a code repository to reuse builds
27
+ - Builds only occur when requirements or DockerSettings change
28
+ - **Documentation**: [Which files are built into the image](https://docs.zenml.io/how-to/customize-docker-builds/which-files-are-built-into-the-image)
29
+
30
+ ### AzureML Orchestrator Support
31
+
32
+ ZenML now supports [AzureML](https://azure.microsoft.com/en-gb/free/machine-learning)
33
+ as an orchestrator, expanding our list of supported cloud platforms.
34
+
35
+ - **Full Azure Guide**: [Setting up an Azure stack](https://docs.zenml.io/how-to/popular-integrations/azure-guide)
36
+ - **Documentation**: [AzureML orchestrator](https://docs.zenml.io/stack-components/orchestrators/azureml)
37
+
38
+ ### Terraform Modules
39
+
40
+ We've released new Terraform modules on the Hashicorp registry for
41
+ provisioning complete MLOps stacks across major cloud providers.
42
+
43
+ - **Features**:
44
+ - Automate infrastructure setup for ZenML stack deployment
45
+ - Handle registration of configurations to ZenML server
46
+ - **More Information**: [MLOps Terraform ZenML blog post](https://www.zenml.io/blog/mlops-terraform-zenml)
47
+
48
+ These updates aim to streamline the MLOps workflow, making it easier to
49
+ develop, deploy, and manage machine learning pipelines with ZenML.
50
+
51
+ ## What's Changed
52
+
53
+ * Add 0.63.0 to migration testing by @bcdurak in https://github.com/zenml-io/zenml/pull/2893
54
+ * Document terraform stack deployment modules by @stefannica in https://github.com/zenml-io/zenml/pull/2898
55
+ * README update by @htahir1 in https://github.com/zenml-io/zenml/pull/2901
56
+ * Enable `Databricks` Unity Catalog for MLflow by @safoinme in https://github.com/zenml-io/zenml/pull/2900
57
+ * Make urls pop out from the sea of purple/cyan in the logs by @AlexejPenner in https://github.com/zenml-io/zenml/pull/2894
58
+ * Add terraform as a supported stack deployment provider by @stefannica in https://github.com/zenml-io/zenml/pull/2902
59
+ * Fix `Model` imports in docs by @strickvl in https://github.com/zenml-io/zenml/pull/2907
60
+ * Remove hub references by @schustmi in https://github.com/zenml-io/zenml/pull/2905
61
+ * Bump NLP template by @avishniakov in https://github.com/zenml-io/zenml/pull/2912
62
+ * Updated step operator docs by @htahir1 in https://github.com/zenml-io/zenml/pull/2908
63
+ * Added lightning studio check by @htahir1 in https://github.com/zenml-io/zenml/pull/2910
64
+ * Upload code to artifact store by @schustmi in https://github.com/zenml-io/zenml/pull/2895
65
+ * AzureML orchestrator by @bcdurak in https://github.com/zenml-io/zenml/pull/2873
66
+ * Run steps defined in notebooks with remote orchestrators by @schustmi in https://github.com/zenml-io/zenml/pull/2899
67
+ * Fix broken / unparsable md docs file by @strickvl in https://github.com/zenml-io/zenml/pull/2916
68
+ * Bump mlflow to 2.15.0 by @christianversloot in https://github.com/zenml-io/zenml/pull/2896
69
+ * Remove extra button by @schustmi in https://github.com/zenml-io/zenml/pull/2918
70
+ * Added last timestamp to zenserver by @htahir1 in https://github.com/zenml-io/zenml/pull/2913
71
+ * A pipeline can't finish successfully in this case by @AlexejPenner in https://github.com/zenml-io/zenml/pull/2903
72
+ * Fix the GCP Workload Identity Federation support in the GCP Service Connector by @stefannica in https://github.com/zenml-io/zenml/pull/2914
73
+ * Embeddings finetuning guide for LLMOps guide by @strickvl in https://github.com/zenml-io/zenml/pull/2917
74
+
75
+ ## 🥳 Community Contributions 🥳
76
+
77
+ We'd like to give a special thanks to @christianversloot who contributed to
78
+ this release by bumping the `mlflow` version to 2.15.0
79
+
80
+ **Full Changelog**: https://github.com/zenml-io/zenml/compare/0.63.0...0.64.0
81
+
3
82
  # 0.63.0
4
83
 
5
84
  Moving forward from the last two releases, we have further improved the
zenml/VERSION CHANGED
@@ -1 +1 @@
1
- 0.63.0.dev20240801
1
+ 0.64.0.dev20240811
zenml/__init__.py CHANGED
@@ -27,10 +27,6 @@ from zenml.logger import init_logging # noqa
27
27
 
28
28
  init_logging()
29
29
 
30
- # The following code is needed for `zenml.hub` subpackages to be found
31
- from pkgutil import extend_path
32
-
33
- __path__ = extend_path(__path__, __name__)
34
30
 
35
31
  # Need to import zenml.models before zenml.config to avoid circular imports
36
32
  from zenml.models import * # noqa: F401
zenml/analytics/enums.py CHANGED
@@ -99,11 +99,5 @@ class AnalyticsEvent(str, Enum):
99
99
  ZENML_SERVER_DEPLOYED = "ZenML server deployed"
100
100
  ZENML_SERVER_DESTROYED = "ZenML server destroyed"
101
101
 
102
- # ZenML Hub events
103
- ZENML_HUB_PLUGIN_INSTALL = "ZenML Hub plugin installed"
104
- ZENML_HUB_PLUGIN_UNINSTALL = "ZenML Hub plugin uninstalled"
105
- ZENML_HUB_PLUGIN_CLONE = "ZenML Hub plugin pulled"
106
- ZENML_HUB_PLUGIN_SUBMIT = "ZenML Hub plugin pushed"
107
-
108
102
  # Server Settings
109
103
  SERVER_SETTINGS_UPDATED = "Server Settings Updated"
zenml/cli/__init__.py CHANGED
@@ -2541,66 +2541,6 @@ zenml artifact-store deploy -f gcp -p gcp -r us-east1 -x project_id=zenml-core b
2541
2541
 
2542
2542
  For full documentation on this functionality, please refer to [the dedicated
2543
2543
  documentation on stack component deploy](https://docs.zenml.io/how-to/stack-deployment/deploy-a-stack-component).
2544
-
2545
- Interacting with the ZenML Hub
2546
- ------------------------------
2547
-
2548
- The ZenML Hub is a central location for discovering and sharing third-party
2549
- ZenML code, such as custom integrations, components, steps, pipelines,
2550
- materializers, and more.
2551
- You can browse the ZenML Hub at [https://hub.zenml.io](https://hub.zenml.io).
2552
-
2553
- The ZenML CLI provides various commands to interact with the ZenML Hub:
2554
-
2555
- - Listing all plugins available on the Hub:
2556
- ```bash
2557
- zenml hub list
2558
- ```
2559
-
2560
- - Installing a Hub plugin:
2561
- ```bash
2562
- zenml hub install
2563
- ```
2564
- Installed plugins can be imported via `from zenml.hub.<plugin_name> import ...`.
2565
-
2566
-
2567
- - Uninstalling a Hub plugin:
2568
- ```bash
2569
- zenml hub uninstall
2570
- ```
2571
-
2572
- - Cloning the source code of a Hub plugin (without installing it):
2573
- ```bash
2574
- zenml hub clone
2575
- ```
2576
- This is useful, e.g., for extending an existing plugin or for getting the
2577
- examples of a plugin.
2578
-
2579
- - Submitting/contributing a plugin to the Hub (requires login, see below):
2580
- ```bash
2581
- zenml hub submit
2582
- ```
2583
- If you are unsure about which arguments you need to set, you can run the
2584
- command in interactive mode:
2585
- ```bash
2586
- zenml hub submit --interactive
2587
- ```
2588
- This will ask for and validate inputs one at a time.
2589
-
2590
- - Logging in to the Hub:
2591
- ```bash
2592
- zenml hub login
2593
- ```
2594
-
2595
- - Logging out of the Hub:
2596
- ```bash
2597
- zenml hub logout
2598
- ```
2599
-
2600
- - Viewing the build logs of a plugin you submitted to the Hub:
2601
- ```bash
2602
- zenml hub logs
2603
- ```
2604
2544
  """
2605
2545
 
2606
2546
  from zenml.cli.version import * # noqa
@@ -2612,7 +2552,6 @@ from zenml.cli.code_repository import * # noqa
2612
2552
  from zenml.cli.config import * # noqa
2613
2553
  from zenml.cli.downgrade import * # noqa
2614
2554
  from zenml.cli.feature import * # noqa
2615
- from zenml.cli.hub import * # noqa
2616
2555
  from zenml.cli.integration import * # noqa
2617
2556
  from zenml.cli.model import * # noqa
2618
2557
  from zenml.cli.model_registry import * # noqa
zenml/cli/base.py CHANGED
@@ -87,7 +87,7 @@ ZENML_PROJECT_TEMPLATES = dict(
87
87
  ),
88
88
  nlp=ZenMLProjectTemplateLocation(
89
89
  github_url="zenml-io/template-nlp",
90
- github_tag="2024.06.14", # Make sure it is aligned with .github/workflows/update-templates-to-examples.yml
90
+ github_tag="2024.08.07", # Make sure it is aligned with .github/workflows/update-templates-to-examples.yml
91
91
  ),
92
92
  llm_finetuning=ZenMLProjectTemplateLocation(
93
93
  github_url="zenml-io/template-llm-finetuning",
zenml/cli/web_login.py CHANGED
@@ -28,6 +28,7 @@ from zenml.constants import (
28
28
  DEVICE_AUTHORIZATION,
29
29
  LOGIN,
30
30
  VERSION_1,
31
+ ZENML_PRO_CONNECTION_ISSUES_SUSPENDED_PAUSED_TENANT_HINT,
31
32
  )
32
33
  from zenml.exceptions import AuthorizationException, OAuthError
33
34
  from zenml.logger import get_logger
@@ -93,6 +94,11 @@ def web_login(url: str, verify_ssl: Union[str, bool]) -> str:
93
94
  # Get rid of any trailing slashes to prevent issues when having double
94
95
  # slashes in the URL
95
96
  url = url.rstrip("/")
97
+ zenml_pro_extra = ""
98
+ if ".zenml.io" in url:
99
+ zenml_pro_extra = (
100
+ ZENML_PRO_CONNECTION_ISSUES_SUSPENDED_PAUSED_TENANT_HINT
101
+ )
96
102
  try:
97
103
  auth_url = url + API + VERSION_1 + DEVICE_AUTHORIZATION
98
104
  response = requests.post(
@@ -111,6 +117,7 @@ def web_login(url: str, verify_ssl: Union[str, bool]) -> str:
111
117
  logger.info(f"Error: {response.status_code} {response.text}")
112
118
  raise AuthorizationException(
113
119
  "Could not connect to API server. Please check the URL."
120
+ + zenml_pro_extra
114
121
  )
115
122
  except (requests.exceptions.JSONDecodeError, ValueError, TypeError):
116
123
  logger.exception("Bad response received from API server.")
@@ -121,6 +128,7 @@ def web_login(url: str, verify_ssl: Union[str, bool]) -> str:
121
128
  logger.exception("Could not connect to API server.")
122
129
  raise AuthorizationException(
123
130
  "Could not connect to API server. Please check the URL."
131
+ + zenml_pro_extra
124
132
  )
125
133
 
126
134
  # Open the verification URL in the user's browser
zenml/client.py CHANGED
@@ -868,7 +868,6 @@ class Client(metaclass=ClientMetaClass):
868
868
  updated_full_name: Optional[str] = None,
869
869
  updated_email: Optional[str] = None,
870
870
  updated_email_opt_in: Optional[bool] = None,
871
- updated_hub_token: Optional[str] = None,
872
871
  updated_password: Optional[str] = None,
873
872
  old_password: Optional[str] = None,
874
873
  updated_is_admin: Optional[bool] = None,
@@ -883,7 +882,6 @@ class Client(metaclass=ClientMetaClass):
883
882
  updated_full_name: The new full name of the user.
884
883
  updated_email: The new email of the user.
885
884
  updated_email_opt_in: The new email opt-in status of the user.
886
- updated_hub_token: Update the hub token
887
885
  updated_password: The new password of the user.
888
886
  old_password: The old password of the user. Required for password
889
887
  update.
@@ -911,8 +909,6 @@ class Client(metaclass=ClientMetaClass):
911
909
  )
912
910
  if updated_email_opt_in is not None:
913
911
  user_update.email_opted_in = updated_email_opt_in
914
- if updated_hub_token is not None:
915
- user_update.hub_token = updated_hub_token
916
912
  if updated_password is not None:
917
913
  user_update.password = updated_password
918
914
  if old_password is None:
@@ -14,11 +14,13 @@
14
14
  """Build configuration class."""
15
15
 
16
16
  import hashlib
17
+ import json
17
18
  from typing import TYPE_CHECKING, Dict, Optional
18
19
 
19
20
  from pydantic import BaseModel
20
21
 
21
- from zenml.config.docker_settings import DockerSettings, SourceFileMode
22
+ from zenml.config.docker_settings import DockerSettings
23
+ from zenml.utils import json_utils
22
24
 
23
25
  if TYPE_CHECKING:
24
26
  from zenml.code_repositories import BaseCodeRepository
@@ -60,7 +62,14 @@ class BuildConfiguration(BaseModel):
60
62
  The checksum.
61
63
  """
62
64
  hash_ = hashlib.md5() # nosec
63
- hash_.update(self.settings.model_dump_json().encode())
65
+ settings_json = json.dumps(
66
+ self.settings.model_dump(
67
+ mode="json", exclude={"prevent_build_reuse"}
68
+ ),
69
+ sort_keys=True,
70
+ default=json_utils.pydantic_encoder,
71
+ )
72
+ hash_.update(settings_json.encode())
64
73
  if self.entrypoint:
65
74
  hash_.update(self.entrypoint.encode())
66
75
 
@@ -72,7 +81,7 @@ class BuildConfiguration(BaseModel):
72
81
  PipelineDockerImageBuilder,
73
82
  )
74
83
 
75
- pass_code_repo = self.should_download_files(
84
+ pass_code_repo = self.should_download_files_from_code_repository(
76
85
  code_repository=code_repository
77
86
  )
78
87
  requirements_files = (
@@ -101,34 +110,51 @@ class BuildConfiguration(BaseModel):
101
110
  Returns:
102
111
  Whether files should be included in the image.
103
112
  """
104
- if self.settings.source_files == SourceFileMode.INCLUDE:
105
- return True
113
+ if self.should_download_files(code_repository=code_repository):
114
+ return False
106
115
 
107
- if (
108
- self.settings.source_files == SourceFileMode.DOWNLOAD_OR_INCLUDE
109
- and not code_repository
116
+ return self.settings.allow_including_files_in_images
117
+
118
+ def should_download_files(
119
+ self,
120
+ code_repository: Optional["BaseCodeRepository"],
121
+ ) -> bool:
122
+ """Whether files should be downloaded in the image.
123
+
124
+ Args:
125
+ code_repository: Code repository that can be used to download files
126
+ inside the image.
127
+
128
+ Returns:
129
+ Whether files should be downloaded in the image.
130
+ """
131
+ if self.should_download_files_from_code_repository(
132
+ code_repository=code_repository
110
133
  ):
111
134
  return True
112
135
 
136
+ if self.settings.allow_download_from_artifact_store:
137
+ return True
138
+
113
139
  return False
114
140
 
115
- def should_download_files(
141
+ def should_download_files_from_code_repository(
116
142
  self,
117
143
  code_repository: Optional["BaseCodeRepository"],
118
144
  ) -> bool:
119
- """Whether files should be downloaded in the image.
145
+ """Whether files should be downloaded from the code repository.
120
146
 
121
147
  Args:
122
148
  code_repository: Code repository that can be used to download files
123
149
  inside the image.
124
150
 
125
151
  Returns:
126
- Whether files should be downloaded in the image.
152
+ Whether files should be downloaded from the code repository.
127
153
  """
128
- if not code_repository:
129
- return False
154
+ if (
155
+ code_repository
156
+ and self.settings.allow_download_from_code_repository
157
+ ):
158
+ return True
130
159
 
131
- return self.settings.source_files in {
132
- SourceFileMode.DOWNLOAD,
133
- SourceFileMode.DOWNLOAD_OR_INCLUDE,
134
- }
160
+ return False
@@ -16,8 +16,7 @@
16
16
  from enum import Enum
17
17
  from typing import Any, Dict, List, Optional, Union
18
18
 
19
- from pydantic import BaseModel, Field, model_validator
20
- from pydantic_settings import SettingsConfigDict
19
+ from pydantic import BaseModel, ConfigDict, Field, model_validator
21
20
 
22
21
  from zenml.config.base_settings import BaseSettings
23
22
  from zenml.logger import get_logger
@@ -49,15 +48,6 @@ class PythonEnvironmentExportMethod(Enum):
49
48
  }[self]
50
49
 
51
50
 
52
- class SourceFileMode(Enum):
53
- """Different methods to handle source files in Docker images."""
54
-
55
- INCLUDE = "include"
56
- DOWNLOAD_OR_INCLUDE = "download_or_include"
57
- DOWNLOAD = "download"
58
- IGNORE = "ignore"
59
-
60
-
61
51
  class PythonPackageInstaller(Enum):
62
52
  """Different installers for python packages."""
63
53
 
@@ -102,7 +92,6 @@ class DockerSettings(BaseSettings):
102
92
  Depending on the configuration of this object, requirements will be
103
93
  installed in the following order (each step optional):
104
94
  - The packages installed in your local python environment
105
- - The packages specified via the `required_hub_plugins` attribute
106
95
  - The packages required by the stack unless this is disabled by setting
107
96
  `install_stack_requirements=False`.
108
97
  - The packages specified via the `required_integrations`
@@ -135,10 +124,9 @@ class DockerSettings(BaseSettings):
135
124
  when the `dockerfile` attribute is set. If this is left empty, the
136
125
  build context will only contain the Dockerfile.
137
126
  parent_image_build_config: Configuration for the parent image build.
138
- build_options: DEPRECATED, use parent_image_build_config.build_options
139
- instead.
140
127
  skip_build: If set to `True`, the parent image will be used directly to
141
128
  run the steps of your pipeline.
129
+ prevent_build_reuse: Prevent the reuse of an existing build.
142
130
  target_repository: Name of the Docker repository to which the
143
131
  image should be pushed. This repository will be appended to the
144
132
  registry URI of the container registry of your stack and should
@@ -161,11 +149,7 @@ class DockerSettings(BaseSettings):
161
149
  required_integrations: List of ZenML integrations that should be
162
150
  installed. All requirements for the specified integrations will
163
151
  be installed inside the Docker image.
164
- required_hub_plugins: List of ZenML Hub plugins to install.
165
- Expected format: '(<author_username>/)<plugin_name>==<version>'.
166
- If no version is specified, the latest version is taken. The
167
- packages of required plugins and all their dependencies will be
168
- installed inside the Docker image.
152
+ required_hub_plugins: DEPRECATED/UNUSED.
169
153
  install_stack_requirements: If `True`, ZenML will automatically detect
170
154
  if components of your active stack are part of a ZenML integration
171
155
  and install the corresponding requirements and apt packages.
@@ -176,33 +160,32 @@ class DockerSettings(BaseSettings):
176
160
  environment: Dictionary of environment variables to set inside the
177
161
  Docker image.
178
162
  build_config: Configuration for the main image build.
179
- dockerignore: DEPRECATED, use build_config.dockerignore instead.
180
- copy_files: DEPRECATED, use the `source_files` attribute instead.
181
- copy_global_config: DEPRECATED/UNUSED.
182
163
  user: If not `None`, will set the user, make it owner of the `/app`
183
164
  directory which contains all the user code and run the container
184
165
  entrypoint as this user.
185
- source_files: Defines how the user source files will be handled when
186
- building the Docker image.
187
- * INCLUDE: The files will be included in the Docker image.
188
- * DOWNLOAD: The files will be downloaded when running the image. If
189
- this is specified, the files must be inside a registered code
190
- repository and the repository must have no local changes,
191
- otherwise the build will fail.
192
- * DOWNLOAD_OR_INCLUDE: The files will be downloaded if they're
193
- inside a registered code repository and the repository has no
194
- local changes, otherwise they will be included in the image.
195
- * IGNORE: The files will not be included or downloaded in the image.
196
- If you use this option, you're responsible that all the files
197
- to run your steps exist in the right place.
166
+ allow_including_files_in_images: If `True`, code can be included in the
167
+ Docker images if code download from a code repository or artifact
168
+ store is disabled or not possible.
169
+ allow_download_from_code_repository: If `True`, code can be downloaded
170
+ from a code repository if possible.
171
+ allow_download_from_artifact_store: If `True`, code can be downloaded
172
+ from the artifact store.
173
+ build_options: DEPRECATED, use parent_image_build_config.build_options
174
+ instead.
175
+ dockerignore: DEPRECATED, use build_config.dockerignore instead.
176
+ copy_files: DEPRECATED/UNUSED.
177
+ copy_global_config: DEPRECATED/UNUSED.
178
+ source_files: DEPRECATED. Use allow_including_files_in_images,
179
+ allow_download_from_code_repository and
180
+ allow_download_from_artifact_store instead.
198
181
  """
199
182
 
200
183
  parent_image: Optional[str] = None
201
184
  dockerfile: Optional[str] = None
202
185
  build_context_root: Optional[str] = None
203
- build_options: Dict[str, Any] = {}
204
186
  parent_image_build_config: Optional[DockerBuildConfig] = None
205
187
  skip_build: bool = False
188
+ prevent_build_reuse: bool = False
206
189
  target_repository: Optional[str] = None
207
190
  python_package_installer: PythonPackageInstaller = (
208
191
  PythonPackageInstaller.PIP
@@ -215,49 +198,89 @@ class DockerSettings(BaseSettings):
215
198
  default=None, union_mode="left_to_right"
216
199
  )
217
200
  required_integrations: List[str] = []
218
- required_hub_plugins: List[str] = []
219
201
  install_stack_requirements: bool = True
220
202
  apt_packages: List[str] = []
221
203
  environment: Dict[str, Any] = {}
222
- dockerignore: Optional[str] = None
223
- copy_files: bool = True
224
- copy_global_config: bool = True
225
204
  user: Optional[str] = None
226
205
  build_config: Optional[DockerBuildConfig] = None
227
206
 
228
- source_files: SourceFileMode = SourceFileMode.DOWNLOAD_OR_INCLUDE
207
+ allow_including_files_in_images: bool = True
208
+ allow_download_from_code_repository: bool = True
209
+ allow_download_from_artifact_store: bool = True
210
+
211
+ # Deprecated attributes
212
+ build_options: Dict[str, Any] = {}
213
+ dockerignore: Optional[str] = None
214
+ copy_files: bool = True
215
+ copy_global_config: bool = True
216
+ source_files: Optional[str] = None
217
+ required_hub_plugins: List[str] = []
229
218
 
230
219
  _deprecation_validator = deprecation_utils.deprecate_pydantic_attributes(
231
- "copy_files", "copy_global_config"
220
+ "copy_files",
221
+ "copy_global_config",
222
+ "source_files",
223
+ "required_hub_plugins",
232
224
  )
233
225
 
234
226
  @model_validator(mode="before")
235
227
  @classmethod
236
228
  @before_validator_handler
237
- def _migrate_copy_files(cls, data: Dict[str, Any]) -> Dict[str, Any]:
238
- """Migrates the value from the old copy_files attribute.
229
+ def _migrate_source_files(cls, data: Dict[str, Any]) -> Dict[str, Any]:
230
+ """Migrate old source_files values.
239
231
 
240
232
  Args:
241
- data: The settings values.
233
+ data: The model data.
234
+
235
+ Raises:
236
+ ValueError: If an invalid source file mode is specified.
242
237
 
243
238
  Returns:
244
- The migrated settings values.
239
+ The migrated data.
245
240
  """
246
- copy_files = data.get("copy_files", None)
241
+ source_files = data.get("source_files", None)
247
242
 
248
- if copy_files is None:
243
+ if source_files is None:
249
244
  return data
250
245
 
251
- if data.get("source_files", None):
252
- # Ignore the copy files value in favor of the new source files
246
+ replacement_attributes = [
247
+ "allow_including_files_in_images",
248
+ "allow_download_from_code_repository",
249
+ "allow_download_from_artifact_store",
250
+ ]
251
+ if any(v in data for v in replacement_attributes):
253
252
  logger.warning(
254
- "Both `copy_files` and `source_files` specified for the "
255
- "DockerSettings, ignoring the `copy_files` value."
253
+ "Both `source_files` and one of %s specified for the "
254
+ "DockerSettings, ignoring the `source_files` value.",
255
+ replacement_attributes,
256
256
  )
257
- elif copy_files is True:
258
- data["source_files"] = SourceFileMode.INCLUDE
259
- elif copy_files is False:
260
- data["source_files"] = SourceFileMode.IGNORE
257
+ return data
258
+
259
+ allow_including_files_in_images = False
260
+ allow_download_from_code_repository = False
261
+ allow_download_from_artifact_store = False
262
+
263
+ if source_files == "download":
264
+ allow_download_from_code_repository = True
265
+ elif source_files == "include":
266
+ allow_including_files_in_images = True
267
+ elif source_files == "download_or_include":
268
+ allow_including_files_in_images = True
269
+ allow_download_from_code_repository = True
270
+ elif source_files == "ignore":
271
+ pass
272
+ else:
273
+ raise ValueError(f"Invalid source file mode `{source_files}`.")
274
+
275
+ data["allow_including_files_in_images"] = (
276
+ allow_including_files_in_images
277
+ )
278
+ data["allow_download_from_code_repository"] = (
279
+ allow_download_from_code_repository
280
+ )
281
+ data["allow_download_from_artifact_store"] = (
282
+ allow_download_from_artifact_store
283
+ )
261
284
 
262
285
  return data
263
286
 
@@ -282,7 +305,7 @@ class DockerSettings(BaseSettings):
282
305
 
283
306
  return self
284
307
 
285
- model_config = SettingsConfigDict(
308
+ model_config = ConfigDict(
286
309
  # public attributes are immutable
287
310
  frozen=True,
288
311
  # prevent extra attributes during model initialization