polyaxon 2.1.0rc9__py3-none-any.whl → 2.6.0__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.
- polyaxon/_auxiliaries/default_scheduling.py +17 -7
- polyaxon/_auxiliaries/init.py +14 -6
- polyaxon/_auxiliaries/sidecar.py +10 -8
- polyaxon/_cli/artifacts.py +96 -11
- polyaxon/_cli/components.py +96 -11
- polyaxon/_cli/config.py +31 -0
- polyaxon/_cli/dashboard.py +12 -2
- polyaxon/_cli/init.py +1 -1
- polyaxon/_cli/models.py +96 -11
- polyaxon/_cli/operations.py +133 -58
- polyaxon/_cli/project_versions.py +139 -6
- polyaxon/_cli/projects.py +23 -9
- polyaxon/_cli/run.py +43 -9
- polyaxon/_cli/services/agent.py +2 -2
- polyaxon/_cli/version.py +4 -1
- polyaxon/_client/mixin.py +39 -0
- polyaxon/_client/project.py +218 -23
- polyaxon/_client/run.py +84 -27
- polyaxon/_compiler/contexts/contexts.py +4 -0
- polyaxon/_compiler/contexts/ray_job.py +4 -2
- polyaxon/_compiler/resolver/agent.py +22 -10
- polyaxon/_compiler/resolver/runtime.py +7 -3
- polyaxon/_constants/metadata.py +1 -0
- polyaxon/_contexts/keys.py +1 -0
- polyaxon/_contexts/paths.py +1 -1
- polyaxon/_deploy/operators/compose.py +1 -27
- polyaxon/_deploy/schemas/auth.py +3 -3
- polyaxon/_deploy/schemas/celery.py +10 -8
- polyaxon/_deploy/schemas/deployment.py +148 -115
- polyaxon/_deploy/schemas/email.py +8 -8
- polyaxon/_deploy/schemas/ingress.py +7 -7
- polyaxon/_deploy/schemas/intervals.py +2 -7
- polyaxon/_deploy/schemas/operators.py +8 -8
- polyaxon/_deploy/schemas/proxy.py +9 -8
- polyaxon/_deploy/schemas/rbac.py +1 -1
- polyaxon/_deploy/schemas/root_user.py +5 -5
- polyaxon/_deploy/schemas/security_context.py +25 -15
- polyaxon/_deploy/schemas/service.py +75 -66
- polyaxon/_deploy/schemas/ssl.py +3 -3
- polyaxon/_deploy/schemas/ui.py +10 -6
- polyaxon/_docker/builder/builder.py +4 -1
- polyaxon/_docker/converter/base/containers.py +4 -7
- polyaxon/_docker/converter/base/env_vars.py +5 -5
- polyaxon/_docker/converter/base/mounts.py +2 -2
- polyaxon/_docker/docker_types.py +57 -30
- polyaxon/_env_vars/getters/owner_entity.py +4 -2
- polyaxon/_env_vars/getters/project.py +4 -2
- polyaxon/_env_vars/getters/run.py +5 -2
- polyaxon/_env_vars/keys.py +3 -0
- polyaxon/_flow/__init__.py +3 -2
- polyaxon/_flow/builds/__init__.py +8 -8
- polyaxon/_flow/cache/__init__.py +4 -4
- polyaxon/_flow/component/base.py +25 -18
- polyaxon/_flow/component/component.py +4 -3
- polyaxon/_flow/early_stopping/__init__.py +1 -1
- polyaxon/_flow/early_stopping/policies.py +12 -10
- polyaxon/_flow/environment/__init__.py +43 -25
- polyaxon/_flow/events/__init__.py +1 -1
- polyaxon/_flow/hooks/__init__.py +11 -11
- polyaxon/_flow/init/__init__.py +41 -25
- polyaxon/_flow/io/io.py +57 -47
- polyaxon/_flow/joins/__init__.py +5 -5
- polyaxon/_flow/matrix/bayes.py +23 -17
- polyaxon/_flow/matrix/grid_search.py +16 -7
- polyaxon/_flow/matrix/hyperband.py +10 -10
- polyaxon/_flow/matrix/hyperopt.py +14 -9
- polyaxon/_flow/matrix/iterative.py +14 -8
- polyaxon/_flow/matrix/mapping.py +4 -4
- polyaxon/_flow/matrix/params.py +138 -77
- polyaxon/_flow/matrix/random_search.py +10 -5
- polyaxon/_flow/matrix/tuner.py +4 -4
- polyaxon/_flow/mounts/artifacts_mounts.py +1 -1
- polyaxon/_flow/notifications/__init__.py +1 -1
- polyaxon/_flow/operations/base.py +10 -8
- polyaxon/_flow/operations/compiled_operation.py +5 -4
- polyaxon/_flow/operations/operation.py +57 -41
- polyaxon/_flow/optimization/__init__.py +2 -2
- polyaxon/_flow/params/params.py +10 -9
- polyaxon/_flow/plugins/__init__.py +19 -13
- polyaxon/_flow/run/dag.py +12 -9
- polyaxon/_flow/run/dask/dask.py +4 -4
- polyaxon/_flow/run/dask/replica.py +17 -11
- polyaxon/_flow/run/job.py +17 -11
- polyaxon/_flow/run/kubeflow/mpi_job.py +10 -5
- polyaxon/_flow/run/kubeflow/mx_job.py +25 -9
- polyaxon/_flow/run/kubeflow/paddle_job.py +16 -9
- polyaxon/_flow/run/kubeflow/pytorch_job.py +24 -17
- polyaxon/_flow/run/kubeflow/replica.py +17 -11
- polyaxon/_flow/run/kubeflow/scheduling_policy.py +7 -5
- polyaxon/_flow/run/kubeflow/tf_job.py +15 -8
- polyaxon/_flow/run/kubeflow/xgboost_job.py +9 -4
- polyaxon/_flow/run/ray/ray.py +9 -6
- polyaxon/_flow/run/ray/replica.py +25 -16
- polyaxon/_flow/run/resources.py +14 -13
- polyaxon/_flow/run/service.py +4 -4
- polyaxon/_flow/schedules/cron.py +4 -4
- polyaxon/_flow/schedules/interval.py +4 -4
- polyaxon/_flow/templates/__init__.py +3 -3
- polyaxon/_flow/termination/__init__.py +3 -3
- polyaxon/_fs/async_manager.py +1 -1
- polyaxon/_fs/fs.py +1 -1
- polyaxon/_fs/watcher.py +26 -27
- polyaxon/_k8s/converter/base/base.py +2 -1
- polyaxon/_k8s/converter/base/main.py +1 -0
- polyaxon/_k8s/converter/common/accelerators.py +7 -4
- polyaxon/_k8s/converter/converters/ray_job.py +4 -2
- polyaxon/_k8s/custom_resources/dask_job.py +3 -0
- polyaxon/_k8s/custom_resources/kubeflow/common.py +4 -1
- polyaxon/_k8s/custom_resources/ray_job.py +3 -0
- polyaxon/_k8s/custom_resources/setter.py +1 -1
- polyaxon/_k8s/executor/async_executor.py +2 -0
- polyaxon/_k8s/k8s_validation.py +1 -1
- polyaxon/_k8s/logging/async_monitor.py +82 -11
- polyaxon/_k8s/manager/async_manager.py +15 -0
- polyaxon/_k8s/manager/manager.py +16 -1
- polyaxon/_local_process/__init__.py +0 -0
- polyaxon/_local_process/agent.py +6 -0
- polyaxon/_local_process/converter/__init__.py +1 -0
- polyaxon/_local_process/converter/base/__init__.py +1 -0
- polyaxon/_local_process/converter/base/base.py +140 -0
- polyaxon/_local_process/converter/base/containers.py +66 -0
- polyaxon/_local_process/converter/base/env_vars.py +253 -0
- polyaxon/_local_process/converter/base/init.py +414 -0
- polyaxon/_local_process/converter/base/main.py +74 -0
- polyaxon/_local_process/converter/base/mounts.py +82 -0
- polyaxon/_local_process/converter/converters/__init__.py +8 -0
- polyaxon/_local_process/converter/converters/job.py +40 -0
- polyaxon/_local_process/converter/converters/service.py +41 -0
- polyaxon/_local_process/converter/mixins.py +38 -0
- polyaxon/_local_process/executor.py +132 -0
- polyaxon/_local_process/process_types.py +42 -0
- polyaxon/_polyaxonfile/specs/compiled_operation.py +1 -1
- polyaxon/_polyaxonfile/specs/libs/parser.py +1 -1
- polyaxon/_polyaxonfile/specs/libs/validator.py +1 -1
- polyaxon/_polyaxonfile/specs/operation.py +1 -1
- polyaxon/_polyaxonfile/specs/sections.py +8 -0
- polyaxon/_pql/manager.py +1 -1
- polyaxon/_runner/agent/async_agent.py +25 -11
- polyaxon/_runner/agent/base_agent.py +19 -10
- polyaxon/_runner/agent/sync_agent.py +24 -10
- polyaxon/_runner/converter/converter.py +12 -4
- polyaxon/_runner/executor.py +1 -1
- polyaxon/_schemas/agent.py +69 -37
- polyaxon/_schemas/authentication.py +4 -4
- polyaxon/_schemas/base.py +26 -2
- polyaxon/_schemas/checks.py +3 -3
- polyaxon/_schemas/cli.py +4 -6
- polyaxon/_schemas/client.py +20 -18
- polyaxon/_schemas/compatibility.py +4 -4
- polyaxon/_schemas/container_resources.py +1 -1
- polyaxon/_schemas/home.py +3 -3
- polyaxon/_schemas/installation.py +13 -9
- polyaxon/_schemas/lifecycle.py +23 -23
- polyaxon/_schemas/log_handler.py +2 -2
- polyaxon/_schemas/services.py +26 -14
- polyaxon/_schemas/types/artifacts.py +3 -3
- polyaxon/_schemas/types/dockerfile.py +14 -12
- polyaxon/_schemas/types/event.py +2 -2
- polyaxon/_schemas/types/file.py +3 -3
- polyaxon/_schemas/types/git.py +12 -4
- polyaxon/_schemas/types/tensorboard.py +14 -8
- polyaxon/_schemas/user.py +3 -3
- polyaxon/_schemas/version.py +2 -2
- polyaxon/_sdk/api/agents_v1_api.py +222 -43
- polyaxon/_sdk/api/artifacts_stores_v1_api.py +3 -3
- polyaxon/_sdk/api/auth_v1_api.py +13 -13
- polyaxon/_sdk/api/connections_v1_api.py +15 -15
- polyaxon/_sdk/api/dashboards_v1_api.py +15 -15
- polyaxon/_sdk/api/organizations_v1_api.py +85 -85
- polyaxon/_sdk/api/presets_v1_api.py +15 -15
- polyaxon/_sdk/api/project_dashboards_v1_api.py +29 -29
- polyaxon/_sdk/api/project_searches_v1_api.py +29 -29
- polyaxon/_sdk/api/projects_v1_api.py +284 -107
- polyaxon/_sdk/api/queues_v1_api.py +19 -19
- polyaxon/_sdk/api/runs_v1_api.py +313 -359
- polyaxon/_sdk/api/searches_v1_api.py +15 -15
- polyaxon/_sdk/api/service_accounts_v1_api.py +31 -31
- polyaxon/_sdk/api/tags_v1_api.py +17 -17
- polyaxon/_sdk/api/teams_v1_api.py +2854 -402
- polyaxon/_sdk/api/users_v1_api.py +254 -78
- polyaxon/_sdk/api/versions_v1_api.py +7 -7
- polyaxon/_sdk/async_client/api_client.py +4 -0
- polyaxon/_sdk/schemas/__init__.py +1 -1
- polyaxon/_sdk/schemas/v1_activity.py +8 -8
- polyaxon/_sdk/schemas/v1_agent.py +18 -16
- polyaxon/_sdk/schemas/v1_agent_state_response.py +4 -4
- polyaxon/_sdk/schemas/v1_agent_state_response_agent_state.py +10 -10
- polyaxon/_sdk/schemas/v1_agent_status_body_request.py +3 -3
- polyaxon/_sdk/schemas/v1_analytics_spec.py +4 -4
- polyaxon/_sdk/schemas/v1_artifact_tree.py +3 -3
- polyaxon/_sdk/schemas/v1_auth.py +1 -1
- polyaxon/_sdk/schemas/v1_cloning.py +3 -3
- polyaxon/_sdk/schemas/v1_connection_response.py +9 -9
- polyaxon/_sdk/schemas/v1_dashboard.py +9 -9
- polyaxon/_sdk/schemas/v1_dashboard_spec.py +5 -1
- polyaxon/_sdk/schemas/v1_entities_tags.py +2 -2
- polyaxon/_sdk/schemas/v1_entities_transfer.py +2 -2
- polyaxon/_sdk/schemas/v1_entity_notification_body.py +7 -7
- polyaxon/_sdk/schemas/v1_entity_stage_body_request.py +5 -5
- polyaxon/_sdk/schemas/v1_entity_status_body_request.py +5 -5
- polyaxon/_sdk/schemas/v1_events_response.py +2 -2
- polyaxon/_sdk/schemas/v1_list_activities_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_agents_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_bookmarks_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_connections_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_dashboards_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_organization_members_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_organizations_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_presets_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_project_versions_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_projects_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_queues_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_run_artifacts_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_run_connections_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_run_edges_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_runs_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_searches_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_service_accounts_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_tags_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_team_members_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_teams_response.py +4 -4
- polyaxon/_sdk/schemas/v1_list_token_response.py +4 -4
- polyaxon/_sdk/schemas/v1_operation_body.py +8 -8
- polyaxon/_sdk/schemas/v1_organization.py +16 -16
- polyaxon/_sdk/schemas/v1_organization_member.py +6 -6
- polyaxon/_sdk/schemas/v1_password_change.py +3 -3
- polyaxon/_sdk/schemas/v1_pipeline.py +3 -3
- polyaxon/_sdk/schemas/v1_preset.py +16 -9
- polyaxon/_sdk/schemas/v1_project.py +17 -17
- polyaxon/_sdk/schemas/v1_project_settings.py +12 -10
- polyaxon/_sdk/schemas/v1_project_version.py +20 -20
- polyaxon/_sdk/schemas/v1_queue.py +12 -12
- polyaxon/_sdk/schemas/v1_run.py +38 -38
- polyaxon/_sdk/schemas/v1_run_connection.py +3 -3
- polyaxon/_sdk/schemas/v1_run_edge.py +5 -5
- polyaxon/_sdk/schemas/v1_run_edge_lineage.py +3 -3
- polyaxon/_sdk/schemas/v1_run_edges_graph.py +1 -1
- polyaxon/_sdk/schemas/v1_run_reference_catalog.py +4 -4
- polyaxon/_sdk/schemas/v1_run_settings.py +9 -9
- polyaxon/_sdk/schemas/v1_search.py +10 -10
- polyaxon/_sdk/schemas/v1_search_spec.py +14 -14
- polyaxon/_sdk/schemas/v1_section_spec.py +12 -7
- polyaxon/_sdk/schemas/v1_service_account.py +9 -9
- polyaxon/_sdk/schemas/v1_settings_catalog.py +4 -3
- polyaxon/_sdk/schemas/v1_tag.py +6 -6
- polyaxon/_sdk/schemas/v1_team.py +11 -8
- polyaxon/_sdk/schemas/v1_team_member.py +6 -6
- polyaxon/_sdk/schemas/v1_team_settings.py +2 -2
- polyaxon/_sdk/schemas/v1_token.py +10 -10
- polyaxon/_sdk/schemas/v1_trial_start.py +6 -6
- polyaxon/_sdk/schemas/v1_user.py +6 -7
- polyaxon/_sdk/schemas/v1_user_access.py +17 -0
- polyaxon/_sdk/schemas/v1_user_email.py +1 -1
- polyaxon/_sdk/schemas/v1_user_singup.py +5 -5
- polyaxon/_sdk/schemas/v1_uuids.py +1 -1
- polyaxon/_sidecar/container/__init__.py +39 -20
- polyaxon/_sidecar/container/monitors/logs.py +10 -13
- polyaxon/_sidecar/ignore.py +0 -1
- polyaxon/_utils/cli_constants.py +2 -0
- polyaxon/_utils/fqn_utils.py +25 -2
- polyaxon/_utils/test_utils.py +2 -1
- polyaxon/pkg.py +1 -1
- polyaxon/schemas.py +1 -1
- {polyaxon-2.1.0rc9.dist-info → polyaxon-2.6.0.dist-info}/METADATA +43 -43
- {polyaxon-2.1.0rc9.dist-info → polyaxon-2.6.0.dist-info}/RECORD +269 -252
- {polyaxon-2.1.0rc9.dist-info → polyaxon-2.6.0.dist-info}/WHEEL +1 -1
- polyaxon/_sdk/schemas/v1_project_user_access.py +0 -10
- {polyaxon-2.1.0rc9.dist-info → polyaxon-2.6.0.dist-info}/LICENSE +0 -0
- {polyaxon-2.1.0rc9.dist-info → polyaxon-2.6.0.dist-info}/entry_points.txt +0 -0
- {polyaxon-2.1.0rc9.dist-info → polyaxon-2.6.0.dist-info}/top_level.txt +0 -0
@@ -2,7 +2,14 @@ from copy import copy
|
|
2
2
|
from typing import Dict, Optional
|
3
3
|
from typing_extensions import Literal
|
4
4
|
|
5
|
-
from clipped.compact.pydantic import
|
5
|
+
from clipped.compact.pydantic import (
|
6
|
+
Field,
|
7
|
+
StrictStr,
|
8
|
+
field_validator,
|
9
|
+
model_validator,
|
10
|
+
validation_after,
|
11
|
+
validation_before,
|
12
|
+
)
|
6
13
|
from clipped.config.patch_strategy import PatchStrategy
|
7
14
|
from clipped.config.schema import skip_partial, to_partial
|
8
15
|
|
@@ -508,40 +515,41 @@ class V1Operation(BaseOp, TemplateMixinConfig):
|
|
508
515
|
"run_patch",
|
509
516
|
"patch_strategy",
|
510
517
|
]
|
518
|
+
_CUSTOM_DUMP_FIELDS = {"component"}
|
511
519
|
|
512
520
|
kind: Literal[_IDENTIFIER] = _IDENTIFIER
|
513
|
-
params: Optional[Dict[StrictStr, V1Param]]
|
514
|
-
hub_ref: Optional[StrictStr] = Field(alias="hubRef")
|
515
|
-
dag_ref: Optional[StrictStr] = Field(alias="dagRef")
|
516
|
-
url_ref: Optional[StrictStr] = Field(alias="urlRef")
|
517
|
-
path_ref: Optional[StrictStr] = Field(alias="pathRef")
|
518
|
-
component: Optional[V1Component]
|
519
|
-
patch_strategy: Optional[PatchStrategy] = Field(alias="patchStrategy")
|
520
|
-
is_preset: Optional[bool] = Field(alias="isPreset")
|
521
|
-
run_patch: Optional[Dict] = Field(alias="runPatch")
|
522
|
-
template: Optional[V1Template]
|
523
|
-
|
524
|
-
@
|
521
|
+
params: Optional[Dict[StrictStr, V1Param]] = None
|
522
|
+
hub_ref: Optional[StrictStr] = Field(alias="hubRef", default=None)
|
523
|
+
dag_ref: Optional[StrictStr] = Field(alias="dagRef", default=None)
|
524
|
+
url_ref: Optional[StrictStr] = Field(alias="urlRef", default=None)
|
525
|
+
path_ref: Optional[StrictStr] = Field(alias="pathRef", default=None)
|
526
|
+
component: Optional[V1Component] = None
|
527
|
+
patch_strategy: Optional[PatchStrategy] = Field(alias="patchStrategy", default=None)
|
528
|
+
is_preset: Optional[bool] = Field(alias="isPreset", default=None)
|
529
|
+
run_patch: Optional[Dict] = Field(alias="runPatch", default=None)
|
530
|
+
template: Optional[V1Template] = None
|
531
|
+
|
532
|
+
@model_validator(**validation_after)
|
525
533
|
@skip_partial
|
526
534
|
def validate_reference(cls, values):
|
527
535
|
if not values:
|
528
536
|
return values
|
529
|
-
if
|
537
|
+
if cls.get_value_for_key("is_preset", values):
|
530
538
|
return values
|
531
539
|
count = 0
|
532
|
-
hub_ref =
|
540
|
+
hub_ref = cls.get_value_for_key("hub_ref", values)
|
533
541
|
if hub_ref:
|
534
542
|
count += 1
|
535
|
-
dag_ref =
|
543
|
+
dag_ref = cls.get_value_for_key("dag_ref", values)
|
536
544
|
if dag_ref:
|
537
545
|
count += 1
|
538
|
-
url_ref =
|
546
|
+
url_ref = cls.get_value_for_key("url_ref", values)
|
539
547
|
if url_ref:
|
540
548
|
count += 1
|
541
|
-
path_ref =
|
549
|
+
path_ref = cls.get_value_for_key("path_ref", values)
|
542
550
|
if path_ref:
|
543
551
|
count += 1
|
544
|
-
component =
|
552
|
+
component = cls.get_value_for_key("component", values)
|
545
553
|
if component and count == 0:
|
546
554
|
count += 1
|
547
555
|
|
@@ -552,11 +560,11 @@ class V1Operation(BaseOp, TemplateMixinConfig):
|
|
552
560
|
)
|
553
561
|
return values
|
554
562
|
|
555
|
-
@
|
563
|
+
@field_validator("run_patch")
|
556
564
|
@skip_partial
|
557
565
|
def validate_run_patch(cls, run_patch, values):
|
558
|
-
component =
|
559
|
-
if
|
566
|
+
component = cls.get_value_for_key("component", values)
|
567
|
+
if cls.get_value_for_key("is_preset", values):
|
560
568
|
return run_patch
|
561
569
|
if not component or not run_patch:
|
562
570
|
return run_patch
|
@@ -662,14 +670,16 @@ class V1Operation(BaseOp, TemplateMixinConfig):
|
|
662
670
|
for k, v in contexts.items():
|
663
671
|
params[k] = V1Param(value=v, context_only=True)
|
664
672
|
|
665
|
-
|
666
|
-
|
667
|
-
hub_ref=hook.hub_ref
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
+
content = {"run_patch": run_patch, "params": params}
|
674
|
+
if hook.hub_ref:
|
675
|
+
content["hub_ref"] = hook.hub_ref
|
676
|
+
if hook.presets:
|
677
|
+
content["presets"] = hook.presets
|
678
|
+
if hook.queue:
|
679
|
+
content["queue"] = hook.queue
|
680
|
+
if hook.namespace:
|
681
|
+
content["namespace"] = hook.namespace
|
682
|
+
return cls.construct(**content)
|
673
683
|
|
674
684
|
@classmethod
|
675
685
|
def from_build(cls, build: V1Build, contexts: Optional[Dict] = None):
|
@@ -685,17 +695,23 @@ class V1Operation(BaseOp, TemplateMixinConfig):
|
|
685
695
|
if not destination.connection or build.connection:
|
686
696
|
destination.connection = build.connection
|
687
697
|
params["destination"] = destination
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
698
|
+
content = {
|
699
|
+
"run_patch": build.run_patch,
|
700
|
+
"patch_strategy": build.patch_strategy,
|
701
|
+
"params": params,
|
702
|
+
}
|
703
|
+
if build.hub_ref:
|
704
|
+
content["hub_ref"] = build.hub_ref
|
705
|
+
if build.presets:
|
706
|
+
content["presets"] = build.presets
|
707
|
+
if build.queue:
|
708
|
+
content["queue"] = build.queue
|
709
|
+
if build.namespace:
|
710
|
+
content["namespace"] = build.namespace
|
711
|
+
if build.cache:
|
712
|
+
content["cache"] = build.cache
|
713
|
+
|
714
|
+
return cls.construct(**content)
|
699
715
|
|
700
716
|
|
701
717
|
PartialV1Operation = to_partial(V1Operation)
|
@@ -10,7 +10,7 @@ class V1OptimizationMetric(BaseSchemaModel):
|
|
10
10
|
_IDENTIFIER = "optimization_metric"
|
11
11
|
|
12
12
|
name: StrictStr
|
13
|
-
optimization: Optional[V1Optimization]
|
13
|
+
optimization: Optional[V1Optimization] = None
|
14
14
|
|
15
15
|
def get_for_sort(self):
|
16
16
|
if self.optimization == V1Optimization.MINIMIZE:
|
@@ -22,7 +22,7 @@ class V1OptimizationResource(BaseSchemaModel):
|
|
22
22
|
_IDENTIFIER = "optimization_resource"
|
23
23
|
|
24
24
|
name: StrictStr
|
25
|
-
type: Optional[V1ResourceType]
|
25
|
+
type: Optional[V1ResourceType] = None
|
26
26
|
|
27
27
|
def cast_value(self, value):
|
28
28
|
if V1ResourceType.is_int(self.type):
|
polyaxon/_flow/params/params.py
CHANGED
@@ -2,7 +2,7 @@ from collections import namedtuple
|
|
2
2
|
from collections.abc import Mapping
|
3
3
|
from typing import Any, Dict, Optional
|
4
4
|
|
5
|
-
from clipped.compact.pydantic import Field, StrictStr,
|
5
|
+
from clipped.compact.pydantic import Field, StrictStr, field_validator
|
6
6
|
from clipped.config.schema import skip_partial
|
7
7
|
from clipped.utils.lists import to_list
|
8
8
|
from clipped.utils.strings import to_string
|
@@ -18,7 +18,7 @@ from polyaxon.exceptions import PolyaxonValidationError
|
|
18
18
|
|
19
19
|
def validate_param_value(value, ref):
|
20
20
|
if ref and not isinstance(value, str):
|
21
|
-
raise
|
21
|
+
raise ValueError(
|
22
22
|
"Value must be of type string when a ref is provided, received `{}` instead.".format(
|
23
23
|
value
|
24
24
|
)
|
@@ -387,16 +387,17 @@ class V1Param(BaseSchemaModel, ctx_refs.RefMixin, ParamValueMixin):
|
|
387
387
|
_IDENTIFIER = "param"
|
388
388
|
|
389
389
|
value: Any
|
390
|
-
ref: Optional[StrictStr]
|
391
|
-
context_only: Optional[bool] = Field(alias="contextOnly")
|
392
|
-
connection: Optional[StrictStr]
|
393
|
-
to_init: Optional[bool] = Field(alias="toInit")
|
394
|
-
to_env: Optional[StrictStr] = Field(alias="toEnv")
|
390
|
+
ref: Optional[StrictStr] = None
|
391
|
+
context_only: Optional[bool] = Field(alias="contextOnly", default=False)
|
392
|
+
connection: Optional[StrictStr] = None
|
393
|
+
to_init: Optional[bool] = Field(alias="toInit", default=None)
|
394
|
+
to_env: Optional[StrictStr] = Field(alias="toEnv", default=None)
|
395
395
|
|
396
|
-
@
|
396
|
+
@field_validator("ref")
|
397
397
|
@skip_partial
|
398
398
|
def check_ref(cls, ref, values):
|
399
|
-
|
399
|
+
values = cls.get_data_from_values(values)
|
400
|
+
validate_param_value(value=cls.get_value_for_key("value", values), ref=ref)
|
400
401
|
return ref
|
401
402
|
|
402
403
|
|
@@ -259,19 +259,25 @@ class V1Plugins(BaseSchemaModel):
|
|
259
259
|
|
260
260
|
_IDENTIFIER = "plugins"
|
261
261
|
|
262
|
-
auth: Optional[BoolOrRef]
|
263
|
-
docker: Optional[BoolOrRef]
|
264
|
-
shm: Optional[BoolOrRef]
|
265
|
-
mount_artifacts_store: Optional[BoolOrRef] = Field(
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
262
|
+
auth: Optional[BoolOrRef] = None
|
263
|
+
docker: Optional[BoolOrRef] = None
|
264
|
+
shm: Optional[BoolOrRef] = None
|
265
|
+
mount_artifacts_store: Optional[BoolOrRef] = Field(
|
266
|
+
alias="mountArtifactsStore", default=None
|
267
|
+
)
|
268
|
+
collect_artifacts: Optional[BoolOrRef] = Field(
|
269
|
+
alias="collectArtifacts", default=None
|
270
|
+
)
|
271
|
+
collect_logs: Optional[BoolOrRef] = Field(alias="collectLogs", default=None)
|
272
|
+
collect_resources: Optional[BoolOrRef] = Field(
|
273
|
+
alias="collectResources", default=None
|
274
|
+
)
|
275
|
+
sync_statuses: Optional[BoolOrRef] = Field(alias="syncStatuses", default=None)
|
276
|
+
auto_resume: Optional[BoolOrRef] = Field(alias="autoResume", default=None)
|
277
|
+
log_level: Optional[StrictStr] = Field(alias="logLevel", default=None)
|
278
|
+
external_host: Optional[BoolOrRef] = Field(alias="externalHost", default=None)
|
279
|
+
sidecar: Optional[Union[V1PolyaxonSidecarContainer, RefField]] = None
|
280
|
+
notifications: Optional[Union[List[V1Notification], RefField]] = None
|
275
281
|
|
276
282
|
@classmethod
|
277
283
|
def get_or_create(
|
polyaxon/_flow/run/dag.py
CHANGED
@@ -7,7 +7,9 @@ from clipped.compact.pydantic import (
|
|
7
7
|
PositiveInt,
|
8
8
|
PrivateAttr,
|
9
9
|
StrictStr,
|
10
|
-
|
10
|
+
field_validator,
|
11
|
+
validation_always,
|
12
|
+
validation_before,
|
11
13
|
)
|
12
14
|
from clipped.types.ref_or_obj import RefField
|
13
15
|
|
@@ -300,16 +302,17 @@ class V1Dag(BaseRun):
|
|
300
302
|
|
301
303
|
_IDENTIFIER = V1RunKind.DAG
|
302
304
|
_SWAGGER_FIELDS = ["volumes"]
|
305
|
+
_CUSTOM_DUMP_FIELDS = {"operations", "components", "environment"}
|
303
306
|
|
304
307
|
kind: Literal[_IDENTIFIER] = _IDENTIFIER
|
305
|
-
operations: Optional[Union[List[V1Operation], RefField]]
|
306
|
-
components: Optional[Union[List[V1Component], RefField]]
|
307
|
-
environment: Optional[Union[V1Environment, RefField]]
|
308
|
-
connections: Optional[Union[List[StrictStr], RefField]]
|
309
|
-
volumes: Optional[Union[List[k8s_schemas.V1Volume], RefField]]
|
310
|
-
concurrency: Optional[Union[PositiveInt, RefField]]
|
308
|
+
operations: Optional[Union[List[V1Operation], RefField]] = None
|
309
|
+
components: Optional[Union[List[V1Component], RefField]] = None
|
310
|
+
environment: Optional[Union[V1Environment, RefField]] = None
|
311
|
+
connections: Optional[Union[List[StrictStr], RefField]] = None
|
312
|
+
volumes: Optional[Union[List[k8s_schemas.V1Volume], RefField]] = None
|
313
|
+
concurrency: Optional[Union[PositiveInt, RefField]] = None
|
311
314
|
early_stopping: Optional[Union[List[V1EarlyStopping], RefField]] = Field(
|
312
|
-
alias="earlyStopping"
|
315
|
+
alias="earlyStopping", default=None
|
313
316
|
)
|
314
317
|
|
315
318
|
_dag: Dict[str, "DagOpSpec"] = PrivateAttr()
|
@@ -317,7 +320,7 @@ class V1Dag(BaseRun):
|
|
317
320
|
_op_component_mapping: Dict[str, str] = PrivateAttr()
|
318
321
|
_context: Dict[str, Any] = PrivateAttr()
|
319
322
|
|
320
|
-
@
|
323
|
+
@field_validator("volumes", **validation_always, **validation_before)
|
321
324
|
def validate_volumes(cls, v):
|
322
325
|
if not v:
|
323
326
|
return v
|
polyaxon/_flow/run/dask/dask.py
CHANGED
@@ -124,12 +124,12 @@ class V1DaskJob(BaseRun, DestinationImageMixin):
|
|
124
124
|
"""
|
125
125
|
|
126
126
|
_IDENTIFIER = V1RunKind.DASKJOB
|
127
|
-
|
127
|
+
_CUSTOM_DUMP_FIELDS = {"job", "worker", "scheduler"}
|
128
128
|
|
129
129
|
kind: Literal[_IDENTIFIER] = _IDENTIFIER
|
130
|
-
job: Optional[Union[V1DaskReplica, RefField]]
|
131
|
-
worker: Optional[Union[V1DaskReplica, RefField]]
|
132
|
-
scheduler: Optional[Union[V1DaskReplica, RefField]]
|
130
|
+
job: Optional[Union[V1DaskReplica, RefField]] = None
|
131
|
+
worker: Optional[Union[V1DaskReplica, RefField]] = None
|
132
|
+
scheduler: Optional[Union[V1DaskReplica, RefField]] = None
|
133
133
|
|
134
134
|
def apply_image_destination(self, image: str):
|
135
135
|
if self.job:
|
@@ -1,6 +1,11 @@
|
|
1
1
|
from typing import List, Optional, Union
|
2
2
|
|
3
|
-
from clipped.compact.pydantic import
|
3
|
+
from clipped.compact.pydantic import (
|
4
|
+
StrictStr,
|
5
|
+
field_validator,
|
6
|
+
validation_always,
|
7
|
+
validation_before,
|
8
|
+
)
|
4
9
|
from clipped.types.ref_or_obj import IntOrRef, RefField
|
5
10
|
|
6
11
|
from polyaxon._flow.environment import V1Environment
|
@@ -174,28 +179,29 @@ class V1DaskReplica(BaseSchemaModel):
|
|
174
179
|
|
175
180
|
_IDENTIFIER = "replica"
|
176
181
|
_SWAGGER_FIELDS = ["volumes", "sidecars", "container"]
|
182
|
+
_CUSTOM_DUMP_FIELDS = {"environment"}
|
177
183
|
|
178
|
-
replicas: Optional[IntOrRef]
|
179
|
-
environment: Optional[Union[V1Environment, RefField]]
|
180
|
-
connections: Optional[Union[List[StrictStr], RefField]]
|
181
|
-
volumes: Optional[Union[List[k8s_schemas.V1Volume], RefField]]
|
182
|
-
init: Optional[Union[List[V1Init], RefField]]
|
183
|
-
sidecars: Optional[Union[List[k8s_schemas.V1Container], RefField]]
|
184
|
-
container: Optional[Union[k8s_schemas.V1Container, RefField]]
|
184
|
+
replicas: Optional[IntOrRef] = None
|
185
|
+
environment: Optional[Union[V1Environment, RefField]] = None
|
186
|
+
connections: Optional[Union[List[StrictStr], RefField]] = None
|
187
|
+
volumes: Optional[Union[List[k8s_schemas.V1Volume], RefField]] = None
|
188
|
+
init: Optional[Union[List[V1Init], RefField]] = None
|
189
|
+
sidecars: Optional[Union[List[k8s_schemas.V1Container], RefField]] = None
|
190
|
+
container: Optional[Union[k8s_schemas.V1Container, RefField]] = None
|
185
191
|
|
186
|
-
@
|
192
|
+
@field_validator("volumes", **validation_always, **validation_before)
|
187
193
|
def validate_volumes(cls, v):
|
188
194
|
if not v:
|
189
195
|
return v
|
190
196
|
return [k8s_validation.validate_k8s_volume(vi) for vi in v]
|
191
197
|
|
192
|
-
@
|
198
|
+
@field_validator("sidecars", **validation_always, **validation_before)
|
193
199
|
def validate_helper_containers(cls, v):
|
194
200
|
if not v:
|
195
201
|
return v
|
196
202
|
return [k8s_validation.validate_k8s_container(vi) for vi in v]
|
197
203
|
|
198
|
-
@
|
204
|
+
@field_validator("container", **validation_always, **validation_before)
|
199
205
|
def validate_container(cls, v):
|
200
206
|
return k8s_validation.validate_k8s_container(v)
|
201
207
|
|
polyaxon/_flow/run/job.py
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
from typing import List, Optional, Union
|
2
2
|
from typing_extensions import Literal
|
3
3
|
|
4
|
-
from clipped.compact.pydantic import
|
4
|
+
from clipped.compact.pydantic import (
|
5
|
+
StrictStr,
|
6
|
+
field_validator,
|
7
|
+
validation_always,
|
8
|
+
validation_before,
|
9
|
+
)
|
5
10
|
from clipped.types.ref_or_obj import RefField
|
6
11
|
|
7
12
|
from polyaxon._flow.environment import V1Environment
|
@@ -213,28 +218,29 @@ class V1Job(BaseRun, DestinationImageMixin):
|
|
213
218
|
|
214
219
|
_IDENTIFIER = V1RunKind.JOB
|
215
220
|
_SWAGGER_FIELDS = ["volumes", "sidecars", "container"]
|
221
|
+
_CUSTOM_DUMP_FIELDS = {"environment", "init"}
|
216
222
|
|
217
223
|
kind: Literal[_IDENTIFIER] = _IDENTIFIER
|
218
|
-
environment: Optional[Union[V1Environment, RefField]]
|
219
|
-
connections: Optional[Union[List[StrictStr], RefField]]
|
220
|
-
volumes: Optional[Union[List[k8s_schemas.V1Volume], RefField]]
|
221
|
-
init: Optional[Union[List[V1Init], RefField]]
|
222
|
-
sidecars: Optional[Union[List[k8s_schemas.V1Container], RefField]]
|
223
|
-
container: Optional[Union[k8s_schemas.V1Container, RefField]]
|
224
|
-
|
225
|
-
@
|
224
|
+
environment: Optional[Union[V1Environment, RefField]] = None
|
225
|
+
connections: Optional[Union[List[StrictStr], RefField]] = None
|
226
|
+
volumes: Optional[Union[List[k8s_schemas.V1Volume], RefField]] = None
|
227
|
+
init: Optional[Union[List[V1Init], RefField]] = None
|
228
|
+
sidecars: Optional[Union[List[k8s_schemas.V1Container], RefField]] = None
|
229
|
+
container: Optional[Union[k8s_schemas.V1Container, RefField]] = None
|
230
|
+
|
231
|
+
@field_validator("volumes", **validation_always, **validation_before)
|
226
232
|
def validate_volumes(cls, v):
|
227
233
|
if not v:
|
228
234
|
return v
|
229
235
|
return [k8s_validation.validate_k8s_volume(vi) for vi in v]
|
230
236
|
|
231
|
-
@
|
237
|
+
@field_validator("sidecars", **validation_always, **validation_before)
|
232
238
|
def validate_helper_containers(cls, v):
|
233
239
|
if not v:
|
234
240
|
return v
|
235
241
|
return [k8s_validation.validate_k8s_container(vi) for vi in v]
|
236
242
|
|
237
|
-
@
|
243
|
+
@field_validator("container", **validation_always, **validation_before)
|
238
244
|
def validate_container(cls, v):
|
239
245
|
return k8s_validation.validate_k8s_container(v)
|
240
246
|
|
@@ -133,13 +133,18 @@ class V1MPIJob(BaseRun, DestinationImageMixin):
|
|
133
133
|
"""
|
134
134
|
|
135
135
|
_IDENTIFIER = V1RunKind.MPIJOB
|
136
|
+
_CUSTOM_DUMP_FIELDS = {"launcher", "worker"}
|
136
137
|
|
137
138
|
kind: Literal[_IDENTIFIER] = _IDENTIFIER
|
138
|
-
clean_pod_policy: Optional[V1CleanPodPolicy] = Field(
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
139
|
+
clean_pod_policy: Optional[V1CleanPodPolicy] = Field(
|
140
|
+
alias="cleanPodPolicy", default=None
|
141
|
+
)
|
142
|
+
scheduling_policy: Optional[V1SchedulingPolicy] = Field(
|
143
|
+
alias="schedulingPolicy", default=None
|
144
|
+
)
|
145
|
+
slots_per_worker: Optional[IntOrRef] = Field(alias="slotsPerWorker", default=None)
|
146
|
+
launcher: Optional[Union[V1KFReplica, RefField]] = None
|
147
|
+
worker: Optional[Union[V1KFReplica, RefField]] = None
|
143
148
|
|
144
149
|
def apply_image_destination(self, image: str):
|
145
150
|
if self.launcher:
|
@@ -202,17 +202,33 @@ class V1MXJob(BaseRun, DestinationImageMixin):
|
|
202
202
|
"""
|
203
203
|
|
204
204
|
_IDENTIFIER = V1RunKind.MXJOB
|
205
|
+
_CUSTOM_DUMP_FIELDS = {
|
206
|
+
"scheduler",
|
207
|
+
"server",
|
208
|
+
"worker",
|
209
|
+
"tuner",
|
210
|
+
"tunerTracker",
|
211
|
+
"tunerServer",
|
212
|
+
}
|
205
213
|
|
206
214
|
kind: Literal[_IDENTIFIER] = _IDENTIFIER
|
207
|
-
clean_pod_policy: Optional[V1CleanPodPolicy] = Field(
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
215
|
+
clean_pod_policy: Optional[V1CleanPodPolicy] = Field(
|
216
|
+
alias="cleanPodPolicy", default=None
|
217
|
+
)
|
218
|
+
scheduling_policy: Optional[V1SchedulingPolicy] = Field(
|
219
|
+
alias="schedulingPolicy", default=None
|
220
|
+
)
|
221
|
+
mode: Optional[MXJobMode] = None
|
222
|
+
scheduler: Optional[Union[V1KFReplica, RefField]] = None
|
223
|
+
server: Optional[Union[V1KFReplica, RefField]] = None
|
224
|
+
worker: Optional[Union[V1KFReplica, RefField]] = None
|
225
|
+
tuner: Optional[Union[V1KFReplica, RefField]] = None
|
226
|
+
tuner_tracker: Optional[Union[V1KFReplica, RefField]] = Field(
|
227
|
+
alias="tunerTracker", default=None
|
228
|
+
)
|
229
|
+
tuner_server: Optional[Union[V1KFReplica, RefField]] = Field(
|
230
|
+
alias="tunerServer", default=None
|
231
|
+
)
|
216
232
|
|
217
233
|
def apply_image_destination(self, image: str):
|
218
234
|
if self.scheduler:
|
@@ -27,10 +27,10 @@ class V1PaddleElasticPolicy(BaseSchemaModel):
|
|
27
27
|
|
28
28
|
_IDENTIFIER = "elasticPolicy"
|
29
29
|
|
30
|
-
min_replicas: Optional[IntOrRef] = Field(alias="minReplicas")
|
31
|
-
max_replicas: Optional[IntOrRef] = Field(alias="maxReplicas")
|
32
|
-
max_restarts: Optional[IntOrRef] = Field(alias="maxRestarts")
|
33
|
-
metrics: Optional[List[Dict]] = Field(alias="Metrics")
|
30
|
+
min_replicas: Optional[IntOrRef] = Field(alias="minReplicas", default=None)
|
31
|
+
max_replicas: Optional[IntOrRef] = Field(alias="maxReplicas", default=None)
|
32
|
+
max_restarts: Optional[IntOrRef] = Field(alias="maxRestarts", default=None)
|
33
|
+
metrics: Optional[List[Dict]] = Field(alias="Metrics", default=None)
|
34
34
|
|
35
35
|
|
36
36
|
class V1PaddleJob(BaseRun, DestinationImageMixin):
|
@@ -151,13 +151,20 @@ class V1PaddleJob(BaseRun, DestinationImageMixin):
|
|
151
151
|
"""
|
152
152
|
|
153
153
|
_IDENTIFIER = V1RunKind.PADDLEJOB
|
154
|
+
_CUSTOM_DUMP_FIELDS = {"master", "worker"}
|
154
155
|
|
155
156
|
kind: Literal[_IDENTIFIER] = _IDENTIFIER
|
156
|
-
clean_pod_policy: Optional[V1CleanPodPolicy] = Field(
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
157
|
+
clean_pod_policy: Optional[V1CleanPodPolicy] = Field(
|
158
|
+
alias="cleanPodPolicy", default=None
|
159
|
+
)
|
160
|
+
scheduling_policy: Optional[V1SchedulingPolicy] = Field(
|
161
|
+
alias="schedulingPolicy", default=None
|
162
|
+
)
|
163
|
+
elastic_policy: Optional[V1PaddleElasticPolicy] = Field(
|
164
|
+
alias="elasticPolicy", default=None
|
165
|
+
)
|
166
|
+
master: Optional[Union[V1KFReplica, RefField]] = None
|
167
|
+
worker: Optional[Union[V1KFReplica, RefField]] = None
|
161
168
|
|
162
169
|
def apply_image_destination(self, image: str):
|
163
170
|
if self.master:
|
@@ -34,17 +34,17 @@ class V1PytorchElasticPolicy(BaseSchemaModel):
|
|
34
34
|
|
35
35
|
_IDENTIFIER = "elasticPolicy"
|
36
36
|
|
37
|
-
min_replicas: Optional[IntOrRef] = Field(alias="minReplicas")
|
38
|
-
max_replicas: Optional[IntOrRef] = Field(alias="maxReplicas")
|
39
|
-
rdvz_backend: Optional[StrictStr] = Field(alias="rdvzBackend")
|
40
|
-
rdvz_port: Optional[IntOrRef] = Field(alias="rdvzPort")
|
41
|
-
rdvz_host: Optional[StrictStr] = Field(alias="rdvzHost")
|
42
|
-
rdvz_id: Optional[StrictStr] = Field(alias="rdvzId")
|
43
|
-
rdvz_conf: Optional[List[Dict]] = Field(alias="rdvzConf")
|
44
|
-
standalone: Optional[BoolOrRef]
|
45
|
-
n_proc_per_node: Optional[IntOrRef] = Field(alias="nProcPerNode")
|
46
|
-
max_restarts: Optional[IntOrRef] = Field(alias="maxRestarts")
|
47
|
-
metrics: Optional[List[Dict]] = Field(alias="Metrics")
|
37
|
+
min_replicas: Optional[IntOrRef] = Field(alias="minReplicas", default=None)
|
38
|
+
max_replicas: Optional[IntOrRef] = Field(alias="maxReplicas", default=None)
|
39
|
+
rdvz_backend: Optional[StrictStr] = Field(alias="rdvzBackend", default=None)
|
40
|
+
rdvz_port: Optional[IntOrRef] = Field(alias="rdvzPort", default=None)
|
41
|
+
rdvz_host: Optional[StrictStr] = Field(alias="rdvzHost", default=None)
|
42
|
+
rdvz_id: Optional[StrictStr] = Field(alias="rdvzId", default=None)
|
43
|
+
rdvz_conf: Optional[List[Dict]] = Field(alias="rdvzConf", default=None)
|
44
|
+
standalone: Optional[BoolOrRef] = None
|
45
|
+
n_proc_per_node: Optional[IntOrRef] = Field(alias="nProcPerNode", default=None)
|
46
|
+
max_restarts: Optional[IntOrRef] = Field(alias="maxRestarts", default=None)
|
47
|
+
metrics: Optional[List[Dict]] = Field(alias="Metrics", default=None)
|
48
48
|
|
49
49
|
|
50
50
|
class V1PytorchJob(BaseRun, DestinationImageMixin):
|
@@ -163,14 +163,21 @@ class V1PytorchJob(BaseRun, DestinationImageMixin):
|
|
163
163
|
"""
|
164
164
|
|
165
165
|
_IDENTIFIER = V1RunKind.PYTORCHJOB
|
166
|
+
_CUSTOM_DUMP_FIELDS = {"master", "worker"}
|
166
167
|
|
167
168
|
kind: Literal[_IDENTIFIER] = _IDENTIFIER
|
168
|
-
clean_pod_policy: Optional[V1CleanPodPolicy] = Field(
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
169
|
+
clean_pod_policy: Optional[V1CleanPodPolicy] = Field(
|
170
|
+
alias="cleanPodPolicy", default=None
|
171
|
+
)
|
172
|
+
scheduling_policy: Optional[V1SchedulingPolicy] = Field(
|
173
|
+
alias="schedulingPolicy", default=None
|
174
|
+
)
|
175
|
+
elastic_policy: Optional[V1PytorchElasticPolicy] = Field(
|
176
|
+
alias="elasticPolicy", default=None
|
177
|
+
)
|
178
|
+
n_proc_per_node: Optional[IntOrRef] = Field(alias="nProcPerNode", default=None)
|
179
|
+
master: Optional[Union[V1KFReplica, RefField]] = None
|
180
|
+
worker: Optional[Union[V1KFReplica, RefField]] = None
|
174
181
|
|
175
182
|
def apply_image_destination(self, image: str):
|
176
183
|
if self.master:
|
@@ -1,6 +1,11 @@
|
|
1
1
|
from typing import List, Optional, Union
|
2
2
|
|
3
|
-
from clipped.compact.pydantic import
|
3
|
+
from clipped.compact.pydantic import (
|
4
|
+
StrictStr,
|
5
|
+
field_validator,
|
6
|
+
validation_always,
|
7
|
+
validation_before,
|
8
|
+
)
|
4
9
|
from clipped.types.ref_or_obj import IntOrRef, RefField
|
5
10
|
|
6
11
|
from polyaxon._flow.environment import V1Environment
|
@@ -202,28 +207,29 @@ class V1KFReplica(BaseSchemaModel):
|
|
202
207
|
|
203
208
|
_IDENTIFIER = "replica"
|
204
209
|
_SWAGGER_FIELDS = ["volumes", "sidecars", "container"]
|
210
|
+
_CUSTOM_DUMP_FIELDS = {"environment"}
|
205
211
|
|
206
|
-
replicas: Optional[IntOrRef]
|
207
|
-
environment: Optional[Union[V1Environment, RefField]]
|
208
|
-
connections: Optional[Union[List[StrictStr], RefField]]
|
209
|
-
volumes: Optional[Union[List[k8s_schemas.V1Volume], RefField]]
|
210
|
-
init: Optional[Union[List[V1Init], RefField]]
|
211
|
-
sidecars: Optional[Union[List[k8s_schemas.V1Container], RefField]]
|
212
|
-
container: Optional[Union[k8s_schemas.V1Container, RefField]]
|
212
|
+
replicas: Optional[IntOrRef] = None
|
213
|
+
environment: Optional[Union[V1Environment, RefField]] = None
|
214
|
+
connections: Optional[Union[List[StrictStr], RefField]] = None
|
215
|
+
volumes: Optional[Union[List[k8s_schemas.V1Volume], RefField]] = None
|
216
|
+
init: Optional[Union[List[V1Init], RefField]] = None
|
217
|
+
sidecars: Optional[Union[List[k8s_schemas.V1Container], RefField]] = None
|
218
|
+
container: Optional[Union[k8s_schemas.V1Container, RefField]] = None
|
213
219
|
|
214
|
-
@
|
220
|
+
@field_validator("volumes", **validation_always, **validation_before)
|
215
221
|
def validate_volumes(cls, v):
|
216
222
|
if not v:
|
217
223
|
return v
|
218
224
|
return [k8s_validation.validate_k8s_volume(vi) for vi in v]
|
219
225
|
|
220
|
-
@
|
226
|
+
@field_validator("sidecars", **validation_always, **validation_before)
|
221
227
|
def validate_helper_containers(cls, v):
|
222
228
|
if not v:
|
223
229
|
return v
|
224
230
|
return [k8s_validation.validate_k8s_container(vi) for vi in v]
|
225
231
|
|
226
|
-
@
|
232
|
+
@field_validator("container", **validation_always, **validation_before)
|
227
233
|
def validate_container(cls, v):
|
228
234
|
return k8s_validation.validate_k8s_container(v)
|
229
235
|
|