zenml-nightly 0.70.0.dev20241201__py3-none-any.whl → 0.71.0.dev20241220__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. README.md +4 -4
  2. RELEASE_NOTES.md +112 -0
  3. zenml/VERSION +1 -1
  4. zenml/artifacts/artifact_config.py +8 -5
  5. zenml/artifacts/utils.py +3 -1
  6. zenml/cli/__init__.py +4 -4
  7. zenml/cli/base.py +1 -1
  8. zenml/cli/pipeline.py +48 -79
  9. zenml/cli/server.py +19 -19
  10. zenml/client.py +54 -2
  11. zenml/config/secret_reference_mixin.py +1 -1
  12. zenml/config/server_config.py +4 -0
  13. zenml/constants.py +10 -0
  14. zenml/image_builders/base_image_builder.py +5 -2
  15. zenml/image_builders/build_context.py +7 -16
  16. zenml/integrations/aws/__init__.py +3 -0
  17. zenml/integrations/aws/flavors/__init__.py +6 -0
  18. zenml/integrations/aws/flavors/aws_image_builder_flavor.py +146 -0
  19. zenml/integrations/aws/image_builders/__init__.py +20 -0
  20. zenml/integrations/aws/image_builders/aws_image_builder.py +307 -0
  21. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +1 -1
  22. zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +2 -1
  23. zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +11 -0
  24. zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +0 -1
  25. zenml/integrations/lightning/flavors/lightning_orchestrator_flavor.py +11 -0
  26. zenml/integrations/neptune/experiment_trackers/neptune_experiment_tracker.py +7 -5
  27. zenml/integrations/neptune/experiment_trackers/run_state.py +69 -53
  28. zenml/integrations/registry.py +2 -2
  29. zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +12 -0
  30. zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +13 -5
  31. zenml/materializers/built_in_materializer.py +1 -1
  32. zenml/model/model.py +12 -16
  33. zenml/model/utils.py +3 -1
  34. zenml/models/v2/base/filter.py +26 -30
  35. zenml/models/v2/base/scoped.py +258 -5
  36. zenml/models/v2/core/artifact_version.py +15 -26
  37. zenml/models/v2/core/code_repository.py +1 -12
  38. zenml/models/v2/core/component.py +5 -46
  39. zenml/models/v2/core/flavor.py +1 -11
  40. zenml/models/v2/core/model.py +1 -57
  41. zenml/models/v2/core/model_version.py +5 -33
  42. zenml/models/v2/core/model_version_artifact.py +11 -3
  43. zenml/models/v2/core/model_version_pipeline_run.py +14 -3
  44. zenml/models/v2/core/pipeline.py +47 -55
  45. zenml/models/v2/core/pipeline_build.py +67 -12
  46. zenml/models/v2/core/pipeline_deployment.py +0 -10
  47. zenml/models/v2/core/pipeline_run.py +91 -29
  48. zenml/models/v2/core/run_template.py +21 -29
  49. zenml/models/v2/core/schedule.py +0 -10
  50. zenml/models/v2/core/secret.py +0 -14
  51. zenml/models/v2/core/service.py +9 -16
  52. zenml/models/v2/core/service_connector.py +0 -11
  53. zenml/models/v2/core/stack.py +21 -30
  54. zenml/models/v2/core/step_run.py +18 -14
  55. zenml/models/v2/core/trigger.py +19 -3
  56. zenml/orchestrators/base_orchestrator.py +13 -1
  57. zenml/orchestrators/output_utils.py +5 -1
  58. zenml/orchestrators/step_launcher.py +9 -13
  59. zenml/orchestrators/step_run_utils.py +8 -204
  60. zenml/orchestrators/utils.py +55 -27
  61. zenml/pipelines/build_utils.py +12 -0
  62. zenml/service_connectors/service_connector_utils.py +3 -9
  63. zenml/stack/stack_component.py +1 -1
  64. zenml/stack_deployments/aws_stack_deployment.py +22 -0
  65. zenml/utils/archivable.py +65 -36
  66. zenml/utils/code_utils.py +8 -4
  67. zenml/utils/docker_utils.py +9 -0
  68. zenml/zen_server/auth.py +9 -10
  69. zenml/zen_server/dashboard/assets/{404-NVXKFp-x.js → 404-Cqu3EDCm.js} +1 -1
  70. zenml/zen_server/dashboard/assets/{@reactflow-CK0KJUen.js → @reactflow-D2Y7BWwz.js} +1 -1
  71. zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-DezXKmDf.js → AlertDialogDropdownItem-BHd71pVS.js} +1 -1
  72. zenml/zen_server/dashboard/assets/{CodeSnippet-JzR8CEtw.js → CodeSnippet-DIonwetW.js} +1 -1
  73. zenml/zen_server/dashboard/assets/{CollapsibleCard-DQW_ktMO.js → CollapsibleCard-CDnC97pB.js} +1 -1
  74. zenml/zen_server/dashboard/assets/{Commands-DL2kwkRd.js → Commands-BVEXKAOj.js} +1 -1
  75. zenml/zen_server/dashboard/assets/{ComponentBadge-D_g62Wv8.js → ComponentBadge-CrRvovox.js} +1 -1
  76. zenml/zen_server/dashboard/assets/{CopyButton-LNcWaa14.js → CopyButton-B6wGAhQv.js} +1 -1
  77. zenml/zen_server/dashboard/assets/{CsvVizualization-DknpE5ej.js → CsvVizualization-CjcT7LMm.js} +5 -5
  78. zenml/zen_server/dashboard/assets/DeleteAlertDialog-D2ELtM2W.js +1 -0
  79. zenml/zen_server/dashboard/assets/{DialogItem-Bxf8FuAT.js → DialogItem-DXIMhBgU.js} +1 -1
  80. zenml/zen_server/dashboard/assets/{Error-DYflYyps.js → Error-B8uUfTpL.js} +1 -1
  81. zenml/zen_server/dashboard/assets/{ExecutionStatus-C7zyIQKZ.js → ExecutionStatus-ibAdY-dG.js} +1 -1
  82. zenml/zen_server/dashboard/assets/{Helpbox-oYSGpLqd.js → Helpbox-BfAfhKHw.js} +1 -1
  83. zenml/zen_server/dashboard/assets/{Infobox-Cx4xGoXR.js → Infobox-M_SMOu96.js} +1 -1
  84. zenml/zen_server/dashboard/assets/{InlineAvatar-DiGOWNKF.js → InlineAvatar-DBA0a0-a.js} +1 -1
  85. zenml/zen_server/dashboard/assets/{NestedCollapsible-DYbgyKxK.js → NestedCollapsible-DpgmEFKw.js} +1 -1
  86. zenml/zen_server/dashboard/assets/{Partials-03iZf8-N.js → Partials-D_ldD9if.js} +1 -1
  87. zenml/zen_server/dashboard/assets/{ProBadge-D_EB8HNo.js → ProBadge-DQbfFotM.js} +1 -1
  88. zenml/zen_server/dashboard/assets/{ProCta-DqNS4v3x.js → ProCta-Bcpb4rcY.js} +1 -1
  89. zenml/zen_server/dashboard/assets/{ProviderIcon-Bki2aw8w.js → ProviderIcon-BZpgPigN.js} +1 -1
  90. zenml/zen_server/dashboard/assets/{ProviderRadio-8f43sPD4.js → ProviderRadio-DWPnMuQ1.js} +1 -1
  91. zenml/zen_server/dashboard/assets/RunSelector-DgRGaAc6.js +1 -0
  92. zenml/zen_server/dashboard/assets/{RunsBody-07YEO7qI.js → RunsBody-KecfSkjY.js} +1 -1
  93. zenml/zen_server/dashboard/assets/{SearchField-lp1KgU4e.js → SearchField-n-ILHnaP.js} +1 -1
  94. zenml/zen_server/dashboard/assets/{SecretTooltip-CgnbyeOx.js → SecretTooltip-B8MrX5yu.js} +1 -1
  95. zenml/zen_server/dashboard/assets/{SetPassword-CpP418A2.js → SetPassword-B_IVq_wg.js} +1 -1
  96. zenml/zen_server/dashboard/assets/StackList-TWPBYnkF.js +1 -0
  97. zenml/zen_server/dashboard/assets/{Tabs-BktHkCJJ.js → Tabs-Rg857zmd.js} +1 -1
  98. zenml/zen_server/dashboard/assets/{Tick-BlMoIlJT.js → Tick-COg4A-xo.js} +1 -1
  99. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Sc0A0pP-.js → UpdatePasswordSchemas-C6Aj3hm6.js} +1 -1
  100. zenml/zen_server/dashboard/assets/{UsageReason-YYduL4fj.js → UsageReason-BTLbx7w4.js} +1 -1
  101. zenml/zen_server/dashboard/assets/{WizardFooter-dgmizSJC.js → WizardFooter-BCAj69Vj.js} +1 -1
  102. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-D-c2G6lV.js → all-pipeline-runs-query-DMXkDrV2.js} +1 -1
  103. zenml/zen_server/dashboard/assets/code-snippets-CqONne41.js +13 -0
  104. zenml/zen_server/dashboard/assets/{create-stack-DM_JPgef.js → create-stack-HfdbhLs4.js} +1 -1
  105. zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +1 -0
  106. zenml/zen_server/dashboard/assets/delete-run-DZ4hIXff.js +1 -0
  107. zenml/zen_server/dashboard/assets/{form-schemas-K6FYKjwa.js → form-schemas-B0AVEd9b.js} +1 -1
  108. zenml/zen_server/dashboard/assets/{index-BAkC7FXi.js → index-DPqSWjug.js} +1 -1
  109. zenml/zen_server/dashboard/assets/{index-CEV4Cvaf.js → index-DScjfBRb.js} +1 -1
  110. zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +1 -0
  111. zenml/zen_server/dashboard/assets/{index-CCOPpudF.js → index-FO-p0GU7.js} +5 -5
  112. zenml/zen_server/dashboard/assets/{index-B1mVPYxf.js → index-I3bKUGUj.js} +1 -1
  113. zenml/zen_server/dashboard/assets/key-icon-aH-QIa5R.js +1 -0
  114. zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +1 -0
  115. zenml/zen_server/dashboard/assets/{login-mutation-hf-lK87O.js → login-mutation-BQeo4wTY.js} +1 -1
  116. zenml/zen_server/dashboard/assets/{not-found-BGirLjU-.js → not-found-gAJ5aDdR.js} +1 -1
  117. zenml/zen_server/dashboard/assets/page-9Y9-gig0.js +1 -0
  118. zenml/zen_server/dashboard/assets/{page-DjRJCGb3.js → page-AUwiQ14W.js} +1 -1
  119. zenml/zen_server/dashboard/assets/page-B6XU7yYT.js +2 -0
  120. zenml/zen_server/dashboard/assets/{page-C00YAkaB.js → page-BKZYc2Zv.js} +1 -1
  121. zenml/zen_server/dashboard/assets/{page-CdMWnQak.js → page-BU9FG4sR.js} +1 -1
  122. zenml/zen_server/dashboard/assets/{page-D7S3aCbF.js → page-B_Apk3xg.js} +1 -1
  123. zenml/zen_server/dashboard/assets/{page-Djikxq_S.js → page-BdowiCbr.js} +1 -1
  124. zenml/zen_server/dashboard/assets/page-Bg8OjTRe.js +1 -0
  125. zenml/zen_server/dashboard/assets/page-BxL4qD4_.js +1 -0
  126. zenml/zen_server/dashboard/assets/{page-DakHVWXF.js → page-CWxT5K5J.js} +1 -1
  127. zenml/zen_server/dashboard/assets/page-CXuQufSe.js +1 -0
  128. zenml/zen_server/dashboard/assets/{page-DLC-bNBP.js → page-CcQr8CPP.js} +1 -1
  129. zenml/zen_server/dashboard/assets/{page-CD-DcWoy.js → page-Ce4Hrjnr.js} +1 -1
  130. zenml/zen_server/dashboard/assets/page-CiYxgZP_.js +1 -0
  131. zenml/zen_server/dashboard/assets/page-Cldq1mpe.js +1 -0
  132. zenml/zen_server/dashboard/assets/{page-BDigxVpo.js → page-D4wdonLm.js} +1 -1
  133. zenml/zen_server/dashboard/assets/{page-D6uU2ax4.js → page-D8ObrbH8.js} +1 -1
  134. zenml/zen_server/dashboard/assets/{page-DXSTpqRD.js → page-DFuAUGt4.js} +1 -1
  135. zenml/zen_server/dashboard/assets/{page-CbpvrsDL.js → page-DGazBpuP.js} +1 -1
  136. zenml/zen_server/dashboard/assets/{page-COXXJj1k.js → page-DO1UcqPX.js} +1 -1
  137. zenml/zen_server/dashboard/assets/page-DRYXdL5o.js +1 -0
  138. zenml/zen_server/dashboard/assets/{page-Df-Fw0aq.js → page-DYEquBC2.js} +1 -1
  139. zenml/zen_server/dashboard/assets/page-Dk32IeZm.js +1 -0
  140. zenml/zen_server/dashboard/assets/{page-yYC9OI-E.js → page-I3nKFGie.js} +1 -1
  141. zenml/zen_server/dashboard/assets/{page-6m6yHHlE.js → page-M0w-n6vn.js} +1 -1
  142. zenml/zen_server/dashboard/assets/{page-Vcxara9U.js → page-R5dx3xGF.js} +1 -1
  143. zenml/zen_server/dashboard/assets/{page-BR68V0V1.js → page-bT5pOvcB.js} +1 -1
  144. zenml/zen_server/dashboard/assets/page-hUqK889I.js +6 -0
  145. zenml/zen_server/dashboard/assets/{page-CjGdWY13.js → page-h_Stveon.js} +1 -1
  146. zenml/zen_server/dashboard/assets/{page-D01JhjQB.js → page-r8XK5vR7.js} +1 -1
  147. zenml/zen_server/dashboard/assets/page-u_-ZXBKb.js +1 -0
  148. zenml/zen_server/dashboard/assets/page-zaMqB_ao.js +1 -0
  149. zenml/zen_server/dashboard/assets/{persist-GjC8PZoC.js → persist-AppN1B0J.js} +1 -1
  150. zenml/zen_server/dashboard/assets/{persist-Coz7ZWvz.js → persist-DAUi_3za.js} +1 -1
  151. zenml/zen_server/dashboard/assets/service-BqqeXLEe.js +2 -0
  152. zenml/zen_server/dashboard/assets/{sharedSchema-CQb14VSr.js → sharedSchema-uXN9FLLk.js} +1 -1
  153. zenml/zen_server/dashboard/assets/{stack-detail-query-OPEW-cDJ.js → stack-detail-query-XfZBiBP2.js} +1 -1
  154. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-LwuQfHYn.js → update-server-settings-mutation-BWmgVJwA.js} +1 -1
  155. zenml/zen_server/dashboard/assets/{url-CkvKAnwF.js → url-BLwMbzES.js} +1 -1
  156. zenml/zen_server/dashboard/index.html +4 -4
  157. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  158. zenml/zen_server/deploy/helm/README.md +2 -2
  159. zenml/zen_server/rbac/rbac_sql_zen_store.py +173 -0
  160. zenml/zen_server/routers/auth_endpoints.py +22 -11
  161. zenml/zen_server/routers/steps_endpoints.py +7 -1
  162. zenml/zen_server/template_execution/utils.py +3 -1
  163. zenml/zen_server/utils.py +4 -3
  164. zenml/zen_stores/base_zen_store.py +10 -2
  165. zenml/zen_stores/migrations/versions/0.71.0_release.py +23 -0
  166. zenml/zen_stores/migrations/versions/26351d482b9e_add_step_run_unique_constraint.py +37 -0
  167. zenml/zen_stores/migrations/versions/a1237ba94fd8_add_model_version_producer_run_unique_.py +68 -0
  168. zenml/zen_stores/rest_zen_store.py +76 -43
  169. zenml/zen_stores/schemas/model_schemas.py +42 -6
  170. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +7 -7
  171. zenml/zen_stores/schemas/pipeline_run_schemas.py +12 -6
  172. zenml/zen_stores/schemas/pipeline_schemas.py +5 -0
  173. zenml/zen_stores/schemas/step_run_schemas.py +8 -1
  174. zenml/zen_stores/sql_zen_store.py +332 -100
  175. {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/METADATA +5 -5
  176. {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/RECORD +179 -164
  177. zenml/zen_server/dashboard/assets/RunSelector-DkPiIiNr.js +0 -1
  178. zenml/zen_server/dashboard/assets/StackList-WvuKQusZ.js +0 -1
  179. zenml/zen_server/dashboard/assets/delete-run-CJdh1P_h.js +0 -1
  180. zenml/zen_server/dashboard/assets/index-DlGvJQPn.css +0 -1
  181. zenml/zen_server/dashboard/assets/page-0JE_-Ec1.js +0 -1
  182. zenml/zen_server/dashboard/assets/page-BRLpxOt0.js +0 -1
  183. zenml/zen_server/dashboard/assets/page-BU7huvKw.js +0 -6
  184. zenml/zen_server/dashboard/assets/page-BvqLv2Ky.js +0 -1
  185. zenml/zen_server/dashboard/assets/page-CwxrFarU.js +0 -1
  186. zenml/zen_server/dashboard/assets/page-DfbXf_8s.js +0 -1
  187. zenml/zen_server/dashboard/assets/page-Dnovpa0i.js +0 -3
  188. zenml/zen_server/dashboard/assets/page-Dot3LPmL.js +0 -1
  189. zenml/zen_server/dashboard/assets/page-Xynx4btY.js +0 -14
  190. zenml/zen_server/dashboard/assets/page-YpKAqVSa.js +0 -1
  191. {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/LICENSE +0 -0
  192. {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/WHEEL +0 -0
  193. {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/entry_points.txt +0 -0
README.md CHANGED
@@ -147,7 +147,7 @@ Or, through our CLI command:
147
147
  zenml stack deploy --provider aws
148
148
  ```
149
149
 
150
- Alternatively, if the necessary pieces of infrastructure is already deployed, you can register a cloud stack seamlessly through the stack wizard:
150
+ Alternatively, if the necessary pieces of infrastructure are already deployed, you can register a cloud stack seamlessly through the stack wizard:
151
151
 
152
152
  ```bash
153
153
  zenml stack register <STACK_NAME> --provider aws
@@ -195,9 +195,9 @@ def trainer(training_df: pd.DataFrame) -> Annotated["model", torch.nn.Module]:
195
195
 
196
196
  ![Exploring ZenML Models](/docs/book/.gitbook/assets/readme_mcp.gif)
197
197
 
198
- ### Purpose built for machine learning with integration to you favorite tools
198
+ ### Purpose built for machine learning with integrations to your favorite tools
199
199
 
200
- While ZenML brings a lot of value of the box, it also integrates into your existing tooling and infrastructure without you having to be locked in.
200
+ While ZenML brings a lot of value out of the box, it also integrates into your existing tooling and infrastructure without you having to be locked in.
201
201
 
202
202
  ```python
203
203
  from bentoml._internal.bento import bento
@@ -333,7 +333,7 @@ the Apache License Version 2.0.
333
333
  <a href="https://github.com/zenml-io/zenml-projects">Projects Showcase</a>
334
334
  <br />
335
335
  <br />
336
- 🎉 Version 0.70.0 is out. Check out the release notes
336
+ 🎉 Version 0.71.0 is out. Check out the release notes
337
337
  <a href="https://github.com/zenml-io/zenml/releases">here</a>.
338
338
  <br />
339
339
  🖥️ 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,117 @@
1
1
  <!-- markdown-link-check-disable -->
2
2
 
3
+ # 0.71.0
4
+
5
+ ZenML version 0.71.0 delivers a new Modal step operator integration as its
6
+ core feature, enabling efficient cloud execution for ML pipelines with granular
7
+ hardware configuration options. The release strengthens enterprise capabilities
8
+ through improved token management and dashboard features, while expanding
9
+ artifact handling with dynamic naming and enhanced visualization support.
10
+ Additionally, it includes various infrastructure improvements and bug fixes
11
+ that enhance the platform's stability and usability, particularly around
12
+ Docker connectivity, Kubernetes management, and service connector operations.
13
+
14
+ ## New Feature: Modal Step Operator Integration
15
+
16
+ ZenML now [integrates with Modal](https://modal.com/), bringing lightning-fast
17
+ cloud execution capabilities to your ML pipelines. This new step operator[
18
+ https://docs.zenml.io/stack-components/step-operators/modal] allows you to
19
+ execute individual pipeline steps on Modal's specialized compute instances,
20
+ offering notable speed particularly for Docker image building and hardware
21
+ provisioning. With simple configuration options, you can precisely specify
22
+ hardware requirements like GPU type, CPU count, and memory for each step,
23
+ making it ideal for resource-intensive ML workloads.
24
+
25
+ ## Other Highlights
26
+
27
+ - **Workload API Token Management:** Refactored token management for improved
28
+ security with a generic API token dispenser.
29
+ - **Dashboard Enhancements:**
30
+ - Introduced service account management capabilities.
31
+ - Added API key creation and integration features.
32
+ - **Dynamic Artifact Naming:** Introduced capability to dynamically name
33
+ artifacts.
34
+ - **Visualization Enhancements:** Made dictionaries and lists visualizable,
35
+ added JSON visualization type.
36
+
37
+ ## Additional Features and Improvements
38
+
39
+ - Improved error messages for Docker daemon connectivity
40
+ - Enhanced SageMaker URL handling
41
+ - Simplified model version artifact linkage
42
+ - Added testing for pipeline templates
43
+ - Improved Kubernetes pod and label length management
44
+ - Allowed skipping type annotations for step inputs
45
+ - Enabled using feature service instances instead of just names
46
+
47
+ ## Bug Fixes
48
+
49
+ - Fixed issues with getting out of an inaccessible active stack
50
+ - Fixed race conditions in the service connector type registry
51
+ - Resolved migration test complications
52
+ - Corrected documentation links
53
+ - Fixed artifact store and artifact URI handling
54
+ - Addressed various scalability and compatibility issues
55
+
56
+ ## Documentation Updates
57
+
58
+ - Added documentation redirects
59
+ - Updated PyTorch documentation links
60
+ - Improved service connector documentation
61
+
62
+ ## What's Changed
63
+ * Refactored workload API token management for better security and implemented generic API token dispenser by @stefannica in https://github.com/zenml-io/zenml/pull/3154
64
+ * Add 0.70.0 to the migration tests by @avishniakov in https://github.com/zenml-io/zenml/pull/3190
65
+ * Adjustments to the PR template by @bcdurak in https://github.com/zenml-io/zenml/pull/3194
66
+ * [docs] Fix links in the how-to section of docs by @wjayesh in https://github.com/zenml-io/zenml/pull/3196
67
+ * Fixing sagemaker urls to take the settings into consideration by @bcdurak in https://github.com/zenml-io/zenml/pull/3195
68
+ * Add cached run into testing of migrations by @avishniakov in https://github.com/zenml-io/zenml/pull/3199
69
+ * Fix service connector type registry race conditions by @stefannica in https://github.com/zenml-io/zenml/pull/3202
70
+ * Refactor container resource configuration in Vertex Orchestrator test by @avishniakov in https://github.com/zenml-io/zenml/pull/3203
71
+ * [docs] Add missing redirects by @wjayesh in https://github.com/zenml-io/zenml/pull/3200
72
+ * Add links to `uv` new PyTorch documentation by @strickvl in https://github.com/zenml-io/zenml/pull/3204
73
+ * Fix broken docs link by @strickvl in https://github.com/zenml-io/zenml/pull/3208
74
+ * Bugfix for getting out of an inaccessible active stack with no permissions by @bcdurak in https://github.com/zenml-io/zenml/pull/3198
75
+ * Simplify model version artifact linkage by @schustmi in https://github.com/zenml-io/zenml/pull/3175
76
+ * Reenable macos testing by @avishniakov in https://github.com/zenml-io/zenml/pull/3205
77
+ * Various fixes and improvements by @stefannica in https://github.com/zenml-io/zenml/pull/3211
78
+ * Pass config path during zenml pipeline build by @schustmi in https://github.com/zenml-io/zenml/pull/3212
79
+ * Add test for running templates by @schustmi in https://github.com/zenml-io/zenml/pull/3192
80
+ * Fix service connector docstring by @schustmi in https://github.com/zenml-io/zenml/pull/3216
81
+ * Improve error message when docker daemon is not reachable by @schustmi in https://github.com/zenml-io/zenml/pull/3214
82
+ * Don't run migration for empty updates by @schustmi in https://github.com/zenml-io/zenml/pull/3210
83
+ * Remove `--check` from format script and fix naming by @safoinme in https://github.com/zenml-io/zenml/pull/3218
84
+ * More scalability improvements by @schustmi in https://github.com/zenml-io/zenml/pull/3206
85
+ * Use correct keyword for artifact store open by @schustmi in https://github.com/zenml-io/zenml/pull/3220
86
+ * Fix passing of some sagemaker settings by @schustmi in https://github.com/zenml-io/zenml/pull/3221
87
+ * Add hint when trying to connect with api key by @schustmi in https://github.com/zenml-io/zenml/pull/3222
88
+ * Allow passing None values as parameter for optional complex types by @schustmi in https://github.com/zenml-io/zenml/pull/3215
89
+ * Limit kubernetes pod and label length by @schustmi in https://github.com/zenml-io/zenml/pull/3217
90
+ * Updating the quickstart example to use the new `log_metadata` by @bcdurak in https://github.com/zenml-io/zenml/pull/3188
91
+ * Allow skipping type annotations for step inputs by @schustmi in https://github.com/zenml-io/zenml/pull/3223
92
+ * Modal Step Operator by @strickvl in https://github.com/zenml-io/zenml/pull/2948
93
+ * Add dynamic artifacts naming, documentation and tests by @avishniakov in https://github.com/zenml-io/zenml/pull/3201
94
+ * Run template CLI command and bugfix by @schustmi in https://github.com/zenml-io/zenml/pull/3225
95
+ * Make dicts/lists visualizable and add JSON as viz type by @wjayesh in https://github.com/zenml-io/zenml/pull/2882
96
+ * Instances of the `FeatureService`s are now used instead of only the names of the FeatureServices. by @aiakide in https://github.com/zenml-io/zenml/pull/3209
97
+ * Quickstart fixes by @schustmi in https://github.com/zenml-io/zenml/pull/3227
98
+ * Add missing docs by @schustmi in https://github.com/zenml-io/zenml/pull/3226
99
+ * Misc cleanup by @schustmi in https://github.com/zenml-io/zenml/pull/3229
100
+ * Fix input resolution for steps with dynamic artifact names by @schustmi in https://github.com/zenml-io/zenml/pull/3228
101
+ * Follow-up on the `run_metadata` changes by @bcdurak in https://github.com/zenml-io/zenml/pull/3193
102
+ * Fixed broken links by @htahir1 in https://github.com/zenml-io/zenml/pull/3232
103
+ * Fixed wandb login problem in Quickstart by @htahir1 in https://github.com/zenml-io/zenml/pull/3233
104
+ * Misc bugfixes by @schustmi in https://github.com/zenml-io/zenml/pull/3234
105
+ * Add additional way to fetch docker repo digest by @schustmi in https://github.com/zenml-io/zenml/pull/3231
106
+ * AWS Image Builder implementation by @stefannica in https://github.com/zenml-io/zenml/pull/2904
107
+ * Disable client-side caching for some orchestrators by @schustmi in https://github.com/zenml-io/zenml/pull/3235
108
+ * Fix artifact uris for artifacts with name placeholders by @schustmi in https://github.com/zenml-io/zenml/pull/3237
109
+ * Materializer test fix on Windows by @bcdurak in https://github.com/zenml-io/zenml/pull/3238
110
+ * Fix GET step run endpoint to return unhydrated response if requested by @schustmi in https://github.com/zenml-io/zenml/pull/3240
111
+ * Pipeline run API token fixes and improvements by @stefannica in https://github.com/zenml-io/zenml/pull/3242
112
+
113
+ **Full Changelog**: https://github.com/zenml-io/zenml/compare/0.70.0...0.71.0
114
+
3
115
  # 0.70.0
4
116
 
5
117
  The **ZenML 0.70.0** release includes a significant number of database schema changes and migrations, which means upgrading to this version will require extra caution. As always, please make sure to make a copy of your production database before upgrading.
zenml/VERSION CHANGED
@@ -1 +1 @@
1
- 0.70.0.dev20241201
1
+ 0.71.0.dev20241220
@@ -104,15 +104,18 @@ class ArtifactConfig(BaseModel):
104
104
  )
105
105
  elif is_model_artifact:
106
106
  logger.warning(
107
- "`ArtifactConfig.is_model_artifact` is deprecated and will be "
108
- "removed soon. Use `ArtifactConfig.artifact_type` instead."
107
+ "`ArtifactConfig(..., is_model_artifact=True)` is deprecated "
108
+ "and will be removed soon. Use `ArtifactConfig(..., "
109
+ "artifact_type=ArtifactType.MODEL)` instead. For more info: "
110
+ "https://docs.zenml.io/user-guide/starter-guide/manage-artifacts"
109
111
  )
110
112
  data.setdefault("artifact_type", ArtifactType.MODEL)
111
113
  elif is_deployment_artifact:
112
114
  logger.warning(
113
- "`ArtifactConfig.is_deployment_artifact` is deprecated and "
114
- "will be removed soon. Use `ArtifactConfig.artifact_type` "
115
- "instead."
115
+ "`ArtifactConfig(..., is_deployment_artifact=True)` is "
116
+ "deprecated and will be removed soon. Use `ArtifactConfig(..., "
117
+ "artifact_type=ArtifactType.SERVICE)` instead. For more info: "
118
+ "https://docs.zenml.io/user-guide/starter-guide/manage-artifacts"
116
119
  )
117
120
  data.setdefault("artifact_type", ArtifactType.SERVICE)
118
121
 
zenml/artifacts/utils.py CHANGED
@@ -414,7 +414,9 @@ def log_artifact_metadata(
414
414
  """
415
415
  logger.warning(
416
416
  "The `log_artifact_metadata` function is deprecated and will soon be "
417
- "removed. Please use `log_metadata` instead."
417
+ "removed. Instead, you can consider using: "
418
+ "`log_metadata(metadata={...}, infer_artifact=True, ...)` instead. For more "
419
+ "info: https://docs.zenml.io/how-to/model-management-metrics/track-metrics-metadata/attach-metadata-to-an-artifact"
418
420
  )
419
421
 
420
422
  from zenml import log_metadata
zenml/cli/__init__.py CHANGED
@@ -1987,7 +1987,7 @@ Secrets management
1987
1987
  ------------------
1988
1988
 
1989
1989
  ZenML offers a way to [securely store secrets associated with your other
1990
- stack components and infrastructure](https://docs.zenml.io/getting-started/deploying-zenml/manage-the-deployed-services/secret-management).
1990
+ stack components and infrastructure](https://docs.zenml.io/getting-started/deploying-zenml/secret-management).
1991
1991
  A ZenML Secret is a collection or grouping of key-value pairs stored by the
1992
1992
  ZenML secrets store. ZenML Secrets are identified by a unique name which
1993
1993
  allows you to fetch or reference them in your pipelines and stacks.
@@ -2083,7 +2083,7 @@ challenge in configuring uninterrupted, secure access to infrastructure
2083
2083
  resources. In ZenML, Service Connectors streamline this process by abstracting
2084
2084
  away the complexity of authentication and help you connect your stack to your
2085
2085
  resources. You can find the full docs on the ZenML service connectors
2086
- [here](https://docs.zenml.io/how-to/auth-management).
2086
+ [here](https://docs.zenml.io/how-to/infrastructure-deployment/auth-management).
2087
2087
 
2088
2088
  The ZenML CLI features a variety of commands to help you manage your service
2089
2089
  connectors. First of all, to explore all the types of service connectors
@@ -2113,7 +2113,7 @@ zenml service-connector register SERVICE_CONNECTOR_NAME \
2113
2113
  ```
2114
2114
 
2115
2115
  For more details on how to create a service connector, please refer to our
2116
- [docs](https://docs.zenml.io/how-to/auth-management).
2116
+ [docs](https://docs.zenml.io/how-to/infrastructure-deployment/auth-management).
2117
2117
 
2118
2118
  To check if your service connector is registered properly, you can `verify` it.
2119
2119
  By doing this, you can both check if it is configured correctly and also, you
@@ -2367,7 +2367,7 @@ defining the pipeline is not in your current directory, the module path consists
2367
2367
  of the full path to the file, separated by dots, e.g.
2368
2368
  `some_directory.some_file.my_pipeline`.
2369
2369
 
2370
- To [build Docker images for your pipeline](https://docs.zenml.io/how-to/customize-docker-builds)
2370
+ To [build Docker images for your pipeline](https://docs.zenml.io/how-to/infrastructure-deployment/customize-docker-builds)
2371
2371
  without actually running the pipeline, use:
2372
2372
 
2373
2373
  ```bash
zenml/cli/base.py CHANGED
@@ -264,7 +264,7 @@ def init(
264
264
  f"will only take effect when you're running ZenML from the initialized "
265
265
  f"repository root, or from a subdirectory. For more information on "
266
266
  f"repositories and configurations, please visit "
267
- f"https://docs.zenml.io/user-guide/starter-guide/understand-stacks."
267
+ f"https://docs.zenml.io/user-guide/production-guide/understand-stacks."
268
268
  )
269
269
 
270
270
 
zenml/cli/pipeline.py CHANGED
@@ -40,6 +40,35 @@ from zenml.utils.yaml_utils import write_yaml
40
40
  logger = get_logger(__name__)
41
41
 
42
42
 
43
+ def _import_pipeline(source: str) -> Pipeline:
44
+ """Import a pipeline.
45
+
46
+ Args:
47
+ source: The pipeline source.
48
+
49
+ Returns:
50
+ The pipeline.
51
+ """
52
+ try:
53
+ pipeline_instance = source_utils.load(source)
54
+ except ModuleNotFoundError as e:
55
+ source_root = source_utils.get_source_root()
56
+ cli_utils.error(
57
+ f"Unable to import module `{e.name}`. Make sure the source path is "
58
+ f"relative to your source root `{source_root}`."
59
+ )
60
+ except AttributeError as e:
61
+ cli_utils.error("Unable to load attribute from module: " + str(e))
62
+
63
+ if not isinstance(pipeline_instance, Pipeline):
64
+ cli_utils.error(
65
+ f"The given source path `{source}` does not resolve to a pipeline "
66
+ "object."
67
+ )
68
+
69
+ return pipeline_instance
70
+
71
+
43
72
  @cli.group(cls=TagGroup, tag=CliCategories.MANAGEMENT_TOOLS)
44
73
  def pipeline() -> None:
45
74
  """Interact with pipelines, runs and schedules."""
@@ -85,22 +114,7 @@ def register_pipeline(
85
114
  "source code root."
86
115
  )
87
116
 
88
- try:
89
- pipeline_instance = source_utils.load(source)
90
- except ModuleNotFoundError as e:
91
- source_root = source_utils.get_source_root()
92
- cli_utils.error(
93
- f"Unable to import module `{e.name}`. Make sure the source path is "
94
- f"relative to your source root `{source_root}`."
95
- )
96
- except AttributeError as e:
97
- cli_utils.error("Unable to load attribute from module: " + str(e))
98
-
99
- if not isinstance(pipeline_instance, Pipeline):
100
- cli_utils.error(
101
- f"The given source path `{source}` does not resolve to a pipeline "
102
- "object."
103
- )
117
+ pipeline_instance = _import_pipeline(source=source)
104
118
 
105
119
  parameters: Dict[str, Any] = {}
106
120
  if parameters_path:
@@ -176,24 +190,9 @@ def build_pipeline(
176
190
  "your source code root."
177
191
  )
178
192
 
179
- try:
180
- pipeline_instance = source_utils.load(source)
181
- except ModuleNotFoundError as e:
182
- source_root = source_utils.get_source_root()
183
- cli_utils.error(
184
- f"Unable to import module `{e.name}`. Make sure the source path is "
185
- f"relative to your source root `{source_root}`."
186
- )
187
- except AttributeError as e:
188
- cli_utils.error("Unable to load attribute from module: " + str(e))
189
-
190
- if not isinstance(pipeline_instance, Pipeline):
191
- cli_utils.error(
192
- f"The given source path `{source}` does not resolve to a pipeline "
193
- "object."
194
- )
195
-
196
193
  with cli_utils.temporary_active_stack(stack_name_or_id=stack_name_or_id):
194
+ pipeline_instance = _import_pipeline(source=source)
195
+
197
196
  pipeline_instance = pipeline_instance.with_options(
198
197
  config_path=config_path
199
198
  )
@@ -277,36 +276,21 @@ def run_pipeline(
277
276
  "your source code root."
278
277
  )
279
278
 
280
- try:
281
- pipeline_instance = source_utils.load(source)
282
- except ModuleNotFoundError as e:
283
- source_root = source_utils.get_source_root()
284
- cli_utils.error(
285
- f"Unable to import module `{e.name}`. Make sure the source path is "
286
- f"relative to your source root `{source_root}`."
287
- )
288
- except AttributeError as e:
289
- cli_utils.error("Unable to load attribute from module: " + str(e))
290
-
291
- if not isinstance(pipeline_instance, Pipeline):
292
- cli_utils.error(
293
- f"The given source path `{source}` does not resolve to a pipeline "
294
- "object."
295
- )
296
-
297
- build: Union[str, PipelineBuildBase, None] = None
298
- if build_path_or_id:
299
- if uuid_utils.is_valid_uuid(build_path_or_id):
300
- build = build_path_or_id
301
- elif os.path.exists(build_path_or_id):
302
- build = PipelineBuildBase.from_yaml(build_path_or_id)
303
- else:
304
- cli_utils.error(
305
- f"The specified build {build_path_or_id} is not a valid UUID "
306
- "or file path."
307
- )
308
-
309
279
  with cli_utils.temporary_active_stack(stack_name_or_id=stack_name_or_id):
280
+ pipeline_instance = _import_pipeline(source=source)
281
+
282
+ build: Union[str, PipelineBuildBase, None] = None
283
+ if build_path_or_id:
284
+ if uuid_utils.is_valid_uuid(build_path_or_id):
285
+ build = build_path_or_id
286
+ elif os.path.exists(build_path_or_id):
287
+ build = PipelineBuildBase.from_yaml(build_path_or_id)
288
+ else:
289
+ cli_utils.error(
290
+ f"The specified build {build_path_or_id} is not a valid UUID "
291
+ "or file path."
292
+ )
293
+
310
294
  pipeline_instance = pipeline_instance.with_options(
311
295
  config_path=config_path,
312
296
  build=build,
@@ -369,24 +353,9 @@ def create_run_template(
369
353
  "init` at your source code root."
370
354
  )
371
355
 
372
- try:
373
- pipeline_instance = source_utils.load(source)
374
- except ModuleNotFoundError as e:
375
- source_root = source_utils.get_source_root()
376
- cli_utils.error(
377
- f"Unable to import module `{e.name}`. Make sure the source path is "
378
- f"relative to your source root `{source_root}`."
379
- )
380
- except AttributeError as e:
381
- cli_utils.error("Unable to load attribute from module: " + str(e))
382
-
383
- if not isinstance(pipeline_instance, Pipeline):
384
- cli_utils.error(
385
- f"The given source path `{source}` does not resolve to a pipeline "
386
- "object."
387
- )
388
-
389
356
  with cli_utils.temporary_active_stack(stack_name_or_id=stack_name_or_id):
357
+ pipeline_instance = _import_pipeline(source=source)
358
+
390
359
  pipeline_instance = pipeline_instance.with_options(
391
360
  config_path=config_path
392
361
  )
zenml/cli/server.py CHANGED
@@ -587,25 +587,6 @@ def server_list(verbose: bool = False, all: bool = False) -> None:
587
587
  accessible_pro_servers = client.tenant.list(member_only=not all)
588
588
  except AuthorizationException as e:
589
589
  cli_utils.warning(f"ZenML Pro authorization error: {e}")
590
- else:
591
- if not all:
592
- accessible_pro_servers = [
593
- s
594
- for s in accessible_pro_servers
595
- if s.status == TenantStatus.AVAILABLE
596
- ]
597
-
598
- if not accessible_pro_servers:
599
- cli_utils.declare(
600
- "No ZenML Pro servers that are accessible to the current "
601
- "user could be found."
602
- )
603
- if not all:
604
- cli_utils.declare(
605
- "Hint: use the `--all` flag to show all ZenML servers, "
606
- "including those that the client is not currently "
607
- "authorized to access or are not running."
608
- )
609
590
 
610
591
  # We update the list of stored ZenML Pro servers with the ones that the
611
592
  # client is a member of
@@ -633,6 +614,25 @@ def server_list(verbose: bool = False, all: bool = False) -> None:
633
614
  stored_server.update_server_info(accessible_server)
634
615
  pro_servers.append(stored_server)
635
616
 
617
+ if not all:
618
+ accessible_pro_servers = [
619
+ s
620
+ for s in accessible_pro_servers
621
+ if s.status == TenantStatus.AVAILABLE
622
+ ]
623
+
624
+ if not accessible_pro_servers:
625
+ cli_utils.declare(
626
+ "No ZenML Pro servers that are accessible to the current "
627
+ "user could be found."
628
+ )
629
+ if not all:
630
+ cli_utils.declare(
631
+ "Hint: use the `--all` flag to show all ZenML servers, "
632
+ "including those that the client is not currently "
633
+ "authorized to access or are not running."
634
+ )
635
+
636
636
  elif pro_servers:
637
637
  cli_utils.warning(
638
638
  "The ZenML Pro authentication has expired. Please re-login "