zenml-nightly 0.84.1.dev20250805__py3-none-any.whl → 0.84.2.dev20250807__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.
- zenml/VERSION +1 -1
- zenml/integrations/huggingface/__init__.py +1 -1
- zenml/integrations/hyperai/__init__.py +1 -1
- zenml/integrations/kubernetes/constants.py +27 -0
- zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +79 -36
- zenml/integrations/kubernetes/flavors/kubernetes_step_operator_flavor.py +55 -24
- zenml/integrations/kubernetes/orchestrators/dag_runner.py +367 -0
- zenml/integrations/kubernetes/orchestrators/kube_utils.py +368 -1
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +144 -262
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +392 -244
- zenml/integrations/kubernetes/orchestrators/manifest_utils.py +53 -85
- zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +74 -32
- zenml/logging/step_logging.py +33 -30
- zenml/steps/base_step.py +6 -6
- zenml/steps/step_decorator.py +4 -4
- zenml/zen_stores/migrations/versions/0.84.2_release.py +23 -0
- {zenml_nightly-0.84.1.dev20250805.dist-info → zenml_nightly-0.84.2.dev20250807.dist-info}/METADATA +3 -3
- {zenml_nightly-0.84.1.dev20250805.dist-info → zenml_nightly-0.84.2.dev20250807.dist-info}/RECORD +21 -18
- {zenml_nightly-0.84.1.dev20250805.dist-info → zenml_nightly-0.84.2.dev20250807.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.84.1.dev20250805.dist-info → zenml_nightly-0.84.2.dev20250807.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.84.1.dev20250805.dist-info → zenml_nightly-0.84.2.dev20250807.dist-info}/entry_points.txt +0 -0
@@ -95,7 +95,7 @@ def add_local_stores_mount(
|
|
95
95
|
|
96
96
|
|
97
97
|
def build_pod_manifest(
|
98
|
-
pod_name: str,
|
98
|
+
pod_name: Optional[str],
|
99
99
|
image_name: str,
|
100
100
|
command: List[str],
|
101
101
|
args: List[str],
|
@@ -262,90 +262,6 @@ def add_pod_settings(
|
|
262
262
|
setattr(pod_spec, key, value)
|
263
263
|
|
264
264
|
|
265
|
-
def build_cron_job_manifest(
|
266
|
-
cron_expression: str,
|
267
|
-
pod_name: str,
|
268
|
-
image_name: str,
|
269
|
-
command: List[str],
|
270
|
-
args: List[str],
|
271
|
-
privileged: bool,
|
272
|
-
pod_settings: Optional[KubernetesPodSettings] = None,
|
273
|
-
service_account_name: Optional[str] = None,
|
274
|
-
env: Optional[Dict[str, str]] = None,
|
275
|
-
labels: Optional[Dict[str, str]] = None,
|
276
|
-
mount_local_stores: bool = False,
|
277
|
-
successful_jobs_history_limit: Optional[int] = None,
|
278
|
-
failed_jobs_history_limit: Optional[int] = None,
|
279
|
-
ttl_seconds_after_finished: Optional[int] = None,
|
280
|
-
termination_grace_period_seconds: Optional[int] = 30,
|
281
|
-
) -> k8s_client.V1CronJob:
|
282
|
-
"""Create a manifest for launching a pod as scheduled CRON job.
|
283
|
-
|
284
|
-
Args:
|
285
|
-
cron_expression: CRON job schedule expression, e.g. "* * * * *".
|
286
|
-
pod_name: Name of the pod.
|
287
|
-
image_name: Name of the Docker image.
|
288
|
-
command: Command to execute the entrypoint in the pod.
|
289
|
-
args: Arguments provided to the entrypoint command.
|
290
|
-
privileged: Whether to run the container in privileged mode.
|
291
|
-
pod_settings: Optional settings for the pod.
|
292
|
-
service_account_name: Optional name of a service account.
|
293
|
-
Can be used to assign certain roles to a pod, e.g., to allow it to
|
294
|
-
run Kubernetes commands from within the cluster.
|
295
|
-
env: Environment variables to set.
|
296
|
-
labels: Labels to add to the pod.
|
297
|
-
mount_local_stores: Whether to mount the local stores path inside the
|
298
|
-
pod.
|
299
|
-
successful_jobs_history_limit: The number of successful jobs to retain.
|
300
|
-
failed_jobs_history_limit: The number of failed jobs to retain.
|
301
|
-
ttl_seconds_after_finished: The amount of seconds to keep finished jobs
|
302
|
-
before deleting them.
|
303
|
-
termination_grace_period_seconds: The amount of seconds to wait for a
|
304
|
-
pod to shutdown gracefully.
|
305
|
-
|
306
|
-
Returns:
|
307
|
-
CRON job manifest.
|
308
|
-
"""
|
309
|
-
pod_manifest = build_pod_manifest(
|
310
|
-
pod_name=pod_name,
|
311
|
-
image_name=image_name,
|
312
|
-
command=command,
|
313
|
-
args=args,
|
314
|
-
privileged=privileged,
|
315
|
-
pod_settings=pod_settings,
|
316
|
-
service_account_name=service_account_name,
|
317
|
-
env=env,
|
318
|
-
labels=labels,
|
319
|
-
mount_local_stores=mount_local_stores,
|
320
|
-
termination_grace_period_seconds=termination_grace_period_seconds,
|
321
|
-
)
|
322
|
-
|
323
|
-
job_spec = k8s_client.V1CronJobSpec(
|
324
|
-
schedule=cron_expression,
|
325
|
-
successful_jobs_history_limit=successful_jobs_history_limit,
|
326
|
-
failed_jobs_history_limit=failed_jobs_history_limit,
|
327
|
-
job_template=k8s_client.V1JobTemplateSpec(
|
328
|
-
metadata=pod_manifest.metadata,
|
329
|
-
spec=k8s_client.V1JobSpec(
|
330
|
-
template=k8s_client.V1PodTemplateSpec(
|
331
|
-
metadata=pod_manifest.metadata,
|
332
|
-
spec=pod_manifest.spec,
|
333
|
-
),
|
334
|
-
ttl_seconds_after_finished=ttl_seconds_after_finished,
|
335
|
-
),
|
336
|
-
),
|
337
|
-
)
|
338
|
-
|
339
|
-
job_manifest = k8s_client.V1CronJob(
|
340
|
-
kind="CronJob",
|
341
|
-
api_version="batch/v1",
|
342
|
-
metadata=pod_manifest.metadata,
|
343
|
-
spec=job_spec,
|
344
|
-
)
|
345
|
-
|
346
|
-
return job_manifest
|
347
|
-
|
348
|
-
|
349
265
|
def build_role_binding_manifest_for_service_account(
|
350
266
|
name: str,
|
351
267
|
role_name: str,
|
@@ -475,6 +391,7 @@ def build_job_manifest(
|
|
475
391
|
backoff_limit: Optional[int] = None,
|
476
392
|
ttl_seconds_after_finished: Optional[int] = None,
|
477
393
|
labels: Optional[Dict[str, str]] = None,
|
394
|
+
annotations: Optional[Dict[str, str]] = None,
|
478
395
|
active_deadline_seconds: Optional[int] = None,
|
479
396
|
pod_failure_policy: Optional[Dict[str, Any]] = None,
|
480
397
|
owner_references: Optional[List[k8s_client.V1OwnerReference]] = None,
|
@@ -487,6 +404,7 @@ def build_job_manifest(
|
|
487
404
|
backoff_limit: The backoff limit for the job.
|
488
405
|
ttl_seconds_after_finished: The TTL seconds after finished for the job.
|
489
406
|
labels: The labels to use for the job.
|
407
|
+
annotations: The annotations to use for the job.
|
490
408
|
active_deadline_seconds: The active deadline seconds for the job.
|
491
409
|
pod_failure_policy: The pod failure policy for the job.
|
492
410
|
owner_references: The owner references for the job.
|
@@ -505,7 +423,57 @@ def build_job_manifest(
|
|
505
423
|
job_metadata = k8s_client.V1ObjectMeta(
|
506
424
|
name=job_name,
|
507
425
|
labels=labels,
|
426
|
+
annotations=annotations,
|
508
427
|
owner_references=owner_references,
|
509
428
|
)
|
510
429
|
|
511
430
|
return k8s_client.V1Job(spec=job_spec, metadata=job_metadata)
|
431
|
+
|
432
|
+
|
433
|
+
def job_template_manifest_from_job(
|
434
|
+
job: k8s_client.V1Job,
|
435
|
+
) -> k8s_client.V1JobTemplateSpec:
|
436
|
+
"""Build a Kubernetes job template manifest from a job.
|
437
|
+
|
438
|
+
Args:
|
439
|
+
job: The job manifest to build the template from.
|
440
|
+
|
441
|
+
Returns:
|
442
|
+
The job template manifest.
|
443
|
+
"""
|
444
|
+
return k8s_client.V1JobTemplateSpec(
|
445
|
+
metadata=job.metadata,
|
446
|
+
spec=job.spec,
|
447
|
+
)
|
448
|
+
|
449
|
+
|
450
|
+
def build_cron_job_manifest(
|
451
|
+
job_template: k8s_client.V1JobTemplateSpec,
|
452
|
+
cron_expression: str,
|
453
|
+
successful_jobs_history_limit: Optional[int] = None,
|
454
|
+
failed_jobs_history_limit: Optional[int] = None,
|
455
|
+
) -> k8s_client.V1CronJob:
|
456
|
+
"""Build a Kubernetes cron job manifest.
|
457
|
+
|
458
|
+
Args:
|
459
|
+
job_template: The job template to use for the cron job.
|
460
|
+
cron_expression: The cron expression to use for the cron job.
|
461
|
+
successful_jobs_history_limit: The number of successful jobs to keep.
|
462
|
+
failed_jobs_history_limit: The number of failed jobs to keep.
|
463
|
+
|
464
|
+
Returns:
|
465
|
+
The Kubernetes cron job manifest.
|
466
|
+
"""
|
467
|
+
spec = k8s_client.V1CronJobSpec(
|
468
|
+
schedule=cron_expression,
|
469
|
+
successful_jobs_history_limit=successful_jobs_history_limit,
|
470
|
+
failed_jobs_history_limit=failed_jobs_history_limit,
|
471
|
+
job_template=job_template,
|
472
|
+
)
|
473
|
+
|
474
|
+
return k8s_client.V1CronJob(
|
475
|
+
kind="CronJob",
|
476
|
+
api_version="batch/v1",
|
477
|
+
metadata=job_template.metadata,
|
478
|
+
spec=spec,
|
479
|
+
)
|
@@ -13,6 +13,7 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Kubernetes step operator implementation."""
|
15
15
|
|
16
|
+
import random
|
16
17
|
from typing import TYPE_CHECKING, Dict, List, Optional, Tuple, Type, cast
|
17
18
|
|
18
19
|
from kubernetes import client as k8s_client
|
@@ -20,13 +21,21 @@ from kubernetes import client as k8s_client
|
|
20
21
|
from zenml.config.base_settings import BaseSettings
|
21
22
|
from zenml.config.build_configuration import BuildConfiguration
|
22
23
|
from zenml.enums import StackComponentType
|
24
|
+
from zenml.integrations.kubernetes.constants import (
|
25
|
+
STEP_NAME_ANNOTATION_KEY,
|
26
|
+
STEP_OPERATOR_ANNOTATION_KEY,
|
27
|
+
)
|
23
28
|
from zenml.integrations.kubernetes.flavors import (
|
24
29
|
KubernetesStepOperatorConfig,
|
25
30
|
KubernetesStepOperatorSettings,
|
26
31
|
)
|
27
|
-
from zenml.integrations.kubernetes.orchestrators import
|
32
|
+
from zenml.integrations.kubernetes.orchestrators import (
|
33
|
+
kube_utils,
|
34
|
+
)
|
28
35
|
from zenml.integrations.kubernetes.orchestrators.manifest_utils import (
|
36
|
+
build_job_manifest,
|
29
37
|
build_pod_manifest,
|
38
|
+
pod_template_manifest_from_pod,
|
30
39
|
)
|
31
40
|
from zenml.logger import get_logger
|
32
41
|
from zenml.stack import Stack, StackValidator
|
@@ -174,6 +183,15 @@ class KubernetesStepOperator(BaseStepOperator):
|
|
174
183
|
"""
|
175
184
|
return k8s_client.CoreV1Api(self.get_kube_client())
|
176
185
|
|
186
|
+
@property
|
187
|
+
def _k8s_batch_api(self) -> k8s_client.BatchV1Api:
|
188
|
+
"""Getter for the Kubernetes Batch API client.
|
189
|
+
|
190
|
+
Returns:
|
191
|
+
The Kubernetes Batch API client.
|
192
|
+
"""
|
193
|
+
return k8s_client.BatchV1Api(self.get_kube_client())
|
194
|
+
|
177
195
|
def launch(
|
178
196
|
self,
|
179
197
|
info: "StepRunInfo",
|
@@ -194,53 +212,77 @@ class KubernetesStepOperator(BaseStepOperator):
|
|
194
212
|
image_name = info.get_image(
|
195
213
|
key=KUBERNETES_STEP_OPERATOR_DOCKER_IMAGE_KEY
|
196
214
|
)
|
197
|
-
|
198
|
-
pod_name = f"{info.run_name}_{info.pipeline_step_name}"
|
199
|
-
pod_name = kube_utils.sanitize_pod_name(
|
200
|
-
pod_name, namespace=self.config.kubernetes_namespace
|
201
|
-
)
|
202
|
-
|
203
215
|
command = entrypoint_command[:3]
|
204
216
|
args = entrypoint_command[3:]
|
205
217
|
|
206
|
-
|
218
|
+
step_labels = {
|
219
|
+
"run_id": kube_utils.sanitize_label(str(info.run_id)),
|
220
|
+
"run_name": kube_utils.sanitize_label(str(info.run_name)),
|
221
|
+
"pipeline": kube_utils.sanitize_label(info.pipeline.name),
|
222
|
+
"step_name": kube_utils.sanitize_label(info.pipeline_step_name),
|
223
|
+
}
|
224
|
+
step_annotations = {
|
225
|
+
STEP_NAME_ANNOTATION_KEY: info.pipeline_step_name,
|
226
|
+
STEP_OPERATOR_ANNOTATION_KEY: str(self.id),
|
227
|
+
}
|
228
|
+
|
229
|
+
# We set some default minimum memory resource requests for the step pod
|
230
|
+
# here if the user has not specified any, because the step pod takes up
|
231
|
+
# some memory resources itself and, if not specified, the pod will be
|
232
|
+
# scheduled on any node regardless of available memory and risk
|
233
|
+
# negatively impacting or even crashing the node due to memory pressure.
|
234
|
+
pod_settings = kube_utils.apply_default_resource_requests(
|
235
|
+
memory="400Mi",
|
236
|
+
pod_settings=settings.pod_settings,
|
237
|
+
)
|
238
|
+
|
207
239
|
pod_manifest = build_pod_manifest(
|
208
|
-
pod_name=
|
240
|
+
pod_name=None,
|
209
241
|
image_name=image_name,
|
210
242
|
command=command,
|
211
243
|
args=args,
|
244
|
+
env=environment,
|
212
245
|
privileged=settings.privileged,
|
246
|
+
pod_settings=pod_settings,
|
213
247
|
service_account_name=settings.service_account_name,
|
214
|
-
|
215
|
-
env=environment,
|
216
|
-
mount_local_stores=False,
|
217
|
-
labels={
|
218
|
-
"run_id": kube_utils.sanitize_label(str(info.run_id)),
|
219
|
-
"pipeline": kube_utils.sanitize_label(info.pipeline.name),
|
220
|
-
},
|
248
|
+
labels=step_labels,
|
221
249
|
)
|
222
250
|
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
251
|
+
job_name = settings.job_name_prefix or ""
|
252
|
+
random_prefix = "".join(random.choices("0123456789abcdef", k=8))
|
253
|
+
job_name += f"-{random_prefix}-{info.pipeline_step_name}-{info.pipeline.name}-step-operator"
|
254
|
+
# The job name will be used as a label on the pods, so we need to make
|
255
|
+
# sure it doesn't exceed the label length limit
|
256
|
+
job_name = kube_utils.sanitize_label(job_name)
|
257
|
+
|
258
|
+
job_manifest = build_job_manifest(
|
259
|
+
job_name=job_name,
|
260
|
+
pod_template=pod_template_manifest_from_pod(pod_manifest),
|
261
|
+
# The orchestrator already handles retries, so we don't need to
|
262
|
+
# retry the step operator job.
|
263
|
+
backoff_limit=0,
|
264
|
+
ttl_seconds_after_finished=settings.ttl_seconds_after_finished,
|
265
|
+
active_deadline_seconds=settings.active_deadline_seconds,
|
266
|
+
labels=step_labels,
|
267
|
+
annotations=step_annotations,
|
268
|
+
)
|
269
|
+
|
270
|
+
kube_utils.create_job(
|
271
|
+
batch_api=self._k8s_batch_api,
|
228
272
|
namespace=self.config.kubernetes_namespace,
|
229
|
-
|
230
|
-
startup_failure_delay=settings.pod_failure_retry_delay,
|
231
|
-
startup_failure_backoff=settings.pod_failure_backoff,
|
232
|
-
startup_timeout=settings.pod_startup_timeout,
|
273
|
+
job_manifest=job_manifest,
|
233
274
|
)
|
234
275
|
|
235
276
|
logger.info(
|
236
|
-
"Waiting for
|
237
|
-
|
277
|
+
"Waiting for step operator job `%s` to finish...",
|
278
|
+
job_name,
|
238
279
|
)
|
239
|
-
kube_utils.
|
240
|
-
|
241
|
-
|
280
|
+
kube_utils.wait_for_job_to_finish(
|
281
|
+
batch_api=self._k8s_batch_api,
|
282
|
+
core_api=self._k8s_core_api,
|
242
283
|
namespace=self.config.kubernetes_namespace,
|
243
|
-
|
284
|
+
job_name=job_name,
|
285
|
+
fail_on_container_waiting_reasons=settings.fail_on_container_waiting_reasons,
|
244
286
|
stream_logs=True,
|
245
287
|
)
|
246
|
-
logger.info("
|
288
|
+
logger.info("Step operator job completed.")
|
zenml/logging/step_logging.py
CHANGED
@@ -48,6 +48,7 @@ from zenml.exceptions import DoesNotExistException
|
|
48
48
|
from zenml.logger import get_logger
|
49
49
|
from zenml.models import (
|
50
50
|
LogsRequest,
|
51
|
+
LogsResponse,
|
51
52
|
PipelineDeploymentResponse,
|
52
53
|
PipelineRunUpdate,
|
53
54
|
)
|
@@ -702,7 +703,9 @@ class PipelineLogsStorageContext:
|
|
702
703
|
|
703
704
|
|
704
705
|
def setup_orchestrator_logging(
|
705
|
-
run_id:
|
706
|
+
run_id: UUID,
|
707
|
+
deployment: "PipelineDeploymentResponse",
|
708
|
+
logs_response: Optional[LogsResponse] = None,
|
706
709
|
) -> Any:
|
707
710
|
"""Set up logging for an orchestrator environment.
|
708
711
|
|
@@ -712,61 +715,61 @@ def setup_orchestrator_logging(
|
|
712
715
|
Args:
|
713
716
|
run_id: The pipeline run ID.
|
714
717
|
deployment: The deployment of the pipeline run.
|
718
|
+
logs_response: The logs response to continue from.
|
715
719
|
|
716
720
|
Returns:
|
717
721
|
The logs context (PipelineLogsStorageContext)
|
718
722
|
"""
|
719
723
|
try:
|
720
|
-
|
724
|
+
logging_enabled = True
|
721
725
|
|
722
|
-
# Check whether logging is enabled
|
723
726
|
if handle_bool_env_var(ENV_ZENML_DISABLE_PIPELINE_LOGS_STORAGE, False):
|
724
|
-
|
727
|
+
logging_enabled = False
|
725
728
|
else:
|
726
729
|
if (
|
727
730
|
deployment.pipeline_configuration.enable_pipeline_logs
|
728
731
|
is not None
|
729
732
|
):
|
730
|
-
|
733
|
+
logging_enabled = (
|
731
734
|
deployment.pipeline_configuration.enable_pipeline_logs
|
732
735
|
)
|
733
736
|
|
734
|
-
if not
|
737
|
+
if not logging_enabled:
|
735
738
|
return nullcontext()
|
736
739
|
|
737
740
|
# Fetch the active stack
|
738
741
|
client = Client()
|
739
742
|
active_stack = client.active_stack
|
740
743
|
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
744
|
+
if logs_response:
|
745
|
+
logs_uri = logs_response.uri
|
746
|
+
else:
|
747
|
+
logs_uri = prepare_logs_uri(
|
748
|
+
artifact_store=active_stack.artifact_store,
|
749
|
+
)
|
750
|
+
logs_model = LogsRequest(
|
751
|
+
uri=logs_uri,
|
752
|
+
source="orchestrator",
|
753
|
+
artifact_store_id=active_stack.artifact_store.id,
|
754
|
+
)
|
755
|
+
|
756
|
+
# Add orchestrator logs to the pipeline run
|
757
|
+
try:
|
758
|
+
run_update = PipelineRunUpdate(add_logs=[logs_model])
|
759
|
+
client.zen_store.update_run(
|
760
|
+
run_id=run_id, run_update=run_update
|
761
|
+
)
|
762
|
+
except Exception as e:
|
763
|
+
logger.error(
|
764
|
+
f"Failed to add orchestrator logs to the run {run_id}: {e}"
|
765
|
+
)
|
766
|
+
raise e
|
745
767
|
|
746
|
-
|
768
|
+
return PipelineLogsStorageContext(
|
747
769
|
logs_uri=logs_uri,
|
748
770
|
artifact_store=active_stack.artifact_store,
|
749
771
|
prepend_step_name=False,
|
750
772
|
)
|
751
|
-
|
752
|
-
logs_model = LogsRequest(
|
753
|
-
uri=logs_uri,
|
754
|
-
source="orchestrator",
|
755
|
-
artifact_store_id=active_stack.artifact_store.id,
|
756
|
-
)
|
757
|
-
|
758
|
-
# Add orchestrator logs to the pipeline run
|
759
|
-
try:
|
760
|
-
run_update = PipelineRunUpdate(add_logs=[logs_model])
|
761
|
-
client.zen_store.update_run(
|
762
|
-
run_id=UUID(run_id), run_update=run_update
|
763
|
-
)
|
764
|
-
except Exception as e:
|
765
|
-
logger.error(
|
766
|
-
f"Failed to add orchestrator logs to the run {run_id}: {e}"
|
767
|
-
)
|
768
|
-
raise e
|
769
|
-
return logs_context
|
770
773
|
except Exception as e:
|
771
774
|
logger.error(
|
772
775
|
f"Failed to setup orchestrator logging for run {run_id}: {e}"
|
zenml/steps/base_step.py
CHANGED
@@ -104,8 +104,8 @@ class BaseStep:
|
|
104
104
|
enable_artifact_metadata: Optional[bool] = None,
|
105
105
|
enable_artifact_visualization: Optional[bool] = None,
|
106
106
|
enable_step_logs: Optional[bool] = None,
|
107
|
-
experiment_tracker: Optional[str] = None,
|
108
|
-
step_operator: Optional[str] = None,
|
107
|
+
experiment_tracker: Optional[Union[bool, str]] = None,
|
108
|
+
step_operator: Optional[Union[bool, str]] = None,
|
109
109
|
parameters: Optional[Dict[str, Any]] = None,
|
110
110
|
output_materializers: Optional[
|
111
111
|
"OutputMaterializersSpecification"
|
@@ -594,8 +594,8 @@ class BaseStep:
|
|
594
594
|
enable_artifact_metadata: Optional[bool] = None,
|
595
595
|
enable_artifact_visualization: Optional[bool] = None,
|
596
596
|
enable_step_logs: Optional[bool] = None,
|
597
|
-
experiment_tracker: Optional[str] = None,
|
598
|
-
step_operator: Optional[str] = None,
|
597
|
+
experiment_tracker: Optional[Union[bool, str]] = None,
|
598
|
+
step_operator: Optional[Union[bool, str]] = None,
|
599
599
|
parameters: Optional[Dict[str, Any]] = None,
|
600
600
|
output_materializers: Optional[
|
601
601
|
"OutputMaterializersSpecification"
|
@@ -728,8 +728,8 @@ class BaseStep:
|
|
728
728
|
enable_artifact_metadata: Optional[bool] = None,
|
729
729
|
enable_artifact_visualization: Optional[bool] = None,
|
730
730
|
enable_step_logs: Optional[bool] = None,
|
731
|
-
experiment_tracker: Optional[str] = None,
|
732
|
-
step_operator: Optional[str] = None,
|
731
|
+
experiment_tracker: Optional[Union[bool, str]] = None,
|
732
|
+
step_operator: Optional[Union[bool, str]] = None,
|
733
733
|
parameters: Optional[Dict[str, Any]] = None,
|
734
734
|
output_materializers: Optional[
|
735
735
|
"OutputMaterializersSpecification"
|
zenml/steps/step_decorator.py
CHANGED
@@ -64,8 +64,8 @@ def step(
|
|
64
64
|
enable_artifact_metadata: Optional[bool] = None,
|
65
65
|
enable_artifact_visualization: Optional[bool] = None,
|
66
66
|
enable_step_logs: Optional[bool] = None,
|
67
|
-
experiment_tracker: Optional[str] = None,
|
68
|
-
step_operator: Optional[str] = None,
|
67
|
+
experiment_tracker: Optional[Union[bool, str]] = None,
|
68
|
+
step_operator: Optional[Union[bool, str]] = None,
|
69
69
|
output_materializers: Optional["OutputMaterializersSpecification"] = None,
|
70
70
|
settings: Optional[Dict[str, "SettingsOrDict"]] = None,
|
71
71
|
extra: Optional[Dict[str, Any]] = None,
|
@@ -85,8 +85,8 @@ def step(
|
|
85
85
|
enable_artifact_metadata: Optional[bool] = None,
|
86
86
|
enable_artifact_visualization: Optional[bool] = None,
|
87
87
|
enable_step_logs: Optional[bool] = None,
|
88
|
-
experiment_tracker: Optional[str] = None,
|
89
|
-
step_operator: Optional[str] = None,
|
88
|
+
experiment_tracker: Optional[Union[bool, str]] = None,
|
89
|
+
step_operator: Optional[Union[bool, str]] = None,
|
90
90
|
output_materializers: Optional["OutputMaterializersSpecification"] = None,
|
91
91
|
settings: Optional[Dict[str, "SettingsOrDict"]] = None,
|
92
92
|
extra: Optional[Dict[str, Any]] = None,
|
@@ -0,0 +1,23 @@
|
|
1
|
+
"""Release [0.84.2].
|
2
|
+
|
3
|
+
Revision ID: 0.84.2
|
4
|
+
Revises: 0.84.1
|
5
|
+
Create Date: 2025-08-06 07:52:42.915891
|
6
|
+
|
7
|
+
"""
|
8
|
+
|
9
|
+
# revision identifiers, used by Alembic.
|
10
|
+
revision = "0.84.2"
|
11
|
+
down_revision = "0.84.1"
|
12
|
+
branch_labels = None
|
13
|
+
depends_on = None
|
14
|
+
|
15
|
+
|
16
|
+
def upgrade() -> None:
|
17
|
+
"""Upgrade database schema and/or data, creating a new revision."""
|
18
|
+
pass
|
19
|
+
|
20
|
+
|
21
|
+
def downgrade() -> None:
|
22
|
+
"""Downgrade database schema and/or data back to the previous revision."""
|
23
|
+
pass
|
{zenml_nightly-0.84.1.dev20250805.dist-info → zenml_nightly-0.84.2.dev20250807.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: zenml-nightly
|
3
|
-
Version: 0.84.
|
3
|
+
Version: 0.84.2.dev20250807
|
4
4
|
Summary: ZenML: Write production-ready ML code.
|
5
5
|
License: Apache-2.0
|
6
6
|
Keywords: machine learning,production,pipeline,mlops,devops
|
@@ -125,7 +125,7 @@ Requires-Dist: types-PyYAML (>=6.0.0,<7.0.0) ; extra == "dev"
|
|
125
125
|
Requires-Dist: types-certifi (>=2021.10.8.0,<2022.0.0.0) ; extra == "dev"
|
126
126
|
Requires-Dist: types-croniter (>=1.0.2,<2.0.0) ; extra == "dev"
|
127
127
|
Requires-Dist: types-futures (>=3.3.1,<4.0.0) ; extra == "dev"
|
128
|
-
Requires-Dist: types-paramiko (>=3.4.0) ; extra == "dev"
|
128
|
+
Requires-Dist: types-paramiko (>=3.4.0,<4.0.0) ; extra == "dev"
|
129
129
|
Requires-Dist: types-passlib (>=1.7.7,<2.0.0) ; extra == "dev"
|
130
130
|
Requires-Dist: types-protobuf (>=3.18.0,<4.0.0) ; extra == "dev"
|
131
131
|
Requires-Dist: types-psutil (>=5.8.13,<6.0.0) ; extra == "dev"
|
@@ -168,7 +168,7 @@ Description-Content-Type: text/markdown
|
|
168
168
|
[pypi-shield]: https://img.shields.io/pypi/pyversions/zenml?color=281158
|
169
169
|
[pypi-url]: https://pypi.org/project/zenml/
|
170
170
|
[pypiversion-shield]: https://img.shields.io/pypi/v/zenml?color=361776
|
171
|
-
[downloads-shield]: https://img.shields.io/
|
171
|
+
[downloads-shield]: https://img.shields.io/pepy/dt/zenml?color=431D93
|
172
172
|
[downloads-url]: https://pypi.org/project/zenml/
|
173
173
|
[contributors-shield]: https://img.shields.io/github/contributors/zenml-io/zenml?color=7A3EF4
|
174
174
|
[contributors-url]: https://github.com/zenml-io/zenml/graphs/contributors
|
{zenml_nightly-0.84.1.dev20250805.dist-info → zenml_nightly-0.84.2.dev20250807.dist-info}/RECORD
RENAMED
@@ -1,5 +1,5 @@
|
|
1
1
|
zenml/README.md,sha256=827dekbOWAs1BpW7VF1a4d7EbwPbjwccX-2zdXBENZo,1777
|
2
|
-
zenml/VERSION,sha256=
|
2
|
+
zenml/VERSION,sha256=5Qbn3wnWDaFIZJ7bj5KdK188yXmxX25h-ppF-ENK_Q4,19
|
3
3
|
zenml/__init__.py,sha256=r7JUg2SVDf_dPhS7iU6vudKusEqK4ics7_jFMZhq0o4,2731
|
4
4
|
zenml/actions/__init__.py,sha256=mrt6wPo73iKRxK754_NqsGyJ3buW7RnVeIGXr1xEw8Y,681
|
5
5
|
zenml/actions/base_action.py,sha256=UcaHev6BTuLDwuswnyaPjdA8AgUqB5xPZ-lRtuvf2FU,25553
|
@@ -297,7 +297,7 @@ zenml/integrations/great_expectations/steps/__init__.py,sha256=OGsp32yJs9GItypFR
|
|
297
297
|
zenml/integrations/great_expectations/steps/ge_profiler.py,sha256=ea6WLF1B8pvkGe-dBaAX3tNV2W8mVhUhk6WQpKgqKEA,2141
|
298
298
|
zenml/integrations/great_expectations/steps/ge_validator.py,sha256=kdFzhkzJtQZGOul8E8BE5_315mYGvMuDINYagPflKVk,2946
|
299
299
|
zenml/integrations/great_expectations/utils.py,sha256=4DXjAfsKUVcp_lSGAPiAsAI-WLNjr_DLMsGJOYGkSjE,3138
|
300
|
-
zenml/integrations/huggingface/__init__.py,sha256=
|
300
|
+
zenml/integrations/huggingface/__init__.py,sha256=BkIpcmQIDFG-2m21GJ5OmRynOVFvE5vL2UEiC9nYrNA,2674
|
301
301
|
zenml/integrations/huggingface/flavors/__init__.py,sha256=NXMxZXrS7fHdZnz1G_Sf83k4zkE84C5UoYJzxXSY-R0,970
|
302
302
|
zenml/integrations/huggingface/flavors/huggingface_model_deployer_flavor.py,sha256=QITTxFrpKu5JNH29A_riAWiC0-gY3qcxGWQf__0aQII,4032
|
303
303
|
zenml/integrations/huggingface/materializers/__init__.py,sha256=HoiSCzfMTxtcvkDBconFm_-pdGZXzXDelkuPtcrJIgA,1267
|
@@ -313,7 +313,7 @@ zenml/integrations/huggingface/services/huggingface_deployment.py,sha256=m-8qKca
|
|
313
313
|
zenml/integrations/huggingface/steps/__init__.py,sha256=tjsmnE9lJcXsE46YGPNWJICHXDUWn34m7jE-os-CFLo,879
|
314
314
|
zenml/integrations/huggingface/steps/accelerate_runner.py,sha256=0fazQcqopAVRCInNePsIEy2Vn4EePioAetWXhewXpFA,6387
|
315
315
|
zenml/integrations/huggingface/steps/huggingface_deployer.py,sha256=Wk1wzYwy-kpA-IJAHzukUpIGRxrhZTuyXNYVriXBqCI,4103
|
316
|
-
zenml/integrations/hyperai/__init__.py,sha256=
|
316
|
+
zenml/integrations/hyperai/__init__.py,sha256=wEi-7px6yKIfcqqswxoWrwdH1P5txMNp6iXsAoizuaU,1670
|
317
317
|
zenml/integrations/hyperai/flavors/__init__.py,sha256=PUGBPmQ7y3H7QU2zAj7Ri0rrUBbOWnM_L59AIVWUYwU,800
|
318
318
|
zenml/integrations/hyperai/flavors/hyperai_orchestrator_flavor.py,sha256=r4w16s4IB72nBKEgvSlJ6TRZ88kyP8mduOUZpQ-njn4,5328
|
319
319
|
zenml/integrations/hyperai/orchestrators/__init__.py,sha256=kSYpMZPEWwNu2vxoOC6PeyQ9RLzsPAgTHxL35K36MiE,784
|
@@ -333,21 +333,23 @@ zenml/integrations/kubeflow/orchestrators/__init__.py,sha256=J879DBt9WbpojBTdOXy
|
|
333
333
|
zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py,sha256=lPQSQn6Jp2oJxULG_G8UcbE_bgw_9XTlAjdsujahWbY,38195
|
334
334
|
zenml/integrations/kubeflow/orchestrators/local_deployment_utils.py,sha256=qszoOdvBpgIp40XkncphXAr9dRKnyZzGiz2mJ56bYmw,15448
|
335
335
|
zenml/integrations/kubernetes/__init__.py,sha256=k1bfrdI1u5RBnAh7yT4w-m-4SWgZ7b4L5uu7dPRc0SI,1809
|
336
|
+
zenml/integrations/kubernetes/constants.py,sha256=7pejIdiOAwcQNkWOkqBta_FFMllzsKte5l2fcFdaqN8,1232
|
336
337
|
zenml/integrations/kubernetes/flavors/__init__.py,sha256=a5gU45qCj3FkLwl_uVjlIkL_2F5DHk-w1gdcZrvVjBI,1266
|
337
|
-
zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py,sha256=
|
338
|
-
zenml/integrations/kubernetes/flavors/kubernetes_step_operator_flavor.py,sha256=
|
338
|
+
zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py,sha256=O_fnKZ6jPItdOyhgxCTJTD7gpIx1MHhU9_22Cg5x0Ig,15266
|
339
|
+
zenml/integrations/kubernetes/flavors/kubernetes_step_operator_flavor.py,sha256=unk8I8uYXn3pJS3HajEhZodhsdFvvhCTs5NzzqkQk3Q,7453
|
339
340
|
zenml/integrations/kubernetes/orchestrators/__init__.py,sha256=TJID3OTieZBox36WpQpzD0jdVRA_aZVcs_bNtfXS8ik,811
|
340
|
-
zenml/integrations/kubernetes/orchestrators/
|
341
|
-
zenml/integrations/kubernetes/orchestrators/
|
342
|
-
zenml/integrations/kubernetes/orchestrators/
|
341
|
+
zenml/integrations/kubernetes/orchestrators/dag_runner.py,sha256=IDumuhi9hySiTZ7oTI6hz5RlJ4kiuv3NpVYgA_pLS_Y,12044
|
342
|
+
zenml/integrations/kubernetes/orchestrators/kube_utils.py,sha256=soQPph_FWFPAwL7vpZX91cu8jEjo4xBYnafLUdMNtnw,38684
|
343
|
+
zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py,sha256=TnrKa6xnrYtAq1elyob0aRy-aTLrSjLuuOzdLSs_GFs,36811
|
344
|
+
zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py,sha256=QahXJ-cM6lrXqWs2BHMQtKQf3svqKB5l69d4D0OB4qc,24789
|
343
345
|
zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint_configuration.py,sha256=QOwQnWCfB-t_BQ2eOZN0SakurGUd0GTMCSdUlREhk6I,2324
|
344
|
-
zenml/integrations/kubernetes/orchestrators/manifest_utils.py,sha256=
|
346
|
+
zenml/integrations/kubernetes/orchestrators/manifest_utils.py,sha256=JskjDSbR3HdTxGT3NOVi0ha7Ku3CqMkPzMJJq4IZYp0,14491
|
345
347
|
zenml/integrations/kubernetes/pod_settings.py,sha256=s6I0sALXB7PnRqJ-nlU71o3cTm2GM1TfqsE44qhiDJY,8022
|
346
348
|
zenml/integrations/kubernetes/serialization_utils.py,sha256=Uy30YWUU8VAizYLWk0cZKtEisSo4AzuzsyGU_KIb8PY,7044
|
347
349
|
zenml/integrations/kubernetes/service_connectors/__init__.py,sha256=Uf6zlHIapYrRDl3xOPWQ2jA7jt85SXx1U7DmSxzxTvQ,818
|
348
350
|
zenml/integrations/kubernetes/service_connectors/kubernetes_service_connector.py,sha256=Cv4tiVxoQOz9ex0lf3JdJrooEkgMwfDfwt5GOeNRpQU,19669
|
349
351
|
zenml/integrations/kubernetes/step_operators/__init__.py,sha256=40utDPYAezxHsFgO0UUIT_6XpCDzDapje6OH951XsTs,806
|
350
|
-
zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py,sha256=
|
352
|
+
zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py,sha256=yNCBOwjF9zN-UeI2jTEz6zMmmtx0xiwTdq5Z1JH-Yhg,10506
|
351
353
|
zenml/integrations/label_studio/__init__.py,sha256=sF2c9FxTDRlbcu95OxaUNKNtIhC1LgfmBRKY4jBME38,1475
|
352
354
|
zenml/integrations/label_studio/annotators/__init__.py,sha256=YtOtSfS1_NBoLoXIygEerElBP1-B98UU0HOAEfzdRY0,821
|
353
355
|
zenml/integrations/label_studio/annotators/label_studio_annotator.py,sha256=VkuW4zsZhHz8__P9WTTLRTF-FOmoYB-_cFqBdu-PUyA,30498
|
@@ -578,7 +580,7 @@ zenml/io/filesystem_registry.py,sha256=stujDg4a5k983WMwp3rj4Z4puiUco4REyVoIoMIpI
|
|
578
580
|
zenml/io/local_filesystem.py,sha256=xQTZPT5cpooptUV8KiifxZojS6pWCv1-6UUxitUYb_E,7386
|
579
581
|
zenml/logger.py,sha256=STfebaOdCGmw404gwKhwpDrrhtKDUREeerO7UtapzfE,6997
|
580
582
|
zenml/logging/__init__.py,sha256=knhroJ2h0uHBCGzAiBBGJEiuhEA3cwI6XYBRIyXdbkQ,613
|
581
|
-
zenml/logging/step_logging.py,sha256=
|
583
|
+
zenml/logging/step_logging.py,sha256=dv_lo4rNdBCHsCaYOBoVwKAorY0Rmxh_6AhcGy_Y78g,27922
|
582
584
|
zenml/login/__init__.py,sha256=Evi7hq8tpUn57IM3iX3hYP0r8oIeEWUhS471TAOyVGs,644
|
583
585
|
zenml/login/credentials.py,sha256=RtLmYkFQ5trbprhsO8NCRKwBA136KzGoUWY52dZP9GA,12722
|
584
586
|
zenml/login/credentials_store.py,sha256=k55mNSqc_RaBuvLWtg5ubQAwlSbaTxTVAqoZ1OQ2YcM,24750
|
@@ -754,11 +756,11 @@ zenml/step_operators/__init__.py,sha256=tqj7fgnQyZubLjwUu4ITwkA-70KMQz4g37agbfF7
|
|
754
756
|
zenml/step_operators/base_step_operator.py,sha256=ZRnY6lcEHY8xZskrKKdPhgKg2BlEoh2_kb8xCaM2D1g,3522
|
755
757
|
zenml/step_operators/step_operator_entrypoint_configuration.py,sha256=wuQKmEI_ckn1CHHrxWGGdIhQyBFXG01aKC2-2b6Atjo,3690
|
756
758
|
zenml/steps/__init__.py,sha256=KKWFOmCZGLDEikOD2E5YmDA7QHo47uPV37by21WwI0U,1453
|
757
|
-
zenml/steps/base_step.py,sha256=
|
759
|
+
zenml/steps/base_step.py,sha256=6mz8ZBn4wd509KcwZeD1qdxQV4BF3wLknMMzn_g3wgg,44390
|
758
760
|
zenml/steps/decorated_step.py,sha256=C8Ng5PCLc9eql4JF1N345HQ6LyC1qCUdTnysUTeoAJs,1315
|
759
761
|
zenml/steps/entrypoint_function_utils.py,sha256=H0WIkHpR_R0S9gl_tWr0nX-fcBlYnm8OQ1cimvrw-qo,9555
|
760
762
|
zenml/steps/step_context.py,sha256=sFvVVvEyKmWTrucofor8Cuxv-72jbziVaQY-OlOvFAM,15526
|
761
|
-
zenml/steps/step_decorator.py,sha256=
|
763
|
+
zenml/steps/step_decorator.py,sha256=0TKxP_oAVRizjN3JhBZ8ShFd3fSBdVPU2ijytTg1h2U,6506
|
762
764
|
zenml/steps/step_invocation.py,sha256=ETfOaV-P4_iXGk9y1-xK54Kfg2QRYaGoj_jTyEYZfb0,4861
|
763
765
|
zenml/steps/utils.py,sha256=UpZ5lN46Bqu1eXyVfh969M4-UBbOZjq5R7u4PkXYDZ8,18586
|
764
766
|
zenml/types.py,sha256=LhGWJ4t3nybBk1l9Ox3tqqHbTYSuCqhkRsL5FqO6yf4,1206
|
@@ -1189,6 +1191,7 @@ zenml/zen_stores/migrations/versions/0.83.0_release.py,sha256=Y3Pe9I_LJvUgTtehyD
|
|
1189
1191
|
zenml/zen_stores/migrations/versions/0.83.1_release.py,sha256=p35ZcMR4k5zsPU6sya0fHLDDjKF-mgwNvpMcxbI7cQo,462
|
1190
1192
|
zenml/zen_stores/migrations/versions/0.84.0_release.py,sha256=Lpg4Xqm-CfchmY3sFyMDrC-J1pAoaSz3gGlPSP4eXJQ,462
|
1191
1193
|
zenml/zen_stores/migrations/versions/0.84.1_release.py,sha256=95TBBvlSduocvY5Hy6yT1QjK8Ml2l5JVcTYVNy33om4,462
|
1194
|
+
zenml/zen_stores/migrations/versions/0.84.2_release.py,sha256=igIzI5EJzwiUurUzgrGAI8jLZd48KL2TWZ3nC-yT388,450
|
1192
1195
|
zenml/zen_stores/migrations/versions/026d4577b6a0_add_code_path.py,sha256=hXLzvQcylNrbCVD6vha52PFkSPNC2klW9kA0vuQX_cE,1091
|
1193
1196
|
zenml/zen_stores/migrations/versions/03742aa7fdd7_add_secrets.py,sha256=gewKqu1AnzvNTjVvK1eaAwP0hVneWDUyDRSLTvRCdpg,1587
|
1194
1197
|
zenml/zen_stores/migrations/versions/0392807467dc_add_build_duration.py,sha256=YlkDBlfBBv45FsrMO11YcdRn4Maqmlg77t8gWJO4DfA,982
|
@@ -1352,8 +1355,8 @@ zenml/zen_stores/secrets_stores/sql_secrets_store.py,sha256=LPFW757WCJLP1S8vrvjs
|
|
1352
1355
|
zenml/zen_stores/sql_zen_store.py,sha256=-3zeByIUjIvsx3564O2gJ463512QkZl04okL3eB-nJs,491568
|
1353
1356
|
zenml/zen_stores/template_utils.py,sha256=iCXrXpqzVTY7roqop4Eh9J7DmLW6PQeILZexmw_l3b8,10074
|
1354
1357
|
zenml/zen_stores/zen_store_interface.py,sha256=weiSULdI9AsbCE10a5TcwtybX-BJs9hKhjPJnTapWv4,93023
|
1355
|
-
zenml_nightly-0.84.
|
1356
|
-
zenml_nightly-0.84.
|
1357
|
-
zenml_nightly-0.84.
|
1358
|
-
zenml_nightly-0.84.
|
1359
|
-
zenml_nightly-0.84.
|
1358
|
+
zenml_nightly-0.84.2.dev20250807.dist-info/LICENSE,sha256=wbnfEnXnafPbqwANHkV6LUsPKOtdpsd-SNw37rogLtc,11359
|
1359
|
+
zenml_nightly-0.84.2.dev20250807.dist-info/METADATA,sha256=g0HviK0kuLK_THciwuXaQMPDkm8S3qL0hX0GOzmgAvE,24303
|
1360
|
+
zenml_nightly-0.84.2.dev20250807.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
1361
|
+
zenml_nightly-0.84.2.dev20250807.dist-info/entry_points.txt,sha256=QK3ETQE0YswAM2mWypNMOv8TLtr7EjnqAFq1br_jEFE,43
|
1362
|
+
zenml_nightly-0.84.2.dev20250807.dist-info/RECORD,,
|
{zenml_nightly-0.84.1.dev20250805.dist-info → zenml_nightly-0.84.2.dev20250807.dist-info}/LICENSE
RENAMED
File without changes
|
{zenml_nightly-0.84.1.dev20250805.dist-info → zenml_nightly-0.84.2.dev20250807.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|