zenml-nightly 0.70.0.dev20241122__py3-none-any.whl → 0.70.0.dev20241201__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 (103) hide show
  1. zenml/VERSION +1 -1
  2. zenml/artifact_stores/base_artifact_store.py +2 -2
  3. zenml/artifacts/artifact_config.py +7 -1
  4. zenml/artifacts/utils.py +56 -31
  5. zenml/cli/__init__.py +18 -0
  6. zenml/cli/base.py +4 -4
  7. zenml/cli/login.py +26 -0
  8. zenml/cli/pipeline.py +80 -0
  9. zenml/cli/server.py +1 -1
  10. zenml/cli/service_connectors.py +3 -3
  11. zenml/cli/stack.py +0 -3
  12. zenml/cli/stack_components.py +0 -1
  13. zenml/cli/utils.py +0 -5
  14. zenml/client.py +8 -18
  15. zenml/config/compiler.py +12 -3
  16. zenml/config/pipeline_configurations.py +20 -0
  17. zenml/config/pipeline_run_configuration.py +1 -0
  18. zenml/config/step_configurations.py +21 -0
  19. zenml/constants.py +1 -0
  20. zenml/enums.py +1 -0
  21. zenml/image_builders/local_image_builder.py +13 -3
  22. zenml/integrations/__init__.py +1 -0
  23. zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +14 -6
  24. zenml/integrations/constants.py +1 -0
  25. zenml/integrations/feast/__init__.py +1 -1
  26. zenml/integrations/feast/feature_stores/feast_feature_store.py +13 -9
  27. zenml/integrations/kubernetes/orchestrators/kube_utils.py +54 -9
  28. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +65 -3
  29. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +14 -2
  30. zenml/integrations/kubernetes/orchestrators/manifest_utils.py +6 -5
  31. zenml/integrations/kubernetes/service_connectors/kubernetes_service_connector.py +2 -1
  32. zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +3 -1
  33. zenml/integrations/modal/__init__.py +46 -0
  34. zenml/integrations/modal/flavors/__init__.py +26 -0
  35. zenml/integrations/modal/flavors/modal_step_operator_flavor.py +125 -0
  36. zenml/integrations/modal/step_operators/__init__.py +22 -0
  37. zenml/integrations/modal/step_operators/modal_step_operator.py +242 -0
  38. zenml/io/filesystem.py +2 -2
  39. zenml/io/local_filesystem.py +3 -3
  40. zenml/materializers/built_in_materializer.py +18 -1
  41. zenml/materializers/structured_string_materializer.py +8 -3
  42. zenml/model/model.py +11 -85
  43. zenml/model/utils.py +18 -16
  44. zenml/models/__init__.py +12 -1
  45. zenml/models/v2/core/artifact_version.py +6 -3
  46. zenml/models/v2/core/component.py +0 -22
  47. zenml/models/v2/core/model_version.py +6 -3
  48. zenml/models/v2/core/pipeline_run.py +19 -3
  49. zenml/models/v2/core/run_metadata.py +30 -9
  50. zenml/models/v2/core/service_connector.py +4 -0
  51. zenml/models/v2/core/step_run.py +6 -4
  52. zenml/models/v2/misc/run_metadata.py +38 -0
  53. zenml/models/v2/misc/server_models.py +23 -0
  54. zenml/orchestrators/input_utils.py +19 -6
  55. zenml/orchestrators/publish_utils.py +12 -5
  56. zenml/orchestrators/step_launcher.py +7 -3
  57. zenml/orchestrators/step_run_utils.py +26 -9
  58. zenml/orchestrators/step_runner.py +40 -3
  59. zenml/orchestrators/utils.py +24 -23
  60. zenml/pipelines/pipeline_decorator.py +4 -0
  61. zenml/pipelines/pipeline_definition.py +26 -8
  62. zenml/pipelines/run_utils.py +9 -5
  63. zenml/steps/base_step.py +11 -1
  64. zenml/steps/entrypoint_function_utils.py +7 -3
  65. zenml/steps/step_decorator.py +4 -0
  66. zenml/steps/utils.py +23 -7
  67. zenml/types.py +4 -0
  68. zenml/utils/metadata_utils.py +186 -153
  69. zenml/utils/string_utils.py +41 -16
  70. zenml/utils/visualization_utils.py +4 -1
  71. zenml/zen_server/cloud_utils.py +3 -1
  72. zenml/zen_server/deploy/helm/templates/_environment.tpl +117 -0
  73. zenml/zen_server/deploy/helm/templates/server-db-job.yaml +3 -14
  74. zenml/zen_server/deploy/helm/templates/server-deployment.yaml +16 -4
  75. zenml/zen_server/deploy/helm/templates/server-secret.yaml +2 -17
  76. zenml/zen_server/rbac/endpoint_utils.py +6 -4
  77. zenml/zen_server/rbac/models.py +3 -2
  78. zenml/zen_server/rbac/utils.py +4 -7
  79. zenml/zen_server/routers/server_endpoints.py +47 -0
  80. zenml/zen_server/routers/users_endpoints.py +35 -37
  81. zenml/zen_server/routers/workspaces_endpoints.py +44 -55
  82. zenml/zen_server/template_execution/utils.py +1 -0
  83. zenml/zen_server/zen_server_api.py +45 -6
  84. zenml/zen_stores/migrations/utils.py +40 -24
  85. zenml/zen_stores/migrations/versions/b73bc71f1106_remove_component_spec_path.py +36 -0
  86. zenml/zen_stores/migrations/versions/cc269488e5a9_separate_run_metadata.py +135 -0
  87. zenml/zen_stores/migrations/versions/ec6307720f92_simplify_model_version_links.py +7 -6
  88. zenml/zen_stores/rest_zen_store.py +38 -1
  89. zenml/zen_stores/schemas/__init__.py +5 -1
  90. zenml/zen_stores/schemas/artifact_schemas.py +12 -11
  91. zenml/zen_stores/schemas/component_schemas.py +0 -3
  92. zenml/zen_stores/schemas/model_schemas.py +13 -11
  93. zenml/zen_stores/schemas/pipeline_run_schemas.py +44 -16
  94. zenml/zen_stores/schemas/run_metadata_schemas.py +66 -31
  95. zenml/zen_stores/schemas/step_run_schemas.py +32 -12
  96. zenml/zen_stores/schemas/utils.py +47 -3
  97. zenml/zen_stores/sql_zen_store.py +130 -34
  98. {zenml_nightly-0.70.0.dev20241122.dist-info → zenml_nightly-0.70.0.dev20241201.dist-info}/METADATA +1 -1
  99. {zenml_nightly-0.70.0.dev20241122.dist-info → zenml_nightly-0.70.0.dev20241201.dist-info}/RECORD +102 -95
  100. zenml/utils/cloud_utils.py +0 -40
  101. {zenml_nightly-0.70.0.dev20241122.dist-info → zenml_nightly-0.70.0.dev20241201.dist-info}/LICENSE +0 -0
  102. {zenml_nightly-0.70.0.dev20241122.dist-info → zenml_nightly-0.70.0.dev20241201.dist-info}/WHEEL +0 -0
  103. {zenml_nightly-0.70.0.dev20241122.dist-info → zenml_nightly-0.70.0.dev20241201.dist-info}/entry_points.txt +0 -0
