zenml-nightly 0.64.0.dev20240811__py3-none-any.whl → 0.65.0.dev20240906__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 (274) hide show
  1. README.md +1 -1
  2. RELEASE_NOTES.md +68 -4
  3. zenml/VERSION +1 -1
  4. zenml/artifacts/utils.py +13 -6
  5. zenml/cli/__init__.py +1 -1
  6. zenml/cli/base.py +4 -4
  7. zenml/cli/integration.py +48 -9
  8. zenml/cli/pipeline.py +9 -2
  9. zenml/cli/stack.py +39 -27
  10. zenml/cli/utils.py +13 -0
  11. zenml/client.py +15 -17
  12. zenml/config/server_config.py +30 -0
  13. zenml/config/source.py +3 -7
  14. zenml/constants.py +5 -3
  15. zenml/entrypoints/base_entrypoint_configuration.py +41 -27
  16. zenml/entrypoints/step_entrypoint_configuration.py +5 -2
  17. zenml/enums.py +2 -0
  18. zenml/environment.py +31 -0
  19. zenml/feature_stores/base_feature_store.py +4 -6
  20. zenml/integrations/__init__.py +3 -0
  21. zenml/integrations/airflow/flavors/airflow_orchestrator_flavor.py +9 -0
  22. zenml/integrations/aws/__init__.py +2 -2
  23. zenml/integrations/azure/__init__.py +2 -2
  24. zenml/integrations/azure/azureml_utils.py +201 -0
  25. zenml/integrations/azure/flavors/azureml.py +139 -0
  26. zenml/integrations/azure/flavors/azureml_orchestrator_flavor.py +20 -118
  27. zenml/integrations/azure/flavors/azureml_step_operator_flavor.py +67 -14
  28. zenml/integrations/azure/orchestrators/azureml_orchestrator.py +58 -172
  29. zenml/integrations/azure/orchestrators/azureml_orchestrator_entrypoint_config.py +1 -0
  30. zenml/integrations/azure/service_connectors/azure_service_connector.py +4 -0
  31. zenml/integrations/azure/step_operators/azureml_step_operator.py +78 -177
  32. zenml/integrations/constants.py +3 -0
  33. zenml/integrations/databricks/__init__.py +22 -4
  34. zenml/integrations/databricks/flavors/databricks_orchestrator_flavor.py +9 -0
  35. zenml/integrations/deepchecks/__init__.py +29 -11
  36. zenml/integrations/deepchecks/materializers/deepchecks_dataset_materializer.py +3 -1
  37. zenml/integrations/deepchecks/validation_checks.py +0 -30
  38. zenml/integrations/evidently/__init__.py +17 -2
  39. zenml/integrations/facets/__init__.py +21 -5
  40. zenml/integrations/feast/__init__.py +18 -5
  41. zenml/integrations/gcp/__init__.py +2 -2
  42. zenml/integrations/gcp/flavors/vertex_orchestrator_flavor.py +9 -0
  43. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +10 -1
  44. zenml/integrations/great_expectations/__init__.py +21 -7
  45. zenml/integrations/huggingface/__init__.py +39 -15
  46. zenml/integrations/huggingface/materializers/__init__.py +3 -0
  47. zenml/integrations/huggingface/materializers/huggingface_datasets_materializer.py +3 -1
  48. zenml/integrations/huggingface/materializers/huggingface_pt_model_materializer.py +1 -1
  49. zenml/integrations/huggingface/materializers/huggingface_t5_materializer.py +107 -0
  50. zenml/integrations/huggingface/materializers/huggingface_tf_model_materializer.py +1 -1
  51. zenml/integrations/huggingface/materializers/huggingface_tokenizer_materializer.py +2 -2
  52. zenml/integrations/huggingface/steps/accelerate_runner.py +108 -85
  53. zenml/integrations/hyperai/flavors/hyperai_orchestrator_flavor.py +9 -0
  54. zenml/integrations/kubeflow/flavors/kubeflow_orchestrator_flavor.py +9 -0
  55. zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +10 -1
  56. zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +9 -0
  57. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +10 -1
  58. zenml/integrations/lightning/__init__.py +48 -0
  59. zenml/integrations/lightning/flavors/__init__.py +23 -0
  60. zenml/integrations/lightning/flavors/lightning_orchestrator_flavor.py +148 -0
  61. zenml/integrations/lightning/orchestrators/__init__.py +23 -0
  62. zenml/integrations/lightning/orchestrators/lightning_orchestrator.py +596 -0
  63. zenml/integrations/lightning/orchestrators/lightning_orchestrator_entrypoint.py +307 -0
  64. zenml/integrations/lightning/orchestrators/lightning_orchestrator_entrypoint_configuration.py +77 -0
  65. zenml/integrations/lightning/orchestrators/utils.py +67 -0
  66. zenml/integrations/mlflow/__init__.py +43 -5
  67. zenml/integrations/mlflow/services/mlflow_deployment.py +26 -0
  68. zenml/integrations/numpy/__init__.py +32 -0
  69. zenml/integrations/numpy/materializers/__init__.py +18 -0
  70. zenml/integrations/numpy/materializers/numpy_materializer.py +246 -0
  71. zenml/integrations/pandas/__init__.py +32 -0
  72. zenml/integrations/pandas/materializers/__init__.py +18 -0
  73. zenml/integrations/pandas/materializers/pandas_materializer.py +192 -0
  74. zenml/integrations/prodigy/annotators/prodigy_annotator.py +1 -1
  75. zenml/integrations/seldon/__init__.py +18 -3
  76. zenml/integrations/sklearn/__init__.py +1 -1
  77. zenml/integrations/skypilot_azure/__init__.py +1 -1
  78. zenml/integrations/tensorboard/__init__.py +1 -1
  79. zenml/integrations/tensorflow/__init__.py +2 -2
  80. zenml/integrations/wandb/experiment_trackers/wandb_experiment_tracker.py +1 -1
  81. zenml/integrations/whylogs/__init__.py +18 -2
  82. zenml/logging/step_logging.py +9 -2
  83. zenml/materializers/__init__.py +0 -4
  84. zenml/materializers/base_materializer.py +4 -0
  85. zenml/materializers/numpy_materializer.py +23 -234
  86. zenml/materializers/pandas_materializer.py +22 -179
  87. zenml/model/model.py +91 -2
  88. zenml/model/utils.py +5 -5
  89. zenml/models/__init__.py +16 -3
  90. zenml/models/v2/core/model_version.py +1 -1
  91. zenml/models/v2/core/pipeline_run.py +31 -1
  92. zenml/models/v2/core/stack.py +51 -20
  93. zenml/models/v2/core/step_run.py +28 -0
  94. zenml/models/v2/misc/info_models.py +78 -0
  95. zenml/new/pipelines/pipeline.py +65 -25
  96. zenml/new/pipelines/run_utils.py +57 -136
  97. zenml/new/steps/step_context.py +17 -6
  98. zenml/orchestrators/base_orchestrator.py +9 -0
  99. zenml/orchestrators/step_launcher.py +37 -14
  100. zenml/orchestrators/step_runner.py +14 -13
  101. zenml/orchestrators/utils.py +107 -7
  102. zenml/service_connectors/service_connector_utils.py +2 -2
  103. zenml/stack/utils.py +11 -2
  104. zenml/stack_deployments/azure_stack_deployment.py +2 -1
  105. zenml/steps/base_step.py +62 -25
  106. zenml/steps/utils.py +115 -3
  107. zenml/utils/cloud_utils.py +8 -8
  108. zenml/utils/code_utils.py +130 -32
  109. zenml/utils/function_utils.py +7 -7
  110. zenml/utils/notebook_utils.py +14 -0
  111. zenml/utils/pipeline_docker_image_builder.py +1 -11
  112. zenml/utils/pydantic_utils.py +3 -3
  113. zenml/utils/secret_utils.py +2 -2
  114. zenml/utils/source_utils.py +67 -21
  115. zenml/utils/string_utils.py +29 -0
  116. zenml/zen_server/dashboard/assets/{404-CRAA_Lew.js → 404-nKxQ4QDX.js} +1 -1
  117. zenml/zen_server/dashboard/assets/{@radix-BXWm7HOa.js → @radix-DnFH_oo1.js} +1 -1
  118. zenml/zen_server/dashboard/assets/{@react-router-l3lMcXA2.js → @react-router-APVeuk-U.js} +1 -1
  119. zenml/zen_server/dashboard/assets/{@reactflow-CeVxyqYT.js → @reactflow-IuMOnBUC.js} +2 -2
  120. zenml/zen_server/dashboard/assets/{@tanstack-FmcYZMuX.js → @tanstack-QbMbTrh5.js} +1 -1
  121. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-CO2rOw5M.js +1 -0
  122. zenml/zen_server/dashboard/assets/{CodeSnippet-D0VLxT2A.js → CodeSnippet-i_WEOWw9.js} +1 -1
  123. zenml/zen_server/dashboard/assets/{CollapsibleCard-BaUPiVg0.js → CollapsibleCard-C9BzoY6q.js} +1 -1
  124. zenml/zen_server/dashboard/assets/Commands-m9HMl-eh.js +1 -0
  125. zenml/zen_server/dashboard/assets/{CopyButton-Dbo52T1K.js → CopyButton-BAYaQlWF.js} +1 -1
  126. zenml/zen_server/dashboard/assets/{CsvVizualization-D3kAypDj.js → CsvVizualization-Bbzv7VEL.js} +5 -5
  127. zenml/zen_server/dashboard/assets/{edit-C0MVvPD2.js → DialogItem-B576Svvy.js} +1 -1
  128. zenml/zen_server/dashboard/assets/{DisplayDate-DizbSeT-.js → DisplayDate-DkCy54Bp.js} +1 -1
  129. zenml/zen_server/dashboard/assets/EditSecretDialog-CmY9fiM0.js +1 -0
  130. zenml/zen_server/dashboard/assets/{EmptyState-BHblM39I.js → EmptyState-Cs3DEmso.js} +1 -1
  131. zenml/zen_server/dashboard/assets/{Error-C6LeJSER.js → Error-QMgFNDTs.js} +1 -1
  132. zenml/zen_server/dashboard/assets/{ExecutionStatus-jH4OrWBq.js → ExecutionStatus-BSQgMpzk.js} +1 -1
  133. zenml/zen_server/dashboard/assets/{Helpbox-aAB2XP-z.js → Helpbox-C96LeSX9.js} +1 -1
  134. zenml/zen_server/dashboard/assets/{Infobox-BQ0aty32.js → Infobox-BB7dfbrO.js} +1 -1
  135. zenml/zen_server/dashboard/assets/{InlineAvatar-DpTLgM3Q.js → InlineAvatar-C2ZECnGP.js} +1 -1
  136. zenml/zen_server/dashboard/assets/{Lock-CNyJvf2r.js → Lock-CmIn0szs.js} +1 -1
  137. zenml/zen_server/dashboard/assets/{MarkdownVisualization-Bajxn0HY.js → MarkdownVisualization-DS05sfBm.js} +1 -1
  138. zenml/zen_server/dashboard/assets/{NumberBox-BmKE0qnO.js → NumberBox-CrN0_kqI.js} +1 -1
  139. zenml/zen_server/dashboard/assets/Partials-RDhJ8Ci7.js +1 -0
  140. zenml/zen_server/dashboard/assets/{PasswordChecker-yGGoJSB-.js → PasswordChecker-DE71J_3F.js} +1 -1
  141. zenml/zen_server/dashboard/assets/ProviderIcon-wA4qBOv1.js +1 -0
  142. zenml/zen_server/dashboard/assets/ProviderRadio-DkPE6alG.js +1 -0
  143. zenml/zen_server/dashboard/assets/SearchField-BPNazO4G.js +1 -0
  144. zenml/zen_server/dashboard/assets/SetPassword-kA6Bi_Kp.js +1 -0
  145. zenml/zen_server/dashboard/assets/{Tick-uxv80Q6a.js → Tick-DEACFydX.js} +1 -1
  146. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-oN4G3sKz.js → UpdatePasswordSchemas-BKyR7Eqi.js} +1 -1
  147. zenml/zen_server/dashboard/assets/UsageReason-DbgUeRkI.js +1 -0
  148. zenml/zen_server/dashboard/assets/WizardFooter-sUnbJ70r.js +1 -0
  149. zenml/zen_server/dashboard/assets/{check-circle-1_I207rW.js → check-circle-DOoS4yhF.js} +1 -1
  150. zenml/zen_server/dashboard/assets/{chevron-down-BpaF8JqM.js → chevron-down-Cwb-W_B_.js} +1 -1
  151. zenml/zen_server/dashboard/assets/{chevron-right-double-Dk8e2L99.js → chevron-right-double-c9H46Kl8.js} +1 -1
  152. zenml/zen_server/dashboard/assets/{cloud-only-BkUuI0lZ.js → cloud-only-DrdxC8NV.js} +1 -1
  153. zenml/zen_server/dashboard/assets/code-browser-BJYErIjr.js +1 -0
  154. zenml/zen_server/dashboard/assets/{copy-f3XGPPxt.js → copy-CaGlDsUy.js} +1 -1
  155. zenml/zen_server/dashboard/assets/create-stack-u6VyIXZP.js +1 -0
  156. zenml/zen_server/dashboard/assets/{docker-8uj__HHK.js → docker-BFAFXr2_.js} +1 -1
  157. zenml/zen_server/dashboard/assets/{dots-horizontal-sKQlWEni.js → dots-horizontal-C6K59vUm.js} +1 -1
  158. zenml/zen_server/dashboard/assets/flyte-Cj-xy_8I.svg +10 -0
  159. zenml/zen_server/dashboard/assets/form-schemas-DD4OppNK.js +1 -0
  160. zenml/zen_server/dashboard/assets/gcp-Dj6ntk0L.js +1 -0
  161. zenml/zen_server/dashboard/assets/{help-FuHlZwn0.js → help-CwN931fX.js} +1 -1
  162. zenml/zen_server/dashboard/assets/{index-Bd1xgUQG.js → index-5GJ5ysEZ.js} +1 -1
  163. zenml/zen_server/dashboard/assets/index-CnqMjIZT.js +1 -0
  164. zenml/zen_server/dashboard/assets/index-CsIuf3i6.css +1 -0
  165. zenml/zen_server/dashboard/assets/index-Davdjm1d.js +55 -0
  166. zenml/zen_server/dashboard/assets/{index.esm-DT4uyn2i.js → index.esm-BE1uqCX5.js} +1 -1
  167. zenml/zen_server/dashboard/assets/kubernetes-BjbR6D-1.js +1 -0
  168. zenml/zen_server/dashboard/assets/{layout-D6oiSbfd.js → layout-Dru15_XR.js} +1 -1
  169. zenml/zen_server/dashboard/assets/{login-mutation-13A_JSVA.js → login-mutation-TIWnZoJ7.js} +1 -1
  170. zenml/zen_server/dashboard/assets/{logs-CgeE2vZP.js → logs-GiDJXbLS.js} +1 -1
  171. zenml/zen_server/dashboard/assets/metaflow-weOkWNyT.svg +10 -0
  172. zenml/zen_server/dashboard/assets/{not-found-B0Mmb90p.js → not-found-C_bW_Kkr.js} +1 -1
  173. zenml/zen_server/dashboard/assets/{package-DdkziX79.js → package-DYKZ5jKW.js} +1 -1
  174. zenml/zen_server/dashboard/assets/page-0eecLRNs.js +1 -0
  175. zenml/zen_server/dashboard/assets/{page-DugsjcQ_.js → page-BN7n3Dsp.js} +1 -1
  176. zenml/zen_server/dashboard/assets/{page-OFKSPyN7.js → page-BPFkP_IB.js} +1 -1
  177. zenml/zen_server/dashboard/assets/page-BSkbj719.js +1 -0
  178. zenml/zen_server/dashboard/assets/{page-YiF_fNbe.js → page-Bg5X2mLz.js} +1 -1
  179. zenml/zen_server/dashboard/assets/{page-DSTQnBk-.js → page-BhqIV8mu.js} +1 -1
  180. zenml/zen_server/dashboard/assets/page-BxPQz4Q8.js +1 -0
  181. zenml/zen_server/dashboard/assets/{page-DLpOnf7u.js → page-CDG9uQT9.js} +1 -1
  182. zenml/zen_server/dashboard/assets/{page-CCY6yfmu.js → page-CUOBhxxU.js} +1 -1
  183. zenml/zen_server/dashboard/assets/page-CrjI9mjm.js +1 -0
  184. zenml/zen_server/dashboard/assets/page-D4J2Oy-I.js +1 -0
  185. zenml/zen_server/dashboard/assets/{page-TXe1Eo3Z.js → page-D5I0-LSs.js} +1 -1
  186. zenml/zen_server/dashboard/assets/page-D7bwpJvV.js +1 -0
  187. zenml/zen_server/dashboard/assets/page-DCnizFO_.js +9 -0
  188. zenml/zen_server/dashboard/assets/page-DQBv3t8t.js +1 -0
  189. zenml/zen_server/dashboard/assets/page-DYNlbmas.js +1 -0
  190. zenml/zen_server/dashboard/assets/{page-Cgn-6v2Y.js → page-DsKroTLH.js} +1 -1
  191. zenml/zen_server/dashboard/assets/page-DsQOL6ZL.js +1 -0
  192. zenml/zen_server/dashboard/assets/{page-BGwA9B1M.js → page-Dvr6lpJm.js} +1 -1
  193. zenml/zen_server/dashboard/assets/{page-hQaiQXfg.js → page-Dy0EbJQD.js} +1 -1
  194. zenml/zen_server/dashboard/assets/page-DyM2M_wT.js +1 -0
  195. zenml/zen_server/dashboard/assets/page-HXZtxyWq.js +1 -0
  196. zenml/zen_server/dashboard/assets/page-OmVfClGH.js +2 -0
  197. zenml/zen_server/dashboard/assets/{page-RnG-qhv9.js → page-XReFLy-1.js} +1 -1
  198. zenml/zen_server/dashboard/assets/page-t1VWIy6W.js +1 -0
  199. zenml/zen_server/dashboard/assets/{page-BkjAUyTA.js → page-wPiJkPp6.js} +1 -1
  200. zenml/zen_server/dashboard/assets/{page-CxQmQqDw.js → page-wQ8_y5mW.js} +1 -1
  201. zenml/zen_server/dashboard/assets/persist-CnMMI8ls.js +1 -0
  202. zenml/zen_server/dashboard/assets/{persist-3-5nOJ6m.js → persist-g4uRK-v-.js} +1 -1
  203. zenml/zen_server/dashboard/assets/{plus-FB9-lEq_.js → plus-Bc8eLSDM.js} +1 -1
  204. zenml/zen_server/dashboard/assets/{refresh-COb6KYDi.js → refresh-CtPKdk2G.js} +1 -1
  205. zenml/zen_server/dashboard/assets/rocket-SESCGQXm.js +1 -0
  206. zenml/zen_server/dashboard/assets/sharedSchema-Dbpe2oAO.js +14 -0
  207. zenml/zen_server/dashboard/assets/stack-detail-query-fuuoot1D.js +1 -0
  208. zenml/zen_server/dashboard/assets/{terminal-grtjrIEJ.js → terminal-DRIPb4oF.js} +1 -1
  209. zenml/zen_server/dashboard/assets/{trash-Cd5CSFqA.js → trash-DUWZWzse.js} +1 -1
  210. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-B8GB_ubU.js → update-server-settings-mutation-YhoZKgC9.js} +1 -1
  211. zenml/zen_server/dashboard/assets/{url-hcMJkz8p.js → url-DNHuFfYx.js} +1 -1
  212. zenml/zen_server/dashboard/assets/{zod-CnykDKJj.js → zod-uFd1wBcd.js} +1 -1
  213. zenml/zen_server/dashboard/index.html +7 -7
  214. zenml/zen_server/dashboard_legacy/asset-manifest.json +4 -4
  215. zenml/zen_server/dashboard_legacy/index.html +1 -1
  216. zenml/zen_server/dashboard_legacy/{precache-manifest.9c473c96a43298343a7ce1256183123b.js → precache-manifest.123c8e8fafecee40f30294ab26484cf1.js} +4 -4
  217. zenml/zen_server/dashboard_legacy/service-worker.js +1 -1
  218. zenml/zen_server/dashboard_legacy/static/js/{main.463c90b9.chunk.js → main.a98a73cf.chunk.js} +2 -2
  219. zenml/zen_server/dashboard_legacy/static/js/{main.463c90b9.chunk.js.map → main.a98a73cf.chunk.js.map} +1 -1
  220. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  221. zenml/zen_server/deploy/helm/README.md +2 -2
  222. zenml/zen_server/routers/service_connectors_endpoints.py +2 -4
  223. zenml/zen_server/routers/workspaces_endpoints.py +20 -66
  224. zenml/zen_server/secure_headers.py +120 -0
  225. zenml/zen_server/template_execution/runner_entrypoint_configuration.py +0 -2
  226. zenml/zen_server/template_execution/utils.py +1 -0
  227. zenml/zen_server/utils.py +0 -100
  228. zenml/zen_server/zen_server_api.py +4 -2
  229. zenml/zen_stores/migrations/versions/0.65.0_release.py +23 -0
  230. zenml/zen_stores/migrations/versions/bf2120261b5a_add_configured_model_version_id.py +74 -0
  231. zenml/zen_stores/rest_zen_store.py +4 -21
  232. zenml/zen_stores/schemas/constants.py +16 -0
  233. zenml/zen_stores/schemas/model_schemas.py +9 -3
  234. zenml/zen_stores/schemas/pipeline_run_schemas.py +22 -8
  235. zenml/zen_stores/schemas/step_run_schemas.py +23 -12
  236. zenml/zen_stores/sql_zen_store.py +312 -300
  237. zenml/zen_stores/zen_store_interface.py +0 -16
  238. {zenml_nightly-0.64.0.dev20240811.dist-info → zenml_nightly-0.65.0.dev20240906.dist-info}/METADATA +9 -11
  239. {zenml_nightly-0.64.0.dev20240811.dist-info → zenml_nightly-0.65.0.dev20240906.dist-info}/RECORD +242 -214
  240. zenml/models/v2/misc/full_stack.py +0 -129
  241. zenml/new/pipelines/model_utils.py +0 -72
  242. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-ErO9aOgK.js +0 -1
  243. zenml/zen_server/dashboard/assets/AwarenessChannel-CLXo5rKM.js +0 -1
  244. zenml/zen_server/dashboard/assets/Commands-JrcZK-3j.js +0 -1
  245. zenml/zen_server/dashboard/assets/EditSecretDialog-Bd7mFLS4.js +0 -1
  246. zenml/zen_server/dashboard/assets/ProviderRadio-BBqkIuTd.js +0 -1
  247. zenml/zen_server/dashboard/assets/RadioItem-xLhXoiFV.js +0 -1
  248. zenml/zen_server/dashboard/assets/SearchField-C9R0mdaX.js +0 -1
  249. zenml/zen_server/dashboard/assets/SetPassword-52sNxNiO.js +0 -1
  250. zenml/zen_server/dashboard/assets/SuccessStep-DlkItqYG.js +0 -1
  251. zenml/zen_server/dashboard/assets/aws-0_3UsPif.js +0 -1
  252. zenml/zen_server/dashboard/assets/database-cXYNX9tt.js +0 -1
  253. zenml/zen_server/dashboard/assets/file-text-B9JibxTs.js +0 -1
  254. zenml/zen_server/dashboard/assets/index-DaGknux4.css +0 -1
  255. zenml/zen_server/dashboard/assets/index-DhIZtpxB.js +0 -55
  256. zenml/zen_server/dashboard/assets/page-7-v2OBm-.js +0 -1
  257. zenml/zen_server/dashboard/assets/page-B3ozwdD1.js +0 -1
  258. zenml/zen_server/dashboard/assets/page-BnacgBiy.js +0 -1
  259. zenml/zen_server/dashboard/assets/page-BxF_KMQ3.js +0 -2
  260. zenml/zen_server/dashboard/assets/page-C4POHC0K.js +0 -1
  261. zenml/zen_server/dashboard/assets/page-C9kudd44.js +0 -9
  262. zenml/zen_server/dashboard/assets/page-CA1j3GpJ.js +0 -1
  263. zenml/zen_server/dashboard/assets/page-CgTe7Bme.js +0 -1
  264. zenml/zen_server/dashboard/assets/page-D2Goey3H.js +0 -1
  265. zenml/zen_server/dashboard/assets/page-DTysUGOy.js +0 -1
  266. zenml/zen_server/dashboard/assets/page-D_EXUFJb.js +0 -1
  267. zenml/zen_server/dashboard/assets/page-Db15QzsM.js +0 -1
  268. zenml/zen_server/dashboard/assets/page-T2BtjwPl.js +0 -1
  269. zenml/zen_server/dashboard/assets/play-circle-XSkLR12B.js +0 -1
  270. zenml/zen_server/dashboard/assets/sharedSchema-BoYx_B_L.js +0 -14
  271. zenml/zen_server/dashboard/assets/stack-detail-query-B-US_-wa.js +0 -1
  272. {zenml_nightly-0.64.0.dev20240811.dist-info → zenml_nightly-0.65.0.dev20240906.dist-info}/LICENSE +0 -0
  273. {zenml_nightly-0.64.0.dev20240811.dist-info → zenml_nightly-0.65.0.dev20240906.dist-info}/WHEEL +0 -0
  274. {zenml_nightly-0.64.0.dev20240811.dist-info → zenml_nightly-0.65.0.dev20240906.dist-info}/entry_points.txt +0 -0
