metaflow 2.12.34__tar.gz → 2.12.35__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.12.34/metaflow.egg-info → metaflow-2.12.35}/PKG-INFO +2 -2
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/metaflow_config.py +2 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/airflow/airflow.py +18 -17
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/argo/argo_workflows.py +22 -13
- metaflow-2.12.35/metaflow/plugins/kubernetes/kube_utils.py +54 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/kubernetes/kubernetes.py +4 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/kubernetes/kubernetes_cli.py +8 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/kubernetes/kubernetes_decorator.py +17 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/kubernetes/kubernetes_job.py +20 -13
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +19 -15
- metaflow-2.12.35/metaflow/version.py +1 -0
- {metaflow-2.12.34 → metaflow-2.12.35/metaflow.egg-info}/PKG-INFO +2 -2
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow.egg-info/requires.txt +1 -1
- metaflow-2.12.34/metaflow/plugins/kubernetes/kube_utils.py +0 -25
- metaflow-2.12.34/metaflow/version.py +0 -1
- {metaflow-2.12.34 → metaflow-2.12.35}/LICENSE +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/MANIFEST.in +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/README.md +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/R.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/_bashcomplete.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/_compat.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/_termui_impl.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/_textwrap.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/_unicodefun.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/_winconsole.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/core.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/decorators.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/exceptions.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/formatting.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/globals.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/parser.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/termui.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/testing.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/types.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/click/utils.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/packaging/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/packaging/_elffile.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/packaging/_manylinux.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/packaging/_musllinux.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/packaging/_parser.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/packaging/_structures.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/packaging/markers.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/packaging/py.typed +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/packaging/requirements.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/packaging/specifiers.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/packaging/tags.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/packaging/utils.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/packaging/version.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/typeguard/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/typeguard/_checkers.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/typeguard/_config.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/typeguard/_decorators.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/typeguard/_functions.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/typeguard/_importhook.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/typeguard/_memo.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/typeguard/_suppression.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/typeguard/_transformer.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/typeguard/_utils.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/typeguard/py.typed +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/typing_extensions.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/v3_5/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/v3_5/zipp.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/v3_6/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/v3_6/zipp.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/_vendor/zipp.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/cards.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/cli.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/cli_args.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/client/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/client/core.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/client/filecache.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/clone_util.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/cmd/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/cmd/configure_cmd.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/cmd/develop/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/cmd/develop/stub_generator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/cmd/develop/stubs.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/cmd/main_cli.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/cmd/tutorials_cmd.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/cmd/util.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/cmd_with_io.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/datastore/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/datastore/content_addressed_store.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/datastore/datastore_set.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/datastore/datastore_storage.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/datastore/exceptions.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/datastore/flow_datastore.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/datastore/inputs.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/datastore/task_datastore.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/debug.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/decorators.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/event_logger.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/events.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/exception.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/extension_support/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/extension_support/_empty_file.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/extension_support/cmd.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/extension_support/integrations.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/extension_support/plugins.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/flowspec.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/graph.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/includefile.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/info_file.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/integrations.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/lint.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/metadata_provider/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/metadata_provider/heartbeat.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/metadata_provider/metadata.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/metadata_provider/util.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/metaflow_config_funcs.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/metaflow_current.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/metaflow_environment.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/metaflow_profile.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/metaflow_version.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/mflog/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/mflog/mflog.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/mflog/save_logs.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/mflog/save_logs_periodically.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/mflog/tee.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/monitor.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/multicore_utils.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/package.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/parameters.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/airflow/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/airflow/airflow_cli.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/airflow/airflow_utils.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/airflow/dag.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/airflow/exception.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/argo/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/argo/argo_client.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/argo/argo_events.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/argo/capture_error.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/argo/generate_input_paths.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/aws_client.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/aws_utils.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/batch/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/batch/batch.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/batch/batch_client.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/azure/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/azure/azure_credential.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/azure/azure_exceptions.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/azure/azure_tail.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/azure/azure_utils.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/azure/includefile_support.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_cli.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_client.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_creator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_datastore.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_modules/base.html +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_modules/basic.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_modules/card.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_modules/components.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_modules/main.js +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_resolver.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_server.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/component_serializer.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/cards/exception.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/catch_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/datastores/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/datastores/azure_storage.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/datastores/gs_storage.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/datastores/local_storage.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/datastores/s3_storage.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/datatools/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/datatools/local.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/datatools/s3/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/datatools/s3/s3.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/datatools/s3/s3op.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/datatools/s3/s3util.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/debug_logger.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/debug_monitor.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/client.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/client_modules.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/communication/channel.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/communication/utils.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/consts.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/data_transferer.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/override_decorators.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/server.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/stub.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/env_escape/utils.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/environment_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/events_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/frameworks/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/frameworks/pytorch.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/gcp/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/gcp/gs_tail.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/gcp/gs_utils.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/gcp/includefile_support.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/kubernetes/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/logs_cli.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/metadata_providers/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/metadata_providers/local.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/metadata_providers/service.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/package_cli.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/parallel_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/project_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/pypi/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/pypi/bootstrap.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/pypi/conda_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/pypi/conda_environment.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/pypi/micromamba.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/pypi/pip.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/pypi/pypi_environment.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/pypi/utils.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/resources_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/retry_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/secrets/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/storage_executor.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/tag_cli.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/plugins/timeout_decorator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/procpoll.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/py.typed +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/pylint_wrapper.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/runner/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/runner/click_api.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/runner/deployer.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/runner/deployer_impl.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/runner/metaflow_runner.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/runner/nbdeploy.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/runner/nbrun.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/runner/subprocess_manager.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/runner/utils.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/runtime.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/sidecar/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/sidecar/sidecar.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/sidecar/sidecar_messages.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/sidecar/sidecar_subprocess.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/sidecar/sidecar_worker.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/system/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/system/system_logger.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/system/system_monitor.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/system/system_utils.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tagging_util.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/task.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tracing/__init__.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tracing/propagator.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tracing/span_exporter.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tracing/tracing_modules.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tuple_util.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/00-helloworld/README.md +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/01-playlist/README.md +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/01-playlist/movies.csv +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/01-playlist/playlist.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/02-statistics/README.md +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/02-statistics/movies.csv +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/02-statistics/stats.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/07-worldview/README.md +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/08-autopilot/README.md +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/unbounded_foreach.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/util.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow/vendor.py +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow.egg-info/SOURCES.txt +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow.egg-info/dependency_links.txt +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow.egg-info/entry_points.txt +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/metaflow.egg-info/top_level.txt +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/setup.cfg +0 -0
- {metaflow-2.12.34 → metaflow-2.12.35}/setup.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: metaflow
|
3
|
-
Version: 2.12.
|
3
|
+
Version: 2.12.35
|
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.12.
|
29
|
+
Requires-Dist: metaflow-stubs==2.12.35; extra == "stubs"
|
30
30
|
|
31
31
|

