metaflow 2.11.12__tar.gz → 2.11.13__tar.gz
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.
- {metaflow-2.11.12/metaflow.egg-info → metaflow-2.11.13}/PKG-INFO +2 -2
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/metaflow_config.py +4 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/argo/argo_workflows.py +162 -20
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/argo/argo_workflows_decorator.py +3 -0
- metaflow-2.11.13/metaflow/plugins/argo/generate_input_paths.py +23 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/datatools/s3/s3.py +1 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/kubernetes/kubernetes_decorator.py +12 -0
- metaflow-2.11.13/metaflow/version.py +1 -0
- {metaflow-2.11.12 → metaflow-2.11.13/metaflow.egg-info}/PKG-INFO +2 -2
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow.egg-info/SOURCES.txt +1 -1
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow.egg-info/requires.txt +1 -1
- metaflow-2.11.12/metaflow/plugins/argo/process_input_paths.py +0 -19
- metaflow-2.11.12/metaflow/version.py +0 -1
- {metaflow-2.11.12 → metaflow-2.11.13}/LICENSE +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/MANIFEST.in +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/README.md +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/R.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/_bashcomplete.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/_compat.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/_termui_impl.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/_textwrap.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/_unicodefun.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/_winconsole.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/core.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/decorators.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/exceptions.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/formatting.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/globals.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/parser.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/termui.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/testing.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/types.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/click/utils.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/packaging/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/packaging/_elffile.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/packaging/_manylinux.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/packaging/_musllinux.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/packaging/_parser.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/packaging/_structures.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/packaging/markers.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/packaging/py.typed +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/packaging/requirements.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/packaging/specifiers.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/packaging/tags.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/packaging/utils.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/packaging/version.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_5/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_5/zipp.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_6/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_6/zipp.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_7/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_7/zipp.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/cards.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/cli.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/cli_args.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/client/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/client/core.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/client/filecache.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/clone_util.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/cmd/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/cmd/configure_cmd.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/cmd/develop/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/cmd/develop/stub_generator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/cmd/develop/stubs.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/cmd/main_cli.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/cmd/tutorials_cmd.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/cmd/util.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/cmd_with_io.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/datastore/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/datastore/content_addressed_store.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/datastore/datastore_set.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/datastore/datastore_storage.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/datastore/exceptions.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/datastore/flow_datastore.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/datastore/inputs.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/datastore/task_datastore.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/debug.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/decorators.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/event_logger.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/events.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/exception.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/extension_support/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/extension_support/_empty_file.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/extension_support/cmd.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/extension_support/integrations.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/extension_support/plugins.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/flowspec.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/graph.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/includefile.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/integrations.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/lint.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/metadata/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/metadata/heartbeat.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/metadata/metadata.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/metadata/util.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/metaflow_config_funcs.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/metaflow_current.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/metaflow_environment.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/metaflow_profile.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/metaflow_version.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/mflog/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/mflog/mflog.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/mflog/save_logs.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/mflog/save_logs_periodically.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/mflog/tee.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/monitor.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/multicore_utils.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/package.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/parameters.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/airflow/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/airflow/airflow.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/airflow/airflow_cli.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/airflow/airflow_utils.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/airflow/dag.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/airflow/exception.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/argo/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/argo/argo_client.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/argo/argo_events.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/aws_client.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/aws_utils.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/batch/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/batch/batch.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/batch/batch_client.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/azure/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/azure/azure_exceptions.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/azure/azure_tail.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/azure/azure_utils.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/azure/includefile_support.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_cli.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_client.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_creator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_datastore.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_modules/base.html +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_modules/basic.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_modules/card.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_modules/components.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_modules/main.js +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_resolver.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_server.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/component_serializer.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/cards/exception.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/catch_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/datastores/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/datastores/azure_storage.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/datastores/gs_storage.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/datastores/local_storage.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/datastores/s3_storage.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/datatools/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/datatools/local.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/datatools/s3/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/datatools/s3/s3op.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/datatools/s3/s3util.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/debug_logger.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/debug_monitor.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/client.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/client_modules.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/communication/channel.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/communication/utils.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/consts.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/data_transferer.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/override_decorators.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/server.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/stub.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/env_escape/utils.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/environment_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/events_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/frameworks/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/frameworks/pytorch.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/gcp/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/gcp/gs_tail.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/gcp/gs_utils.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/gcp/includefile_support.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/kubernetes/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/kubernetes/kubernetes.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/kubernetes/kubernetes_cli.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/metadata/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/metadata/local.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/metadata/service.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/package_cli.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/parallel_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/project_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/pypi/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/pypi/bootstrap.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/pypi/conda_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/pypi/conda_environment.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/pypi/micromamba.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/pypi/pip.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/pypi/pypi_environment.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/pypi/utils.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/resources_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/retry_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/secrets/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/storage_executor.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/tag_cli.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/plugins/timeout_decorator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/procpoll.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/py.typed +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/pylint_wrapper.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/runtime.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/sidecar/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/sidecar/sidecar.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/sidecar/sidecar_messages.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/sidecar/sidecar_subprocess.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/sidecar/sidecar_worker.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tagging_util.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/task.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tracing/__init__.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tracing/propagator.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tracing/span_exporter.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tracing/tracing_modules.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/00-helloworld/README.md +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/01-playlist/README.md +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/01-playlist/movies.csv +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/01-playlist/playlist.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/02-statistics/README.md +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/02-statistics/movies.csv +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/02-statistics/stats.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/07-worldview/README.md +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/08-autopilot/README.md +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/unbounded_foreach.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/util.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow/vendor.py +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow.egg-info/dependency_links.txt +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow.egg-info/entry_points.txt +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/metaflow.egg-info/top_level.txt +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/setup.cfg +0 -0
- {metaflow-2.11.12 → metaflow-2.11.13}/setup.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: metaflow
|
3
|
-
Version: 2.11.
|
3
|
+
Version: 2.11.13
|
4
4
|
Summary: Metaflow: More Data Science, Less Engineering
|
5
5
|
Author: Metaflow Developers
|
6
6
|
Author-email: help@metaflow.org
|
@@ -26,7 +26,7 @@ License-File: LICENSE
|
|
26
26
|
Requires-Dist: requests
|
27
27
|
Requires-Dist: boto3
|
28
28
|
Provides-Extra: stubs
|
29
|
-
Requires-Dist: metaflow-stubs==2.11.
|
29
|
+
Requires-Dist: metaflow-stubs==2.11.13; extra == "stubs"
|
30
30
|
|
31
31
|