@@ -15,20 +15,19 @@
15
15
 
16
16
  from typing import TYPE_CHECKING, Optional, Type
17
17
 
18
- from pydantic import Field, model_validator
18
+ from pydantic import Field
19
19
 
20
- from zenml.config.base_settings import BaseSettings
21
20
  from zenml.integrations.azure import (
22
21
  AZURE_RESOURCE_TYPE,
23
22
  AZUREML_ORCHESTRATOR_FLAVOR,
24
23
  )
24
+ from zenml.integrations.azure.flavors.azureml import AzureMLComputeSettings
25
25
  from zenml.logger import get_logger
26
26
  from zenml.models import ServiceConnectorRequirements
27
27
  from zenml.orchestrators.base_orchestrator import (
28
28
  BaseOrchestratorConfig,
29
29
  BaseOrchestratorFlavor,
30
30
  )
31
- from zenml.utils.enum_utils import StrEnum
32
31
 
33
32
  if TYPE_CHECKING:
34
33
  from zenml.integrations.azure.orchestrators import AzureMLOrchestrator
@@ -36,118 +35,8 @@ if TYPE_CHECKING:
36
35
  logger = get_logger(__name__)
37
36
 
38
37
 
39
- class AzureMLComputeTypes(StrEnum):
40
- """Enum for different types of compute on AzureML."""
41
-
42
- SERVERLESS = "serverless"
43
- COMPUTE_INSTANCE = "compute-instance"
44
- COMPUTE_CLUSTER = "compute-cluster"
45
-
46
-
47
- class AzureMLOrchestratorSettings(BaseSettings):
48
- """Settings for the AzureML orchestrator.
49
-
50
- These settings adjust the compute resources that will be used by the
51
- pipeline execution.
52
-
53
- There are three possible use cases for this implementation:
54
-
55
- 1. Serverless compute (default behaviour):
56
- - The `mode` is set to `serverless` (default behaviour).
57
- - All the other parameters become irrelevant and will throw a
58
- warning if set.
59
-
60
- 2. Compute instance:
61
- - The `mode` is set to `compute-instance`.
62
- - In this case, users have to provide a `compute-name`.
63
- - If a compute instance exists with this name, this instance
64
- will be used and all the other parameters become irrelevant
65
- and will throw a warning if set.
66
- - If a compute instance does not already exist, ZenML will
67
- create it. You can use the parameters `compute_size` and
68
- `idle_type_before_shutdown_minutes` for this operation.
69
-
70
- 3. Compute cluster:
71
- - The `mode` is set to `compute-cluster`.
72
- - In this case, users have to provide a `compute-name`.
73
- - If a compute cluster exists with this name, this instance
74
- will be used and all the other parameters become irrelevant
75
- and will throw a warning if set.
76
- - If a compute cluster does not already exist, ZenML will
77
- create it. You can all the additional parameters for this
78
- operation.
79
- """
80
-
81
- # Mode for compute
82
- mode: AzureMLComputeTypes = AzureMLComputeTypes.SERVERLESS
83
-
84
- # Common Configuration for Compute Instances and Clusters
85
- compute_name: Optional[str] = None
86
- size: Optional[str] = None
87
-
88
- # Additional configuration for a Compute Instance
89
- idle_time_before_shutdown_minutes: Optional[int] = None
90
-
91
- # Additional configuration for a Compute Cluster
92
- idle_time_before_scaledown_down: Optional[int] = None
93
- location: Optional[str] = None
94
- min_instances: Optional[int] = None
95
- max_instances: Optional[int] = None
96
- tier: Optional[str] = None
97
-
98
- @model_validator(mode="after")
99
- def azureml_settings_validator(self) -> "AzureMLOrchestratorSettings":
100
- """Checks whether the right configuration is set based on mode.
101
-
102
- Returns:
103
- the instance itself.
104
-
105
- Raises:
106
- AssertionError: if a name is not provided when working with
107
- instances and clusters.
108
- """
109
- excluded_fields = {"subscription_id", "resource_group", "workspace"}
110
-
111
- viable_configuration_fields = {
112
- AzureMLComputeTypes.SERVERLESS: {"mode"},
113
- AzureMLComputeTypes.COMPUTE_INSTANCE: {
114
- "mode",
115
- "compute_name",
116
- "size",
117
- "idle_time_before_shutdown_minutes",
118
- },
119
- AzureMLComputeTypes.COMPUTE_CLUSTER: {
120
- "mode",
121
- "compute_name",
122
- "size",
123
- "idle_time_before_scaledown_down",
124
- "location",
125
- "min_instances",
126
- "max_instances",
127
- "tier",
128
- },
129
- }
130
- viable_fields = viable_configuration_fields[self.mode]
131
-
132
- for field in self.model_fields_set:
133
- if field not in viable_fields and field not in excluded_fields:
134
- logger.warning(
135
- "In the AzureML Orchestrator Settings, the mode of "
136
- f"operation is set to {self.mode}. In this mode, you can "
137
- f"not configure the parameter '{field}'. This "
138
- "configuration will be ignored."
139
- )
140
-
141
- if (
142
- self.mode == AzureMLComputeTypes.COMPUTE_INSTANCE
143
- or self.mode == AzureMLComputeTypes.COMPUTE_CLUSTER
144
- ):
145
- assert self.compute_name is not None, (
146
- "When you are working with compute instances and clusters, "
147
- "please define a name for the compute target."
148
- )
149
-
150
- return self
38
+ class AzureMLOrchestratorSettings(AzureMLComputeSettings):
39
+ """Settings for the AzureML orchestrator."""
151
40
 