@@ -26,6 +26,7 @@ from datetime import datetime, timezone
26
26
  from functools import lru_cache
27
27
  from pathlib import Path
28
28
  from typing import (
29
+ TYPE_CHECKING,
29
30
  Any,
30
31
  Callable,
31
32
  ClassVar,
@@ -219,6 +220,7 @@ from zenml.models import (
219
220
  PipelineRunUpdate,
220
221
  PipelineUpdate,
221
222
  RunMetadataRequest,
223
+ RunMetadataResource,
222
224
  RunTemplateFilter,
223
225
  RunTemplateRequest,
224
226
  RunTemplateResponse,
@@ -325,6 +327,7 @@ from zenml.zen_stores.schemas import (
325
327
  PipelineDeploymentSchema,
326
328
  PipelineRunSchema,
327
329
  PipelineSchema,
330
+ RunMetadataResourceSchema,
328
331
  RunMetadataSchema,
329
332
  RunTemplateSchema,
330
333
  ScheduleSchema,
@@ -354,6 +357,9 @@ from zenml.zen_stores.secrets_stores.sql_secrets_store import (
354
357
  SqlSecretsStoreConfiguration,
355
358
  )
356
359
 
360
+ if TYPE_CHECKING:
361
+ from zenml.metadata.metadata_types import MetadataType, MetadataTypeEnum
362
+
357
363
  AnyNamedSchema = TypeVar("AnyNamedSchema", bound=NamedSchema)
358
364
  AnySchema = TypeVar("AnySchema", bound=BaseSchema)
359
365
 
@@ -2726,7 +2732,9 @@ class SqlZenStore(BaseZenStore):
2726
2732
  # -------------------- Artifact Versions --------------------
2727
2733
 
2728
2734
  def _get_or_create_artifact_for_name(
2729
- self, name: str, has_custom_name: bool
2735
+ self,
2736
+ name: str,
2737
+ has_custom_name: bool,
2730
2738
  ) -> ArtifactSchema:
2731
2739
  """Get or create an artifact with a specific name.
2732
2740
 
@@ -2747,7 +2755,8 @@ class SqlZenStore(BaseZenStore):
2747
2755
  try:
2748
2756
  with session.begin_nested():
2749
2757
  artifact_request = ArtifactRequest(
2750
- name=name, has_custom_name=has_custom_name
2758
+ name=name,
2759
+ has_custom_name=has_custom_name,
2751
2760
  )
2752
2761
  artifact = ArtifactSchema.from_request(
2753
2762
  artifact_request
@@ -2915,17 +2924,41 @@ class SqlZenStore(BaseZenStore):
2915
2924
 
2916
2925
  # Save metadata of the artifact
2917
2926
  if artifact_version.metadata:
2927
+ values: Dict[str, "MetadataType"] = {}
2928
+ types: Dict[str, "MetadataTypeEnum"] = {}
2918
2929
  for key, value in artifact_version.metadata.items():
2919
- run_metadata_schema = RunMetadataSchema(
2920
- workspace_id=artifact_version.workspace,
2921
- user_id=artifact_version.user,
2922
- resource_id=artifact_version_id,
2923
- resource_type=MetadataResourceTypes.ARTIFACT_VERSION,
2924
- key=key,
2925
- value=json.dumps(value),
2926
- type=get_metadata_type(value),
2930
+ # Skip metadata that is too large to be stored in the DB.
2931
+ if len(json.dumps(value)) > TEXT_FIELD_MAX_LENGTH:
2932
+ logger.warning(
2933
+ f"Metadata value for key '{key}' is too large to be "
2934
+ "stored in the database. Skipping."
2935
+ )
2936
+ continue
2937
+ # Skip metadata that is not of a supported type.
2938
+ try:
2939
+ metadata_type = get_metadata_type(value)
2940
+ except ValueError as e:
2941
+ logger.warning(
2942
+ f"Metadata value for key '{key}' is not of a "
2943
+ f"supported type. Skipping. Full error: {e}"
2944
+ )
2945
+ continue
2946
+ values[key] = value
2947
+ types[key] = metadata_type
2948
+ self.create_run_metadata(
2949
+ RunMetadataRequest(
2950
+ workspace=artifact_version.workspace,
2951
+ user=artifact_version.user,
2952
+ resources=[
2953
+ RunMetadataResource(
2954
+ id=artifact_version_id,
2955
+ type=MetadataResourceTypes.ARTIFACT_VERSION,
2956
+ )
2957
+ ],
2958
+ values=values,
2959
+ types=types,
2927
2960
  )
2928
- session.add(run_metadata_schema)
2961
+ )
2929
2962
 
2930
2963
  session.commit()
2931
2964
  artifact_version_schema = session.exec(
@@ -5329,6 +5362,19 @@ class SqlZenStore(BaseZenStore):
5329
5362
  "orchestrator run ID."
5330
5363
  )
5331
5364
 
5365
+ try:
5366
+ # We first try the most likely case that the run was already
5367
+ # created by a previous step in the same pipeline run.
5368
+ return (
5369
+ self._get_run_by_orchestrator_run_id(
5370
+ orchestrator_run_id=pipeline_run.orchestrator_run_id,
5371
+ deployment_id=pipeline_run.deployment,
5372
+ ),
5373
+ False,
5374
+ )
5375
+ except KeyError:
5376
+ pass
5377
+
5332
5378
  try:
5333
5379
  return (
5334
5380
  self._replace_placeholder_run(
@@ -5516,20 +5562,29 @@ class SqlZenStore(BaseZenStore):
5516
5562
  The created run metadata.
5517
5563
  """
5518
5564
  with Session(self.engine) as session:
5519
- for key, value in run_metadata.values.items():
5520
- type_ = run_metadata.types[key]
5521
- run_metadata_schema = RunMetadataSchema(
5522
- workspace_id=run_metadata.workspace,
5523
- user_id=run_metadata.user,
5524
- resource_id=run_metadata.resource_id,
5525
- resource_type=run_metadata.resource_type.value,
5526
- stack_component_id=run_metadata.stack_component_id,
5527
- key=key,
5528
- value=json.dumps(value),
5529
- type=type_,
5530
- )
5531
- session.add(run_metadata_schema)
5532
- session.commit()
5565
+ if run_metadata.resources:
5566
+ for key, value in run_metadata.values.items():
5567
+ type_ = run_metadata.types[key]
5568
+ run_metadata_schema = RunMetadataSchema(
5569
+ workspace_id=run_metadata.workspace,
5570
+ user_id=run_metadata.user,
5571
+ stack_component_id=run_metadata.stack_component_id,
5572
+ key=key,
5573
+ value=json.dumps(value),
5574
+ type=type_,
5575
+ publisher_step_id=run_metadata.publisher_step_id,
5576
+ )
5577
+ session.add(run_metadata_schema)
5578
+ session.commit()
5579
+
5580
+ for resource in run_metadata.resources:
5581
+ rm_resource_link = RunMetadataResourceSchema(
5582
+ resource_id=resource.id,
5583
+ resource_type=resource.type.value,
5584
+ run_metadata_id=run_metadata_schema.id,
5585
+ )
5586
+ session.add(rm_resource_link)
5587
+ session.commit()
5533
5588
  return None
5534
5589
 
5535
5590
  # ----------------------------- Schedules -----------------------------
@@ -8140,6 +8195,46 @@ class SqlZenStore(BaseZenStore):
8140
8195
  )
8141
8196
  session.add(log_entry)
8142
8197
 
8198
+ # If cached, attach metadata of the original step
8199
+ if (
8200
+ step_run.status == ExecutionStatus.CACHED
8201
+ and step_run.original_step_run_id is not None
8202
+ ):
8203
+ original_metadata_links = session.exec(
8204
+ select(RunMetadataResourceSchema)
8205
+ .where(
8206
+ RunMetadataResourceSchema.run_metadata_id
8207
+ == RunMetadataSchema.id
8208
+ )
8209
+ .where(
8210
+ RunMetadataResourceSchema.resource_id
8211
+ == step_run.original_step_run_id
8212
+ )
8213
+ .where(
8214
+ RunMetadataResourceSchema.resource_type
8215
+ == MetadataResourceTypes.STEP_RUN
8216
+ )
8217
+ .where(
8218
+ RunMetadataSchema.publisher_step_id
8219
+ == step_run.original_step_run_id
8220
+ )
8221
+ ).all()
8222
+
8223
+ # Create new links in a batch
8224
+ new_links = [
8225
+ RunMetadataResourceSchema(
8226
+ resource_id=step_schema.id,
8227
+ resource_type=link.resource_type,
8228
+ run_metadata_id=link.run_metadata_id,
8229
+ )
8230
+ for link in original_metadata_links
8231
+ ]
8232
+ # Add all new links in a single operation
8233
+ session.add_all(new_links)
8234
+ # Commit the changes
8235
+ session.commit()
8236
+ session.refresh(step_schema)
8237
+
8143
8238
  # Save parent step IDs into the database.
8144
8239
  for parent_step_id in step_run.parent_step_ids:
8145
8240
  self._set_run_step_parent_step(
@@ -8169,12 +8264,12 @@ class SqlZenStore(BaseZenStore):
8169
8264
  )
8170
8265
 
8171
8266
  # Save output artifact IDs into the database.
8172
- for output_name, artifact_version_ids in step_run.outputs.items():
8267
+ for name, artifact_version_ids in step_run.outputs.items():
8173
8268
  for artifact_version_id in artifact_version_ids:
8174
8269
  self._set_run_step_output_artifact(
8175
8270
  step_run_id=step_schema.id,
8176
8271
  artifact_version_id=artifact_version_id,
8177
- name=output_name,
8272
+ name=name,
8178
8273
  session=session,
8179
8274
  )
8180
8275
 
@@ -8278,13 +8373,14 @@ class SqlZenStore(BaseZenStore):
8278
8373
  session.add(existing_step_run)
8279
8374
 
8280
8375
  # Update the artifacts.
8281
- for name, artifact_version_id in step_run_update.outputs.items():
8282
- self._set_run_step_output_artifact(
8283
- step_run_id=step_run_id,
8284
- artifact_version_id=artifact_version_id,
8285
- name=name,
8286
- session=session,
8287
- )
8376
+ for name, artifact_version_ids in step_run_update.outputs.items():
8377
+ for artifact_version_id in artifact_version_ids:
8378
+ self._set_run_step_output_artifact(
8379
+ step_run_id=step_run_id,
8380
+ artifact_version_id=artifact_version_id,
8381
+ name=name,
8382
+ session=session,
8383
+ )
8288
8384
 
8289
8385
  # Update loaded artifacts.
8290
8386
  for (
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zenml-nightly
3
- Version: 0.70.0.dev20241122
3
+ Version: 0.70.0.dev20241201
4
4
  Summary: ZenML: Write production-ready ML code.
5
5
  Home-page: https://zenml.io
6
6
  License: Apache-2.0