flyte 0.0.1b0__py3-none-any.whl → 2.0.0b46__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.
- flyte/__init__.py +83 -30
- flyte/_bin/connect.py +61 -0
- flyte/_bin/debug.py +38 -0
- flyte/_bin/runtime.py +87 -19
- flyte/_bin/serve.py +351 -0
- flyte/_build.py +3 -2
- flyte/_cache/cache.py +6 -5
- flyte/_cache/local_cache.py +216 -0
- flyte/_code_bundle/_ignore.py +31 -5
- flyte/_code_bundle/_packaging.py +42 -11
- flyte/_code_bundle/_utils.py +57 -34
- flyte/_code_bundle/bundle.py +130 -27
- flyte/_constants.py +1 -0
- flyte/_context.py +21 -5
- flyte/_custom_context.py +73 -0
- flyte/_debug/constants.py +37 -0
- flyte/_debug/utils.py +17 -0
- flyte/_debug/vscode.py +315 -0
- flyte/_deploy.py +396 -75
- flyte/_deployer.py +109 -0
- flyte/_environment.py +94 -11
- flyte/_excepthook.py +37 -0
- flyte/_group.py +2 -1
- flyte/_hash.py +1 -16
- flyte/_image.py +544 -234
- flyte/_initialize.py +443 -294
- flyte/_interface.py +40 -5
- flyte/_internal/controllers/__init__.py +22 -8
- flyte/_internal/controllers/_local_controller.py +159 -35
- flyte/_internal/controllers/_trace.py +18 -10
- flyte/_internal/controllers/remote/__init__.py +38 -9
- flyte/_internal/controllers/remote/_action.py +82 -12
- flyte/_internal/controllers/remote/_client.py +6 -2
- flyte/_internal/controllers/remote/_controller.py +290 -64
- flyte/_internal/controllers/remote/_core.py +155 -95
- flyte/_internal/controllers/remote/_informer.py +40 -20
- flyte/_internal/controllers/remote/_service_protocol.py +2 -2
- flyte/_internal/imagebuild/__init__.py +2 -10
- flyte/_internal/imagebuild/docker_builder.py +391 -84
- flyte/_internal/imagebuild/image_builder.py +111 -55
- flyte/_internal/imagebuild/remote_builder.py +409 -0
- flyte/_internal/imagebuild/utils.py +79 -0
- flyte/_internal/resolvers/_app_env_module.py +92 -0
- flyte/_internal/resolvers/_task_module.py +5 -38
- flyte/_internal/resolvers/app_env.py +26 -0
- flyte/_internal/resolvers/common.py +8 -1
- flyte/_internal/resolvers/default.py +2 -2
- flyte/_internal/runtime/convert.py +322 -33
- flyte/_internal/runtime/entrypoints.py +106 -18
- flyte/_internal/runtime/io.py +71 -23
- flyte/_internal/runtime/resources_serde.py +21 -7
- flyte/_internal/runtime/reuse.py +125 -0
- flyte/_internal/runtime/rusty.py +196 -0
- flyte/_internal/runtime/task_serde.py +239 -66
- flyte/_internal/runtime/taskrunner.py +48 -8
- flyte/_internal/runtime/trigger_serde.py +162 -0
- flyte/_internal/runtime/types_serde.py +7 -16
- flyte/_keyring/file.py +115 -0
- flyte/_link.py +30 -0
- flyte/_logging.py +241 -42
- flyte/_map.py +312 -0
- flyte/_metrics.py +59 -0
- flyte/_module.py +74 -0
- flyte/_pod.py +30 -0
- flyte/_resources.py +296 -33
- flyte/_retry.py +1 -7
- flyte/_reusable_environment.py +72 -7
- flyte/_run.py +461 -132
- flyte/_secret.py +47 -11
- flyte/_serve.py +333 -0
- flyte/_task.py +245 -56
- flyte/_task_environment.py +219 -97
- flyte/_task_plugins.py +47 -0
- flyte/_tools.py +8 -8
- flyte/_trace.py +15 -24
- flyte/_trigger.py +1027 -0
- flyte/_utils/__init__.py +12 -1
- flyte/_utils/asyn.py +3 -1
- flyte/_utils/async_cache.py +139 -0
- flyte/_utils/coro_management.py +5 -4
- flyte/_utils/description_parser.py +19 -0
- flyte/_utils/docker_credentials.py +173 -0
- flyte/_utils/helpers.py +45 -19
- flyte/_utils/module_loader.py +123 -0
- flyte/_utils/org_discovery.py +57 -0
- flyte/_utils/uv_script_parser.py +8 -1
- flyte/_version.py +16 -3
- flyte/app/__init__.py +27 -0
- flyte/app/_app_environment.py +362 -0
- flyte/app/_connector_environment.py +40 -0
- flyte/app/_deploy.py +130 -0
- flyte/app/_parameter.py +343 -0
- flyte/app/_runtime/__init__.py +3 -0
- flyte/app/_runtime/app_serde.py +383 -0
- flyte/app/_types.py +113 -0
- flyte/app/extras/__init__.py +9 -0
- flyte/app/extras/_auth_middleware.py +217 -0
- flyte/app/extras/_fastapi.py +93 -0
- flyte/app/extras/_model_loader/__init__.py +3 -0
- flyte/app/extras/_model_loader/config.py +7 -0
- flyte/app/extras/_model_loader/loader.py +288 -0
- flyte/cli/__init__.py +12 -0
- flyte/cli/_abort.py +28 -0
- flyte/cli/_build.py +114 -0
- flyte/cli/_common.py +493 -0
- flyte/cli/_create.py +371 -0
- flyte/cli/_delete.py +45 -0
- flyte/cli/_deploy.py +401 -0
- flyte/cli/_gen.py +316 -0
- flyte/cli/_get.py +446 -0
- flyte/cli/_option.py +33 -0
- {union/_cli → flyte/cli}/_params.py +152 -153
- flyte/cli/_plugins.py +209 -0
- flyte/cli/_prefetch.py +292 -0
- flyte/cli/_run.py +690 -0
- flyte/cli/_serve.py +338 -0
- flyte/cli/_update.py +86 -0
- flyte/cli/_user.py +20 -0
- flyte/cli/main.py +246 -0
- flyte/config/__init__.py +3 -0
- flyte/config/_config.py +248 -0
- flyte/config/_internal.py +73 -0
- flyte/config/_reader.py +225 -0
- flyte/connectors/__init__.py +11 -0
- flyte/connectors/_connector.py +330 -0
- flyte/connectors/_server.py +194 -0
- flyte/connectors/utils.py +159 -0
- flyte/errors.py +134 -2
- flyte/extend.py +24 -0
- flyte/extras/_container.py +69 -56
- flyte/git/__init__.py +3 -0
- flyte/git/_config.py +279 -0
- flyte/io/__init__.py +8 -1
- flyte/io/{structured_dataset → _dataframe}/__init__.py +32 -30
- flyte/io/{structured_dataset → _dataframe}/basic_dfs.py +75 -68
- flyte/io/{structured_dataset/structured_dataset.py → _dataframe/dataframe.py} +207 -242
- flyte/io/_dir.py +575 -113
- flyte/io/_file.py +587 -141
- flyte/io/_hashing_io.py +342 -0
- flyte/io/extend.py +7 -0
- flyte/models.py +635 -0
- flyte/prefetch/__init__.py +22 -0
- flyte/prefetch/_hf_model.py +563 -0
- flyte/remote/__init__.py +14 -3
- flyte/remote/_action.py +879 -0
- flyte/remote/_app.py +346 -0
- flyte/remote/_auth_metadata.py +42 -0
- flyte/remote/_client/_protocols.py +62 -4
- flyte/remote/_client/auth/_auth_utils.py +19 -0
- flyte/remote/_client/auth/_authenticators/base.py +8 -2
- flyte/remote/_client/auth/_authenticators/device_code.py +4 -5
- flyte/remote/_client/auth/_authenticators/factory.py +4 -0
- flyte/remote/_client/auth/_authenticators/passthrough.py +79 -0
- flyte/remote/_client/auth/_authenticators/pkce.py +17 -18
- flyte/remote/_client/auth/_channel.py +47 -18
- flyte/remote/_client/auth/_client_config.py +5 -3
- flyte/remote/_client/auth/_keyring.py +15 -2
- flyte/remote/_client/auth/_token_client.py +3 -3
- flyte/remote/_client/controlplane.py +206 -18
- flyte/remote/_common.py +66 -0
- flyte/remote/_data.py +107 -22
- flyte/remote/_logs.py +116 -33
- flyte/remote/_project.py +21 -19
- flyte/remote/_run.py +164 -631
- flyte/remote/_secret.py +72 -29
- flyte/remote/_task.py +387 -46
- flyte/remote/_trigger.py +368 -0
- flyte/remote/_user.py +43 -0
- flyte/report/_report.py +10 -6
- flyte/storage/__init__.py +13 -1
- flyte/storage/_config.py +237 -0
- flyte/storage/_parallel_reader.py +289 -0
- flyte/storage/_storage.py +268 -59
- flyte/syncify/__init__.py +56 -0
- flyte/syncify/_api.py +414 -0
- flyte/types/__init__.py +39 -0
- flyte/types/_interface.py +22 -7
- flyte/{io/pickle/transformer.py → types/_pickle.py} +37 -9
- flyte/types/_string_literals.py +8 -9
- flyte/types/_type_engine.py +230 -129
- flyte/types/_utils.py +1 -1
- flyte-2.0.0b46.data/scripts/debug.py +38 -0
- flyte-2.0.0b46.data/scripts/runtime.py +194 -0
- flyte-2.0.0b46.dist-info/METADATA +352 -0
- flyte-2.0.0b46.dist-info/RECORD +221 -0
- flyte-2.0.0b46.dist-info/entry_points.txt +8 -0
- flyte-2.0.0b46.dist-info/licenses/LICENSE +201 -0
- flyte/_api_commons.py +0 -3
- flyte/_cli/_common.py +0 -287
- flyte/_cli/_create.py +0 -42
- flyte/_cli/_delete.py +0 -23
- flyte/_cli/_deploy.py +0 -140
- flyte/_cli/_get.py +0 -235
- flyte/_cli/_run.py +0 -152
- flyte/_cli/main.py +0 -72
- flyte/_datastructures.py +0 -342
- flyte/_internal/controllers/pbhash.py +0 -39
- flyte/_protos/common/authorization_pb2.py +0 -66
- flyte/_protos/common/authorization_pb2.pyi +0 -108
- flyte/_protos/common/authorization_pb2_grpc.py +0 -4
- flyte/_protos/common/identifier_pb2.py +0 -71
- flyte/_protos/common/identifier_pb2.pyi +0 -82
- flyte/_protos/common/identifier_pb2_grpc.py +0 -4
- flyte/_protos/common/identity_pb2.py +0 -48
- flyte/_protos/common/identity_pb2.pyi +0 -72
- flyte/_protos/common/identity_pb2_grpc.py +0 -4
- flyte/_protos/common/list_pb2.py +0 -36
- flyte/_protos/common/list_pb2.pyi +0 -69
- flyte/_protos/common/list_pb2_grpc.py +0 -4
- flyte/_protos/common/policy_pb2.py +0 -37
- flyte/_protos/common/policy_pb2.pyi +0 -27
- flyte/_protos/common/policy_pb2_grpc.py +0 -4
- flyte/_protos/common/role_pb2.py +0 -37
- flyte/_protos/common/role_pb2.pyi +0 -53
- flyte/_protos/common/role_pb2_grpc.py +0 -4
- flyte/_protos/common/runtime_version_pb2.py +0 -28
- flyte/_protos/common/runtime_version_pb2.pyi +0 -24
- flyte/_protos/common/runtime_version_pb2_grpc.py +0 -4
- flyte/_protos/logs/dataplane/payload_pb2.py +0 -96
- flyte/_protos/logs/dataplane/payload_pb2.pyi +0 -168
- flyte/_protos/logs/dataplane/payload_pb2_grpc.py +0 -4
- flyte/_protos/secret/definition_pb2.py +0 -49
- flyte/_protos/secret/definition_pb2.pyi +0 -93
- flyte/_protos/secret/definition_pb2_grpc.py +0 -4
- flyte/_protos/secret/payload_pb2.py +0 -62
- flyte/_protos/secret/payload_pb2.pyi +0 -94
- flyte/_protos/secret/payload_pb2_grpc.py +0 -4
- flyte/_protos/secret/secret_pb2.py +0 -38
- flyte/_protos/secret/secret_pb2.pyi +0 -6
- flyte/_protos/secret/secret_pb2_grpc.py +0 -198
- flyte/_protos/secret/secret_pb2_grpc_grpc.py +0 -198
- flyte/_protos/validate/validate/validate_pb2.py +0 -76
- flyte/_protos/workflow/node_execution_service_pb2.py +0 -26
- flyte/_protos/workflow/node_execution_service_pb2.pyi +0 -4
- flyte/_protos/workflow/node_execution_service_pb2_grpc.py +0 -32
- flyte/_protos/workflow/queue_service_pb2.py +0 -106
- flyte/_protos/workflow/queue_service_pb2.pyi +0 -141
- flyte/_protos/workflow/queue_service_pb2_grpc.py +0 -172
- flyte/_protos/workflow/run_definition_pb2.py +0 -128
- flyte/_protos/workflow/run_definition_pb2.pyi +0 -310
- flyte/_protos/workflow/run_definition_pb2_grpc.py +0 -4
- flyte/_protos/workflow/run_logs_service_pb2.py +0 -41
- flyte/_protos/workflow/run_logs_service_pb2.pyi +0 -28
- flyte/_protos/workflow/run_logs_service_pb2_grpc.py +0 -69
- flyte/_protos/workflow/run_service_pb2.py +0 -133
- flyte/_protos/workflow/run_service_pb2.pyi +0 -175
- flyte/_protos/workflow/run_service_pb2_grpc.py +0 -412
- flyte/_protos/workflow/state_service_pb2.py +0 -58
- flyte/_protos/workflow/state_service_pb2.pyi +0 -71
- flyte/_protos/workflow/state_service_pb2_grpc.py +0 -138
- flyte/_protos/workflow/task_definition_pb2.py +0 -72
- flyte/_protos/workflow/task_definition_pb2.pyi +0 -65
- flyte/_protos/workflow/task_definition_pb2_grpc.py +0 -4
- flyte/_protos/workflow/task_service_pb2.py +0 -44
- flyte/_protos/workflow/task_service_pb2.pyi +0 -31
- flyte/_protos/workflow/task_service_pb2_grpc.py +0 -104
- flyte/io/_dataframe.py +0 -0
- flyte/io/pickle/__init__.py +0 -0
- flyte/remote/_console.py +0 -18
- flyte-0.0.1b0.dist-info/METADATA +0 -179
- flyte-0.0.1b0.dist-info/RECORD +0 -390
- flyte-0.0.1b0.dist-info/entry_points.txt +0 -3
- union/__init__.py +0 -54
- union/_api_commons.py +0 -3
- union/_bin/__init__.py +0 -0
- union/_bin/runtime.py +0 -113
- union/_build.py +0 -25
- union/_cache/__init__.py +0 -12
- union/_cache/cache.py +0 -141
- union/_cache/defaults.py +0 -9
- union/_cache/policy_function_body.py +0 -42
- union/_cli/__init__.py +0 -0
- union/_cli/_common.py +0 -263
- union/_cli/_create.py +0 -40
- union/_cli/_delete.py +0 -23
- union/_cli/_deploy.py +0 -120
- union/_cli/_get.py +0 -162
- union/_cli/_run.py +0 -150
- union/_cli/main.py +0 -72
- union/_code_bundle/__init__.py +0 -8
- union/_code_bundle/_ignore.py +0 -113
- union/_code_bundle/_packaging.py +0 -187
- union/_code_bundle/_utils.py +0 -342
- union/_code_bundle/bundle.py +0 -176
- union/_context.py +0 -146
- union/_datastructures.py +0 -295
- union/_deploy.py +0 -185
- union/_doc.py +0 -29
- union/_docstring.py +0 -26
- union/_environment.py +0 -43
- union/_group.py +0 -31
- union/_hash.py +0 -23
- union/_image.py +0 -760
- union/_initialize.py +0 -585
- union/_interface.py +0 -84
- union/_internal/__init__.py +0 -3
- union/_internal/controllers/__init__.py +0 -77
- union/_internal/controllers/_local_controller.py +0 -77
- union/_internal/controllers/pbhash.py +0 -39
- union/_internal/controllers/remote/__init__.py +0 -40
- union/_internal/controllers/remote/_action.py +0 -131
- union/_internal/controllers/remote/_client.py +0 -43
- union/_internal/controllers/remote/_controller.py +0 -169
- union/_internal/controllers/remote/_core.py +0 -341
- union/_internal/controllers/remote/_informer.py +0 -260
- union/_internal/controllers/remote/_service_protocol.py +0 -44
- union/_internal/imagebuild/__init__.py +0 -11
- union/_internal/imagebuild/docker_builder.py +0 -416
- union/_internal/imagebuild/image_builder.py +0 -243
- union/_internal/imagebuild/remote_builder.py +0 -0
- union/_internal/resolvers/__init__.py +0 -0
- union/_internal/resolvers/_task_module.py +0 -31
- union/_internal/resolvers/common.py +0 -24
- union/_internal/resolvers/default.py +0 -27
- union/_internal/runtime/__init__.py +0 -0
- union/_internal/runtime/convert.py +0 -163
- union/_internal/runtime/entrypoints.py +0 -121
- union/_internal/runtime/io.py +0 -136
- union/_internal/runtime/resources_serde.py +0 -134
- union/_internal/runtime/task_serde.py +0 -202
- union/_internal/runtime/taskrunner.py +0 -179
- union/_internal/runtime/types_serde.py +0 -53
- union/_logging.py +0 -124
- union/_protos/__init__.py +0 -0
- union/_protos/common/authorization_pb2.py +0 -66
- union/_protos/common/authorization_pb2.pyi +0 -106
- union/_protos/common/authorization_pb2_grpc.py +0 -4
- union/_protos/common/identifier_pb2.py +0 -71
- union/_protos/common/identifier_pb2.pyi +0 -82
- union/_protos/common/identifier_pb2_grpc.py +0 -4
- union/_protos/common/identity_pb2.py +0 -48
- union/_protos/common/identity_pb2.pyi +0 -72
- union/_protos/common/identity_pb2_grpc.py +0 -4
- union/_protos/common/list_pb2.py +0 -36
- union/_protos/common/list_pb2.pyi +0 -69
- union/_protos/common/list_pb2_grpc.py +0 -4
- union/_protos/common/policy_pb2.py +0 -37
- union/_protos/common/policy_pb2.pyi +0 -27
- union/_protos/common/policy_pb2_grpc.py +0 -4
- union/_protos/common/role_pb2.py +0 -37
- union/_protos/common/role_pb2.pyi +0 -51
- union/_protos/common/role_pb2_grpc.py +0 -4
- union/_protos/common/runtime_version_pb2.py +0 -28
- union/_protos/common/runtime_version_pb2.pyi +0 -24
- union/_protos/common/runtime_version_pb2_grpc.py +0 -4
- union/_protos/logs/dataplane/payload_pb2.py +0 -96
- union/_protos/logs/dataplane/payload_pb2.pyi +0 -168
- union/_protos/logs/dataplane/payload_pb2_grpc.py +0 -4
- union/_protos/secret/definition_pb2.py +0 -49
- union/_protos/secret/definition_pb2.pyi +0 -93
- union/_protos/secret/definition_pb2_grpc.py +0 -4
- union/_protos/secret/payload_pb2.py +0 -62
- union/_protos/secret/payload_pb2.pyi +0 -94
- union/_protos/secret/payload_pb2_grpc.py +0 -4
- union/_protos/secret/secret_pb2.py +0 -38
- union/_protos/secret/secret_pb2.pyi +0 -6
- union/_protos/secret/secret_pb2_grpc.py +0 -198
- union/_protos/validate/validate/validate_pb2.py +0 -76
- union/_protos/workflow/node_execution_service_pb2.py +0 -26
- union/_protos/workflow/node_execution_service_pb2.pyi +0 -4
- union/_protos/workflow/node_execution_service_pb2_grpc.py +0 -32
- union/_protos/workflow/queue_service_pb2.py +0 -75
- union/_protos/workflow/queue_service_pb2.pyi +0 -103
- union/_protos/workflow/queue_service_pb2_grpc.py +0 -172
- union/_protos/workflow/run_definition_pb2.py +0 -100
- union/_protos/workflow/run_definition_pb2.pyi +0 -256
- union/_protos/workflow/run_definition_pb2_grpc.py +0 -4
- union/_protos/workflow/run_logs_service_pb2.py +0 -41
- union/_protos/workflow/run_logs_service_pb2.pyi +0 -28
- union/_protos/workflow/run_logs_service_pb2_grpc.py +0 -69
- union/_protos/workflow/run_service_pb2.py +0 -133
- union/_protos/workflow/run_service_pb2.pyi +0 -173
- union/_protos/workflow/run_service_pb2_grpc.py +0 -412
- union/_protos/workflow/state_service_pb2.py +0 -58
- union/_protos/workflow/state_service_pb2.pyi +0 -69
- union/_protos/workflow/state_service_pb2_grpc.py +0 -138
- union/_protos/workflow/task_definition_pb2.py +0 -72
- union/_protos/workflow/task_definition_pb2.pyi +0 -65
- union/_protos/workflow/task_definition_pb2_grpc.py +0 -4
- union/_protos/workflow/task_service_pb2.py +0 -44
- union/_protos/workflow/task_service_pb2.pyi +0 -31
- union/_protos/workflow/task_service_pb2_grpc.py +0 -104
- union/_resources.py +0 -226
- union/_retry.py +0 -32
- union/_reusable_environment.py +0 -25
- union/_run.py +0 -374
- union/_secret.py +0 -61
- union/_task.py +0 -354
- union/_task_environment.py +0 -186
- union/_timeout.py +0 -47
- union/_tools.py +0 -27
- union/_utils/__init__.py +0 -11
- union/_utils/asyn.py +0 -119
- union/_utils/file_handling.py +0 -71
- union/_utils/helpers.py +0 -46
- union/_utils/lazy_module.py +0 -54
- union/_utils/uv_script_parser.py +0 -49
- union/_version.py +0 -21
- union/connectors/__init__.py +0 -0
- union/errors.py +0 -128
- union/extras/__init__.py +0 -5
- union/extras/_container.py +0 -263
- union/io/__init__.py +0 -11
- union/io/_dataframe.py +0 -0
- union/io/_dir.py +0 -425
- union/io/_file.py +0 -418
- union/io/pickle/__init__.py +0 -0
- union/io/pickle/transformer.py +0 -117
- union/io/structured_dataset/__init__.py +0 -122
- union/io/structured_dataset/basic_dfs.py +0 -219
- union/io/structured_dataset/structured_dataset.py +0 -1057
- union/py.typed +0 -0
- union/remote/__init__.py +0 -23
- union/remote/_client/__init__.py +0 -0
- union/remote/_client/_protocols.py +0 -129
- union/remote/_client/auth/__init__.py +0 -12
- union/remote/_client/auth/_authenticators/__init__.py +0 -0
- union/remote/_client/auth/_authenticators/base.py +0 -391
- union/remote/_client/auth/_authenticators/client_credentials.py +0 -73
- union/remote/_client/auth/_authenticators/device_code.py +0 -120
- union/remote/_client/auth/_authenticators/external_command.py +0 -77
- union/remote/_client/auth/_authenticators/factory.py +0 -200
- union/remote/_client/auth/_authenticators/pkce.py +0 -515
- union/remote/_client/auth/_channel.py +0 -184
- union/remote/_client/auth/_client_config.py +0 -83
- union/remote/_client/auth/_default_html.py +0 -32
- union/remote/_client/auth/_grpc_utils/__init__.py +0 -0
- union/remote/_client/auth/_grpc_utils/auth_interceptor.py +0 -204
- union/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py +0 -144
- union/remote/_client/auth/_keyring.py +0 -154
- union/remote/_client/auth/_token_client.py +0 -258
- union/remote/_client/auth/errors.py +0 -16
- union/remote/_client/controlplane.py +0 -86
- union/remote/_data.py +0 -149
- union/remote/_logs.py +0 -74
- union/remote/_project.py +0 -86
- union/remote/_run.py +0 -820
- union/remote/_secret.py +0 -132
- union/remote/_task.py +0 -193
- union/report/__init__.py +0 -3
- union/report/_report.py +0 -178
- union/report/_template.html +0 -124
- union/storage/__init__.py +0 -24
- union/storage/_remote_fs.py +0 -34
- union/storage/_storage.py +0 -247
- union/storage/_utils.py +0 -5
- union/types/__init__.py +0 -11
- union/types/_renderer.py +0 -162
- union/types/_string_literals.py +0 -120
- union/types/_type_engine.py +0 -2131
- union/types/_utils.py +0 -80
- /flyte/{_cli → _debug}/__init__.py +0 -0
- /flyte/{_protos → _keyring}/__init__.py +0 -0
- {flyte-0.0.1b0.dist-info → flyte-2.0.0b46.dist-info}/WHEEL +0 -0
- {flyte-0.0.1b0.dist-info → flyte-2.0.0b46.dist-info}/top_level.txt +0 -0
|
@@ -3,66 +3,68 @@ This module provides functionality to serialize and deserialize tasks to and fro
|
|
|
3
3
|
It includes a Resolver interface for loading tasks, and functions to load classes and tasks.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
-
import
|
|
6
|
+
import copy
|
|
7
|
+
import typing
|
|
7
8
|
from datetime import timedelta
|
|
8
|
-
from typing import Optional,
|
|
9
|
+
from typing import Optional, cast
|
|
9
10
|
|
|
10
|
-
from
|
|
11
|
+
from flyteidl2.core import identifier_pb2, literals_pb2, security_pb2, tasks_pb2
|
|
12
|
+
from flyteidl2.core.execution_pb2 import TaskLog
|
|
13
|
+
from flyteidl2.task import common_pb2, environment_pb2, task_definition_pb2
|
|
11
14
|
from google.protobuf import duration_pb2, wrappers_pb2
|
|
12
15
|
|
|
13
16
|
import flyte.errors
|
|
14
17
|
from flyte._cache.cache import VersionParameters, cache_from_request
|
|
15
|
-
from flyte._datastructures import SerializationContext
|
|
16
18
|
from flyte._logging import logger
|
|
17
|
-
from flyte.
|
|
19
|
+
from flyte._pod import _PRIMARY_CONTAINER_NAME_FIELD, PodTemplate
|
|
18
20
|
from flyte._secret import SecretRequest, secrets_from_request
|
|
19
21
|
from flyte._task import AsyncFunctionTaskTemplate, TaskTemplate
|
|
22
|
+
from flyte.models import CodeBundle, SerializationContext
|
|
20
23
|
|
|
24
|
+
from ... import ReusePolicy
|
|
25
|
+
from ..._context import internal_ctx
|
|
21
26
|
from ..._retry import RetryStrategy
|
|
22
27
|
from ..._timeout import TimeoutType, timeout_from_request
|
|
23
28
|
from .resources_serde import get_proto_extended_resources, get_proto_resources
|
|
29
|
+
from .reuse import add_reusable
|
|
24
30
|
from .types_serde import transform_native_to_typed_interface
|
|
25
31
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
"""
|
|
29
|
-
Load a class from a qualified name. The qualified name should be in the format 'module.ClassName'.
|
|
30
|
-
:param qualified_name: The qualified name of the class to load.
|
|
31
|
-
:return: The class object.
|
|
32
|
-
"""
|
|
33
|
-
module_name, class_name = qualified_name.rsplit(".", 1) # Split module and class
|
|
34
|
-
module = importlib.import_module(module_name) # Import the module
|
|
35
|
-
return getattr(module, class_name) # Retrieve the class
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def load_task(resolver: str, *resolver_args: str) -> TaskTemplate:
|
|
39
|
-
"""
|
|
40
|
-
Load a task from a resolver. This is a placeholder function.
|
|
41
|
-
|
|
42
|
-
:param resolver: The resolver to use to load the task.
|
|
43
|
-
:param resolver_args: Arguments to pass to the resolver.
|
|
44
|
-
:return: The loaded task.
|
|
45
|
-
"""
|
|
46
|
-
resolver_class = load_class(resolver)
|
|
47
|
-
resolver_instance = resolver_class()
|
|
48
|
-
return resolver_instance.load_task(resolver_args)
|
|
32
|
+
_MAX_ENV_NAME_LENGTH = 63 # Maximum length for environment names
|
|
33
|
+
_MAX_TASK_SHORT_NAME_LENGTH = 63 # Maximum length for task short names
|
|
49
34
|
|
|
50
35
|
|
|
51
36
|
def translate_task_to_wire(
|
|
52
|
-
task: TaskTemplate,
|
|
37
|
+
task: TaskTemplate,
|
|
38
|
+
serialization_context: SerializationContext,
|
|
39
|
+
default_inputs: Optional[typing.List[common_pb2.NamedParameter]] = None,
|
|
53
40
|
) -> task_definition_pb2.TaskSpec:
|
|
54
41
|
"""
|
|
55
42
|
Translate a task to a wire format. This is a placeholder function.
|
|
56
43
|
|
|
57
44
|
:param task: The task to translate.
|
|
58
45
|
:param serialization_context: The serialization context to use for the translation.
|
|
46
|
+
:param default_inputs: Optional list of default inputs for the task.
|
|
59
47
|
|
|
60
48
|
:return: The translated task.
|
|
61
49
|
"""
|
|
62
|
-
|
|
50
|
+
tt = get_proto_task(task, serialization_context)
|
|
51
|
+
env: environment_pb2.Environment | None = None
|
|
52
|
+
|
|
53
|
+
if task.parent_env and task.parent_env():
|
|
54
|
+
_env = task.parent_env()
|
|
55
|
+
if _env:
|
|
56
|
+
env = environment_pb2.Environment(name=_env.name[:_MAX_ENV_NAME_LENGTH])
|
|
57
|
+
return task_definition_pb2.TaskSpec(
|
|
58
|
+
task_template=tt,
|
|
59
|
+
default_inputs=default_inputs,
|
|
60
|
+
short_name=task.short_name[:_MAX_TASK_SHORT_NAME_LENGTH],
|
|
61
|
+
environment=env,
|
|
62
|
+
)
|
|
63
63
|
|
|
64
64
|
|
|
65
|
-
def get_security_context(
|
|
65
|
+
def get_security_context(
|
|
66
|
+
secrets: Optional[SecretRequest],
|
|
67
|
+
) -> Optional[security_pb2.SecurityContext]:
|
|
66
68
|
"""
|
|
67
69
|
Get the security context from a list of secrets. This is a placeholder function.
|
|
68
70
|
|
|
@@ -89,7 +91,9 @@ def get_security_context(secrets: Optional[SecretRequest]) -> Optional[security_
|
|
|
89
91
|
)
|
|
90
92
|
|
|
91
93
|
|
|
92
|
-
def get_proto_retry_strategy(
|
|
94
|
+
def get_proto_retry_strategy(
|
|
95
|
+
retries: RetryStrategy | int | None,
|
|
96
|
+
) -> Optional[literals_pb2.RetryStrategy]:
|
|
93
97
|
if retries is None:
|
|
94
98
|
return None
|
|
95
99
|
|
|
@@ -108,7 +112,7 @@ def get_proto_timeout(timeout: TimeoutType | None) -> Optional[duration_pb2.Dura
|
|
|
108
112
|
return duration_pb2.Duration(seconds=max_runtime_timeout.seconds)
|
|
109
113
|
|
|
110
114
|
|
|
111
|
-
def get_proto_task(task: TaskTemplate, serialize_context: SerializationContext) ->
|
|
115
|
+
def get_proto_task(task: TaskTemplate, serialize_context: SerializationContext) -> tasks_pb2.TaskTemplate:
|
|
112
116
|
task_id = identifier_pb2.Identifier(
|
|
113
117
|
resource_type=identifier_pb2.ResourceType.TASK,
|
|
114
118
|
project=serialize_context.project,
|
|
@@ -117,21 +121,38 @@ def get_proto_task(task: TaskTemplate, serialize_context: SerializationContext)
|
|
|
117
121
|
name=task.name,
|
|
118
122
|
version=serialize_context.version,
|
|
119
123
|
)
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
124
|
+
|
|
125
|
+
extra_config: typing.Dict[str, str] = {}
|
|
126
|
+
|
|
127
|
+
if task.pod_template and not isinstance(task.pod_template, str):
|
|
128
|
+
pod = _get_k8s_pod(_get_urun_container(serialize_context, task), task.pod_template)
|
|
129
|
+
extra_config[_PRIMARY_CONTAINER_NAME_FIELD] = task.pod_template.primary_container_name
|
|
130
|
+
container = None
|
|
131
|
+
else:
|
|
132
|
+
container = _get_urun_container(serialize_context, task)
|
|
133
|
+
pod = None
|
|
134
|
+
|
|
135
|
+
ctx = internal_ctx()
|
|
136
|
+
task_ctx = ctx.data.task_context
|
|
137
|
+
log_links = []
|
|
138
|
+
if task.links and task_ctx:
|
|
139
|
+
action = task_ctx.action
|
|
140
|
+
for link in task.links:
|
|
141
|
+
uri = link.get_link(
|
|
142
|
+
run_name=action.run_name if action.run_name else "",
|
|
143
|
+
project=action.project if action.project else "",
|
|
144
|
+
domain=action.domain if action.domain else "",
|
|
145
|
+
context=task_ctx.custom_context if task_ctx.custom_context else {},
|
|
146
|
+
parent_action_name=action.name if action.name else "",
|
|
147
|
+
action_name="{{.actionName}}",
|
|
148
|
+
pod_name="{{.podName}}",
|
|
149
|
+
)
|
|
150
|
+
task_log = TaskLog(name=link.name, uri=uri, icon_uri=link.icon_uri)
|
|
151
|
+
log_links.append(task_log)
|
|
152
|
+
|
|
153
|
+
custom = task.custom_config(serialize_context)
|
|
154
|
+
|
|
155
|
+
sql = task.sql(serialize_context)
|
|
135
156
|
|
|
136
157
|
# -------------- CACHE HANDLING ----------------------
|
|
137
158
|
task_cache = cache_from_request(task.cache)
|
|
@@ -144,7 +165,6 @@ def get_proto_task(task: TaskTemplate, serialize_context: SerializationContext)
|
|
|
144
165
|
logger.debug(f"Detected pkl bundle for task {task.name}, using computed version as cache version")
|
|
145
166
|
cache_version = serialize_context.code_bundle.computed_version
|
|
146
167
|
else:
|
|
147
|
-
version_parameters = None
|
|
148
168
|
if isinstance(task, AsyncFunctionTaskTemplate):
|
|
149
169
|
version_parameters = VersionParameters(func=task.func, image=task.image)
|
|
150
170
|
else:
|
|
@@ -154,23 +174,29 @@ def get_proto_task(task: TaskTemplate, serialize_context: SerializationContext)
|
|
|
154
174
|
else:
|
|
155
175
|
logger.debug(f"Cache disabled for task {task.name}")
|
|
156
176
|
|
|
157
|
-
|
|
177
|
+
task_template = tasks_pb2.TaskTemplate(
|
|
158
178
|
id=task_id,
|
|
159
179
|
type=task.task_type,
|
|
160
180
|
metadata=tasks_pb2.TaskMetadata(
|
|
161
181
|
discoverable=cache_enabled,
|
|
162
182
|
discovery_version=cache_version,
|
|
163
183
|
cache_serializable=task_cache.serialize,
|
|
164
|
-
cache_ignore_input_vars=task_cache.
|
|
165
|
-
runtime=tasks_pb2.RuntimeMetadata(
|
|
184
|
+
cache_ignore_input_vars=(task_cache.get_ignored_inputs() if cache_enabled else None),
|
|
185
|
+
runtime=tasks_pb2.RuntimeMetadata(
|
|
186
|
+
version=flyte.version(),
|
|
187
|
+
type=tasks_pb2.RuntimeMetadata.RuntimeType.FLYTE_SDK,
|
|
188
|
+
flavor="python",
|
|
189
|
+
),
|
|
166
190
|
retries=get_proto_retry_strategy(task.retries),
|
|
167
191
|
timeout=get_proto_timeout(task.timeout),
|
|
168
|
-
pod_template_name=task.pod_template if task.pod_template and isinstance(task.pod_template, str) else None,
|
|
169
|
-
interruptible=task.
|
|
170
|
-
generates_deck=wrappers_pb2.BoolValue(value=
|
|
192
|
+
pod_template_name=(task.pod_template if task.pod_template and isinstance(task.pod_template, str) else None),
|
|
193
|
+
interruptible=task.interruptible,
|
|
194
|
+
generates_deck=wrappers_pb2.BoolValue(value=task.report),
|
|
195
|
+
debuggable=task.debuggable,
|
|
196
|
+
log_links=log_links,
|
|
171
197
|
),
|
|
172
198
|
interface=transform_native_to_typed_interface(task.native_interface),
|
|
173
|
-
custom=custom,
|
|
199
|
+
custom=custom if len(custom) > 0 else None,
|
|
174
200
|
container=container,
|
|
175
201
|
task_type_version=task.task_type_version,
|
|
176
202
|
security_context=get_security_context(task.secrets),
|
|
@@ -179,25 +205,69 @@ def get_proto_task(task: TaskTemplate, serialize_context: SerializationContext)
|
|
|
179
205
|
sql=sql,
|
|
180
206
|
extended_resources=get_proto_extended_resources(task.resources),
|
|
181
207
|
)
|
|
182
|
-
|
|
208
|
+
|
|
209
|
+
if task.reusable is not None:
|
|
210
|
+
if not isinstance(task.reusable, ReusePolicy):
|
|
211
|
+
raise flyte.errors.RuntimeUserError(
|
|
212
|
+
"BadConfig", f"Expected ReusePolicy, got {type(task.reusable)} for task {task.name}"
|
|
213
|
+
)
|
|
214
|
+
env_name = None
|
|
215
|
+
if task.parent_env is not None:
|
|
216
|
+
env = task.parent_env()
|
|
217
|
+
if env is not None:
|
|
218
|
+
env_name = env.name
|
|
219
|
+
return add_reusable(task_template, task.reusable, serialize_context.code_bundle, env_name)
|
|
220
|
+
|
|
221
|
+
return task_template
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def lookup_image_in_cache(serialize_context: SerializationContext, env_name: str, image: flyte.Image) -> str:
|
|
225
|
+
if not serialize_context.image_cache or len(image._layers) == 0:
|
|
226
|
+
# This computes the image uri, computing hashes as necessary so can fail if done remotely.
|
|
227
|
+
return image.uri
|
|
228
|
+
elif serialize_context.image_cache and env_name not in serialize_context.image_cache.image_lookup:
|
|
229
|
+
raise flyte.errors.RuntimeUserError(
|
|
230
|
+
"MissingEnvironment",
|
|
231
|
+
f"Environment '{env_name}' not found in image cache.\n\n"
|
|
232
|
+
"💡 To fix this:\n"
|
|
233
|
+
" 1. If your parent environment calls a task in another environment,"
|
|
234
|
+
" declare that dependency using 'depends_on=[...]'.\n"
|
|
235
|
+
" Example:\n"
|
|
236
|
+
" env1 = flyte.TaskEnvironment(\n"
|
|
237
|
+
" name='outer',\n"
|
|
238
|
+
" image=flyte.Image.from_debian_base().with_pip_packages('requests'),\n"
|
|
239
|
+
" depends_on=[env2, env3],\n"
|
|
240
|
+
" )\n"
|
|
241
|
+
" 2. If you're using os.getenv() to set the environment name,"
|
|
242
|
+
" make sure the runtime environment has the same environment variable defined.\n"
|
|
243
|
+
" Example:\n"
|
|
244
|
+
" env = flyte.TaskEnvironment(\n"
|
|
245
|
+
' name=os.getenv("my-name"),\n'
|
|
246
|
+
' env_vars={"my-name": os.getenv("my-name")},\n'
|
|
247
|
+
" )\n",
|
|
248
|
+
)
|
|
249
|
+
return serialize_context.image_cache.image_lookup[env_name]
|
|
183
250
|
|
|
184
251
|
|
|
185
252
|
def _get_urun_container(
|
|
186
253
|
serialize_context: SerializationContext, task_template: TaskTemplate
|
|
187
254
|
) -> Optional[tasks_pb2.Container]:
|
|
188
255
|
env = (
|
|
189
|
-
[literals_pb2.KeyValuePair(key=k, value=v) for k, v in task_template.
|
|
256
|
+
[literals_pb2.KeyValuePair(key=k, value=v) for k, v in task_template.env_vars.items()]
|
|
257
|
+
if task_template.env_vars
|
|
258
|
+
else None
|
|
190
259
|
)
|
|
191
260
|
resources = get_proto_resources(task_template.resources)
|
|
192
|
-
|
|
193
|
-
|
|
261
|
+
|
|
262
|
+
img = task_template.image
|
|
263
|
+
if isinstance(img, str):
|
|
194
264
|
raise flyte.errors.RuntimeSystemError("BadConfig", "Image is not a valid image")
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
265
|
+
|
|
266
|
+
env_name = task_template.parent_env_name
|
|
267
|
+
if env_name is None:
|
|
268
|
+
raise flyte.errors.RuntimeSystemError("BadConfig", f"Task {task_template.name} has no parent environment name")
|
|
269
|
+
|
|
270
|
+
img_uri = lookup_image_in_cache(serialize_context, env_name, img)
|
|
201
271
|
|
|
202
272
|
return tasks_pb2.Container(
|
|
203
273
|
image=img_uri,
|
|
@@ -208,3 +278,106 @@ def _get_urun_container(
|
|
|
208
278
|
data_config=task_template.data_loading_config(serialize_context),
|
|
209
279
|
config=task_template.config(serialize_context),
|
|
210
280
|
)
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
def _sanitize_resource_name(resource: tasks_pb2.Resources.ResourceEntry) -> str:
|
|
284
|
+
return tasks_pb2.Resources.ResourceName.Name(resource.name).lower().replace("_", "-")
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
def _get_k8s_pod(primary_container: tasks_pb2.Container, pod_template: PodTemplate) -> Optional[tasks_pb2.K8sPod]:
|
|
288
|
+
"""
|
|
289
|
+
Get the K8sPod representation of the task template.
|
|
290
|
+
:param task: The task to convert.
|
|
291
|
+
:return: The K8sPod representation of the task template.
|
|
292
|
+
"""
|
|
293
|
+
from kubernetes.client import ApiClient, V1PodSpec
|
|
294
|
+
from kubernetes.client.models import V1EnvVar, V1ResourceRequirements
|
|
295
|
+
|
|
296
|
+
pod_template = copy.deepcopy(pod_template)
|
|
297
|
+
containers = cast(V1PodSpec, pod_template.pod_spec).containers
|
|
298
|
+
primary_exists = False
|
|
299
|
+
|
|
300
|
+
for container in containers:
|
|
301
|
+
if container.name == pod_template.primary_container_name:
|
|
302
|
+
primary_exists = True
|
|
303
|
+
break
|
|
304
|
+
|
|
305
|
+
if not primary_exists:
|
|
306
|
+
raise ValueError(
|
|
307
|
+
"No primary container defined in the pod spec."
|
|
308
|
+
f" You must define a primary container with the name '{pod_template.primary_container_name}'."
|
|
309
|
+
)
|
|
310
|
+
final_containers = []
|
|
311
|
+
|
|
312
|
+
for container in containers:
|
|
313
|
+
# We overwrite the primary container attributes with the values given to ContainerTask.
|
|
314
|
+
# The attributes include: image, command, args, resource, and env (env is unioned)
|
|
315
|
+
|
|
316
|
+
if container.name == pod_template.primary_container_name:
|
|
317
|
+
if container.image is None:
|
|
318
|
+
# Copy the image from primary_container only if the image is not specified in the pod spec.
|
|
319
|
+
container.image = primary_container.image
|
|
320
|
+
|
|
321
|
+
container.command = list(primary_container.command)
|
|
322
|
+
container.args = list(primary_container.args)
|
|
323
|
+
|
|
324
|
+
limits, requests = {}, {}
|
|
325
|
+
for resource in primary_container.resources.limits:
|
|
326
|
+
limits[_sanitize_resource_name(resource)] = resource.value
|
|
327
|
+
for resource in primary_container.resources.requests:
|
|
328
|
+
requests[_sanitize_resource_name(resource)] = resource.value
|
|
329
|
+
|
|
330
|
+
resource_requirements = V1ResourceRequirements(limits=limits, requests=requests)
|
|
331
|
+
if len(limits) > 0 or len(requests) > 0:
|
|
332
|
+
# Important! Only copy over resource requirements if they are non-empty.
|
|
333
|
+
container.resources = resource_requirements
|
|
334
|
+
|
|
335
|
+
if primary_container.env is not None:
|
|
336
|
+
container.env = [V1EnvVar(name=e.key, value=e.value) for e in primary_container.env] + (
|
|
337
|
+
container.env or []
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
final_containers.append(container)
|
|
341
|
+
|
|
342
|
+
cast(V1PodSpec, pod_template.pod_spec).containers = final_containers
|
|
343
|
+
pod_spec = ApiClient().sanitize_for_serialization(pod_template.pod_spec)
|
|
344
|
+
|
|
345
|
+
metadata = tasks_pb2.K8sObjectMetadata(labels=pod_template.labels, annotations=pod_template.annotations)
|
|
346
|
+
return tasks_pb2.K8sPod(pod_spec=pod_spec, metadata=metadata)
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
def extract_code_bundle(
|
|
350
|
+
task_spec: task_definition_pb2.TaskSpec,
|
|
351
|
+
) -> Optional[CodeBundle]:
|
|
352
|
+
"""
|
|
353
|
+
Extract the code bundle from the task spec.
|
|
354
|
+
:param task_spec: The task spec to extract the code bundle from.
|
|
355
|
+
:return: The extracted code bundle or None if not present.
|
|
356
|
+
"""
|
|
357
|
+
container = task_spec.task_template.container
|
|
358
|
+
if container and container.args:
|
|
359
|
+
pkl_path = None
|
|
360
|
+
tgz_path = None
|
|
361
|
+
dest_path: str = "."
|
|
362
|
+
version = ""
|
|
363
|
+
for i, v in enumerate(container.args):
|
|
364
|
+
if v == "--pkl":
|
|
365
|
+
# Extract the code bundle path from the argument
|
|
366
|
+
pkl_path = container.args[i + 1] if i + 1 < len(container.args) else None
|
|
367
|
+
elif v == "--tgz":
|
|
368
|
+
# Extract the code bundle path from the argument
|
|
369
|
+
tgz_path = container.args[i + 1] if i + 1 < len(container.args) else None
|
|
370
|
+
elif v == "--dest":
|
|
371
|
+
# Extract the destination path from the argument
|
|
372
|
+
dest_path = container.args[i + 1] if i + 1 < len(container.args) else "."
|
|
373
|
+
elif v == "--version":
|
|
374
|
+
# Extract the version from the argument
|
|
375
|
+
version = container.args[i + 1] if i + 1 < len(container.args) else ""
|
|
376
|
+
if pkl_path or tgz_path:
|
|
377
|
+
return CodeBundle(
|
|
378
|
+
destination=dest_path,
|
|
379
|
+
tgz=tgz_path,
|
|
380
|
+
pkl=pkl_path,
|
|
381
|
+
computed_version=version,
|
|
382
|
+
)
|
|
383
|
+
return None
|
|
@@ -4,15 +4,17 @@ invoked within a context tree.
|
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
import pathlib
|
|
7
|
+
import time
|
|
7
8
|
from typing import Any, Dict, List, Optional, Tuple
|
|
8
9
|
|
|
9
10
|
import flyte.report
|
|
10
11
|
from flyte._context import internal_ctx
|
|
11
|
-
from flyte._datastructures import ActionID, Checkpoints, CodeBundle, RawDataPath, TaskContext
|
|
12
12
|
from flyte._internal.imagebuild.image_builder import ImageCache
|
|
13
13
|
from flyte._logging import log, logger
|
|
14
|
+
from flyte._metrics import Stopwatch
|
|
14
15
|
from flyte._task import TaskTemplate
|
|
15
16
|
from flyte.errors import CustomError, RuntimeSystemError, RuntimeUnknownError, RuntimeUserError
|
|
17
|
+
from flyte.models import ActionID, Checkpoints, CodeBundle, RawDataPath, TaskContext
|
|
16
18
|
|
|
17
19
|
from .. import Controller
|
|
18
20
|
from .convert import (
|
|
@@ -110,41 +112,75 @@ async def run_task(
|
|
|
110
112
|
async def convert_and_run(
|
|
111
113
|
*,
|
|
112
114
|
task: TaskTemplate,
|
|
113
|
-
inputs: Inputs,
|
|
114
115
|
action: ActionID,
|
|
115
116
|
controller: Controller,
|
|
116
117
|
raw_data_path: RawDataPath,
|
|
117
118
|
version: str,
|
|
118
119
|
output_path: str,
|
|
119
120
|
run_base_dir: str,
|
|
121
|
+
inputs: Inputs = Inputs.empty(),
|
|
122
|
+
input_path: str | None = None,
|
|
120
123
|
checkpoints: Checkpoints | None = None,
|
|
121
124
|
code_bundle: CodeBundle | None = None,
|
|
122
125
|
image_cache: ImageCache | None = None,
|
|
126
|
+
interactive_mode: bool = False,
|
|
123
127
|
) -> Tuple[Optional[Outputs], Optional[Error]]:
|
|
124
128
|
"""
|
|
125
129
|
This method is used to convert the inputs to native types, and run the task. It assumes you are running
|
|
126
130
|
in a context tree.
|
|
127
131
|
"""
|
|
128
132
|
ctx = internal_ctx()
|
|
133
|
+
|
|
134
|
+
# Load inputs first to get context
|
|
135
|
+
if input_path:
|
|
136
|
+
sw = Stopwatch("load_inputs")
|
|
137
|
+
sw.start()
|
|
138
|
+
inputs = await load_inputs(input_path, path_rewrite_config=raw_data_path.path_rewrite)
|
|
139
|
+
sw.stop()
|
|
140
|
+
|
|
141
|
+
# Extract context from inputs
|
|
142
|
+
custom_context = inputs.context if inputs else {}
|
|
143
|
+
|
|
129
144
|
tctx = TaskContext(
|
|
130
145
|
action=action,
|
|
131
146
|
checkpoints=checkpoints,
|
|
132
147
|
code_bundle=code_bundle,
|
|
148
|
+
input_path=input_path,
|
|
133
149
|
output_path=output_path,
|
|
134
150
|
run_base_dir=run_base_dir,
|
|
135
151
|
version=version,
|
|
136
152
|
raw_data_path=raw_data_path,
|
|
137
153
|
compiled_image_cache=image_cache,
|
|
138
154
|
report=flyte.report.Report(name=action.name),
|
|
155
|
+
mode="remote" if not ctx.data.task_context else ctx.data.task_context.mode,
|
|
156
|
+
interactive_mode=interactive_mode,
|
|
157
|
+
custom_context=custom_context,
|
|
139
158
|
)
|
|
140
|
-
|
|
159
|
+
|
|
160
|
+
with ctx.replace_task_context(tctx):
|
|
161
|
+
sw = Stopwatch("convert_inputs_to_native")
|
|
162
|
+
sw.start()
|
|
141
163
|
inputs_kwargs = await convert_inputs_to_native(inputs, task.native_interface)
|
|
164
|
+
sw.stop()
|
|
165
|
+
|
|
166
|
+
sw = Stopwatch("run_task")
|
|
167
|
+
sw.start()
|
|
142
168
|
out, err = await run_task(tctx=tctx, controller=controller, task=task, inputs=inputs_kwargs)
|
|
169
|
+
sw.stop()
|
|
170
|
+
|
|
143
171
|
if err is not None:
|
|
144
172
|
return None, convert_from_native_to_error(err)
|
|
145
173
|
if task.report:
|
|
146
|
-
|
|
147
|
-
|
|
174
|
+
# Check if report has content before flushing to avoid overwriting
|
|
175
|
+
# worker reports (from Elastic/distributed tasks) with empty main process report
|
|
176
|
+
if ctx.get_report():
|
|
177
|
+
await flyte.report.flush.aio()
|
|
178
|
+
|
|
179
|
+
sw = Stopwatch("convert_outputs_from_native")
|
|
180
|
+
sw.start()
|
|
181
|
+
result = await convert_from_native_to_outputs(out, task.native_interface, task.name), None
|
|
182
|
+
sw.stop()
|
|
183
|
+
return result
|
|
148
184
|
|
|
149
185
|
|
|
150
186
|
async def extract_download_run_upload(
|
|
@@ -160,15 +196,17 @@ async def extract_download_run_upload(
|
|
|
160
196
|
code_bundle: CodeBundle | None = None,
|
|
161
197
|
input_path: str | None = None,
|
|
162
198
|
image_cache: ImageCache | None = None,
|
|
199
|
+
interactive_mode: bool = False,
|
|
163
200
|
):
|
|
164
201
|
"""
|
|
165
202
|
This method is invoked from the CLI (urun) and is used to run a task. This assumes that the context tree
|
|
166
203
|
has already been created, and the task has been loaded. It also handles the loading of the task.
|
|
167
204
|
"""
|
|
168
|
-
|
|
205
|
+
t = time.time()
|
|
206
|
+
logger.info(f"Task {action.name} started at {t}")
|
|
169
207
|
outputs, err = await convert_and_run(
|
|
170
208
|
task=task,
|
|
171
|
-
|
|
209
|
+
input_path=input_path,
|
|
172
210
|
action=action,
|
|
173
211
|
controller=controller,
|
|
174
212
|
raw_data_path=raw_data_path,
|
|
@@ -178,7 +216,9 @@ async def extract_download_run_upload(
|
|
|
178
216
|
checkpoints=checkpoints,
|
|
179
217
|
code_bundle=code_bundle,
|
|
180
218
|
image_cache=image_cache,
|
|
219
|
+
interactive_mode=interactive_mode,
|
|
181
220
|
)
|
|
221
|
+
logger.debug(f"Task {action.name} completed at {t}, with outputs: {outputs}")
|
|
182
222
|
if err is not None:
|
|
183
223
|
path = await upload_error(err.err, output_path)
|
|
184
224
|
logger.error(f"Task {task.name} failed with error: {err}. Uploaded error to {path}")
|
|
@@ -187,4 +227,4 @@ async def extract_download_run_upload(
|
|
|
187
227
|
logger.info(f"Task {task.name} completed successfully, no outputs")
|
|
188
228
|
return
|
|
189
229
|
await upload_outputs(outputs, output_path) if output_path else None
|
|
190
|
-
logger.info(f"Task {task.name} completed successfully, uploaded outputs to {output_path}")
|
|
230
|
+
logger.info(f"Task {task.name} completed successfully, uploaded outputs to {output_path} in {time.time() - t}s")
|