metaflow 2.12.34__tar.gz → 2.12.36__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.
Files changed (364) hide show
  1. {metaflow-2.12.34/metaflow.egg-info → metaflow-2.12.36}/PKG-INFO +2 -2
  2. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/metaflow_config.py +2 -0
  3. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/airflow/airflow.py +18 -17
  4. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/argo/argo_workflows.py +22 -13
  5. metaflow-2.12.36/metaflow/plugins/kubernetes/kube_utils.py +54 -0
  6. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/kubernetes/kubernetes.py +4 -0
  7. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/kubernetes/kubernetes_cli.py +8 -0
  8. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/kubernetes/kubernetes_decorator.py +17 -0
  9. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/kubernetes/kubernetes_job.py +20 -13
  10. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +19 -15
  11. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/parallel_decorator.py +4 -1
  12. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/runtime.py +88 -32
  13. metaflow-2.12.36/metaflow/version.py +1 -0
  14. {metaflow-2.12.34 → metaflow-2.12.36/metaflow.egg-info}/PKG-INFO +2 -2
  15. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow.egg-info/requires.txt +1 -1
  16. metaflow-2.12.34/metaflow/plugins/kubernetes/kube_utils.py +0 -25
  17. metaflow-2.12.34/metaflow/version.py +0 -1
  18. {metaflow-2.12.34 → metaflow-2.12.36}/LICENSE +0 -0
  19. {metaflow-2.12.34 → metaflow-2.12.36}/MANIFEST.in +0 -0
  20. {metaflow-2.12.34 → metaflow-2.12.36}/README.md +0 -0
  21. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/R.py +0 -0
  22. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/__init__.py +0 -0
  23. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/__init__.py +0 -0
  24. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/__init__.py +0 -0
  25. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  26. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/_compat.py +0 -0
  27. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/_termui_impl.py +0 -0
  28. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/_textwrap.py +0 -0
  29. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/_unicodefun.py +0 -0
  30. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/_winconsole.py +0 -0
  31. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/core.py +0 -0
  32. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/decorators.py +0 -0
  33. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/exceptions.py +0 -0
  34. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/formatting.py +0 -0
  35. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/globals.py +0 -0
  36. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/parser.py +0 -0
  37. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/termui.py +0 -0
  38. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/testing.py +0 -0
  39. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/types.py +0 -0
  40. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/click/utils.py +0 -0
  41. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  42. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  43. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  44. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  45. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  46. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  47. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  48. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  49. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  50. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/packaging/__init__.py +0 -0
  51. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/packaging/_elffile.py +0 -0
  52. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  53. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  54. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/packaging/_parser.py +0 -0
  55. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/packaging/_structures.py +0 -0
  56. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  57. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/packaging/markers.py +0 -0
  58. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/packaging/py.typed +0 -0
  59. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/packaging/requirements.py +0 -0
  60. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/packaging/specifiers.py +0 -0
  61. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/packaging/tags.py +0 -0
  62. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/packaging/utils.py +0 -0
  63. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/packaging/version.py +0 -0
  64. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/typeguard/__init__.py +0 -0
  65. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  66. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/typeguard/_config.py +0 -0
  67. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  68. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  69. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/typeguard/_functions.py +0 -0
  70. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  71. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/typeguard/_memo.py +0 -0
  72. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  73. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  74. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  75. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  76. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/typeguard/_utils.py +0 -0
  77. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/typeguard/py.typed +0 -0
  78. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/typing_extensions.py +0 -0
  79. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/v3_5/__init__.py +0 -0
  80. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
  81. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
  82. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/v3_5/zipp.py +0 -0
  83. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/v3_6/__init__.py +0 -0
  84. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  85. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  86. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  87. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  88. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  89. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  90. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  91. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  92. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  93. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  94. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/v3_6/zipp.py +0 -0
  95. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/_vendor/zipp.py +0 -0
  96. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/cards.py +0 -0
  97. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/cli.py +0 -0
  98. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/cli_args.py +0 -0
  99. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/client/__init__.py +0 -0
  100. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/client/core.py +0 -0
  101. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/client/filecache.py +0 -0
  102. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/clone_util.py +0 -0
  103. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/cmd/__init__.py +0 -0
  104. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/cmd/configure_cmd.py +0 -0
  105. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/cmd/develop/__init__.py +0 -0
  106. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/cmd/develop/stub_generator.py +0 -0
  107. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/cmd/develop/stubs.py +0 -0
  108. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/cmd/main_cli.py +0 -0
  109. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/cmd/tutorials_cmd.py +0 -0
  110. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/cmd/util.py +0 -0
  111. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/cmd_with_io.py +0 -0
  112. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/datastore/__init__.py +0 -0
  113. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/datastore/content_addressed_store.py +0 -0
  114. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/datastore/datastore_set.py +0 -0
  115. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/datastore/datastore_storage.py +0 -0
  116. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/datastore/exceptions.py +0 -0
  117. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/datastore/flow_datastore.py +0 -0
  118. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/datastore/inputs.py +0 -0
  119. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/datastore/task_datastore.py +0 -0
  120. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/debug.py +0 -0
  121. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/decorators.py +0 -0
  122. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/event_logger.py +0 -0
  123. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/events.py +0 -0
  124. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/exception.py +0 -0
  125. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/extension_support/__init__.py +0 -0
  126. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/extension_support/_empty_file.py +0 -0
  127. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/extension_support/cmd.py +0 -0
  128. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/extension_support/integrations.py +0 -0
  129. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/extension_support/plugins.py +0 -0
  130. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/flowspec.py +0 -0
  131. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/graph.py +0 -0
  132. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/includefile.py +0 -0
  133. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/info_file.py +0 -0
  134. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/integrations.py +0 -0
  135. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/lint.py +0 -0
  136. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/metadata_provider/__init__.py +0 -0
  137. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/metadata_provider/heartbeat.py +0 -0
  138. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/metadata_provider/metadata.py +0 -0
  139. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/metadata_provider/util.py +0 -0
  140. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/metaflow_config_funcs.py +0 -0
  141. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/metaflow_current.py +0 -0
  142. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/metaflow_environment.py +0 -0
  143. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/metaflow_profile.py +0 -0
  144. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/metaflow_version.py +0 -0
  145. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/mflog/__init__.py +0 -0
  146. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/mflog/mflog.py +0 -0
  147. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/mflog/save_logs.py +0 -0
  148. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/mflog/save_logs_periodically.py +0 -0
  149. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/mflog/tee.py +0 -0
  150. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/monitor.py +0 -0
  151. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/multicore_utils.py +0 -0
  152. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/package.py +0 -0
  153. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/parameters.py +0 -0
  154. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/__init__.py +0 -0
  155. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/airflow/__init__.py +0 -0
  156. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  157. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  158. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  159. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/airflow/dag.py +0 -0
  160. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/airflow/exception.py +0 -0
  161. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  162. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  163. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  164. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  165. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  166. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  167. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/argo/__init__.py +0 -0
  168. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/argo/argo_client.py +0 -0
  169. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/argo/argo_events.py +0 -0
  170. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
  171. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  172. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
  173. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +0 -0
  174. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/argo/capture_error.py +0 -0
  175. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  176. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
  177. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/__init__.py +0 -0
  178. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/aws_client.py +0 -0
  179. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/aws_utils.py +0 -0
  180. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/batch/__init__.py +0 -0
  181. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/batch/batch.py +0 -0
  182. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  183. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  184. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
  185. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  186. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  187. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  188. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  189. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  190. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  191. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  192. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  193. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  194. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  195. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  196. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  197. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
  198. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -0
  199. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/azure/__init__.py +0 -0
  200. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/azure/azure_credential.py +0 -0
  201. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  202. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  203. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/azure/azure_tail.py +0 -0
  204. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/azure/azure_utils.py +0 -0
  205. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  206. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/azure/includefile_support.py +0 -0
  207. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/__init__.py +0 -0
  208. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_cli.py +0 -0
  209. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_client.py +0 -0
  210. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_creator.py +0 -0
  211. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_datastore.py +0 -0
  212. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_decorator.py +0 -0
  213. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  214. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_modules/base.html +0 -0
  215. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  216. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  217. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_modules/card.py +0 -0
  218. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  219. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  220. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  221. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  222. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  223. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_modules/components.py +0 -0
  224. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  225. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_modules/main.js +0 -0
  226. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  227. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  228. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_resolver.py +0 -0
  229. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_server.py +0 -0
  230. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  231. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/component_serializer.py +0 -0
  232. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/cards/exception.py +0 -0
  233. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/catch_decorator.py +0 -0
  234. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/datastores/__init__.py +0 -0
  235. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/datastores/azure_storage.py +0 -0
  236. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/datastores/gs_storage.py +0 -0
  237. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/datastores/local_storage.py +0 -0
  238. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/datastores/s3_storage.py +0 -0
  239. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/datatools/__init__.py +0 -0
  240. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/datatools/local.py +0 -0
  241. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  242. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/datatools/s3/s3.py +0 -0
  243. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/datatools/s3/s3op.py +0 -0
  244. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  245. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  246. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/debug_logger.py +0 -0
  247. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/debug_monitor.py +0 -0
  248. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/__init__.py +0 -0
  249. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/client.py +0 -0
  250. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/client_modules.py +0 -0
  251. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  252. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  253. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  254. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  255. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  256. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  257. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  258. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  259. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  260. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  261. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/consts.py +0 -0
  262. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  263. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  264. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  265. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/server.py +0 -0
  266. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/stub.py +0 -0
  267. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/env_escape/utils.py +0 -0
  268. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/environment_decorator.py +0 -0
  269. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/events_decorator.py +0 -0
  270. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/frameworks/__init__.py +0 -0
  271. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/frameworks/pytorch.py +0 -0
  272. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/gcp/__init__.py +0 -0
  273. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  274. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  275. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  276. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/gcp/gs_tail.py +0 -0
  277. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/gcp/gs_utils.py +0 -0
  278. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/gcp/includefile_support.py +0 -0
  279. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/kubernetes/__init__.py +0 -0
  280. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  281. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/logs_cli.py +0 -0
  282. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/metadata_providers/__init__.py +0 -0
  283. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/metadata_providers/local.py +0 -0
  284. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/metadata_providers/service.py +0 -0
  285. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/package_cli.py +0 -0
  286. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/project_decorator.py +0 -0
  287. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/pypi/__init__.py +0 -0
  288. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/pypi/bootstrap.py +0 -0
  289. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/pypi/conda_decorator.py +0 -0
  290. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/pypi/conda_environment.py +0 -0
  291. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/pypi/micromamba.py +0 -0
  292. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/pypi/pip.py +0 -0
  293. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  294. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  295. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/pypi/utils.py +0 -0
  296. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/resources_decorator.py +0 -0
  297. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/retry_decorator.py +0 -0
  298. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/secrets/__init__.py +0 -0
  299. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  300. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  301. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/storage_executor.py +0 -0
  302. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/tag_cli.py +0 -0
  303. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  304. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/plugins/timeout_decorator.py +0 -0
  305. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/procpoll.py +0 -0
  306. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/py.typed +0 -0
  307. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/pylint_wrapper.py +0 -0
  308. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/runner/__init__.py +0 -0
  309. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/runner/click_api.py +0 -0
  310. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/runner/deployer.py +0 -0
  311. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/runner/deployer_impl.py +0 -0
  312. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/runner/metaflow_runner.py +0 -0
  313. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/runner/nbdeploy.py +0 -0
  314. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/runner/nbrun.py +0 -0
  315. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/runner/subprocess_manager.py +0 -0
  316. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/runner/utils.py +0 -0
  317. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/sidecar/__init__.py +0 -0
  318. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/sidecar/sidecar.py +0 -0
  319. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/sidecar/sidecar_messages.py +0 -0
  320. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  321. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/sidecar/sidecar_worker.py +0 -0
  322. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/system/__init__.py +0 -0
  323. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/system/system_logger.py +0 -0
  324. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/system/system_monitor.py +0 -0
  325. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/system/system_utils.py +0 -0
  326. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tagging_util.py +0 -0
  327. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/task.py +0 -0
  328. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tracing/__init__.py +0 -0
  329. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tracing/propagator.py +0 -0
  330. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tracing/span_exporter.py +0 -0
  331. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tracing/tracing_modules.py +0 -0
  332. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tuple_util.py +0 -0
  333. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/00-helloworld/README.md +0 -0
  334. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  335. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/01-playlist/README.md +0 -0
  336. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  337. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  338. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  339. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/02-statistics/README.md +0 -0
  340. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  341. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  342. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/02-statistics/stats.py +0 -0
  343. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  344. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  345. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  346. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  347. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  348. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  349. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  350. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  351. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  352. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/07-worldview/README.md +0 -0
  353. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  354. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/08-autopilot/README.md +0 -0
  355. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  356. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/unbounded_foreach.py +0 -0
  357. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/util.py +0 -0
  358. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow/vendor.py +0 -0
  359. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow.egg-info/SOURCES.txt +0 -0
  360. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow.egg-info/dependency_links.txt +0 -0
  361. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow.egg-info/entry_points.txt +0 -0
  362. {metaflow-2.12.34 → metaflow-2.12.36}/metaflow.egg-info/top_level.txt +0 -0
  363. {metaflow-2.12.34 → metaflow-2.12.36}/setup.cfg +0 -0
  364. {metaflow-2.12.34 → metaflow-2.12.36}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: metaflow
