zenml-nightly 0.70.0.dev20241204__py3-none-any.whl → 0.71.0.dev20241207__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- README.md +4 -4
- RELEASE_NOTES.md +112 -0
- zenml/VERSION +1 -1
- zenml/config/server_config.py +4 -0
- zenml/constants.py +10 -0
- zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +13 -5
- zenml/orchestrators/utils.py +55 -27
- zenml/zen_server/auth.py +9 -10
- zenml/zen_server/dashboard/assets/{404-NVXKFp-x.js → 404-Cqu3EDCm.js} +1 -1
- zenml/zen_server/dashboard/assets/{@reactflow-CK0KJUen.js → @reactflow-D2Y7BWwz.js} +1 -1
- zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-DezXKmDf.js → AlertDialogDropdownItem-BHd71pVS.js} +1 -1
- zenml/zen_server/dashboard/assets/{CodeSnippet-JzR8CEtw.js → CodeSnippet-DIonwetW.js} +1 -1
- zenml/zen_server/dashboard/assets/{CollapsibleCard-DQW_ktMO.js → CollapsibleCard-CDnC97pB.js} +1 -1
- zenml/zen_server/dashboard/assets/{Commands-DL2kwkRd.js → Commands-BVEXKAOj.js} +1 -1
- zenml/zen_server/dashboard/assets/{ComponentBadge-D_g62Wv8.js → ComponentBadge-CrRvovox.js} +1 -1
- zenml/zen_server/dashboard/assets/{CopyButton-LNcWaa14.js → CopyButton-B6wGAhQv.js} +1 -1
- zenml/zen_server/dashboard/assets/{CsvVizualization-DknpE5ej.js → CsvVizualization-CjcT7LMm.js} +5 -5
- zenml/zen_server/dashboard/assets/DeleteAlertDialog-D2ELtM2W.js +1 -0
- zenml/zen_server/dashboard/assets/{DialogItem-Bxf8FuAT.js → DialogItem-DXIMhBgU.js} +1 -1
- zenml/zen_server/dashboard/assets/{Error-DYflYyps.js → Error-B8uUfTpL.js} +1 -1
- zenml/zen_server/dashboard/assets/{ExecutionStatus-C7zyIQKZ.js → ExecutionStatus-ibAdY-dG.js} +1 -1
- zenml/zen_server/dashboard/assets/{Helpbox-oYSGpLqd.js → Helpbox-BfAfhKHw.js} +1 -1
- zenml/zen_server/dashboard/assets/{Infobox-Cx4xGoXR.js → Infobox-M_SMOu96.js} +1 -1
- zenml/zen_server/dashboard/assets/{InlineAvatar-DiGOWNKF.js → InlineAvatar-DBA0a0-a.js} +1 -1
- zenml/zen_server/dashboard/assets/{NestedCollapsible-DYbgyKxK.js → NestedCollapsible-DpgmEFKw.js} +1 -1
- zenml/zen_server/dashboard/assets/{Partials-03iZf8-N.js → Partials-D_ldD9if.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProBadge-D_EB8HNo.js → ProBadge-DQbfFotM.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProCta-DqNS4v3x.js → ProCta-Bcpb4rcY.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderIcon-Bki2aw8w.js → ProviderIcon-BZpgPigN.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderRadio-8f43sPD4.js → ProviderRadio-DWPnMuQ1.js} +1 -1
- zenml/zen_server/dashboard/assets/RunSelector-DgRGaAc6.js +1 -0
- zenml/zen_server/dashboard/assets/{RunsBody-07YEO7qI.js → RunsBody-KecfSkjY.js} +1 -1
- zenml/zen_server/dashboard/assets/{SearchField-lp1KgU4e.js → SearchField-n-ILHnaP.js} +1 -1
- zenml/zen_server/dashboard/assets/{SecretTooltip-CgnbyeOx.js → SecretTooltip-B8MrX5yu.js} +1 -1
- zenml/zen_server/dashboard/assets/{SetPassword-CpP418A2.js → SetPassword-B_IVq_wg.js} +1 -1
- zenml/zen_server/dashboard/assets/StackList-TWPBYnkF.js +1 -0
- zenml/zen_server/dashboard/assets/{Tabs-BktHkCJJ.js → Tabs-Rg857zmd.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tick-BlMoIlJT.js → Tick-COg4A-xo.js} +1 -1
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Sc0A0pP-.js → UpdatePasswordSchemas-C6Aj3hm6.js} +1 -1
- zenml/zen_server/dashboard/assets/{UsageReason-YYduL4fj.js → UsageReason-BTLbx7w4.js} +1 -1
- zenml/zen_server/dashboard/assets/{WizardFooter-dgmizSJC.js → WizardFooter-BCAj69Vj.js} +1 -1
- zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-D-c2G6lV.js → all-pipeline-runs-query-DMXkDrV2.js} +1 -1
- zenml/zen_server/dashboard/assets/code-snippets-CqONne41.js +13 -0
- zenml/zen_server/dashboard/assets/{create-stack-DM_JPgef.js → create-stack-HfdbhLs4.js} +1 -1
- zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +1 -0
- zenml/zen_server/dashboard/assets/delete-run-DZ4hIXff.js +1 -0
- zenml/zen_server/dashboard/assets/{form-schemas-K6FYKjwa.js → form-schemas-B0AVEd9b.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-BAkC7FXi.js → index-DPqSWjug.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-CEV4Cvaf.js → index-DScjfBRb.js} +1 -1
- zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +1 -0
- zenml/zen_server/dashboard/assets/{index-CCOPpudF.js → index-FO-p0GU7.js} +5 -5
- zenml/zen_server/dashboard/assets/{index-B1mVPYxf.js → index-I3bKUGUj.js} +1 -1
- zenml/zen_server/dashboard/assets/key-icon-aH-QIa5R.js +1 -0
- zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +1 -0
- zenml/zen_server/dashboard/assets/{login-mutation-hf-lK87O.js → login-mutation-BQeo4wTY.js} +1 -1
- zenml/zen_server/dashboard/assets/{not-found-BGirLjU-.js → not-found-gAJ5aDdR.js} +1 -1
- zenml/zen_server/dashboard/assets/page-9Y9-gig0.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DjRJCGb3.js → page-AUwiQ14W.js} +1 -1
- zenml/zen_server/dashboard/assets/page-B6XU7yYT.js +2 -0
- zenml/zen_server/dashboard/assets/{page-C00YAkaB.js → page-BKZYc2Zv.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CdMWnQak.js → page-BU9FG4sR.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D7S3aCbF.js → page-B_Apk3xg.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Djikxq_S.js → page-BdowiCbr.js} +1 -1
- zenml/zen_server/dashboard/assets/page-Bg8OjTRe.js +1 -0
- zenml/zen_server/dashboard/assets/page-BxL4qD4_.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DakHVWXF.js → page-CWxT5K5J.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CXuQufSe.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DLC-bNBP.js → page-CcQr8CPP.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CD-DcWoy.js → page-Ce4Hrjnr.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CiYxgZP_.js +1 -0
- zenml/zen_server/dashboard/assets/page-Cldq1mpe.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BDigxVpo.js → page-D4wdonLm.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D6uU2ax4.js → page-D8ObrbH8.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DXSTpqRD.js → page-DFuAUGt4.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CbpvrsDL.js → page-DGazBpuP.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-COXXJj1k.js → page-DO1UcqPX.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DRYXdL5o.js +1 -0
- zenml/zen_server/dashboard/assets/{page-Df-Fw0aq.js → page-DYEquBC2.js} +1 -1
- zenml/zen_server/dashboard/assets/page-Dk32IeZm.js +1 -0
- zenml/zen_server/dashboard/assets/{page-yYC9OI-E.js → page-I3nKFGie.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-6m6yHHlE.js → page-M0w-n6vn.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Vcxara9U.js → page-R5dx3xGF.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BR68V0V1.js → page-bT5pOvcB.js} +1 -1
- zenml/zen_server/dashboard/assets/page-hUqK889I.js +6 -0
- zenml/zen_server/dashboard/assets/{page-CjGdWY13.js → page-h_Stveon.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D01JhjQB.js → page-r8XK5vR7.js} +1 -1
- zenml/zen_server/dashboard/assets/page-u_-ZXBKb.js +1 -0
- zenml/zen_server/dashboard/assets/page-zaMqB_ao.js +1 -0
- zenml/zen_server/dashboard/assets/{persist-GjC8PZoC.js → persist-AppN1B0J.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-Coz7ZWvz.js → persist-DAUi_3za.js} +1 -1
- zenml/zen_server/dashboard/assets/service-BqqeXLEe.js +2 -0
- zenml/zen_server/dashboard/assets/{sharedSchema-CQb14VSr.js → sharedSchema-uXN9FLLk.js} +1 -1
- zenml/zen_server/dashboard/assets/{stack-detail-query-OPEW-cDJ.js → stack-detail-query-XfZBiBP2.js} +1 -1
- zenml/zen_server/dashboard/assets/{update-server-settings-mutation-LwuQfHYn.js → update-server-settings-mutation-BWmgVJwA.js} +1 -1
- zenml/zen_server/dashboard/assets/{url-CkvKAnwF.js → url-BLwMbzES.js} +1 -1
- zenml/zen_server/dashboard/index.html +4 -4
- zenml/zen_server/deploy/helm/Chart.yaml +1 -1
- zenml/zen_server/deploy/helm/README.md +2 -2
- zenml/zen_server/routers/auth_endpoints.py +22 -11
- zenml/zen_server/routers/steps_endpoints.py +7 -1
- zenml/zen_server/template_execution/utils.py +3 -1
- zenml/zen_stores/migrations/versions/0.71.0_release.py +23 -0
- zenml/zen_stores/rest_zen_store.py +8 -3
- zenml/zen_stores/schemas/pipeline_run_schemas.py +12 -6
- zenml/zen_stores/sql_zen_store.py +5 -1
- {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.71.0.dev20241207.dist-info}/METADATA +5 -5
- {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.71.0.dev20241207.dist-info}/RECORD +110 -101
- zenml/zen_server/dashboard/assets/RunSelector-DkPiIiNr.js +0 -1
- zenml/zen_server/dashboard/assets/StackList-WvuKQusZ.js +0 -1
- zenml/zen_server/dashboard/assets/delete-run-CJdh1P_h.js +0 -1
- zenml/zen_server/dashboard/assets/index-DlGvJQPn.css +0 -1
- zenml/zen_server/dashboard/assets/page-0JE_-Ec1.js +0 -1
- zenml/zen_server/dashboard/assets/page-BRLpxOt0.js +0 -1
- zenml/zen_server/dashboard/assets/page-BU7huvKw.js +0 -6
- zenml/zen_server/dashboard/assets/page-BvqLv2Ky.js +0 -1
- zenml/zen_server/dashboard/assets/page-CwxrFarU.js +0 -1
- zenml/zen_server/dashboard/assets/page-DfbXf_8s.js +0 -1
- zenml/zen_server/dashboard/assets/page-Dnovpa0i.js +0 -3
- zenml/zen_server/dashboard/assets/page-Dot3LPmL.js +0 -1
- zenml/zen_server/dashboard/assets/page-Xynx4btY.js +0 -14
- zenml/zen_server/dashboard/assets/page-YpKAqVSa.js +0 -1
- {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.71.0.dev20241207.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.71.0.dev20241207.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.71.0.dev20241207.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
|
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
|

|
197
197
|
|
198
|
-
### Purpose built for machine learning with
|
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.
|
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.
|
1
|
+
0.71.0.dev20241207
|
zenml/config/server_config.py
CHANGED
@@ -27,6 +27,7 @@ from zenml.constants import (
|
|
27
27
|
DEFAULT_ZENML_SERVER_DEVICE_AUTH_POLLING,
|
28
28
|
DEFAULT_ZENML_SERVER_DEVICE_AUTH_TIMEOUT,
|
29
29
|
DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_LIFETIME,
|
30
|
+
DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_MAX_LIFETIME,
|
30
31
|
DEFAULT_ZENML_SERVER_LOGIN_RATE_LIMIT_DAY,
|
31
32
|
DEFAULT_ZENML_SERVER_LOGIN_RATE_LIMIT_MINUTE,
|
32
33
|
DEFAULT_ZENML_SERVER_MAX_DEVICE_AUTH_ATTEMPTS,
|
@@ -269,6 +270,9 @@ class ServerConfiguration(BaseModel):
|
|
269
270
|
generic_api_token_lifetime: PositiveInt = (
|
270
271
|
DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_LIFETIME
|
271
272
|
)
|
273
|
+
generic_api_token_max_lifetime: PositiveInt = (
|
274
|
+
DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_MAX_LIFETIME
|
275
|
+
)
|
272
276
|
|
273
277
|
external_login_url: Optional[str] = None
|
274
278
|
external_user_info_url: Optional[str] = None
|
zenml/constants.py
CHANGED
@@ -170,6 +170,9 @@ ENV_ZENML_DISABLE_STEP_LOGS_STORAGE = "ZENML_DISABLE_STEP_LOGS_STORAGE"
|
|
170
170
|
ENV_ZENML_IGNORE_FAILURE_HOOK = "ZENML_IGNORE_FAILURE_HOOK"
|
171
171
|
ENV_ZENML_CUSTOM_SOURCE_ROOT = "ZENML_CUSTOM_SOURCE_ROOT"
|
172
172
|
ENV_ZENML_WHEEL_PACKAGE_NAME = "ZENML_WHEEL_PACKAGE_NAME"
|
173
|
+
ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION = (
|
174
|
+
"ZENML_PIPELINE_API_TOKEN_EXPIRATION"
|
175
|
+
)
|
173
176
|
|
174
177
|
# ZenML Server environment variables
|
175
178
|
ENV_ZENML_SERVER_PREFIX = "ZENML_SERVER_"
|
@@ -268,6 +271,9 @@ DEFAULT_ZENML_SERVER_PIPELINE_RUN_AUTH_WINDOW = 60 * 48 # 48 hours
|
|
268
271
|
DEFAULT_ZENML_SERVER_LOGIN_RATE_LIMIT_MINUTE = 5
|
269
272
|
DEFAULT_ZENML_SERVER_LOGIN_RATE_LIMIT_DAY = 1000
|
270
273
|
DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_LIFETIME = 60 * 60 # 1 hour
|
274
|
+
DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_MAX_LIFETIME = (
|
275
|
+
60 * 60 * 24 * 7
|
276
|
+
) # 7 days
|
271
277
|
|
272
278
|
DEFAULT_ZENML_SERVER_SECURE_HEADERS_HSTS = (
|
273
279
|
"max-age=63072000; includeSubdomains"
|
@@ -466,3 +472,7 @@ BANNED_NAME_CHARACTERS = "\t\n\r\v\f"
|
|
466
472
|
|
467
473
|
|
468
474
|
STACK_DEPLOYMENT_API_TOKEN_EXPIRATION = 60 * 6 # 6 hours
|
475
|
+
|
476
|
+
ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION = handle_int_env_var(
|
477
|
+
ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION, default=0
|
478
|
+
)
|
@@ -23,7 +23,7 @@ from typing import (
|
|
23
23
|
cast,
|
24
24
|
)
|
25
25
|
|
26
|
-
from pydantic import field_validator
|
26
|
+
from pydantic import field_validator, BaseModel
|
27
27
|
|
28
28
|
from zenml.config.base_settings import BaseSettings
|
29
29
|
from zenml.experiment_trackers.base_experiment_tracker import (
|
@@ -60,18 +60,26 @@ class WandbExperimentTrackerSettings(BaseSettings):
|
|
60
60
|
Args:
|
61
61
|
value: The settings.
|
62
62
|
|
63
|
+
Raises:
|
64
|
+
ValueError: If converting the settings failed.
|
65
|
+
|
63
66
|
Returns:
|
64
67
|
Dict representation of the settings.
|
65
68
|
"""
|
66
69
|
import wandb
|
67
70
|
|
68
71
|
if isinstance(value, wandb.Settings):
|
69
|
-
# Depending on the wandb version, either `
|
70
|
-
# is available to convert the settings
|
71
|
-
|
72
|
+
# Depending on the wandb version, either `model_dump`,
|
73
|
+
# `make_static` or `to_dict` is available to convert the settings
|
74
|
+
# to a dictionary
|
75
|
+
if isinstance(value, BaseModel):
|
76
|
+
return value.model_dump()
|
77
|
+
elif hasattr(value, "make_static"):
|
72
78
|
return cast(Dict[str, Any], value.make_static())
|
73
|
-
|
79
|
+
elif hasattr(value, "to_dict"):
|
74
80
|
return value.to_dict()
|
81
|
+
else:
|
82
|
+
raise ValueError("Unable to convert wandb settings to dict.")
|
75
83
|
else:
|
76
84
|
return value
|
77
85
|
|
zenml/orchestrators/utils.py
CHANGED
@@ -26,10 +26,12 @@ from zenml.constants import (
|
|
26
26
|
ENV_ZENML_ACTIVE_STACK_ID,
|
27
27
|
ENV_ZENML_ACTIVE_WORKSPACE_ID,
|
28
28
|
ENV_ZENML_DISABLE_CREDENTIALS_DISK_CACHING,
|
29
|
+
ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION,
|
29
30
|
ENV_ZENML_SERVER,
|
30
31
|
ENV_ZENML_STORE_PREFIX,
|
32
|
+
ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION,
|
31
33
|
)
|
32
|
-
from zenml.enums import AuthScheme, StackComponentType, StoreType
|
34
|
+
from zenml.enums import APITokenType, AuthScheme, StackComponentType, StoreType
|
33
35
|
from zenml.logger import get_logger
|
34
36
|
from zenml.stack import StackComponent
|
35
37
|
|
@@ -137,37 +139,63 @@ def get_config_environment_vars(
|
|
137
139
|
url = global_config.store_configuration.url
|
138
140
|
api_token = credentials_store.get_token(url, allow_expired=False)
|
139
141
|
if schedule_id or pipeline_run_id or step_run_id:
|
140
|
-
# When connected to an authenticated ZenML server, if a schedule ID,
|
141
|
-
# pipeline run ID or step run ID is supplied, we need to fetch a new
|
142
|
-
# workload API token scoped to the schedule, pipeline run or step
|
143
|
-
# run.
|
144
142
|
assert isinstance(global_config.zen_store, RestZenStore)
|
145
143
|
|
146
|
-
#
|
147
|
-
#
|
148
|
-
|
149
|
-
if
|
144
|
+
# The user has the option to manually set an expiration for the API
|
145
|
+
# token generated for a pipeline run. In this case, we generate a new
|
146
|
+
# generic API token that will be valid for the indicated duration.
|
147
|
+
if (
|
148
|
+
pipeline_run_id
|
149
|
+
and ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION != 0
|
150
|
+
):
|
150
151
|
logger.warning(
|
151
|
-
"An API token
|
152
|
-
"
|
153
|
-
"
|
154
|
-
"
|
155
|
-
"
|
156
|
-
"
|
157
|
-
"
|
158
|
-
"
|
159
|
-
"
|
160
|
-
"
|
152
|
+
f"An unscoped API token will be generated for this pipeline "
|
153
|
+
f"run that will expire after "
|
154
|
+
f"{ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION} "
|
155
|
+
f"seconds instead of being scoped to the pipeline run "
|
156
|
+
f"and not having an expiration time. This is more insecure "
|
157
|
+
f"because the API token will remain valid even after the "
|
158
|
+
f"pipeline run completes its execution. This option has "
|
159
|
+
"been explicitly enabled by setting the "
|
160
|
+
f"{ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION} environment "
|
161
|
+
f"variable"
|
162
|
+
)
|
163
|
+
new_api_token = global_config.zen_store.get_api_token(
|
164
|
+
token_type=APITokenType.GENERIC,
|
165
|
+
expires_in=ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION,
|
161
166
|
)
|
162
167
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
168
|
+
else:
|
169
|
+
# If a schedule ID, pipeline run ID or step run ID is supplied,
|
170
|
+
# we need to fetch a new workload API token scoped to the
|
171
|
+
# schedule, pipeline run or step run.
|
172
|
+
|
173
|
+
# If only a schedule is given, the pipeline run credentials will
|
174
|
+
# be valid for the entire duration of the schedule.
|
175
|
+
api_key = credentials_store.get_api_key(url)
|
176
|
+
if not api_key and not pipeline_run_id and not step_run_id:
|
177
|
+
logger.warning(
|
178
|
+
"An API token without an expiration time will be generated "
|
179
|
+
"and used to run this pipeline on a schedule. This is very "
|
180
|
+
"insecure because the API token will be valid for the "
|
181
|
+
"entire lifetime of the schedule and can be used to access "
|
182
|
+
"your user account if accidentally leaked. When deploying "
|
183
|
+
"a pipeline on a schedule, it is strongly advised to use a "
|
184
|
+
"service account API key to authenticate to the ZenML "
|
185
|
+
"server instead of your regular user account. For more "
|
186
|
+
"information, see "
|
187
|
+
"https://docs.zenml.io/how-to/connecting-to-zenml/connect-with-a-service-account"
|
188
|
+
)
|
189
|
+
|
190
|
+
# The schedule, pipeline run or step run credentials are scoped to
|
191
|
+
# the schedule, pipeline run or step run and will only be valid for
|
192
|
+
# the duration of the schedule/pipeline run/step run.
|
193
|
+
new_api_token = global_config.zen_store.get_api_token(
|
194
|
+
token_type=APITokenType.WORKLOAD,
|
195
|
+
schedule_id=schedule_id,
|
196
|
+
pipeline_run_id=pipeline_run_id,
|
197
|
+
step_run_id=step_run_id,
|
198
|
+
)
|
171
199
|
|
172
200
|
environment_vars[ENV_ZENML_STORE_PREFIX + "API_TOKEN"] = (
|
173
201
|
new_api_token
|
zenml/zen_server/auth.py
CHANGED
@@ -413,10 +413,7 @@ def authenticate_credentials(
|
|
413
413
|
logger.error(error)
|
414
414
|
raise CredentialsNotValid(error)
|
415
415
|
|
416
|
-
if pipeline_run_status
|
417
|
-
ExecutionStatus.FAILED,
|
418
|
-
ExecutionStatus.COMPLETED,
|
419
|
-
]:
|
416
|
+
if pipeline_run_status.is_finished:
|
420
417
|
error = (
|
421
418
|
f"The execution of pipeline run "
|
422
419
|
f"{decoded_token.pipeline_run_id} has already concluded and "
|
@@ -461,10 +458,7 @@ def authenticate_credentials(
|
|
461
458
|
logger.error(error)
|
462
459
|
raise CredentialsNotValid(error)
|
463
460
|
|
464
|
-
if step_run_status
|
465
|
-
ExecutionStatus.FAILED,
|
466
|
-
ExecutionStatus.COMPLETED,
|
467
|
-
]:
|
461
|
+
if step_run_status.is_finished:
|
468
462
|
error = (
|
469
463
|
f"The execution of step run "
|
470
464
|
f"{decoded_token.step_run_id} has already concluded and "
|
@@ -821,7 +815,10 @@ def generate_access_token(
|
|
821
815
|
response: The FastAPI response object.
|
822
816
|
device: The device used for authentication.
|
823
817
|
api_key: The service account API key used for authentication.
|
824
|
-
expires_in: The number of seconds until the token expires.
|
818
|
+
expires_in: The number of seconds until the token expires. If not set,
|
819
|
+
the default value is determined automatically based on the server
|
820
|
+
configuration and type of token. If set to 0, the token will not
|
821
|
+
expire.
|
825
822
|
schedule_id: The ID of the schedule to scope the token to.
|
826
823
|
pipeline_run_id: The ID of the pipeline run to scope the token to.
|
827
824
|
step_run_id: The ID of the step run to scope the token to.
|
@@ -835,7 +832,9 @@ def generate_access_token(
|
|
835
832
|
# according to the values configured in the server config. Device tokens are
|
836
833
|
# handled separately from regular user tokens.
|
837
834
|
expires: Optional[datetime] = None
|
838
|
-
if expires_in:
|
835
|
+
if expires_in == 0:
|
836
|
+
expires_in = None
|
837
|
+
elif expires_in is not None:
|
839
838
|
expires = datetime.utcnow() + timedelta(seconds=expires_in)
|
840
839
|
elif device:
|
841
840
|
# If a device was used for authentication, the token will expire
|
@@ -1 +1 @@
|
|
1
|
-
import{j as e}from"./@radix-DeK6qiuw.js";import{f as s,r as t}from"./index-
|
1
|
+
import{j as e}from"./@radix-DeK6qiuw.js";import{f as s,r as t}from"./index-FO-p0GU7.js";import{E as r}from"./EmptyState-BzdlCwp3.js";import{S as a}from"./help-Cc9bBIJH.js";import{L as o}from"./@react-router-B3Z5rLr2.js";import"./@tanstack-DT5WLu9C.js";import"./@reactflow-D2Y7BWwz.js";function d(){return e.jsx("div",{className:"flex min-h-screen w-full flex-col",children:e.jsx(r,{icon:e.jsx(a,{className:"h-[120px] w-[120px] fill-neutral-300"}),children:e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"mb-2 text-display-xs font-semibold",children:"We can't find the page you are looking for"}),e.jsx("p",{className:"text-lg text-theme-text-secondary",children:"You can try typing a different URL or we can bring you back to your Homepage."}),e.jsx("div",{className:"mt-5 flex justify-center",children:e.jsx(s,{size:"md",asChild:!0,children:e.jsx(o,{className:"w-min self-center whitespace-nowrap",to:t.home,children:e.jsx("span",{className:"px-0.5",children:"Go to Home"})})})})]})})})}export{d as default};
|