metaflow 2.8.2__tar.gz → 2.8.3__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.8.2/metaflow.egg-info → metaflow-2.8.3}/PKG-INFO +1 -6
- {metaflow-2.8.2 → metaflow-2.8.3}/README.md +0 -5
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/client/core.py +14 -4
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/cmd/configure_cmd.py +3 -3
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/cmd/main_cli.py +9 -14
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/current.py +15 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/metaflow_config.py +21 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/metaflow_environment.py +5 -4
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/package.py +1 -1
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/airflow/airflow.py +0 -1
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/argo/argo_workflows.py +2 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/aws_utils.py +6 -1
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/batch/batch.py +30 -8
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/batch/batch_cli.py +12 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/batch/batch_client.py +39 -2
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/batch/batch_decorator.py +23 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/step_functions/step_functions.py +7 -4
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -1
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +67 -5
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/conda/conda_environment.py +2 -2
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/conda/conda_step_decorator.py +7 -1
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/datatools/s3/s3.py +2 -2
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/communication/channel.py +1 -1
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/kubernetes/kubernetes.py +4 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/kubernetes/kubernetes_decorator.py +6 -2
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/kubernetes/kubernetes_job.py +17 -2
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/metadata/service.py +3 -2
- {metaflow-2.8.2 → metaflow-2.8.3/metaflow.egg-info}/PKG-INFO +1 -6
- {metaflow-2.8.2 → metaflow-2.8.3}/setup.py +1 -1
- {metaflow-2.8.2 → metaflow-2.8.3}/LICENSE +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/MANIFEST.in +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/R.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/_bashcomplete.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/_compat.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/_termui_impl.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/_textwrap.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/_unicodefun.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/_winconsole.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/core.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/decorators.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/exceptions.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/formatting.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/globals.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/parser.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/termui.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/testing.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/types.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/click/utils.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/v3_5/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/v3_5/zipp.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/v3_6/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/_vendor/v3_6/zipp.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/cards.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/cli.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/cli_args.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/client/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/client/filecache.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/cmd/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/cmd/tutorials_cmd.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/cmd/util.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/cmd_with_io.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/datastore/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/datastore/content_addressed_store.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/datastore/datastore_set.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/datastore/datastore_storage.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/datastore/exceptions.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/datastore/flow_datastore.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/datastore/inputs.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/datastore/task_datastore.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/debug.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/decorators.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/event_logger.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/exception.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/extension_support/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/extension_support/_empty_file.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/extension_support/cmd.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/extension_support/integrations.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/extension_support/plugins.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/flowspec.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/graph.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/includefile.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/integrations.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/lint.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/metadata/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/metadata/heartbeat.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/metadata/metadata.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/metadata/util.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/metaflow_config_funcs.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/metaflow_profile.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/metaflow_version.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/mflog/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/mflog/mflog.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/mflog/save_logs.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/mflog/save_logs_periodically.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/mflog/tee.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/monitor.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/multicore_utils.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/parameters.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/airflow/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/airflow/airflow_cli.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/airflow/airflow_utils.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/airflow/dag.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/airflow/exception.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/argo/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/argo/argo_client.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/argo/process_input_paths.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/aws_client.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/batch/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/azure/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/azure/azure_exceptions.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/azure/azure_tail.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/azure/azure_utils.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/azure/includefile_support.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_cli.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_client.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_datastore.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_decorator.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_modules/base.html +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_modules/basic.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_modules/card.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_modules/components.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_modules/main.js +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/card_resolver.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/component_serializer.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/cards/exception.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/catch_decorator.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/conda/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/conda/batch_bootstrap.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/conda/conda.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/conda/conda_flow_decorator.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/datastores/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/datastores/azure_storage.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/datastores/gs_storage.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/datastores/local_storage.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/datastores/s3_storage.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/datatools/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/datatools/local.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/datatools/s3/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/datatools/s3/s3op.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/datatools/s3/s3util.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/debug_logger.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/debug_monitor.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/client.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/client_modules.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/communication/utils.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/configurations/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/consts.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/data_transferer.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/override_decorators.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/server.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/stub.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/env_escape/utils.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/environment_decorator.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/frameworks/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/frameworks/pytorch.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/gcp/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/gcp/gs_tail.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/gcp/gs_utils.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/gcp/includefile_support.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/kubernetes/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/kubernetes/kubernetes_cli.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/metadata/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/metadata/local.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/package_cli.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/parallel_decorator.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/project_decorator.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/resources_decorator.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/retry_decorator.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/secrets/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/storage_executor.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/tag_cli.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/plugins/timeout_decorator.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/procpoll.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/py.typed +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/pylint_wrapper.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/runtime.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/sidecar/__init__.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/sidecar/sidecar.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/sidecar/sidecar_messages.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/sidecar/sidecar_subprocess.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/sidecar/sidecar_worker.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tagging_util.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/task.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/00-helloworld/README.md +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/01-playlist/README.md +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/01-playlist/movies.csv +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/01-playlist/playlist.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/02-statistics/README.md +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/02-statistics/movies.csv +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/02-statistics/stats.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/07-worldview/README.md +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/08-autopilot/README.md +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/unbounded_foreach.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/util.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow/vendor.py +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow.egg-info/SOURCES.txt +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow.egg-info/dependency_links.txt +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow.egg-info/entry_points.txt +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow.egg-info/requires.txt +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/metaflow.egg-info/top_level.txt +0 -0
- {metaflow-2.8.2 → metaflow-2.8.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: metaflow
|
3
|
-
Version: 2.8.
|
3
|
+
Version: 2.8.3
|
4
4
|
Summary: Metaflow: More Data Science, Less Engineering
|
5
5
|
Author: Metaflow Developers
|
6
6
|
Author-email: help@metaflow.org
|
@@ -73,8 +73,3 @@ There are several ways to get in touch with us:
|
|
73
73
|
## Contributing
|
74
74
|
|
75
75
|
We welcome contributions to Metaflow. Please see our [contribution guide](https://docs.metaflow.org/introduction/contributing-to-metaflow) for more details.
|
76
|
-
|
77
|
-
### Code style
|
78
|
-
|
79
|
-
We use [black](https://black.readthedocs.io/en/stable/) as a code formatter. The easiest way to ensure your commits are always formatted with the correct version of `black` it is to use [pre-commit](https://pre-commit.com/): install it and then run `pre-commit install` once in your local copy of the repo.
|
80
|
-
|
@@ -48,8 +48,3 @@ There are several ways to get in touch with us:
|
|
48
48
|
## Contributing
|
49
49
|
|
50
50
|
We welcome contributions to Metaflow. Please see our [contribution guide](https://docs.metaflow.org/introduction/contributing-to-metaflow) for more details.
|
51
|
-
|
52
|
-
### Code style
|
53
|
-
|
54
|
-
We use [black](https://black.readthedocs.io/en/stable/) as a code formatter. The easiest way to ensure your commits are always formatted with the correct version of `black` it is to use [pre-commit](https://pre-commit.com/): install it and then run `pre-commit install` once in your local copy of the repo.
|
55
|
-
|
@@ -265,6 +265,7 @@ class MetaflowObject(object):
|
|
265
265
|
self._parent = _parent
|
266
266
|
self._path_components = None
|
267
267
|
self._attempt = attempt
|
268
|
+
self._namespace_check = _namespace_check
|
268
269
|
|
269
270
|
if self._attempt is not None:
|
270
271
|
if self._NAME not in ["task", "artifact"]:
|
@@ -315,7 +316,7 @@ class MetaflowObject(object):
|
|
315
316
|
self._user_tags = frozenset(self._object.get("tags") or [])
|
316
317
|
self._system_tags = frozenset(self._object.get("system_tags") or [])
|
317
318
|
|
318
|
-
if _namespace_check and not self.is_in_namespace():
|
319
|
+
if self._namespace_check and not self.is_in_namespace():
|
319
320
|
raise MetaflowNamespaceMismatch(current_namespace)
|
320
321
|
|
321
322
|
def _get_object(self, *path_components):
|
@@ -330,7 +331,8 @@ class MetaflowObject(object):
|
|
330
331
|
"""
|
331
332
|
Iterate over all child objects of this object if any.
|
332
333
|
|
333
|
-
Note that only children present in the current namespace are returned
|
334
|
+
Note that only children present in the current namespace are returned iff
|
335
|
+
_namespace_check is set.
|
334
336
|
|
335
337
|
Returns
|
336
338
|
-------
|
@@ -338,7 +340,8 @@ class MetaflowObject(object):
|
|
338
340
|
Iterator over all children
|
339
341
|
"""
|
340
342
|
query_filter = {}
|
341
|
-
if
|
343
|
+
# skip namespace filtering if _namespace_check is False
|
344
|
+
if self._namespace_check and current_namespace:
|
342
345
|
query_filter = {"any_tags": current_namespace}
|
343
346
|
|
344
347
|
unfiltered_children = self._metaflow.metadata.get_object(
|
@@ -381,6 +384,10 @@ class MetaflowObject(object):
|
|
381
384
|
if all(tag in child.tags for tag in tags):
|
382
385
|
yield child
|
383
386
|
|
387
|
+
def _ipython_key_completions_(self):
|
388
|
+
"""Returns available options for ipython auto-complete."""
|
389
|
+
return [child.id for child in self._filtered_children()]
|
390
|
+
|
384
391
|
@classmethod
|
385
392
|
def _url_token(cls):
|
386
393
|
return "%ss" % cls._NAME
|
@@ -444,7 +451,10 @@ class MetaflowObject(object):
|
|
444
451
|
obj = self._get_child(id)
|
445
452
|
if obj:
|
446
453
|
return _CLASSES[self._CHILD_CLASS](
|
447
|
-
attempt=self._attempt,
|
454
|
+
attempt=self._attempt,
|
455
|
+
_object=obj,
|
456
|
+
_parent=self,
|
457
|
+
_namespace_check=self._namespace_check,
|
448
458
|
)
|
449
459
|
else:
|
450
460
|
raise KeyError(id)
|
@@ -249,13 +249,13 @@ def configure_s3_datastore(existing_env):
|
|
249
249
|
show_default=True,
|
250
250
|
)
|
251
251
|
# Set Amazon S3 folder for datatools.
|
252
|
-
env["
|
253
|
-
cyan("[
|
252
|
+
env["METAFLOW_DATATOOLS_S3ROOT"] = click.prompt(
|
253
|
+
cyan("[METAFLOW_DATATOOLS_S3ROOT]")
|
254
254
|
+ yellow(" (optional)")
|
255
255
|
+ " Amazon S3 folder for Metaflow datatools "
|
256
256
|
+ "(s3://<bucket>/<prefix>).",
|
257
257
|
default=existing_env.get(
|
258
|
-
"
|
258
|
+
"METAFLOW_DATATOOLS_S3ROOT",
|
259
259
|
os.path.join(env["METAFLOW_DATASTORE_SYSROOT_S3"], "data"),
|
260
260
|
),
|
261
261
|
show_default=True,
|
@@ -4,7 +4,8 @@ from metaflow._vendor import click
|
|
4
4
|
|
5
5
|
from metaflow.extension_support.cmd import process_cmds, resolve_cmds
|
6
6
|
from metaflow.plugins.datastores.local_storage import LocalStorage
|
7
|
-
from metaflow.metaflow_config import DATASTORE_LOCAL_DIR
|
7
|
+
from metaflow.metaflow_config import DATASTORE_LOCAL_DIR, CONTACT_INFO
|
8
|
+
from metaflow.metaflow_version import get_version
|
8
9
|
|
9
10
|
from .util import echo_always
|
10
11
|
|
@@ -80,24 +81,18 @@ def start(ctx):
|
|
80
81
|
echo("Metaflow ", fg="magenta", bold=True, nl=False)
|
81
82
|
|
82
83
|
if ctx.invoked_subcommand is None:
|
83
|
-
echo("(%s): " %
|
84
|
+
echo("(%s): " % get_version(), fg="magenta", bold=False, nl=False)
|
84
85
|
else:
|
85
|
-
echo("(%s)\n" %
|
86
|
+
echo("(%s)\n" % get_version(), fg="magenta", bold=False)
|
86
87
|
|
87
88
|
if ctx.invoked_subcommand is None:
|
88
89
|
echo("More data science, less engineering\n", fg="magenta")
|
89
90
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
echo("http://chat.metaflow.org", fg="cyan", nl=False)
|
96
|
-
echo(" - Chat with us")
|
97
|
-
|
98
|
-
# metaflow help email
|
99
|
-
echo("help@metaflow.org", fg="cyan", nl=False)
|
100
|
-
echo(" - Get help by email\n")
|
91
|
+
lnk_sz = max(len(lnk) for lnk in CONTACT_INFO.values()) + 1
|
92
|
+
for what, lnk in CONTACT_INFO.items():
|
93
|
+
echo("%s%s" % (lnk, " " * (lnk_sz - len(lnk))), fg="cyan", nl=False)
|
94
|
+
echo("- %s" % what)
|
95
|
+
echo("")
|
101
96
|
|
102
97
|
print(ctx.get_help())
|
103
98
|
|
@@ -2,6 +2,8 @@ from collections import namedtuple
|
|
2
2
|
import os
|
3
3
|
from typing import Any, Optional
|
4
4
|
|
5
|
+
from metaflow.metaflow_config import TEMPDIR
|
6
|
+
|
5
7
|
Parallel = namedtuple("Parallel", ["main_ip", "num_nodes", "node_index"])
|
6
8
|
|
7
9
|
|
@@ -17,6 +19,7 @@ class Current(object):
|
|
17
19
|
self._username = None
|
18
20
|
self._metadata_str = None
|
19
21
|
self._is_running = False
|
22
|
+
self._tempdir = TEMPDIR
|
20
23
|
|
21
24
|
def _raise(ex):
|
22
25
|
raise ex
|
@@ -230,6 +233,18 @@ class Current(object):
|
|
230
233
|
"""
|
231
234
|
return self._tags
|
232
235
|
|
236
|
+
@property
|
237
|
+
def tempdir(self) -> str:
|
238
|
+
"""
|
239
|
+
Currently configured temp dir.
|
240
|
+
|
241
|
+
Returns
|
242
|
+
-------
|
243
|
+
str
|
244
|
+
temp dir.
|
245
|
+
"""
|
246
|
+
return self._tempdir
|
247
|
+
|
233
248
|
|
234
249
|
# instantiate the Current singleton. This will be populated
|
235
250
|
# by task.MetaflowTask before a task is executed.
|
@@ -96,6 +96,8 @@ DATATOOLS_S3ROOT = from_conf(
|
|
96
96
|
else None,
|
97
97
|
)
|
98
98
|
|
99
|
+
TEMPDIR = from_conf("TEMPDIR", ".")
|
100
|
+
|
99
101
|
DATATOOLS_CLIENT_PARAMS = from_conf("DATATOOLS_CLIENT_PARAMS", {})
|
100
102
|
if S3_ENDPOINT_URL:
|
101
103
|
DATATOOLS_CLIENT_PARAMS["endpoint_url"] = S3_ENDPOINT_URL
|
@@ -193,8 +195,25 @@ DEFAULT_CONTAINER_IMAGE = from_conf("DEFAULT_CONTAINER_IMAGE")
|
|
193
195
|
# Default container registry
|
194
196
|
DEFAULT_CONTAINER_REGISTRY = from_conf("DEFAULT_CONTAINER_REGISTRY")
|
195
197
|
|
198
|
+
###
|
199
|
+
# Organization customizations
|
200
|
+
###
|
196
201
|
UI_URL = from_conf("UI_URL")
|
197
202
|
|
203
|
+
# Contact information displayed when running the `metaflow` command.
|
204
|
+
# Value should be a dictionary where:
|
205
|
+
# - key is a string describing contact method
|
206
|
+
# - value is a string describing contact itself (email, web address, etc.)
|
207
|
+
# The default value shows an example of this
|
208
|
+
CONTACT_INFO = from_conf(
|
209
|
+
"CONTACT_INFO",
|
210
|
+
{
|
211
|
+
"Read the documentation": "http://docs.metaflow.org",
|
212
|
+
"Chat with us": "http://chat.metaflow.org",
|
213
|
+
"Get help by email": "help@metaflow.org",
|
214
|
+
},
|
215
|
+
)
|
216
|
+
|
198
217
|
###
|
199
218
|
# AWS Batch configuration
|
200
219
|
###
|
@@ -260,6 +279,8 @@ KUBERNETES_CONTAINER_IMAGE = from_conf(
|
|
260
279
|
KUBERNETES_CONTAINER_REGISTRY = from_conf(
|
261
280
|
"KUBERNETES_CONTAINER_REGISTRY", DEFAULT_CONTAINER_REGISTRY
|
262
281
|
)
|
282
|
+
# Toggle for trying to fetch EC2 instance metadata
|
283
|
+
KUBERNETES_FETCH_EC2_METADATA = from_conf("KUBERNETES_FETCH_EC2_METADATA", False)
|
263
284
|
|
264
285
|
ARGO_WORKFLOWS_KUBERNETES_SECRETS = from_conf("ARGO_WORKFLOWS_KUBERNETES_SECRETS", "")
|
265
286
|
ARGO_WORKFLOWS_ENV_VARS_TO_SKIP = from_conf("ARGO_WORKFLOWS_ENV_VARS_TO_SKIP", "")
|
@@ -162,7 +162,7 @@ class MetaflowEnvironment(object):
|
|
162
162
|
]
|
163
163
|
return cmds
|
164
164
|
|
165
|
-
def get_environment_info(self):
|
165
|
+
def get_environment_info(self, include_ext_info=False):
|
166
166
|
global version_cache
|
167
167
|
if version_cache is None:
|
168
168
|
version_cache = metaflow_version.get_version()
|
@@ -187,9 +187,10 @@ class MetaflowEnvironment(object):
|
|
187
187
|
env["metaflow_r_version"] = R.metaflow_r_version()
|
188
188
|
env["r_version"] = R.r_version()
|
189
189
|
env["r_version_code"] = R.r_version_code()
|
190
|
-
|
191
|
-
|
192
|
-
|
190
|
+
if include_ext_info:
|
191
|
+
# Information about extension modules (to load them in the proper order)
|
192
|
+
ext_key, ext_val = dump_module_info()
|
193
|
+
env[ext_key] = ext_val
|
193
194
|
return env
|
194
195
|
|
195
196
|
def executable(self, step_name):
|
@@ -151,7 +151,7 @@ class MetaflowPackage(object):
|
|
151
151
|
|
152
152
|
def _add_info(self, tar):
|
153
153
|
info = tarfile.TarInfo(os.path.basename(INFO_FILE))
|
154
|
-
env = self.environment.get_environment_info()
|
154
|
+
env = self.environment.get_environment_info(include_ext_info=True)
|
155
155
|
buf = BytesIO()
|
156
156
|
buf.write(json.dumps(env).encode("utf-8"))
|
157
157
|
buf.seek(0)
|
@@ -18,6 +18,7 @@ from metaflow.metaflow_config import (
|
|
18
18
|
KUBERNETES_NODE_SELECTOR,
|
19
19
|
KUBERNETES_SANDBOX_INIT_SCRIPT,
|
20
20
|
KUBERNETES_SECRETS,
|
21
|
+
KUBERNETES_FETCH_EC2_METADATA,
|
21
22
|
S3_ENDPOINT_URL,
|
22
23
|
AZURE_STORAGE_BLOB_SERVICE_ENDPOINT,
|
23
24
|
DATASTORE_SYSROOT_AZURE,
|
@@ -785,6 +786,7 @@ class ArgoWorkflows(object):
|
|
785
786
|
"METAFLOW_DEFAULT_METADATA": DEFAULT_METADATA,
|
786
787
|
"METAFLOW_CARD_S3ROOT": CARD_S3ROOT,
|
787
788
|
"METAFLOW_KUBERNETES_WORKLOAD": 1,
|
789
|
+
"METAFLOW_KUBERNETES_FETCH_EC2_METADATA": KUBERNETES_FETCH_EC2_METADATA,
|
788
790
|
"METAFLOW_RUNTIME_ENVIRONMENT": "kubernetes",
|
789
791
|
"METAFLOW_OWNER": self.username,
|
790
792
|
},
|
@@ -20,8 +20,13 @@ def get_ec2_instance_metadata():
|
|
20
20
|
# for non-AWS deployments.
|
21
21
|
# https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-identity-documents.html
|
22
22
|
try:
|
23
|
+
# Set a very aggressive timeout, as the communication is happening in the same subnet,
|
24
|
+
# there should not be any significant delay in the response.
|
25
|
+
# Having a long default timeout here introduces unnecessary delay in launching tasks when the
|
26
|
+
# instance is unreachable.
|
23
27
|
instance_meta = requests.get(
|
24
|
-
url="http://169.254.169.254/latest/dynamic/instance-identity/document"
|
28
|
+
url="http://169.254.169.254/latest/dynamic/instance-identity/document",
|
29
|
+
timeout=(1, 10),
|
25
30
|
).json()
|
26
31
|
meta["ec2-instance-id"] = instance_meta.get("instanceId")
|
27
32
|
meta["ec2-instance-type"] = instance_meta.get("instanceType")
|
@@ -179,6 +179,10 @@ class Batch(object):
|
|
179
179
|
env={},
|
180
180
|
attrs={},
|
181
181
|
host_volumes=None,
|
182
|
+
use_tmpfs=None,
|
183
|
+
tmpfs_tempdir=None,
|
184
|
+
tmpfs_size=None,
|
185
|
+
tmpfs_path=None,
|
182
186
|
num_parallel=0,
|
183
187
|
):
|
184
188
|
job_name = self._job_name(
|
@@ -201,6 +205,14 @@ class Batch(object):
|
|
201
205
|
.image(image)
|
202
206
|
.iam_role(iam_role)
|
203
207
|
.execution_role(execution_role)
|
208
|
+
.cpu(cpu)
|
209
|
+
.gpu(gpu)
|
210
|
+
.memory(memory)
|
211
|
+
.shared_memory(shared_memory)
|
212
|
+
.max_swap(max_swap)
|
213
|
+
.swappiness(swappiness)
|
214
|
+
.inferentia(inferentia)
|
215
|
+
.timeout_in_secs(run_time_limit)
|
204
216
|
.job_def(
|
205
217
|
image,
|
206
218
|
iam_role,
|
@@ -210,17 +222,14 @@ class Batch(object):
|
|
210
222
|
max_swap,
|
211
223
|
swappiness,
|
212
224
|
inferentia,
|
225
|
+
memory=memory,
|
213
226
|
host_volumes=host_volumes,
|
227
|
+
use_tmpfs=use_tmpfs,
|
228
|
+
tmpfs_tempdir=tmpfs_tempdir,
|
229
|
+
tmpfs_size=tmpfs_size,
|
230
|
+
tmpfs_path=tmpfs_path,
|
214
231
|
num_parallel=num_parallel,
|
215
232
|
)
|
216
|
-
.cpu(cpu)
|
217
|
-
.gpu(gpu)
|
218
|
-
.memory(memory)
|
219
|
-
.shared_memory(shared_memory)
|
220
|
-
.max_swap(max_swap)
|
221
|
-
.swappiness(swappiness)
|
222
|
-
.inferentia(inferentia)
|
223
|
-
.timeout_in_secs(run_time_limit)
|
224
233
|
.task_id(attrs.get("metaflow.task_id"))
|
225
234
|
.environment_variable("AWS_DEFAULT_REGION", self._client.region())
|
226
235
|
.environment_variable("METAFLOW_CODE_SHA", code_package_sha)
|
@@ -248,6 +257,11 @@ class Batch(object):
|
|
248
257
|
AWS_SECRETS_MANAGER_DEFAULT_REGION,
|
249
258
|
)
|
250
259
|
|
260
|
+
tmpfs_enabled = use_tmpfs or (tmpfs_size and use_tmpfs is None)
|
261
|
+
|
262
|
+
if tmpfs_enabled and tmpfs_tempdir:
|
263
|
+
job.environment_variable("METAFLOW_TEMPDIR", tmpfs_path)
|
264
|
+
|
251
265
|
# Skip setting METAFLOW_DATASTORE_SYSROOT_LOCAL because metadata sync between the local user
|
252
266
|
# instance and the remote AWS Batch instance assumes metadata is stored in DATASTORE_LOCAL_DIR
|
253
267
|
# on the remote AWS Batch instance; this happens when METAFLOW_DATASTORE_SYSROOT_LOCAL
|
@@ -300,6 +314,10 @@ class Batch(object):
|
|
300
314
|
swappiness=None,
|
301
315
|
inferentia=None,
|
302
316
|
host_volumes=None,
|
317
|
+
use_tmpfs=None,
|
318
|
+
tmpfs_tempdir=None,
|
319
|
+
tmpfs_size=None,
|
320
|
+
tmpfs_path=None,
|
303
321
|
num_parallel=0,
|
304
322
|
env={},
|
305
323
|
attrs={},
|
@@ -333,6 +351,10 @@ class Batch(object):
|
|
333
351
|
env=env,
|
334
352
|
attrs=attrs,
|
335
353
|
host_volumes=host_volumes,
|
354
|
+
use_tmpfs=use_tmpfs,
|
355
|
+
tmpfs_tempdir=tmpfs_tempdir,
|
356
|
+
tmpfs_size=tmpfs_size,
|
357
|
+
tmpfs_path=tmpfs_path,
|
336
358
|
num_parallel=num_parallel,
|
337
359
|
)
|
338
360
|
self.num_parallel = num_parallel
|
@@ -141,6 +141,10 @@ def kill(ctx, run_id, user, my_runs):
|
|
141
141
|
@click.option("--max-swap", help="Max Swap requirement for AWS Batch.")
|
142
142
|
@click.option("--swappiness", help="Swappiness requirement for AWS Batch.")
|
143
143
|
@click.option("--inferentia", help="Inferentia requirement for AWS Batch.")
|
144
|
+
@click.option("--use-tmpfs", is_flag=True, help="tmpfs requirement for AWS Batch.")
|
145
|
+
@click.option("--tmpfs-tempdir", is_flag=True, help="tmpfs requirement for AWS Batch.")
|
146
|
+
@click.option("--tmpfs-size", help="tmpfs requirement for AWS Batch.")
|
147
|
+
@click.option("--tmpfs-path", help="tmpfs requirement for AWS Batch.")
|
144
148
|
# TODO: Maybe remove it altogether since it's not used here
|
145
149
|
@click.option("--ubf-context", default=None, type=click.Choice([None, "ubf_control"]))
|
146
150
|
@click.option("--host-volumes", multiple=True)
|
@@ -169,6 +173,10 @@ def step(
|
|
169
173
|
max_swap=None,
|
170
174
|
swappiness=None,
|
171
175
|
inferentia=None,
|
176
|
+
use_tmpfs=None,
|
177
|
+
tmpfs_tempdir=None,
|
178
|
+
tmpfs_size=None,
|
179
|
+
tmpfs_path=None,
|
172
180
|
host_volumes=None,
|
173
181
|
num_parallel=None,
|
174
182
|
**kwargs
|
@@ -296,6 +304,10 @@ def step(
|
|
296
304
|
env=env,
|
297
305
|
attrs=attrs,
|
298
306
|
host_volumes=host_volumes,
|
307
|
+
use_tmpfs=use_tmpfs,
|
308
|
+
tmpfs_tempdir=tmpfs_tempdir,
|
309
|
+
tmpfs_size=tmpfs_size,
|
310
|
+
tmpfs_path=tmpfs_path,
|
299
311
|
num_parallel=num_parallel,
|
300
312
|
)
|
301
313
|
except Exception as e:
|
@@ -149,7 +149,12 @@ class BatchJob(object):
|
|
149
149
|
max_swap,
|
150
150
|
swappiness,
|
151
151
|
inferentia,
|
152
|
+
memory,
|
152
153
|
host_volumes,
|
154
|
+
use_tmpfs,
|
155
|
+
tmpfs_tempdir,
|
156
|
+
tmpfs_size,
|
157
|
+
tmpfs_path,
|
153
158
|
num_parallel,
|
154
159
|
):
|
155
160
|
# identify platform from any compute environment associated with the
|
@@ -251,7 +256,7 @@ class BatchJob(object):
|
|
251
256
|
if inferentia:
|
252
257
|
if not (isinstance(inferentia, (int, unicode, basestring))):
|
253
258
|
raise BatchJobException(
|
254
|
-
"
|
259
|
+
"Invalid inferentia value: ({}) (should be 0 or greater)".format(
|
255
260
|
inferentia
|
256
261
|
)
|
257
262
|
)
|
@@ -282,6 +287,29 @@ class BatchJob(object):
|
|
282
287
|
{"sourceVolume": name, "containerPath": host_path}
|
283
288
|
)
|
284
289
|
|
290
|
+
if use_tmpfs or (tmpfs_size and use_tmpfs is None):
|
291
|
+
if tmpfs_size:
|
292
|
+
if not (isinstance(tmpfs_size, (int, unicode, basestring))):
|
293
|
+
raise BatchJobException(
|
294
|
+
"Invalid tmpfs value: ({}) (should be 0 or greater)".format(
|
295
|
+
tmpfs_size
|
296
|
+
)
|
297
|
+
)
|
298
|
+
else:
|
299
|
+
# default tmpfs behavior - https://man7.org/linux/man-pages/man5/tmpfs.5.html
|
300
|
+
tmpfs_size = int(memory) / 2
|
301
|
+
|
302
|
+
job_definition["containerProperties"]["linuxParameters"]["tmpfs"] = [
|
303
|
+
{
|
304
|
+
"containerPath": tmpfs_path,
|
305
|
+
"size": int(tmpfs_size),
|
306
|
+
"mountOptions": [
|
307
|
+
# should map to rw, suid, dev, exec, auto, nouser, and async
|
308
|
+
"defaults"
|
309
|
+
],
|
310
|
+
}
|
311
|
+
]
|
312
|
+
|
285
313
|
self.num_parallel = num_parallel or 0
|
286
314
|
if self.num_parallel >= 1:
|
287
315
|
job_definition["type"] = "multinode"
|
@@ -343,7 +371,12 @@ class BatchJob(object):
|
|
343
371
|
max_swap,
|
344
372
|
swappiness,
|
345
373
|
inferentia,
|
374
|
+
memory,
|
346
375
|
host_volumes,
|
376
|
+
use_tmpfs,
|
377
|
+
tmpfs_tempdir,
|
378
|
+
tmpfs_size,
|
379
|
+
tmpfs_path,
|
347
380
|
num_parallel,
|
348
381
|
):
|
349
382
|
self.payload["jobDefinition"] = self._register_job_definition(
|
@@ -355,7 +388,12 @@ class BatchJob(object):
|
|
355
388
|
max_swap,
|
356
389
|
swappiness,
|
357
390
|
inferentia,
|
391
|
+
memory,
|
358
392
|
host_volumes,
|
393
|
+
use_tmpfs,
|
394
|
+
tmpfs_tempdir,
|
395
|
+
tmpfs_size,
|
396
|
+
tmpfs_path,
|
359
397
|
num_parallel,
|
360
398
|
)
|
361
399
|
return self
|
@@ -522,7 +560,6 @@ class TriableException(Exception):
|
|
522
560
|
|
523
561
|
|
524
562
|
class RunningJob(object):
|
525
|
-
|
526
563
|
NUM_RETRIES = 8
|
527
564
|
|
528
565
|
def __init__(self, id, client):
|
@@ -71,6 +71,16 @@ class BatchDecorator(StepDecorator):
|
|
71
71
|
A swappiness value of 0 causes swapping not to happen unless absolutely
|
72
72
|
necessary. A swappiness value of 100 causes pages to be swapped very
|
73
73
|
aggressively. Accepted values are whole numbers between 0 and 100.
|
74
|
+
use_tmpfs: bool, default: False
|
75
|
+
This enables an explicit tmpfs mount for this step.
|
76
|
+
tmpfs_tempdir: bool, default: True
|
77
|
+
sets METAFLOW_TEMPDIR to tmpfs_path if set for this step.
|
78
|
+
tmpfs_size: int, optional
|
79
|
+
The value for the size (in MiB) of the tmpfs mount for this step.
|
80
|
+
This parameter maps to the `--tmpfs` option in Docker. Defaults to 50% of the
|
81
|
+
memory allocated for this step.
|
82
|
+
tmpfs_path: string, optional
|
83
|
+
Path to tmpfs mount for this step. Defaults to /metaflow_temp.
|
74
84
|
inferentia : int, default: 0
|
75
85
|
Number of Inferentia chips required for this step.
|
76
86
|
"""
|
@@ -89,6 +99,10 @@ class BatchDecorator(StepDecorator):
|
|
89
99
|
"swappiness": None,
|
90
100
|
"inferentia": None,
|
91
101
|
"host_volumes": None,
|
102
|
+
"use_tmpfs": False,
|
103
|
+
"tmpfs_tempdir": True,
|
104
|
+
"tmpfs_size": None,
|
105
|
+
"tmpfs_path": "/metaflow_temp",
|
92
106
|
}
|
93
107
|
resource_defaults = {
|
94
108
|
"cpu": "1",
|
@@ -153,6 +167,10 @@ class BatchDecorator(StepDecorator):
|
|
153
167
|
"least 60 seconds for execution on AWS Batch.".format(step=step)
|
154
168
|
)
|
155
169
|
|
170
|
+
# Validate tmpfs_path. Batch requires this to be an absolute path
|
171
|
+
if self.attributes["tmpfs_path"] and self.attributes["tmpfs_path"][0] != "/":
|
172
|
+
raise BatchException("'tmpfs_path' needs to be an absolute path")
|
173
|
+
|
156
174
|
def runtime_init(self, flow, graph, package, run_id):
|
157
175
|
# Set some more internal state.
|
158
176
|
self.flow = flow
|
@@ -198,6 +216,11 @@ class BatchDecorator(StepDecorator):
|
|
198
216
|
self.metadata = metadata
|
199
217
|
self.task_datastore = task_datastore
|
200
218
|
|
219
|
+
# current.tempdir reflects the value of METAFLOW_TEMPDIR (the current working
|
220
|
+
# directory by default), or the value of tmpfs_path if tmpfs_tempdir=False.
|
221
|
+
if not self.attributes["tmpfs_tempdir"]:
|
222
|
+
current._update_env({"tempdir": self.attributes["tmpfs_path"]})
|
223
|
+
|
201
224
|
# task_pre_step may run locally if fallback is activated for @catch
|
202
225
|
# decorator. In that scenario, we skip collecting AWS Batch execution
|
203
226
|
# metadata. A rudimentary way to detect non-local execution is to
|
@@ -227,7 +227,6 @@ class StepFunctions(object):
|
|
227
227
|
return None
|
228
228
|
|
229
229
|
def _compile(self):
|
230
|
-
|
231
230
|
# Visit every node of the flow and recursively build the state machine.
|
232
231
|
def _visit(node, workflow, exit_node=None):
|
233
232
|
if node.parallel_foreach:
|
@@ -637,8 +636,7 @@ class StepFunctions(object):
|
|
637
636
|
env["METAFLOW_SFN_DYNAMO_DB_TABLE"] = SFN_DYNAMO_DB_TABLE
|
638
637
|
|
639
638
|
# It makes no sense to set env vars to None (shows up as "None" string)
|
640
|
-
|
641
|
-
del env
|
639
|
+
env = {k: v for k, v in env.items() if v is not None}
|
642
640
|
|
643
641
|
# Resolve AWS Batch resource requirements.
|
644
642
|
batch_deco = [deco for deco in node.decorators if deco.name == "batch"][0]
|
@@ -686,7 +684,12 @@ class StepFunctions(object):
|
|
686
684
|
shared_memory=resources["shared_memory"],
|
687
685
|
max_swap=resources["max_swap"],
|
688
686
|
swappiness=resources["swappiness"],
|
689
|
-
|
687
|
+
use_tmpfs=resources["use_tmpfs"],
|
688
|
+
tmpfs_tempdir=resources["tmpfs_tempdir"],
|
689
|
+
tmpfs_size=resources["tmpfs_size"],
|
690
|
+
tmpfs_path=resources["tmpfs_path"],
|
691
|
+
inferentia=resources["inferentia"],
|
692
|
+
env=env,
|
690
693
|
attrs=attrs,
|
691
694
|
host_volumes=resources["host_volumes"],
|
692
695
|
)
|
@@ -312,7 +312,6 @@ def make_flow(
|
|
312
312
|
def resolve_token(
|
313
313
|
name, token_prefix, obj, authorize, given_token, generate_new_token, is_project
|
314
314
|
):
|
315
|
-
|
316
315
|
# 1) retrieve the previous deployment, if one exists
|
317
316
|
workflow = StepFunctions.get_existing_deployment(name)
|
318
317
|
if workflow is None:
|