3
- Version: 2.12.34
3
+ Version: 2.12.36
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.34; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.12.36; extra == "stubs"
30
30
 
31
31
  ![Metaflow_Logo_Horizontal_FullColor_Ribbon_Dark_RGB](https://user-images.githubusercontent.com/763451/89453116-96a57e00-d713-11ea-9fa6-82b29d4d6eff.png)
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
- "cpu": k8s_deco.attributes["cpu"],
435
- "memory": "%sM" % str(k8s_deco.attributes["memory"]),
436
- "ephemeral-storage": str(k8s_deco.attributes["disk"]),
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
- "%s.com/gpu".lower()
2101
- % resources["gpu_vendor"]: str(resources["gpu"])
2102
- for k in [0]
2103
- if resources["gpu"] is not None
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
- "%s.com/gpu".lower()
165
- % self._kwargs["gpu_vendor"]: str(
166
- self._kwargs["gpu"]
167
- )
168
- for k in [0]
169
- # Don't set GPU limits if gpu isn't specified.
170
- if self._kwargs["gpu"] is not None
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
- "%s.com/gpu".lower()
665
- % self._kwargs["gpu_vendor"]: str(
666
- self._kwargs["gpu"]
667
- )
668
- for k in [0]
669
- # Don't set GPU limits if gpu isn't specified.
670
- if self._kwargs["gpu"] is not None
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=(
@@ -45,6 +45,8 @@ class ParallelDecorator(StepDecorator):
45
45
  if ubf_context == UBF_CONTROL:
46
46
  num_parallel = cli_args.task.ubf_iter.num_parallel
47
47
  cli_args.command_options["num-parallel"] = str(num_parallel)
48
+ if os.environ.get("METAFLOW_RUNTIME_ENVIRONMENT", "local") == "local":
49
+ cli_args.command_options["split_index"] = "0"
48
50
 
49
51
  def step_init(
50
52
  self, flow, graph, step_name, decorators, environment, flow_datastore, logger
@@ -126,6 +128,8 @@ class ParallelDecorator(StepDecorator):
126
128
  tags=["attempt_id:{0}".format(0)],
127
129
  )
128
130
  ]
131
+ flow._control_task_is_mapper_zero = True
132
+
129
133
  metadata.register_metadata(run_id, step_name, task_id, task_metadata_list)
130
134
 
131
135
  def task_decorate(
@@ -221,7 +225,6 @@ def _local_multinode_control_task_step_func(
221
225
  "%s/%s/%s" % (run_id, step_name, mapper_task_id)
222
226
  for mapper_task_id in mapper_task_ids
223
227
  ]
224
- flow._control_task_is_mapper_zero = True
225
228
 
226
229
  # run the step function ourselves
227
230
  os.environ["MF_PARALLEL_NODE_INDEX"] = "0"