152
41
 
153
42
  class AzureMLOrchestratorConfig(
@@ -164,6 +53,10 @@ class AzureMLOrchestratorConfig(
164
53
  workspace: str = Field(
165
54
  description="Name of the workspace that AzureML is running on."
166
55
  )
56
+ synchronous: bool = Field(
57
+ default=True,
58
+ description="Whether the orchestrator runs synchronously or not.",
59
+ )
167
60
 
168
61
  @property
169
62
  def is_remote(self) -> bool:
@@ -180,12 +73,21 @@ class AzureMLOrchestratorConfig(
180
73
 
181
74
  @property
182
75
  def is_synchronous(self) -> bool:
183
- """Whether the orchestrator runs synchronous or not.
76
+ """Whether the orchestrator runs synchronously or not.
184
77
 
185
78
  Returns:
186
- Whether the orchestrator runs synchronous or not.
79
+ Whether the orchestrator runs synchronously or not.
187
80
  """
188
- return False
81
+ return self.synchronous
82
+
83
+ @property
84
+ def is_schedulable(self) -> bool:
85
+ """Whether the orchestrator is schedulable or not.
86
+
87
+ Returns:
88
+ Whether the orchestrator is schedulable or not.
89
+ """
90
+ return True
189
91
 
190
92
 
191
93
  class AzureMLOrchestratorFlavor(BaseOrchestratorFlavor):
@@ -13,29 +13,65 @@
13
13
  # permissions and limitations under the License.
14
14
  """AzureML step operator flavor."""
15
15
 
16
- from typing import TYPE_CHECKING, Optional, Type
16
+ from typing import TYPE_CHECKING, Any, Dict, Optional, Type
17
17
 
18
- from zenml.config.base_settings import BaseSettings
19
- from zenml.integrations.azure import AZUREML_STEP_OPERATOR_FLAVOR
18
+ from pydantic import Field, model_validator
19
+
20
+ from zenml.integrations.azure import (
21
+ AZURE_RESOURCE_TYPE,
22
+ AZUREML_STEP_OPERATOR_FLAVOR,
23
+ )
24
+ from zenml.integrations.azure.flavors.azureml import (
25
+ AzureMLComputeSettings,
26
+ AzureMLComputeTypes,
27
+ )
28
+ from zenml.models import ServiceConnectorRequirements
20
29
  from zenml.step_operators.base_step_operator import (
21
30
  BaseStepOperatorConfig,
22
31
  BaseStepOperatorFlavor,
23
32
  )
33
+ from zenml.utils.pydantic_utils import before_validator_handler
24
34
  from zenml.utils.secret_utils import SecretField
25
35
 
26
36
  if TYPE_CHECKING:
27
37
  from zenml.integrations.azure.step_operators import AzureMLStepOperator
28
38
 
29
39
 
30
- class AzureMLStepOperatorSettings(BaseSettings):
40
+ class AzureMLStepOperatorSettings(AzureMLComputeSettings):
31
41
  """Settings for the AzureML step operator.
32
42
 
33
43
  Attributes:
34
- environment_name: The name of the environment if there
35
- already exists one.
44
+ compute_target_name: The name of the configured ComputeTarget.
45
+ Deprecated in favor of `compute_name`.
36
46
  """
37
47
 
38
- environment_name: Optional[str] = None
48
+ compute_target_name: Optional[str] = Field(
49
+ default=None,
50
+ description="Name of the configured ComputeTarget. Deprecated in favor "
51
+ "of `compute_name`.",
52
+ )
53
+
54
+ @model_validator(mode="before")
55
+ @classmethod
56
+ @before_validator_handler
57
+ def _migrate_compute_name(cls, data: Dict[str, Any]) -> Dict[str, Any]:
58
+ """Backward compatibility for compute_target_name.
59
+
60
+ Args:
61
+ data: The model data.
62
+
63
+ Returns:
64
+ The migrated data.
65
+ """
66
+ if (
67
+ "compute_target_name" in data
68
+ and "compute_name" not in data
69
+ and "mode" not in data
70
+ ):
71
+ data["compute_name"] = data.pop("compute_target_name")
72
+ data["mode"] = AzureMLComputeTypes.COMPUTE_INSTANCE
73
+
74
+ return data
39
75
 
40
76
 
41
77
  class AzureMLStepOperatorConfig(
@@ -48,19 +84,21 @@ class AzureMLStepOperatorConfig(
48
84
  resource_group: The resource group to which the AzureML workspace
49
85
  is deployed.
50
86
  workspace_name: The name of the AzureML Workspace.
51
- compute_target_name: The name of the configured ComputeTarget.
52
- An instance of it has to be created on the portal if it doesn't
53
- exist already.
54
87
  tenant_id: The Azure Tenant ID.
55
88
  service_principal_id: The ID for the service principal that is created
56
89
  to allow apps to access secure resources.
57
90
  service_principal_password: Password for the service principal.
58
91
  """
59
92
 
60
- subscription_id: str
61
- resource_group: str
62
- workspace_name: str
63
- compute_target_name: str
93
+ subscription_id: str = Field(
94
+ description="Subscription ID that AzureML is running on."
95
+ )
96
+ resource_group: str = Field(
97
+ description="Name of the resource group that AzureML is running on.",
98
+ )
99
+ workspace_name: str = Field(
100
+ description="Name of the workspace that AzureML is running on."
101
+ )
64
102
 
65
103
  # Service principal authentication
66
104
  # https://docs.microsoft.com/en-us/azure/machine-learning/how-to-setup-authentication#configure-a-service-principal
@@ -94,6 +132,21 @@ class AzureMLStepOperatorFlavor(BaseStepOperatorFlavor):
94
132
  """
95
133
  return AZUREML_STEP_OPERATOR_FLAVOR
96
134
 
135
+ @property
136
+ def service_connector_requirements(
137
+ self,
138
+ ) -> Optional[ServiceConnectorRequirements]:
139
+ """Service connector resource requirements for service connectors.
140
+
141
+ Specifies resource requirements that are used to filter the available
142
+ service connector types that are compatible with this flavor.
143
+
144
+ Returns:
145
+ Requirements for compatible service connectors, if a service
146
+ connector is required for this flavor.
147
+ """
148
+ return ServiceConnectorRequirements(resource_type=AZURE_RESOURCE_TYPE)
149
+
97
150
  @property
98
151
  def docs_url(self) -> Optional[str]:
99
152
  """A url to point at docs explaining this flavor.
@@ -26,6 +26,7 @@ from typing import (
26
26
  Union,
27
27
  cast,
28
28
  )
29
+ from uuid import UUID
29
30
 
30
31
  from azure.ai.ml import Input, MLClient, Output
31
32
  from azure.ai.ml.constants import TimeZone
@@ -40,15 +41,16 @@ from azure.ai.ml.entities import (
40
41
  from azure.core.exceptions import (
41
42
  HttpResponseError,
42
43
  ResourceExistsError,
43
- ResourceNotFoundError,
44
44
  )
45
45
  from azure.identity import DefaultAzureCredential
46
46
 
47
47
  from zenml.config.base_settings import BaseSettings
48
48
  from zenml.config.step_configurations import Step
49
+ from zenml.constants import METADATA_ORCHESTRATOR_URL
49
50
  from zenml.enums import StackComponentType
51
+ from zenml.integrations.azure.azureml_utils import create_or_get_compute
52
+ from zenml.integrations.azure.flavors.azureml import AzureMLComputeTypes
50
53
  from zenml.integrations.azure.flavors.azureml_orchestrator_flavor import (
51
- AzureMLComputeTypes,
52
54
  AzureMLOrchestratorConfig,
53
55
  AzureMLOrchestratorSettings,
54
56
  )
@@ -56,14 +58,13 @@ from zenml.integrations.azure.orchestrators.azureml_orchestrator_entrypoint_conf
56
58
  AzureMLEntrypointConfiguration,
57
59
  )
58
60
  from zenml.logger import get_logger
61
+ from zenml.metadata.metadata_types import MetadataType, Uri
59
62
  from zenml.orchestrators import ContainerizedOrchestrator
60
63
  from zenml.orchestrators.utils import get_orchestrator_run_name
61
64
  from zenml.stack import StackValidator
62
65
  from zenml.utils.string_utils import b64_encode
63
66
 
64
67
  if TYPE_CHECKING:
65
- from azure.ai.ml.entities import AmlCompute, ComputeInstance
66
-
67
68
  from zenml.models import PipelineDeploymentResponse
68
69
  from zenml.stack import Stack
69
70
 
@@ -193,172 +194,6 @@ class AzureMLOrchestrator(ContainerizedOrchestrator):
193
194
  command=" ".join(command + arguments),
194
195
  )
195
196
 
196
- @staticmethod
197
- def _check_settings_and_compute_configuration(
198
- parameter: str,
199
- settings: AzureMLOrchestratorSettings,
200
- compute: Union["ComputeInstance", "AmlCompute"],
201
- ) -> None:
202
- """Utility function comparing a parameter between settings and compute.
203
-
204
- Args:
205
- parameter: the name of the parameter.
206
- settings: The AzureML orchestrator settings.
207
- compute: The compute instance or cluster from AzureML.
208
- """
209
- # Check the compute size
210
- compute_value = getattr(compute, parameter)
211
- settings_value = getattr(settings, parameter)
212
-
213
- if settings_value is not None and settings_value != compute_value:
214
- logger.warning(
215
- f"The '{parameter}' defined in the settings '{settings_value}' "
216
- "does not match the actual parameter of the instance: "
217
- f"'{compute_value}'. Will ignore this setting for now."
218
- )
219
-
220
- def _create_or_get_compute(
221
- self, client: MLClient, settings: AzureMLOrchestratorSettings
222
- ) -> Optional[str]:
223
- """Creates or fetches the compute target if defined in the settings.
224
-
225
- Args:
226
- client: the AzureML client.
227
- settings: the settings for the orchestrator.
228
-
229
- Returns:
230
- None, if the orchestrator is using serverless compute or
231
- str, the name of the compute target (instance or cluster).
232
-
233
- Raises:
234
- RuntimeError: if the fetched compute target is unsupported or the
235
- mode defined in the setting does not match the type of the
236
- compute target.
237
- """
238
- # If the mode is serverless, we can not fetch anything anyhow
239
- if settings.mode == AzureMLComputeTypes.SERVERLESS:
240
- return None
241
-
242
- # If a name is not provided, generate one based on the orchestrator id
243
- compute_name = settings.compute_name or f"compute_{self.id}"
244
- # Try to fetch the compute target
245
- try:
246
- compute = client.compute.get(compute_name)
247
-
248
- logger.info(f"Using existing compute target: '{compute_name}'.")
249
-
250
- # Check if compute size matches with the settings
251
- self._check_settings_and_compute_configuration(
252
- parameter="size", settings=settings, compute=compute
253
- )
254
-
255
- compute_type = compute.type
256
-
257
- # Check the type and matches the settings
258
- if compute_type == "computeinstance": # Compute Instance
259
- if settings.mode != AzureMLComputeTypes.COMPUTE_INSTANCE:
260
- raise RuntimeError(
261
- "The mode of operation for the compute target defined"
262
- f"in the settings '{settings.mode}' does not match "
263
- f"the type of the compute target: `{compute_name}` "
264
- "which is a 'compute-instance'. Please make sure that "
265
- "the settings are adjusted properly."
266
- )
267
-
268
- if compute.state != "Running":
269
- raise RuntimeError(
270
- f"The compute instance `{compute_name}` is not in a "
271
- "running state at the moment. Please make sure that "
272
- "the compute target is running, before executing the "
273
- "pipeline."
274
- )
275
-
276
- # Idle time before shutdown
277
- self._check_settings_and_compute_configuration(
278
- parameter="idle_time_before_shutdown_minutes",
279
- settings=settings,
280
- compute=compute,
281
- )
282
-
283
- elif compute_type == "amIcompute": # Compute Cluster
284
- if settings.mode != AzureMLComputeTypes.COMPUTE_CLUSTER:
285
- raise RuntimeError(
286
- "The mode of operation for the compute target defined "
287
- f"in the settings '{settings.mode}' does not match "
288
- f"the type of the compute target: `{compute_name}` "
289
- "which is a 'compute-cluster'. Please make sure that "
290
- "the settings are adjusted properly."
291
- )
292
-
293
- if compute.provisioning_state != "Succeeded":
294
- raise RuntimeError(
295
- f"The provisioning state '{compute.provisioning_state}'"
296
- f"of the compute cluster `{compute_name}` is not "
297
- "successful. Please make sure that the compute cluster "
298
- "is provisioned properly, before executing the "
299
- "pipeline."
300
- )
301
-
302
- for parameter in [
303
- "idle_time_before_scale_down",
304
- "max_instances",
305
- "min_instances",
306
- "tier",
307
- "location",
308
- ]:
309
- # Check all possible configurations
310
- self._check_settings_and_compute_configuration(
311
- parameter=parameter, settings=settings, compute=compute
312
- )
313
- else:
314
- raise RuntimeError(f"Unsupported compute type: {compute_type}")
315
- return compute_name
316
-
317
- # If the compute target does not exist create it
318
- except ResourceNotFoundError:
319
- logger.info(
320
- "Can not find the compute target with name: "
321
- f"'{compute_name}':"
322
- )
323
-
324
- if settings.mode == AzureMLComputeTypes.COMPUTE_INSTANCE:
325
- logger.info(
326
- "Creating a new compute instance. This might take a "
327
- "few minutes."
328
- )
329
-
330
- from azure.ai.ml.entities import ComputeInstance
331
-
332
- compute_instance = ComputeInstance(
333
- name=compute_name,
334
- size=settings.size,
335
- idle_time_before_shutdown_minutes=settings.idle_time_before_shutdown_minutes,
336
- )
337
- client.begin_create_or_update(compute_instance).result()
338
- return compute_name
339
-
340
- elif settings.mode == AzureMLComputeTypes.COMPUTE_CLUSTER:
341
- logger.info(
342
- "Creating a new compute cluster. This might take a "
343
- "few minutes."
344
- )
345
-
346
- from azure.ai.ml.entities import AmlCompute
347
-
348
- compute_cluster = AmlCompute(
349
- name=compute_name,
350
- size=settings.size,
351
- location=settings.location,
352
- min_instances=settings.min_instances,
353
- max_instances=settings.max_instances,
354
- idle_time_before_scale_down=settings.idle_time_before_scaledown_down,
355
- tier=settings.tier,
356
- )
357
- client.begin_create_or_update(compute_cluster).result()
358
- return compute_name
359
-
360
- return None
361
-
362
197
  def prepare_or_run_pipeline(
363
198
  self,
364
199
  deployment: "PipelineDeploymentResponse",
@@ -429,7 +264,9 @@ class AzureMLOrchestrator(ContainerizedOrchestrator):
429
264
  )
430
265
  pipeline_args["name"] = run_name
431
266
 
432
- if compute_target := self._create_or_get_compute(ml_client, settings):
267
+ if compute_target := create_or_get_compute(
268
+ ml_client, settings, default_compute_name=f"zenml_{self.id}"
269
+ ):
433
270
  pipeline_args["compute"] = compute_target
434
271
 
435
272
  @pipeline(force_rerun=True, **pipeline_args) # type: ignore[call-overload, misc]
@@ -540,5 +377,54 @@ class AzureMLOrchestrator(ContainerizedOrchestrator):
540
377
  )
541
378
 
542
379
  else:
543
- ml_client.jobs.create_or_update(pipeline_job)
380
+ job = ml_client.jobs.create_or_update(pipeline_job)
544
381
  logger.info(f"Pipeline {run_name} has been started.")
382
+ assert job.services is not None
383
+ assert job.name is not None
384
+
385
+ logger.info(
386
+ f"Pipeline {run_name} is running. "
387
+ "You can view the pipeline in the AzureML portal at "
388
+ f"{job.services['Studio'].endpoint}"
389
+ )
390
+
391
+ if self.config.synchronous:
392
+ logger.info("Waiting for pipeline to finish...")
393
+ ml_client.jobs.stream(job.name)
394
+
395
+ def get_pipeline_run_metadata(
396
+ self, run_id: UUID
397
+ ) -> Dict[str, "MetadataType"]:
398
+ """Get general component-specific metadata for a pipeline run.
399
+
400
+ Args:
401
+ run_id: The ID of the pipeline run.
402
+
403
+ Returns:
404
+ A dictionary of metadata.
405
+ """
406
+ try:
407
+ if connector := self.get_connector():
408
+ credentials = connector.connect()
409
+ else:
410
+ credentials = DefaultAzureCredential()
411
+
412
+ ml_client = MLClient(
413
+ credential=credentials,
414
+ subscription_id=self.config.subscription_id,
415
+ resource_group_name=self.config.resource_group,
416
+ workspace_name=self.config.workspace,
417
+ )
418
+
419
+ azureml_root_run_id = os.environ[ENV_ZENML_AZUREML_RUN_ID]
420
+ azureml_job = ml_client.jobs.get(azureml_root_run_id)
421
+
422
+ return {
423
+ METADATA_ORCHESTRATOR_URL: Uri(azureml_job.studio_url),
424
+ }
425
+ except Exception as e:
426
+ logger.warning(
427
+ f"Failed to fetch the Studio URL of the AzureML pipeline "
428
+ f"job: {e}"
429
+ )
430
+ return {}
@@ -69,6 +69,7 @@ class AzureMLEntrypointConfiguration(StepEntrypointConfiguration):
69
69
 
70
70
  # Azure automatically changes the working directory, we have to set it
71
71
  # back to /app before running the step.
72
+ os.makedirs("/app", exist_ok=True)
72
73
  os.chdir("/app")
73
74
 
74
75
  # Run the step
@@ -14,6 +14,7 @@
14
14
  """Azure Service Connector."""
15
15
 
16
16
  import datetime
17
+ import logging
17
18
  import re
18
19
  import subprocess
19
20
  from typing import Any, Dict, List, Optional, Tuple
@@ -58,6 +59,9 @@ from zenml.service_connectors.service_connector import (
58
59
  from zenml.utils.enum_utils import StrEnum
59
60
  from zenml.utils.secret_utils import PlainSerializedSecretStr
60
61
 
62
+ # Configure the logging level for azure.identity
63
+ logging.getLogger("azure.identity").setLevel(logging.WARNING)
64
+
61
65
  logger = get_logger(__name__)
62
66
 
63
67