|
32
32
|
|
@@ -314,6 +314,10 @@ KUBERNETES_FETCH_EC2_METADATA = from_conf("KUBERNETES_FETCH_EC2_METADATA", False
|
|
314
314
|
KUBERNETES_SHARED_MEMORY = from_conf("KUBERNETES_SHARED_MEMORY", None)
|
315
315
|
# Default port number to open on the pods
|
316
316
|
KUBERNETES_PORT = from_conf("KUBERNETES_PORT", None)
|
317
|
+
# Default kubernetes resource requests for CPU, memory and disk
|
318
|
+
KUBERNETES_CPU = from_conf("KUBERNETES_CPU", None)
|
319
|
+
KUBERNETES_MEMORY = from_conf("KUBERNETES_MEMORY", None)
|
320
|
+
KUBERNETES_DISK = from_conf("KUBERNETES_DISK", None)
|
317
321
|
|
318
322
|
ARGO_WORKFLOWS_KUBERNETES_SECRETS = from_conf("ARGO_WORKFLOWS_KUBERNETES_SECRETS", "")
|
319
323
|
ARGO_WORKFLOWS_ENV_VARS_TO_SKIP = from_conf("ARGO_WORKFLOWS_ENV_VARS_TO_SKIP", "")
|
@@ -835,7 +835,9 @@ class ArgoWorkflows(object):
|
|
835
835
|
|
836
836
|
# Visit every node and yield the uber DAGTemplate(s).
|
837
837
|
def _dag_templates(self):
|
838
|
-
def _visit(
|
838
|
+
def _visit(
|
839
|
+
node, exit_node=None, templates=None, dag_tasks=None, parent_foreach=None
|
840
|
+
):
|
839
841
|
# Every for-each node results in a separate subDAG and an equivalent
|
840
842
|
# DAGTemplate rooted at the child of the for-each node. Each DAGTemplate
|
841
843
|
# has a unique name - the top-level DAGTemplate is named as the name of
|
@@ -883,6 +885,37 @@ class ArgoWorkflows(object):
|
|
883
885
|
)
|
884
886
|
)
|
885
887
|
]
|
888
|
+
# NOTE: Due to limitations with Argo Workflows Parameter size we
|
889
|
+
# can not pass arbitrarily large lists of task id's to join tasks.
|
890
|
+
# Instead we ensure that task id's for foreach tasks can be
|
891
|
+
# deduced deterministically and pass the relevant information to
|
892
|
+
# the join task.
|
893
|
+
#
|
894
|
+
# We need to add the split-index and root-input-path for the last
|
895
|
+
# step in any foreach scope and use these to generate the task id,
|
896
|
+
# as the join step uses the root and the cardinality of the
|
897
|
+
# foreach scope to generate the required id's.
|
898
|
+
if (
|
899
|
+
node.is_inside_foreach
|
900
|
+
and self.graph[node.out_funcs[0]].type == "join"
|
901
|
+
):
|
902
|
+
if any(
|
903
|
+
self.graph[parent].matching_join
|
904
|
+
== self.graph[node.out_funcs[0]].name
|
905
|
+
and self.graph[parent].type == "foreach"
|
906
|
+
for parent in self.graph[node.out_funcs[0]].split_parents
|
907
|
+
):
|
908
|
+
parameters.extend(
|
909
|
+
[
|
910
|
+
Parameter("split-index").value(
|
911
|
+
"{{inputs.parameters.split-index}}"
|
912
|
+
),
|
913
|
+
Parameter("root-input-path").value(
|
914
|
+
"{{inputs.parameters.input-paths}}"
|
915
|
+
),
|
916
|
+
]
|
917
|
+
)
|
918
|
+
|
886
919
|
dag_task = (
|
887
920
|
DAGTask(self._sanitize(node.name))
|
888
921
|
.dependencies(
|
@@ -903,9 +936,19 @@ class ArgoWorkflows(object):
|
|
903
936
|
# For split nodes traverse all the children
|
904
937
|
if node.type == "split":
|
905
938
|
for n in node.out_funcs:
|
906
|
-
_visit(
|
939
|
+
_visit(
|
940
|
+
self.graph[n],
|
941
|
+
node.matching_join,
|
942
|
+
templates,
|
943
|
+
dag_tasks,
|
944
|
+
parent_foreach,
|
945
|
+
)
|
907
946
|
return _visit(
|
908
|
-
self.graph[node.matching_join],
|
947
|
+
self.graph[node.matching_join],
|
948
|
+
exit_node,
|
949
|
+
templates,
|
950
|
+
dag_tasks,
|
951
|
+
parent_foreach,
|
909
952
|
)
|
910
953
|
# For foreach nodes generate a new sub DAGTemplate
|
911
954
|
elif node.type == "foreach":
|
@@ -929,6 +972,16 @@ class ArgoWorkflows(object):
|
|
929
972
|
),
|
930
973
|
Parameter("split-index").value("{{item}}"),
|
931
974
|
]
|
975
|
+
+ (
|
976
|
+
[
|
977
|
+
Parameter("root-input-path").value(
|
978
|
+
"argo-{{workflow.name}}/%s/{{tasks.%s.outputs.parameters.task-id}}"
|
979
|
+
% (node.name, self._sanitize(node.name))
|
980
|
+
),
|
981
|
+
]
|
982
|
+
if parent_foreach
|
983
|
+
else []
|
984
|
+
)
|
932
985
|
)
|
933
986
|
)
|
934
987
|
.with_param(
|
@@ -938,13 +991,18 @@ class ArgoWorkflows(object):
|
|
938
991
|
)
|
939
992
|
dag_tasks.append(foreach_task)
|
940
993
|
templates, dag_tasks_1 = _visit(
|
941
|
-
self.graph[node.out_funcs[0]],
|
994
|
+
self.graph[node.out_funcs[0]],
|
995
|
+
node.matching_join,
|
996
|
+
templates,
|
997
|
+
[],
|
998
|
+
node.name,
|
942
999
|
)
|
943
1000
|
templates.append(
|
944
1001
|
Template(foreach_template_name)
|
945
1002
|
.inputs(
|
946
1003
|
Inputs().parameters(
|
947
1004
|
[Parameter("input-paths"), Parameter("split-index")]
|
1005
|
+
+ ([Parameter("root-input-path")] if parent_foreach else [])
|
948
1006
|
)
|
949
1007
|
)
|
950
1008
|
.outputs(
|
@@ -971,13 +1029,26 @@ class ArgoWorkflows(object):
|
|
971
1029
|
Arguments().parameters(
|
972
1030
|
[
|
973
1031
|
Parameter("input-paths").value(
|
974
|
-
"argo-{{workflow.name}}/%s/{{tasks.%s.outputs.parameters}}"
|
975
|
-
% (
|
976
|
-
|
977
|
-
|
978
|
-
|
979
|
-
|
1032
|
+
"argo-{{workflow.name}}/%s/{{tasks.%s.outputs.parameters.task-id}}"
|
1033
|
+
% (node.name, self._sanitize(node.name))
|
1034
|
+
),
|
1035
|
+
Parameter("split-cardinality").value(
|
1036
|
+
"{{tasks.%s.outputs.parameters.split-cardinality}}"
|
1037
|
+
% self._sanitize(node.name)
|
1038
|
+
),
|
980
1039
|
]
|
1040
|
+
+ (
|
1041
|
+
[
|
1042
|
+
Parameter("split-index").value(
|
1043
|
+
"{{inputs.parameters.split-index}}"
|
1044
|
+
),
|
1045
|
+
Parameter("root-input-path").value(
|
1046
|
+
"{{inputs.parameters.input-paths}}"
|
1047
|
+
),
|
1048
|
+
]
|
1049
|
+
if parent_foreach
|
1050
|
+
else []
|
1051
|
+
)
|
981
1052
|
)
|
982
1053
|
)
|
983
1054
|
)
|
@@ -987,11 +1058,16 @@ class ArgoWorkflows(object):
|
|
987
1058
|
exit_node,
|
988
1059
|
templates,
|
989
1060
|
dag_tasks,
|
1061
|
+
parent_foreach,
|
990
1062
|
)
|
991
1063
|
# For linear nodes continue traversing to the next node
|
992
1064
|
if node.type in ("linear", "join", "start"):
|
993
1065
|
return _visit(
|
994
|
-
self.graph[node.out_funcs[0]],
|
1066
|
+
self.graph[node.out_funcs[0]],
|
1067
|
+
exit_node,
|
1068
|
+
templates,
|
1069
|
+
dag_tasks,
|
1070
|
+
parent_foreach,
|
995
1071
|
)
|
996
1072
|
else:
|
997
1073
|
raise ArgoWorkflowsException(
|
@@ -1034,11 +1110,43 @@ class ArgoWorkflows(object):
|
|
1034
1110
|
# Ideally, we would like these task ids to be the same as node name
|
1035
1111
|
# (modulo retry suffix) on Argo Workflows but that doesn't seem feasible
|
1036
1112
|
# right now.
|
1037
|
-
|
1113
|
+
|
1114
|
+
task_idx = ""
|
1115
|
+
input_paths = ""
|
1116
|
+
root_input = None
|
1117
|
+
# export input_paths as it is used multiple times in the container script
|
1118
|
+
# and we do not want to repeat the values.
|
1119
|
+
input_paths_expr = "export INPUT_PATHS=''"
|
1038
1120
|
if node.name != "start":
|
1039
|
-
|
1121
|
+
input_paths_expr = (
|
1122
|
+
"export INPUT_PATHS={{inputs.parameters.input-paths}}"
|
1123
|
+
)
|
1124
|
+
input_paths = "$(echo $INPUT_PATHS)"
|
1040
1125
|
if any(self.graph[n].type == "foreach" for n in node.in_funcs):
|
1041
|
-
|
1126
|
+
task_idx = "{{inputs.parameters.split-index}}"
|
1127
|
+
if node.is_inside_foreach and self.graph[node.out_funcs[0]].type == "join":
|
1128
|
+
if any(
|
1129
|
+
self.graph[parent].matching_join
|
1130
|
+
== self.graph[node.out_funcs[0]].name
|
1131
|
+
for parent in self.graph[node.out_funcs[0]].split_parents
|
1132
|
+
if self.graph[parent].type == "foreach"
|
1133
|
+
) and any(not self.graph[f].type == "foreach" for f in node.in_funcs):
|
1134
|
+
# we need to propagate the split-index and root-input-path info for
|
1135
|
+
# the last step inside a foreach for correctly joining nested
|
1136
|
+
# foreaches
|
1137
|
+
task_idx = "{{inputs.parameters.split-index}}"
|
1138
|
+
root_input = "{{inputs.parameters.root-input-path}}"
|
1139
|
+
|
1140
|
+
# Task string to be hashed into an ID
|
1141
|
+
task_str = "-".join(
|
1142
|
+
[
|
1143
|
+
node.name,
|
1144
|
+
"{{workflow.creationTimestamp}}",
|
1145
|
+
root_input or input_paths,
|
1146
|
+
task_idx,
|
1147
|
+
]
|
1148
|
+
)
|
1149
|
+
|
1042
1150
|
# Generated task_ids need to be non-numeric - see register_task_id in
|
1043
1151
|
# service.py. We do so by prefixing `t-`
|
1044
1152
|
task_id_expr = (
|
@@ -1087,6 +1195,7 @@ class ArgoWorkflows(object):
|
|
1087
1195
|
# env var.
|
1088
1196
|
'${METAFLOW_INIT_SCRIPT:+eval \\"${METAFLOW_INIT_SCRIPT}\\"}',
|
1089
1197
|
"mkdir -p $PWD/.logs",
|
1198
|
+
input_paths_expr,
|
1090
1199
|
task_id_expr,
|
1091
1200
|
mflog_expr,
|
1092
1201
|
]
|
@@ -1098,8 +1207,6 @@ class ArgoWorkflows(object):
|
|
1098
1207
|
node.name, self.flow_datastore.TYPE
|
1099
1208
|
)
|
1100
1209
|
|
1101
|
-
input_paths = "{{inputs.parameters.input-paths}}"
|
1102
|
-
|
1103
1210
|
top_opts_dict = {
|
1104
1211
|
"with": [
|
1105
1212
|
decorator.make_decorator_spec()
|
@@ -1168,10 +1275,16 @@ class ArgoWorkflows(object):
|
|
1168
1275
|
node.type == "join"
|
1169
1276
|
and self.graph[node.split_parents[-1]].type == "foreach"
|
1170
1277
|
):
|
1171
|
-
# Set aggregated input-paths for a
|
1278
|
+
# Set aggregated input-paths for a for-each join
|
1279
|
+
foreach_step = next(
|
1280
|
+
n for n in node.in_funcs if self.graph[n].is_inside_foreach
|
1281
|
+
)
|
1172
1282
|
input_paths = (
|
1173
|
-
"$(python -m metaflow.plugins.argo.
|
1174
|
-
%
|
1283
|
+
"$(python -m metaflow.plugins.argo.generate_input_paths %s {{workflow.creationTimestamp}} %s {{inputs.parameters.split-cardinality}})"
|
1284
|
+
% (
|
1285
|
+
foreach_step,
|
1286
|
+
input_paths,
|
1287
|
+
)
|
1175
1288
|
)
|
1176
1289
|
step = [
|
1177
1290
|
"step",
|
@@ -1337,13 +1450,37 @@ class ArgoWorkflows(object):
|
|
1337
1450
|
# input. Analogously, if the node under consideration is a foreach
|
1338
1451
|
# node, then we emit split cardinality as an extra output. I would like
|
1339
1452
|
# to thank the designers of Argo Workflows for making this so
|
1340
|
-
# straightforward!
|
1453
|
+
# straightforward! Things become a bit more complicated to support very
|
1454
|
+
# wide foreaches where we have to resort to passing a root-input-path
|
1455
|
+
# so that we can compute the task ids for each parent task of a for-each
|
1456
|
+
# join task deterministically inside the join task without resorting to
|
1457
|
+
# passing a rather long list of (albiet compressed)
|
1341
1458
|
inputs = []
|
1342
1459
|
if node.name != "start":
|
1343
1460
|
inputs.append(Parameter("input-paths"))
|
1344
1461
|
if any(self.graph[n].type == "foreach" for n in node.in_funcs):
|
1345
1462
|
# Fetch split-index from parent
|
1346
1463
|
inputs.append(Parameter("split-index"))
|
1464
|
+
if (
|
1465
|
+
node.type == "join"
|
1466
|
+
and self.graph[node.split_parents[-1]].type == "foreach"
|
1467
|
+
):
|
1468
|
+
# append this only for joins of foreaches, not static splits
|
1469
|
+
inputs.append(Parameter("split-cardinality"))
|
1470
|
+
if node.is_inside_foreach and self.graph[node.out_funcs[0]].type == "join":
|
1471
|
+
if any(
|
1472
|
+
self.graph[parent].matching_join
|
1473
|
+
== self.graph[node.out_funcs[0]].name
|
1474
|
+
for parent in self.graph[node.out_funcs[0]].split_parents
|
1475
|
+
if self.graph[parent].type == "foreach"
|
1476
|
+
) and any(not self.graph[f].type == "foreach" for f in node.in_funcs):
|
1477
|
+
# we need to propagate the split-index and root-input-path info for
|
1478
|
+
# the last step inside a foreach for correctly joining nested
|
1479
|
+
# foreaches
|
1480
|
+
if not any(self.graph[n].type == "foreach" for n in node.in_funcs):
|
1481
|
+
# Don't add duplicate split index parameters.
|
1482
|
+
inputs.append(Parameter("split-index"))
|
1483
|
+
inputs.append(Parameter("root-input-path"))
|
1347
1484
|
|
1348
1485
|
outputs = []
|
1349
1486
|
if node.name != "end":
|
@@ -1353,6 +1490,11 @@ class ArgoWorkflows(object):
|
|
1353
1490
|
outputs.append(
|
1354
1491
|
Parameter("num-splits").valueFrom({"path": "/mnt/out/splits"})
|
1355
1492
|
)
|
1493
|
+
outputs.append(
|
1494
|
+
Parameter("split-cardinality").valueFrom(
|
1495
|
+
{"path": "/mnt/out/split_cardinality"}
|
1496
|
+
)
|
1497
|
+
)
|
1356
1498
|
|
1357
1499
|
# It makes no sense to set env vars to None (shows up as "None" string)
|
1358
1500
|
# Also we skip some env vars (e.g. in case we want to pull them from KUBERNETES_SECRETS)
|
@@ -102,6 +102,9 @@ class ArgoWorkflowsInternalDecorator(StepDecorator):
|
|
102
102
|
if graph[step_name].type == "foreach":
|
103
103
|
with open("/mnt/out/splits", "w") as file:
|
104
104
|
json.dump(list(range(flow._foreach_num_splits)), file)
|
105
|
+
with open("/mnt/out/split_cardinality", "w") as file:
|
106
|
+
json.dump(flow._foreach_num_splits, file)
|
107
|
+
|
105
108
|
# Unfortunately, we can't always use pod names as task-ids since the pod names
|
106
109
|
# are not static across retries. We write the task-id to a file that is read
|
107
110
|
# by the next task here.
|
@@ -0,0 +1,23 @@
|
|
1
|
+
import sys
|
2
|
+
from hashlib import md5
|
3
|
+
|
4
|
+
|
5
|
+
def generate_input_paths(step_name, timestamp, input_paths, split_cardinality):
|
6
|
+
# => run_id/step/:foo,bar
|
7
|
+
run_id = input_paths.split("/")[0]
|
8
|
+
foreach_base_id = "{}-{}-{}".format(step_name, timestamp, input_paths)
|
9
|
+
|
10
|
+
ids = [_generate_task_id(foreach_base_id, i) for i in range(int(split_cardinality))]
|
11
|
+
return "{}/{}/:{}".format(run_id, step_name, ",".join(ids))
|
12
|
+
|
13
|
+
|
14
|
+
def _generate_task_id(base, idx):
|
15
|
+
# For foreach splits generate the expected input-paths based on split_cardinality and base_id.
|
16
|
+
# newline required at the end due to 'echo' appending one in the shell side task_id creation.
|
17
|
+
task_str = "%s-%s\n" % (base, idx)
|
18
|
+
hash = md5(task_str.encode("utf-8")).hexdigest()[-8:]
|
19
|
+
return "t-" + hash
|
20
|
+
|
21
|
+
|
22
|
+
if __name__ == "__main__":
|
23
|
+
print(generate_input_paths(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]))
|
@@ -1626,6 +1626,7 @@ class S3(object):
|
|
1626
1626
|
# Run the operation.
|
1627
1627
|
env = os.environ.copy()
|
1628
1628
|
tracing.inject_tracing_vars(env)
|
1629
|
+
env["METAFLOW_ESCAPE_HATCH_WARNING"] = "False"
|
1629
1630
|
stdout = subprocess.check_output(
|
1630
1631
|
cmdline + addl_cmdline,
|
1631
1632
|
cwd=self._tmpdir,
|
@@ -22,6 +22,9 @@ from metaflow.metaflow_config import (
|
|
22
22
|
KUBERNETES_SERVICE_ACCOUNT,
|
23
23
|
KUBERNETES_SHARED_MEMORY,
|
24
24
|
KUBERNETES_PORT,
|
25
|
+
KUBERNETES_CPU,
|
26
|
+
KUBERNETES_MEMORY,
|
27
|
+
KUBERNETES_DISK,
|
25
28
|
)
|
26
29
|
from metaflow.plugins.resources_decorator import ResourcesDecorator
|
27
30
|
from metaflow.plugins.timeout_decorator import get_run_time_limit_for_task
|
@@ -174,6 +177,15 @@ class KubernetesDecorator(StepDecorator):
|
|
174
177
|
except (NameError, ImportError):
|
175
178
|
pass
|
176
179
|
|
180
|
+
# parse the CPU, memory, disk, values from the KUBERNETES_ environment variable (you would need to export the METAFLOW_KUBERNETES_CPU, METAFLOW_KUBERNETES_MEMORY and/or METAFLOW_KUBERNTES_DISK environment variable with the desired values before running the flow)
|
181
|
+
# find the values from the environment variables, then validate if the values are still the default ones, if so, then replace them with the values from the environment variables (otherwise, keep the values from the decorator)
|
182
|
+
if self.attributes["cpu"] == self.defaults["cpu"] and KUBERNETES_CPU:
|
183
|
+
self.attributes["cpu"] = KUBERNETES_CPU
|
184
|
+
if self.attributes["memory"] == self.defaults["memory"] and KUBERNETES_MEMORY:
|
185
|
+
self.attributes["memory"] = KUBERNETES_MEMORY
|
186
|
+
if self.attributes["disk"] == self.defaults["disk"] and KUBERNETES_DISK:
|
187
|
+
self.attributes["disk"] = KUBERNETES_DISK
|
188
|
+
|
177
189
|
# If no docker image is explicitly specified, impute a default image.
|
178
190
|
if not self.attributes["image"]:
|
179
191
|
# If metaflow-config specifies a docker image, just use that.
|
@@ -0,0 +1 @@
|
|
1
|
+
metaflow_version = "2.11.13"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: metaflow
|
3
|
-
Version: 2.11.
|
3
|
+
Version: 2.11.13
|
4
4
|
Summary: Metaflow: More Data Science, Less Engineering
|
5
5
|
Author: Metaflow Developers
|
6
6
|
Author-email: help@metaflow.org
|
@@ -26,7 +26,7 @@ License-File: LICENSE
|
|
26
26
|
Requires-Dist: requests
|
27
27
|
Requires-Dist: boto3
|
28
28
|
Provides-Extra: stubs
|
29
|
-
Requires-Dist: metaflow-stubs==2.11.
|
29
|
+
Requires-Dist: metaflow-stubs==2.11.13; extra == "stubs"
|
30
30
|
|
31
31
|

|
32
32
|
|
@@ -163,7 +163,7 @@ metaflow/plugins/argo/argo_events.py
|
|
163
163
|
metaflow/plugins/argo/argo_workflows.py
|
164
164
|
metaflow/plugins/argo/argo_workflows_cli.py
|
165
165
|
metaflow/plugins/argo/argo_workflows_decorator.py
|
166
|
-
metaflow/plugins/argo/
|
166
|
+
metaflow/plugins/argo/generate_input_paths.py
|
167
167
|
metaflow/plugins/aws/__init__.py
|
168
168
|
metaflow/plugins/aws/aws_client.py
|
169
169
|
metaflow/plugins/aws/aws_utils.py
|
@@ -1,19 +0,0 @@
|
|
1
|
-
import re
|
2
|
-
import sys
|
3
|
-
|
4
|
-
|
5
|
-
def process_input_paths(input_paths):
|
6
|
-
# Convert Argo Workflows provided input-paths string to something that Metaflow
|
7
|
-
# understands
|
8
|
-
#
|
9
|
-
# flow/step/[{task-id:foo},{task-id:bar}] => flow/step/:foo,bar
|
10
|
-
|
11
|
-
flow, run_id, task_ids = input_paths.split("/")
|
12
|
-
task_ids = re.sub("[\[\]{}]", "", task_ids)
|
13
|
-
task_ids = task_ids.split(",")
|
14
|
-
tasks = [t.split(":")[1] for t in task_ids]
|
15
|
-
return "{}/{}/:{}".format(flow, run_id, ",".join(tasks))
|
16
|
-
|
17
|
-
|
18
|
-
if __name__ == "__main__":
|
19
|
-
print(process_input_paths(sys.argv[1]))
|
@@ -1 +0,0 @@
|
|
1
|
-
metaflow_version = "2.11.12"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py
RENAMED
File without changes
|
File without changes
|
{metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py
RENAMED
File without changes
|
{metaflow-2.11.12 → metaflow-2.11.13}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|