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
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import click
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
@click.group()
|
|
5
|
+
def _debug():
|
|
6
|
+
"""Debug commands for Flyte."""
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@_debug.command("resume")
|
|
10
|
+
@click.option("--pid", "-m", type=int, required=True, help="PID of the vscode server.")
|
|
11
|
+
def resume(pid):
|
|
12
|
+
"""
|
|
13
|
+
Resume a Flyte task for debugging purposes.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
pid (int): PID of the vscode server.
|
|
17
|
+
"""
|
|
18
|
+
import os
|
|
19
|
+
import signal
|
|
20
|
+
|
|
21
|
+
print("Terminating server and resuming task.")
|
|
22
|
+
answer = (
|
|
23
|
+
input(
|
|
24
|
+
"This operation will kill the server. All unsaved data will be lost,"
|
|
25
|
+
" and you will no longer be able to connect to it. Do you really want to terminate? (Y/N): "
|
|
26
|
+
)
|
|
27
|
+
.strip()
|
|
28
|
+
.upper()
|
|
29
|
+
)
|
|
30
|
+
if answer == "Y":
|
|
31
|
+
os.kill(pid, signal.SIGTERM)
|
|
32
|
+
print("The server has been terminated and the task has been resumed.")
|
|
33
|
+
else:
|
|
34
|
+
print("Operation canceled.")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
if __name__ == "__main__":
|
|
38
|
+
_debug()
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Flyte runtime module, this is the entrypoint script for the Flyte runtime.
|
|
3
|
+
|
|
4
|
+
Caution: Startup time for this module is very important, as it is the entrypoint for the Flyte runtime.
|
|
5
|
+
Refrain from importing any modules here. If you need to import any modules, do it inside the main function.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import asyncio
|
|
9
|
+
import os
|
|
10
|
+
import sys
|
|
11
|
+
from typing import List
|
|
12
|
+
|
|
13
|
+
import click
|
|
14
|
+
|
|
15
|
+
from flyte.models import PathRewrite
|
|
16
|
+
|
|
17
|
+
ACTION_NAME = "ACTION_NAME"
|
|
18
|
+
RUN_NAME = "RUN_NAME"
|
|
19
|
+
PROJECT_NAME = "FLYTE_INTERNAL_EXECUTION_PROJECT"
|
|
20
|
+
DOMAIN_NAME = "FLYTE_INTERNAL_EXECUTION_DOMAIN"
|
|
21
|
+
ORG_NAME = "_U_ORG_NAME"
|
|
22
|
+
ENDPOINT_OVERRIDE = "_U_EP_OVERRIDE"
|
|
23
|
+
INSECURE_SKIP_VERIFY_OVERRIDE = "_U_INSECURE_SKIP_VERIFY"
|
|
24
|
+
RUN_OUTPUT_BASE_DIR = "_U_RUN_BASE"
|
|
25
|
+
FLYTE_ENABLE_VSCODE_KEY = "_F_E_VS"
|
|
26
|
+
|
|
27
|
+
_UNION_EAGER_API_KEY_ENV_VAR = "_UNION_EAGER_API_KEY"
|
|
28
|
+
_F_PATH_REWRITE = "_F_PATH_REWRITE"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@click.group()
|
|
32
|
+
def _pass_through():
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@_pass_through.command("a0")
|
|
37
|
+
@click.option("--inputs", "-i", required=True)
|
|
38
|
+
@click.option("--outputs-path", "-o", required=True)
|
|
39
|
+
@click.option("--version", "-v", required=True)
|
|
40
|
+
@click.option("--run-base-dir", envvar=RUN_OUTPUT_BASE_DIR, required=True)
|
|
41
|
+
@click.option("--raw-data-path", "-r", required=False)
|
|
42
|
+
@click.option("--checkpoint-path", "-c", required=False)
|
|
43
|
+
@click.option("--prev-checkpoint", "-p", required=False)
|
|
44
|
+
@click.option("--name", envvar=ACTION_NAME, required=False)
|
|
45
|
+
@click.option("--run-name", envvar=RUN_NAME, required=False)
|
|
46
|
+
@click.option("--project", envvar=PROJECT_NAME, required=False)
|
|
47
|
+
@click.option("--domain", envvar=DOMAIN_NAME, required=False)
|
|
48
|
+
@click.option("--org", envvar=ORG_NAME, required=False)
|
|
49
|
+
@click.option("--debug", envvar=FLYTE_ENABLE_VSCODE_KEY, type=click.BOOL, required=False)
|
|
50
|
+
@click.option("--interactive-mode", type=click.BOOL, required=False)
|
|
51
|
+
@click.option("--image-cache", required=False)
|
|
52
|
+
@click.option("--tgz", required=False)
|
|
53
|
+
@click.option("--pkl", required=False)
|
|
54
|
+
@click.option("--dest", required=False)
|
|
55
|
+
@click.option("--resolver", required=False)
|
|
56
|
+
@click.argument(
|
|
57
|
+
"resolver-args",
|
|
58
|
+
type=click.UNPROCESSED,
|
|
59
|
+
nargs=-1,
|
|
60
|
+
)
|
|
61
|
+
@click.pass_context
|
|
62
|
+
def main(
|
|
63
|
+
ctx: click.Context,
|
|
64
|
+
run_name: str,
|
|
65
|
+
name: str,
|
|
66
|
+
project: str,
|
|
67
|
+
domain: str,
|
|
68
|
+
org: str,
|
|
69
|
+
debug: bool,
|
|
70
|
+
interactive_mode: bool,
|
|
71
|
+
image_cache: str,
|
|
72
|
+
version: str,
|
|
73
|
+
inputs: str,
|
|
74
|
+
run_base_dir: str,
|
|
75
|
+
outputs_path: str,
|
|
76
|
+
raw_data_path: str,
|
|
77
|
+
checkpoint_path: str,
|
|
78
|
+
prev_checkpoint: str,
|
|
79
|
+
tgz: str,
|
|
80
|
+
pkl: str,
|
|
81
|
+
dest: str,
|
|
82
|
+
resolver: str,
|
|
83
|
+
resolver_args: List[str],
|
|
84
|
+
):
|
|
85
|
+
sys.path.insert(0, ".")
|
|
86
|
+
|
|
87
|
+
import faulthandler
|
|
88
|
+
import signal
|
|
89
|
+
|
|
90
|
+
import flyte
|
|
91
|
+
import flyte._utils as utils
|
|
92
|
+
import flyte.errors
|
|
93
|
+
import flyte.storage as storage
|
|
94
|
+
from flyte._initialize import init_in_cluster
|
|
95
|
+
from flyte._internal.controllers import create_controller
|
|
96
|
+
from flyte._internal.imagebuild.image_builder import ImageCache
|
|
97
|
+
from flyte._internal.runtime.entrypoints import load_and_run_task
|
|
98
|
+
from flyte._logging import logger
|
|
99
|
+
from flyte.models import ActionID, Checkpoints, CodeBundle, RawDataPath
|
|
100
|
+
|
|
101
|
+
logger.info("Registering faulthandler for SIGUSR1")
|
|
102
|
+
faulthandler.register(signal.SIGUSR1)
|
|
103
|
+
|
|
104
|
+
logger.info(f"Initializing flyte runtime - version {flyte.__version__}")
|
|
105
|
+
assert org, "Org is required for now"
|
|
106
|
+
assert project, "Project is required"
|
|
107
|
+
assert domain, "Domain is required"
|
|
108
|
+
assert run_name, f"Run name is required {run_name}"
|
|
109
|
+
assert name, f"Action name is required {name}"
|
|
110
|
+
|
|
111
|
+
if run_name.startswith("{{"):
|
|
112
|
+
run_name = os.getenv("RUN_NAME", "")
|
|
113
|
+
if name.startswith("{{"):
|
|
114
|
+
name = os.getenv("ACTION_NAME", "")
|
|
115
|
+
|
|
116
|
+
logger.warning(f"Flyte runtime started for action {name} with run name {run_name}")
|
|
117
|
+
|
|
118
|
+
if debug and name == "a0":
|
|
119
|
+
from flyte._debug.vscode import _start_vscode_server
|
|
120
|
+
|
|
121
|
+
asyncio.run(_start_vscode_server(ctx))
|
|
122
|
+
|
|
123
|
+
bundle = None
|
|
124
|
+
if tgz or pkl:
|
|
125
|
+
bundle = CodeBundle(tgz=tgz, pkl=pkl, destination=dest, computed_version=version)
|
|
126
|
+
|
|
127
|
+
controller_kwargs = init_in_cluster(org=org, project=project, domain=domain)
|
|
128
|
+
# Controller is created with the same kwargs as init, so that it can be used to run tasks
|
|
129
|
+
controller = create_controller(ct="remote", **controller_kwargs)
|
|
130
|
+
|
|
131
|
+
ic = ImageCache.from_transport(image_cache) if image_cache else None
|
|
132
|
+
|
|
133
|
+
path_rewrite_cfg = os.getenv(_F_PATH_REWRITE, None)
|
|
134
|
+
path_rewrite = None
|
|
135
|
+
if path_rewrite_cfg:
|
|
136
|
+
potential_path_rewrite = PathRewrite.from_str(path_rewrite_cfg)
|
|
137
|
+
if storage.exists_sync(potential_path_rewrite.new_prefix):
|
|
138
|
+
path_rewrite = potential_path_rewrite
|
|
139
|
+
logger.info(f"Path rewrite configured for {path_rewrite.new_prefix}")
|
|
140
|
+
else:
|
|
141
|
+
logger.error(
|
|
142
|
+
f"Path rewrite failed for path {potential_path_rewrite.new_prefix}, "
|
|
143
|
+
f"not found, reverting to original path {potential_path_rewrite.old_prefix}"
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
# Create a coroutine to load the task and run it
|
|
147
|
+
task_coroutine = load_and_run_task(
|
|
148
|
+
resolver=resolver,
|
|
149
|
+
resolver_args=resolver_args,
|
|
150
|
+
action=ActionID(name=name, run_name=run_name, project=project, domain=domain, org=org),
|
|
151
|
+
raw_data_path=RawDataPath(path=raw_data_path, path_rewrite=path_rewrite),
|
|
152
|
+
checkpoints=Checkpoints(checkpoint_path, prev_checkpoint),
|
|
153
|
+
code_bundle=bundle,
|
|
154
|
+
input_path=inputs,
|
|
155
|
+
output_path=outputs_path,
|
|
156
|
+
run_base_dir=run_base_dir,
|
|
157
|
+
version=version,
|
|
158
|
+
controller=controller,
|
|
159
|
+
image_cache=ic,
|
|
160
|
+
interactive_mode=interactive_mode or debug,
|
|
161
|
+
)
|
|
162
|
+
# Create a coroutine to watch for errors
|
|
163
|
+
controller_failure = controller.watch_for_errors()
|
|
164
|
+
|
|
165
|
+
# Run both coroutines concurrently and wait for first to finish and cancel the other
|
|
166
|
+
async def _run_and_stop():
|
|
167
|
+
loop = asyncio.get_event_loop()
|
|
168
|
+
loop.set_exception_handler(flyte.errors.silence_grpc_polling_error)
|
|
169
|
+
try:
|
|
170
|
+
await utils.run_coros(controller_failure, task_coroutine)
|
|
171
|
+
await controller.stop()
|
|
172
|
+
except flyte.errors.RuntimeSystemError as e:
|
|
173
|
+
logger.error(f"Runtime system error: {e}")
|
|
174
|
+
from flyte._internal.runtime.convert import convert_from_native_to_error
|
|
175
|
+
from flyte._internal.runtime.io import upload_error
|
|
176
|
+
|
|
177
|
+
logger.error(f"Flyte runtime failed for action {name} with run name {run_name}, error: {e}")
|
|
178
|
+
err = convert_from_native_to_error(e)
|
|
179
|
+
path = await upload_error(err.err, outputs_path)
|
|
180
|
+
logger.error(f"Run {run_name} Action {name} failed with error: {err}. Uploaded error to {path}")
|
|
181
|
+
await controller.stop()
|
|
182
|
+
|
|
183
|
+
asyncio.run(_run_and_stop())
|
|
184
|
+
logger.warning(f"Flyte runtime completed for action {name} with run name {run_name}")
|
|
185
|
+
for h in logger.handlers:
|
|
186
|
+
h.flush()
|
|
187
|
+
sys.stdout.flush()
|
|
188
|
+
# We os._exit here to ensure that grpc does not block the exiting! grpc currently has a graceful shutdown system
|
|
189
|
+
# that blocks the process from exiting
|
|
190
|
+
os._exit(0)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
if __name__ == "__main__":
|
|
194
|
+
_pass_through()
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: flyte
|
|
3
|
+
Version: 2.0.0b46
|
|
4
|
+
Summary: Add your description here
|
|
5
|
+
Author-email: Ketan Umare <kumare3@users.noreply.github.com>
|
|
6
|
+
Requires-Python: >=3.10
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Requires-Dist: aiofiles>=24.1.0
|
|
10
|
+
Requires-Dist: click>=8.2.1
|
|
11
|
+
Requires-Dist: flyteidl<2.0.0,>=1.15.4b0
|
|
12
|
+
Requires-Dist: cloudpickle>=3.1.1
|
|
13
|
+
Requires-Dist: docstring_parser>=0.16
|
|
14
|
+
Requires-Dist: fsspec>=2025.3.0
|
|
15
|
+
Requires-Dist: grpcio>=1.71.0
|
|
16
|
+
Requires-Dist: obstore>=0.7.3
|
|
17
|
+
Requires-Dist: protobuf>=6.30.1
|
|
18
|
+
Requires-Dist: pydantic>=2.10.6
|
|
19
|
+
Requires-Dist: pyyaml>=6.0.2
|
|
20
|
+
Requires-Dist: rich-click==1.8.9
|
|
21
|
+
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
22
|
+
Requires-Dist: keyring>=25.6.0
|
|
23
|
+
Requires-Dist: msgpack>=1.1.0
|
|
24
|
+
Requires-Dist: toml>=0.10.2
|
|
25
|
+
Requires-Dist: async-lru>=2.0.5
|
|
26
|
+
Requires-Dist: mashumaro
|
|
27
|
+
Requires-Dist: aiolimiter>=1.2.1
|
|
28
|
+
Requires-Dist: flyteidl2==2.0.0
|
|
29
|
+
Requires-Dist: packaging
|
|
30
|
+
Provides-Extra: aiosqlite
|
|
31
|
+
Requires-Dist: aiosqlite>=0.21.0; extra == "aiosqlite"
|
|
32
|
+
Provides-Extra: connector
|
|
33
|
+
Requires-Dist: grpcio-health-checking; extra == "connector"
|
|
34
|
+
Requires-Dist: httpx; extra == "connector"
|
|
35
|
+
Requires-Dist: prometheus-client; extra == "connector"
|
|
36
|
+
Dynamic: license-file
|
|
37
|
+
|
|
38
|
+
# Flyte 2 SDK ๐
|
|
39
|
+
|
|
40
|
+
**Type-safe, distributed orchestration of agents, ML pipelines, and more โ in pure Python with async/await or sync!**
|
|
41
|
+
|
|
42
|
+
[](https://pypi.org/project/flyte/)
|
|
43
|
+
[](https://pypi.org/project/flyte/)
|
|
44
|
+
[](LICENSE)
|
|
45
|
+
|
|
46
|
+
> โก **Pure Python workflows** โข ๐ **Async-first parallelism** โข ๐ ๏ธ **Zero DSL constraints** โข ๐ **Sub-task observability**
|
|
47
|
+
|
|
48
|
+
## ๐ Ecosystem & Resources
|
|
49
|
+
|
|
50
|
+
- **๐ Documentation**: [Docs Link](https://www.union.ai/docs/v2/flyte/user-guide/)
|
|
51
|
+
- **โถ๏ธ Getting Started**: [Docs Link](https://www.union.ai/docs/v2/flyte/user-guide/getting-started/)
|
|
52
|
+
- **๐ฌ Community**: [Slack](https://slack.flyte.org/) | [GitHub Discussions](https://github.com/flyteorg/flyte/discussions)
|
|
53
|
+
- **๐ Examples**: [GitHub Examples](https://github.com/flyteorg/flyte-sdk/tree/main/examples)
|
|
54
|
+
- **๐ Issues**: [Bug Reports](https://github.com/flyteorg/flyte/issues)
|
|
55
|
+
|
|
56
|
+
## What is Flyte 2?
|
|
57
|
+
|
|
58
|
+
Flyte 2 represents a fundamental shift from constrained domain-specific languages to **pure Python workflows**. Write data pipelines, ML training jobs, and distributed compute exactly like you write Pythonโbecause it *is* Python.
|
|
59
|
+
|
|
60
|
+
```python
|
|
61
|
+
import flyte
|
|
62
|
+
|
|
63
|
+
env = flyte.TaskEnvironment("hello_world")
|
|
64
|
+
|
|
65
|
+
@env.task
|
|
66
|
+
async def process_data(data: list[str]) -> list[str]:
|
|
67
|
+
# Use any Python construct: loops, conditionals, try/except
|
|
68
|
+
results = []
|
|
69
|
+
for item in data:
|
|
70
|
+
if len(item) > 5:
|
|
71
|
+
results.append(await transform_item(item))
|
|
72
|
+
return results
|
|
73
|
+
|
|
74
|
+
@env.task
|
|
75
|
+
async def transform_item(item: str) -> str:
|
|
76
|
+
return f"processed: {item.upper()}"
|
|
77
|
+
|
|
78
|
+
if __name__ == "__main__":
|
|
79
|
+
flyte.init()
|
|
80
|
+
result = flyte.run(process_data, data=["hello", "world", "flyte"])
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## ๐ Why Flyte 2?
|
|
84
|
+
|
|
85
|
+
| Feature Highlight | Flyte 1 | Flyte 2 |
|
|
86
|
+
|-| ------- | ------- |
|
|
87
|
+
| **No More Workflow DSL** | โ `@workflow` decorators with Python subset limitations | โ
**Pure Python**: loops, conditionals, error handling, dynamic structures |
|
|
88
|
+
| **Async-First Parallelism** | โ Custom `map()` functions and workflow-specific parallel constructs | โ
**Native `asyncio`**: `await asyncio.gather()` for distributed parallel execution |
|
|
89
|
+
| **Fine-Grained Observability** | โ Task-level logging only | โ
**Function-level tracing** with `@flyte.trace` for sub-task checkpoints |
|
|
90
|
+
|
|
91
|
+
## ๐ Quick Start
|
|
92
|
+
|
|
93
|
+
### Installation
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Install uv package manager
|
|
97
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
98
|
+
|
|
99
|
+
# Create virtual environment
|
|
100
|
+
uv venv && source .venv/bin/activate
|
|
101
|
+
|
|
102
|
+
# Install Flyte 2 (beta)
|
|
103
|
+
uv pip install --prerelease=allow flyte
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Your First Workflow
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
# hello.py
|
|
110
|
+
# /// script
|
|
111
|
+
# requires-python = ">=3.10"
|
|
112
|
+
# dependencies = ["flyte>=2.0.0b0"]
|
|
113
|
+
# ///
|
|
114
|
+
|
|
115
|
+
import flyte
|
|
116
|
+
|
|
117
|
+
env = flyte.TaskEnvironment(
|
|
118
|
+
name="hello_world",
|
|
119
|
+
resources=flyte.Resources(memory="250Mi")
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
@env.task
|
|
123
|
+
def calculate(x: int) -> int:
|
|
124
|
+
return x * 2 + 5
|
|
125
|
+
|
|
126
|
+
@env.task
|
|
127
|
+
async def main(numbers: list[int]) -> float:
|
|
128
|
+
# Parallel execution across distributed containers
|
|
129
|
+
results = await asyncio.gather(*[
|
|
130
|
+
calculate.aio(num) for num in numbers
|
|
131
|
+
])
|
|
132
|
+
return sum(results) / len(results)
|
|
133
|
+
|
|
134
|
+
if __name__ == "__main__":
|
|
135
|
+
flyte.init_from_config("config.yaml")
|
|
136
|
+
run = flyte.run(main, numbers=list(range(10)))
|
|
137
|
+
print(f"Result: {run.result}")
|
|
138
|
+
print(f"View at: {run.url}")
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# Run locally, execute remotely
|
|
143
|
+
uv run --prerelease=allow hello.py
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## ๐๏ธ Core Concepts
|
|
147
|
+
|
|
148
|
+
### **TaskEnvironments**: Container Configuration Made Simple
|
|
149
|
+
|
|
150
|
+
```python
|
|
151
|
+
# Group tasks with shared configuration
|
|
152
|
+
env = flyte.TaskEnvironment(
|
|
153
|
+
name="ml_pipeline",
|
|
154
|
+
image=flyte.Image.from_debian_base().with_pip_packages(
|
|
155
|
+
"torch", "pandas", "scikit-learn"
|
|
156
|
+
),
|
|
157
|
+
resources=flyte.Resources(cpu=4, memory="8Gi", gpu=1),
|
|
158
|
+
reusable=flyte.ReusePolicy(replicas=3, idle_ttl=300)
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
@env.task
|
|
162
|
+
def train_model(data: flyte.io.File) -> flyte.io.File:
|
|
163
|
+
# Runs in configured container with GPU access
|
|
164
|
+
pass
|
|
165
|
+
|
|
166
|
+
@env.task
|
|
167
|
+
def evaluate_model(model: flyte.io.File, test_data: flyte.io.File) -> dict:
|
|
168
|
+
# Same container configuration, different instance
|
|
169
|
+
pass
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### **Pure Python Workflows**: No More DSL Constraints
|
|
173
|
+
|
|
174
|
+
```python
|
|
175
|
+
@env.task
|
|
176
|
+
async def dynamic_pipeline(config: dict) -> list[str]:
|
|
177
|
+
results = []
|
|
178
|
+
|
|
179
|
+
# โ
Use any Python construct
|
|
180
|
+
for dataset in config["datasets"]:
|
|
181
|
+
try:
|
|
182
|
+
# โ
Native error handling
|
|
183
|
+
if dataset["type"] == "batch":
|
|
184
|
+
result = await process_batch(dataset)
|
|
185
|
+
else:
|
|
186
|
+
result = await process_stream(dataset)
|
|
187
|
+
results.append(result)
|
|
188
|
+
except ValidationError as e:
|
|
189
|
+
# โ
Custom error recovery
|
|
190
|
+
result = await handle_error(dataset, e)
|
|
191
|
+
results.append(result)
|
|
192
|
+
|
|
193
|
+
return results
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### **Async Parallelism**: Distributed by Default
|
|
197
|
+
|
|
198
|
+
```python
|
|
199
|
+
@env.task
|
|
200
|
+
async def parallel_training(hyperparams: list[dict]) -> dict:
|
|
201
|
+
# Each model trains on separate infrastructure
|
|
202
|
+
models = await asyncio.gather(*[
|
|
203
|
+
train_model.aio(params) for params in hyperparams
|
|
204
|
+
])
|
|
205
|
+
|
|
206
|
+
# Evaluate all models in parallel
|
|
207
|
+
evaluations = await asyncio.gather(*[
|
|
208
|
+
evaluate_model.aio(model) for model in models
|
|
209
|
+
])
|
|
210
|
+
|
|
211
|
+
# Find best model
|
|
212
|
+
best_idx = max(range(len(evaluations)),
|
|
213
|
+
key=lambda i: evaluations[i]["accuracy"])
|
|
214
|
+
return {"best_model": models[best_idx], "accuracy": evaluations[best_idx]}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## ๐ฏ Advanced Features
|
|
218
|
+
|
|
219
|
+
### **Sub-Task Observability with Tracing**
|
|
220
|
+
|
|
221
|
+
```python
|
|
222
|
+
@flyte.trace
|
|
223
|
+
async def expensive_computation(data: str) -> str:
|
|
224
|
+
# Function-level checkpointing - recoverable on failure
|
|
225
|
+
result = await call_external_api(data)
|
|
226
|
+
return process_result(result)
|
|
227
|
+
|
|
228
|
+
@env.task(cache=flyte.Cache(behavior="auto"))
|
|
229
|
+
async def main_task(inputs: list[str]) -> list[str]:
|
|
230
|
+
results = []
|
|
231
|
+
for inp in inputs:
|
|
232
|
+
# If task fails here, it resumes from the last successful trace
|
|
233
|
+
result = await expensive_computation(inp)
|
|
234
|
+
results.append(result)
|
|
235
|
+
return results
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### **Remote Task Execution**
|
|
239
|
+
|
|
240
|
+
```python
|
|
241
|
+
import flyte.remote
|
|
242
|
+
|
|
243
|
+
# Remote tasks deployed elsewhere
|
|
244
|
+
torch_task = flyte.remote.Task.get("torch_env.train_model", auto_version="latest")
|
|
245
|
+
spark_task = flyte.remote.Task.get("spark_env.process_data", auto_version="latest")
|
|
246
|
+
|
|
247
|
+
@env.task
|
|
248
|
+
async def orchestrator(raw_data: flyte.io.File) -> flyte.io.File:
|
|
249
|
+
# Execute Spark job on big data cluster
|
|
250
|
+
processed = await spark_task(raw_data)
|
|
251
|
+
|
|
252
|
+
# Execute PyTorch training on GPU cluster
|
|
253
|
+
model = await torch_task(processed)
|
|
254
|
+
|
|
255
|
+
return model
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## ๐ Native Jupyter Integration
|
|
259
|
+
|
|
260
|
+
Run and monitor workflows directly from notebooks:
|
|
261
|
+
|
|
262
|
+
```python
|
|
263
|
+
# In Jupyter cell
|
|
264
|
+
import flyte
|
|
265
|
+
|
|
266
|
+
flyte.init_from_config()
|
|
267
|
+
run = flyte.run(my_workflow, data=large_dataset)
|
|
268
|
+
|
|
269
|
+
# Stream logs in real-time
|
|
270
|
+
run.logs.stream()
|
|
271
|
+
|
|
272
|
+
# Get outputs when complete
|
|
273
|
+
results = run.wait()
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
## ๐ง Configuration & Deployment
|
|
277
|
+
|
|
278
|
+
### Configuration File
|
|
279
|
+
|
|
280
|
+
```yaml
|
|
281
|
+
# config.yaml
|
|
282
|
+
endpoint: https://my-flyte-instance.com
|
|
283
|
+
project: ml-team
|
|
284
|
+
domain: production
|
|
285
|
+
image:
|
|
286
|
+
builder: local
|
|
287
|
+
registry: ghcr.io/my-org
|
|
288
|
+
auth:
|
|
289
|
+
type: oauth2
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Deploy and Run
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
# Deploy tasks to remote cluster
|
|
296
|
+
flyte deploy my_workflow.py
|
|
297
|
+
|
|
298
|
+
# Run deployed workflow
|
|
299
|
+
flyte run my_workflow --input-file params.json
|
|
300
|
+
|
|
301
|
+
# Monitor execution
|
|
302
|
+
flyte logs <execution-id>
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
## Migration from Flyte 1
|
|
306
|
+
|
|
307
|
+
| Flyte 1 | Flyte 2 |
|
|
308
|
+
|---------|---------|
|
|
309
|
+
| `@workflow` + `@task` | `@env.task` only |
|
|
310
|
+
| `flytekit.map()` | `await asyncio.gather()` |
|
|
311
|
+
| `@dynamic` workflows | Regular `@env.task` with loops |
|
|
312
|
+
| `flytekit.conditional()` | Python `if/else` |
|
|
313
|
+
| `LaunchPlan` schedules | `@env.task(on_schedule=...)` |
|
|
314
|
+
| Workflow failure handlers | Python `try/except` |
|
|
315
|
+
|
|
316
|
+
## ๐ค Contributing
|
|
317
|
+
|
|
318
|
+
We welcome contributions! Whether it's:
|
|
319
|
+
|
|
320
|
+
- ๐ **Bug fixes**
|
|
321
|
+
- โจ **New features**
|
|
322
|
+
- ๐ **Documentation improvements**
|
|
323
|
+
- ๐งช **Testing enhancements**
|
|
324
|
+
|
|
325
|
+
### Setup & Iteration Cycle
|
|
326
|
+
To get started, make sure you start from a new virtual environment and install this package in editable mode with any of the supported Python versions, from 3.10 to 3.13.
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
uv venv --python 3.13
|
|
330
|
+
uv pip install -e .
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
Besides from picking up local code changes, installing the package in editable mode
|
|
334
|
+
also changes the definition of the default `Image()` object to use a locally
|
|
335
|
+
build wheel. You will need to build said wheel by yourself though, with the `make dist` target.
|
|
336
|
+
|
|
337
|
+
```bash
|
|
338
|
+
make dist
|
|
339
|
+
python maint_tools/build_default_image.py
|
|
340
|
+
```
|
|
341
|
+
You'll need to have a local docker daemon running for this. The build script does nothing
|
|
342
|
+
more than invoke the local image builder, which will create a buildx builder named `flytex` if not present. Note that only members of the `Flyte Maintainers` group has
|
|
343
|
+
access to push to the default registry. If you don't have access, please make sure to
|
|
344
|
+
specify the registry and name to the build script.
|
|
345
|
+
|
|
346
|
+
```bash
|
|
347
|
+
python maint_tools/build_default_image.py --registry ghcr.io/my-org --name my-flyte-image
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
## ๐ License
|
|
351
|
+
|
|
352
|
+
Flyte 2 is licensed under the [Apache 2.0 License](LICENSE).
|