|
32
32
|
|
@@ -377,6 +377,8 @@ KUBERNETES_PORT = from_conf("KUBERNETES_PORT", None)
|
|
377
377
|
KUBERNETES_CPU = from_conf("KUBERNETES_CPU", None)
|
378
378
|
KUBERNETES_MEMORY = from_conf("KUBERNETES_MEMORY", None)
|
379
379
|
KUBERNETES_DISK = from_conf("KUBERNETES_DISK", None)
|
380
|
+
# Default kubernetes QoS class
|
381
|
+
KUBERNETES_QOS = from_conf("KUBERNETES_QOS", "burstable")
|
380
382
|
|
381
383
|
ARGO_WORKFLOWS_KUBERNETES_SECRETS = from_conf("ARGO_WORKFLOWS_KUBERNETES_SECRETS", "")
|
382
384
|
ARGO_WORKFLOWS_ENV_VARS_TO_SKIP = from_conf("ARGO_WORKFLOWS_ENV_VARS_TO_SKIP", "")
|
@@ -46,6 +46,7 @@ from metaflow.parameters import (
|
|
46
46
|
# TODO: Move chevron to _vendor
|
47
47
|
from metaflow.plugins.cards.card_modules import chevron
|
48
48
|
from metaflow.plugins.kubernetes.kubernetes import Kubernetes
|
49
|
+
from metaflow.plugins.kubernetes.kube_utils import qos_requests_and_limits
|
49
50
|
from metaflow.plugins.timeout_decorator import get_run_time_limit_for_task
|
50
51
|
from metaflow.util import compress_list, dict_to_cli_options, get_username
|
51
52
|
|
@@ -428,25 +429,25 @@ class Airflow(object):
|
|
428
429
|
if k8s_deco.attributes["namespace"] is not None
|
429
430
|
else "default"
|
430
431
|
)
|
431
|
-
|
432
|
+
qos_requests, qos_limits = qos_requests_and_limits(
|
433
|
+
k8s_deco.attributes["qos"],
|
434
|
+
k8s_deco.attributes["cpu"],
|
435
|
+
k8s_deco.attributes["memory"],
|
436
|
+
k8s_deco.attributes["disk"],
|
437
|
+
)
|
432
438
|
resources = dict(
|
433
|
-
requests=
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
439
|
+
requests=qos_requests,
|
440
|
+
limits={
|
441
|
+
**qos_limits,
|
442
|
+
**{
|
443
|
+
"%s.com/gpu".lower()
|
444
|
+
% k8s_deco.attributes["gpu_vendor"]: str(k8s_deco.attributes["gpu"])
|
445
|
+
for k in [0]
|
446
|
+
# Don't set GPU limits if gpu isn't specified.
|
447
|
+
if k8s_deco.attributes["gpu"] is not None
|
448
|
+
},
|
449
|
+
},
|
438
450
|
)
|
439
|
-
if k8s_deco.attributes["gpu"] is not None:
|
440
|
-
resources.update(
|
441
|
-
dict(
|
442
|
-
limits={
|
443
|
-
"%s.com/gpu".lower()
|
444
|
-
% k8s_deco.attributes["gpu_vendor"]: str(
|
445
|
-
k8s_deco.attributes["gpu"]
|
446
|
-
)
|
447
|
-
}
|
448
|
-
)
|
449
|
-
)
|
450
451
|
|
451
452
|
annotations = {
|
452
453
|
"metaflow/production_token": self.production_token,
|
@@ -53,6 +53,7 @@ from metaflow.metaflow_config import (
|
|
53
53
|
from metaflow.metaflow_config_funcs import config_values
|
54
54
|
from metaflow.mflog import BASH_SAVE_LOGS, bash_capture_logs, export_mflog_env_vars
|
55
55
|
from metaflow.parameters import deploy_time_eval
|
56
|
+
from metaflow.plugins.kubernetes.kube_utils import qos_requests_and_limits
|
56
57
|
from metaflow.plugins.kubernetes.kubernetes import (
|
57
58
|
parse_kube_keyvalue_list,
|
58
59
|
validate_kube_labels,
|
@@ -1842,6 +1843,13 @@ class ArgoWorkflows(object):
|
|
1842
1843
|
if tmpfs_enabled and tmpfs_tempdir:
|
1843
1844
|
env["METAFLOW_TEMPDIR"] = tmpfs_path
|
1844
1845
|
|
1846
|
+
qos_requests, qos_limits = qos_requests_and_limits(
|
1847
|
+
resources["qos"],
|
1848
|
+
resources["cpu"],
|
1849
|
+
resources["memory"],
|
1850
|
+
resources["disk"],
|
1851
|
+
)
|
1852
|
+
|
1845
1853
|
# Create a ContainerTemplate for this node. Ideally, we would have
|
1846
1854
|
# liked to inline this ContainerTemplate and avoid scanning the workflow
|
1847
1855
|
# twice, but due to issues with variable substitution, we will have to
|
@@ -1905,6 +1913,7 @@ class ArgoWorkflows(object):
|
|
1905
1913
|
persistent_volume_claims=resources["persistent_volume_claims"],
|
1906
1914
|
shared_memory=shared_memory,
|
1907
1915
|
port=port,
|
1916
|
+
qos=resources["qos"],
|
1908
1917
|
)
|
1909
1918
|
|
1910
1919
|
for k, v in env.items():
|
@@ -2090,17 +2099,17 @@ class ArgoWorkflows(object):
|
|
2090
2099
|
image=resources["image"],
|
2091
2100
|
image_pull_policy=resources["image_pull_policy"],
|
2092
2101
|
resources=kubernetes_sdk.V1ResourceRequirements(
|
2093
|
-
requests=
|
2094
|
-
"cpu": str(resources["cpu"]),
|
2095
|
-
"memory": "%sM" % str(resources["memory"]),
|
2096
|
-
"ephemeral-storage": "%sM"
|
2097
|
-
% str(resources["disk"]),
|
2098
|
-
},
|
2102
|
+
requests=qos_requests,
|
2099
2103
|
limits={
|
2100
|
-
|
2101
|
-
|
2102
|
-
|
2103
|
-
|
2104
|
+
**qos_limits,
|
2105
|
+
**{
|
2106
|
+
"%s.com/gpu".lower()
|
2107
|
+
% resources["gpu_vendor"]: str(
|
2108
|
+
resources["gpu"]
|
2109
|
+
)
|
2110
|
+
for k in [0]
|
2111
|
+
if resources["gpu"] is not None
|
2112
|
+
},
|
2104
2113
|
},
|
2105
2114
|
),
|
2106
2115
|
# Configure secrets
|
@@ -2337,7 +2346,7 @@ class ArgoWorkflows(object):
|
|
2337
2346
|
"memory": "500Mi",
|
2338
2347
|
},
|
2339
2348
|
),
|
2340
|
-
)
|
2349
|
+
).to_dict()
|
2341
2350
|
)
|
2342
2351
|
),
|
2343
2352
|
Template("capture-error-hook-fn-preflight").steps(
|
@@ -2688,7 +2697,7 @@ class ArgoWorkflows(object):
|
|
2688
2697
|
},
|
2689
2698
|
),
|
2690
2699
|
)
|
2691
|
-
)
|
2700
|
+
).to_dict()
|
2692
2701
|
)
|
2693
2702
|
)
|
2694
2703
|
|
@@ -2858,7 +2867,7 @@ class ArgoWorkflows(object):
|
|
2858
2867
|
"memory": "250Mi",
|
2859
2868
|
},
|
2860
2869
|
),
|
2861
|
-
)
|
2870
|
+
).to_dict()
|
2862
2871
|
)
|
2863
2872
|
)
|
2864
2873
|
.service_account_name(ARGO_EVENTS_SERVICE_ACCOUNT)
|
@@ -0,0 +1,54 @@
|
|
1
|
+
from metaflow.exception import CommandException
|
2
|
+
from metaflow.util import get_username, get_latest_run_id
|
3
|
+
|
4
|
+
|
5
|
+
def parse_cli_options(flow_name, run_id, user, my_runs, echo):
|
6
|
+
if user and my_runs:
|
7
|
+
raise CommandException("--user and --my-runs are mutually exclusive.")
|
8
|
+
|
9
|
+
if run_id and my_runs:
|
10
|
+
raise CommandException("--run_id and --my-runs are mutually exclusive.")
|
11
|
+
|
12
|
+
if my_runs:
|
13
|
+
user = get_username()
|
14
|
+
|
15
|
+
latest_run = True
|
16
|
+
|
17
|
+
if user and not run_id:
|
18
|
+
latest_run = False
|
19
|
+
|
20
|
+
if not run_id and latest_run:
|
21
|
+
run_id = get_latest_run_id(echo, flow_name)
|
22
|
+
if run_id is None:
|
23
|
+
raise CommandException("A previous run id was not found. Specify --run-id.")
|
24
|
+
|
25
|
+
return flow_name, run_id, user
|
26
|
+
|
27
|
+
|
28
|
+
def qos_requests_and_limits(qos: str, cpu: int, memory: int, storage: int):
|
29
|
+
"return resource requests and limits for the kubernetes pod based on the given QoS Class"
|
30
|
+
# case insensitive matching for QoS class
|
31
|
+
qos = qos.lower()
|
32
|
+
# Determine the requests and limits to define chosen QoS class
|
33
|
+
qos_limits = {}
|
34
|
+
qos_requests = {}
|
35
|
+
if qos == "guaranteed":
|
36
|
+
# Guaranteed - has both cpu/memory limits. requests not required, as these will be inferred.
|
37
|
+
qos_limits = {
|
38
|
+
"cpu": str(cpu),
|
39
|
+
"memory": "%sM" % str(memory),
|
40
|
+
"ephemeral-storage": "%sM" % str(storage),
|
41
|
+
}
|
42
|
+
# NOTE: Even though Kubernetes will produce matching requests for the specified limits, this happens late in the lifecycle.
|
43
|
+
# We specify them explicitly here to make some K8S tooling happy, in case they rely on .resources.requests being present at time of submitting the job.
|
44
|
+
qos_requests = qos_limits
|
45
|
+
else:
|
46
|
+
# Burstable - not Guaranteed, and has a memory/cpu limit or request
|
47
|
+
qos_requests = {
|
48
|
+
"cpu": str(cpu),
|
49
|
+
"memory": "%sM" % str(memory),
|
50
|
+
"ephemeral-storage": "%sM" % str(storage),
|
51
|
+
}
|
52
|
+
# TODO: Add support for BestEffort once there is a use case for it.
|
53
|
+
# BestEffort - no limit or requests for cpu/memory
|
54
|
+
return qos_requests, qos_limits
|
@@ -196,6 +196,7 @@ class Kubernetes(object):
|
|
196
196
|
shared_memory=None,
|
197
197
|
port=None,
|
198
198
|
num_parallel=None,
|
199
|
+
qos=None,
|
199
200
|
):
|
200
201
|
name = "js-%s" % str(uuid4())[:6]
|
201
202
|
jobset = (
|
@@ -228,6 +229,7 @@ class Kubernetes(object):
|
|
228
229
|
shared_memory=shared_memory,
|
229
230
|
port=port,
|
230
231
|
num_parallel=num_parallel,
|
232
|
+
qos=qos,
|
231
233
|
)
|
232
234
|
.environment_variable("METAFLOW_CODE_SHA", code_package_sha)
|
233
235
|
.environment_variable("METAFLOW_CODE_URL", code_package_url)
|
@@ -488,6 +490,7 @@ class Kubernetes(object):
|
|
488
490
|
shared_memory=None,
|
489
491
|
port=None,
|
490
492
|
name_pattern=None,
|
493
|
+
qos=None,
|
491
494
|
):
|
492
495
|
if env is None:
|
493
496
|
env = {}
|
@@ -528,6 +531,7 @@ class Kubernetes(object):
|
|
528
531
|
persistent_volume_claims=persistent_volume_claims,
|
529
532
|
shared_memory=shared_memory,
|
530
533
|
port=port,
|
534
|
+
qos=qos,
|
531
535
|
)
|
532
536
|
.environment_variable("METAFLOW_CODE_SHA", code_package_sha)
|
533
537
|
.environment_variable("METAFLOW_CODE_URL", code_package_url)
|
@@ -126,6 +126,12 @@ def kubernetes():
|
|
126
126
|
type=int,
|
127
127
|
help="Number of parallel nodes to run as a multi-node job.",
|
128
128
|
)
|
129
|
+
@click.option(
|
130
|
+
"--qos",
|
131
|
+
default=None,
|
132
|
+
type=str,
|
133
|
+
help="Quality of Service class for the Kubernetes pod",
|
134
|
+
)
|
129
135
|
@click.pass_context
|
130
136
|
def step(
|
131
137
|
ctx,
|
@@ -154,6 +160,7 @@ def step(
|
|
154
160
|
shared_memory=None,
|
155
161
|
port=None,
|
156
162
|
num_parallel=None,
|
163
|
+
qos=None,
|
157
164
|
**kwargs
|
158
165
|
):
|
159
166
|
def echo(msg, stream="stderr", job_id=None, **kwargs):
|
@@ -294,6 +301,7 @@ def step(
|
|
294
301
|
shared_memory=shared_memory,
|
295
302
|
port=port,
|
296
303
|
num_parallel=num_parallel,
|
304
|
+
qos=qos,
|
297
305
|
)
|
298
306
|
except Exception as e:
|
299
307
|
traceback.print_exc(chain=False)
|
@@ -26,6 +26,7 @@ from metaflow.metaflow_config import (
|
|
26
26
|
KUBERNETES_SERVICE_ACCOUNT,
|
27
27
|
KUBERNETES_SHARED_MEMORY,
|
28
28
|
KUBERNETES_TOLERATIONS,
|
29
|
+
KUBERNETES_QOS,
|
29
30
|
)
|
30
31
|
from metaflow.plugins.resources_decorator import ResourcesDecorator
|
31
32
|
from metaflow.plugins.timeout_decorator import get_run_time_limit_for_task
|
@@ -41,6 +42,8 @@ except NameError:
|
|
41
42
|
unicode = str
|
42
43
|
basestring = str
|
43
44
|
|
45
|
+
SUPPORTED_KUBERNETES_QOS_CLASSES = ["Guaranteed", "Burstable"]
|
46
|
+
|
44
47
|
|
45
48
|
class KubernetesDecorator(StepDecorator):
|
46
49
|
"""
|
@@ -109,6 +112,8 @@ class KubernetesDecorator(StepDecorator):
|
|
109
112
|
hostname_resolution_timeout: int, default 10 * 60
|
110
113
|
Timeout in seconds for the workers tasks in the gang scheduled cluster to resolve the hostname of control task.
|
111
114
|
Only applicable when @parallel is used.
|
115
|
+
qos: str, default: Burstable
|
116
|
+
Quality of Service class to assign to the pod. Supported values are: Guaranteed, Burstable, BestEffort
|
112
117
|
"""
|
113
118
|
|
114
119
|
name = "kubernetes"
|
@@ -136,6 +141,7 @@ class KubernetesDecorator(StepDecorator):
|
|
136
141
|
"compute_pool": None,
|
137
142
|
"executable": None,
|
138
143
|
"hostname_resolution_timeout": 10 * 60,
|
144
|
+
"qos": KUBERNETES_QOS,
|
139
145
|
}
|
140
146
|
package_url = None
|
141
147
|
package_sha = None
|
@@ -259,6 +265,17 @@ class KubernetesDecorator(StepDecorator):
|
|
259
265
|
self.step = step
|
260
266
|
self.flow_datastore = flow_datastore
|
261
267
|
|
268
|
+
if (
|
269
|
+
self.attributes["qos"] is not None
|
270
|
+
# case insensitive matching.
|
271
|
+
and self.attributes["qos"].lower()
|
272
|
+
not in [c.lower() for c in SUPPORTED_KUBERNETES_QOS_CLASSES]
|
273
|
+
):
|
274
|
+
raise MetaflowException(
|
275
|
+
"*%s* is not a valid Kubernetes QoS class. Choose one of the following: %s"
|
276
|
+
% (self.attributes["qos"], ", ".join(SUPPORTED_KUBERNETES_QOS_CLASSES))
|
277
|
+
)
|
278
|
+
|
262
279
|
if any([deco.name == "batch" for deco in decos]):
|
263
280
|
raise MetaflowException(
|
264
281
|
"Step *{step}* is marked for execution both on AWS Batch and "
|
@@ -15,6 +15,8 @@ from .kubernetes_jobsets import (
|
|
15
15
|
KubernetesJobSet,
|
16
16
|
) # We need this import for Kubernetes Client.
|
17
17
|
|
18
|
+
from .kube_utils import qos_requests_and_limits
|
19
|
+
|
18
20
|
|
19
21
|
class KubernetesJobException(MetaflowException):
|
20
22
|
headline = "Kubernetes job error"
|
@@ -74,6 +76,13 @@ class KubernetesJob(object):
|
|
74
76
|
if self._kwargs["shared_memory"]
|
75
77
|
else None
|
76
78
|
)
|
79
|
+
qos_requests, qos_limits = qos_requests_and_limits(
|
80
|
+
self._kwargs["qos"],
|
81
|
+
self._kwargs["cpu"],
|
82
|
+
self._kwargs["memory"],
|
83
|
+
self._kwargs["disk"],
|
84
|
+
)
|
85
|
+
|
77
86
|
return client.V1JobSpec(
|
78
87
|
# Retries are handled by Metaflow when it is responsible for
|
79
88
|
# executing the flow. The responsibility is moved to Kubernetes
|
@@ -154,20 +163,18 @@ class KubernetesJob(object):
|
|
154
163
|
image_pull_policy=self._kwargs["image_pull_policy"],
|
155
164
|
name=self._kwargs["step_name"].replace("_", "-"),
|
156
165
|
resources=client.V1ResourceRequirements(
|
157
|
-
requests=
|
158
|
-
"cpu": str(self._kwargs["cpu"]),
|
159
|
-
"memory": "%sM" % str(self._kwargs["memory"]),
|
160
|
-
"ephemeral-storage": "%sM"
|
161
|
-
% str(self._kwargs["disk"]),
|
162
|
-
},
|
166
|
+
requests=qos_requests,
|
163
167
|
limits={
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
168
|
+
**qos_limits,
|
169
|
+
**{
|
170
|
+
"%s.com/gpu".lower()
|
171
|
+
% self._kwargs["gpu_vendor"]: str(
|
172
|
+
self._kwargs["gpu"]
|
173
|
+
)
|
174
|
+
for k in [0]
|
175
|
+
# Don't set GPU limits if gpu isn't specified.
|
176
|
+
if self._kwargs["gpu"] is not None
|
177
|
+
},
|
171
178
|
},
|
172
179
|
),
|
173
180
|
volume_mounts=(
|
@@ -9,6 +9,8 @@ from metaflow.metaflow_config import KUBERNETES_JOBSET_GROUP, KUBERNETES_JOBSET_
|
|
9
9
|
from metaflow.tracing import inject_tracing_vars
|
10
10
|
from metaflow.metaflow_config import KUBERNETES_SECRETS
|
11
11
|
|
12
|
+
from .kube_utils import qos_requests_and_limits
|
13
|
+
|
12
14
|
|
13
15
|
class KubernetesJobsetException(MetaflowException):
|
14
16
|
headline = "Kubernetes jobset error"
|
@@ -554,7 +556,12 @@ class JobSetSpec(object):
|
|
554
556
|
if self._kwargs["shared_memory"]
|
555
557
|
else None
|
556
558
|
)
|
557
|
-
|
559
|
+
qos_requests, qos_limits = qos_requests_and_limits(
|
560
|
+
self._kwargs["qos"],
|
561
|
+
self._kwargs["cpu"],
|
562
|
+
self._kwargs["memory"],
|
563
|
+
self._kwargs["disk"],
|
564
|
+
)
|
558
565
|
return dict(
|
559
566
|
name=self.name,
|
560
567
|
template=client.api_client.ApiClient().sanitize_for_serialization(
|
@@ -653,21 +660,18 @@ class JobSetSpec(object):
|
|
653
660
|
"_", "-"
|
654
661
|
),
|
655
662
|
resources=client.V1ResourceRequirements(
|
656
|
-
requests=
|
657
|
-
"cpu": str(self._kwargs["cpu"]),
|
658
|
-
"memory": "%sM"
|
659
|
-
% str(self._kwargs["memory"]),
|
660
|
-
"ephemeral-storage": "%sM"
|
661
|
-
% str(self._kwargs["disk"]),
|
662
|
-
},
|
663
|
+
requests=qos_requests,
|
663
664
|
limits={
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
665
|
+
**qos_limits,
|
666
|
+
**{
|
667
|
+
"%s.com/gpu".lower()
|
668
|
+
% self._kwargs["gpu_vendor"]: str(
|
669
|
+
self._kwargs["gpu"]
|
670
|
+
)
|
671
|
+
for k in [0]
|
672
|
+
# Don't set GPU limits if gpu isn't specified.
|
673
|
+
if self._kwargs["gpu"] is not None
|
674
|
+
},
|
671
675
|
},
|
672
676
|
),
|
673
677
|
volume_mounts=(
|
@@ -0,0 +1 @@
|
|
1
|
+
metaflow_version = "2.12.35"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: metaflow
|
3
|
-
Version: 2.12.
|
3
|
+
Version: 2.12.35
|
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.12.
|
29
|
+
Requires-Dist: metaflow-stubs==2.12.35; extra == "stubs"
|
30
30
|
|
31
31
|

|
32
32
|
|
@@ -1,25 +0,0 @@
|
|
1
|
-
from metaflow.exception import CommandException
|
2
|
-
from metaflow.util import get_username, get_latest_run_id
|
3
|
-
|
4
|
-
|
5
|
-
def parse_cli_options(flow_name, run_id, user, my_runs, echo):
|
6
|
-
if user and my_runs:
|
7
|
-
raise CommandException("--user and --my-runs are mutually exclusive.")
|
8
|
-
|
9
|
-
if run_id and my_runs:
|
10
|
-
raise CommandException("--run_id and --my-runs are mutually exclusive.")
|
11
|
-
|
12
|
-
if my_runs:
|
13
|
-
user = get_username()
|
14
|
-
|
15
|
-
latest_run = True
|
16
|
-
|
17
|
-
if user and not run_id:
|
18
|
-
latest_run = False
|
19
|
-
|
20
|
-
if not run_id and latest_run:
|
21
|
-
run_id = get_latest_run_id(echo, flow_name)
|
22
|
-
if run_id is None:
|
23
|
-
raise CommandException("A previous run id was not found. Specify --run-id.")
|
24
|
-
|
25
|
-
return flow_name, run_id, user
|
@@ -1 +0,0 @@
|
|
1
|
-
metaflow_version = "2.12.34"
|
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
|
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
|