metaflow 2.8.2__tar.gz → 2.8.3__tar.gz

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