metaflow 2.12.7__py2.py3-none-any.whl → 2.12.9__py2.py3-none-any.whl

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 (40) hide show
  1. metaflow/__init__.py +2 -0
  2. metaflow/cli.py +12 -4
  3. metaflow/extension_support/plugins.py +1 -0
  4. metaflow/flowspec.py +8 -1
  5. metaflow/lint.py +13 -0
  6. metaflow/metaflow_current.py +0 -8
  7. metaflow/plugins/__init__.py +12 -0
  8. metaflow/plugins/argo/argo_workflows.py +462 -42
  9. metaflow/plugins/argo/argo_workflows_cli.py +60 -3
  10. metaflow/plugins/argo/argo_workflows_decorator.py +38 -7
  11. metaflow/plugins/argo/argo_workflows_deployer.py +290 -0
  12. metaflow/plugins/argo/jobset_input_paths.py +16 -0
  13. metaflow/plugins/aws/batch/batch_decorator.py +16 -13
  14. metaflow/plugins/aws/step_functions/step_functions_cli.py +45 -3
  15. metaflow/plugins/aws/step_functions/step_functions_deployer.py +251 -0
  16. metaflow/plugins/cards/card_cli.py +1 -1
  17. metaflow/plugins/kubernetes/kubernetes.py +279 -52
  18. metaflow/plugins/kubernetes/kubernetes_cli.py +26 -8
  19. metaflow/plugins/kubernetes/kubernetes_client.py +0 -1
  20. metaflow/plugins/kubernetes/kubernetes_decorator.py +56 -44
  21. metaflow/plugins/kubernetes/kubernetes_job.py +6 -6
  22. metaflow/plugins/kubernetes/kubernetes_jobsets.py +510 -272
  23. metaflow/plugins/parallel_decorator.py +108 -8
  24. metaflow/plugins/pypi/bootstrap.py +1 -1
  25. metaflow/plugins/pypi/micromamba.py +1 -1
  26. metaflow/plugins/secrets/secrets_decorator.py +12 -3
  27. metaflow/plugins/test_unbounded_foreach_decorator.py +39 -4
  28. metaflow/runner/deployer.py +386 -0
  29. metaflow/runner/metaflow_runner.py +1 -20
  30. metaflow/runner/nbdeploy.py +130 -0
  31. metaflow/runner/nbrun.py +4 -28
  32. metaflow/runner/utils.py +49 -0
  33. metaflow/runtime.py +246 -134
  34. metaflow/version.py +1 -1
  35. {metaflow-2.12.7.dist-info → metaflow-2.12.9.dist-info}/METADATA +2 -2
  36. {metaflow-2.12.7.dist-info → metaflow-2.12.9.dist-info}/RECORD +40 -34
  37. {metaflow-2.12.7.dist-info → metaflow-2.12.9.dist-info}/WHEEL +1 -1
  38. {metaflow-2.12.7.dist-info → metaflow-2.12.9.dist-info}/LICENSE +0 -0
  39. {metaflow-2.12.7.dist-info → metaflow-2.12.9.dist-info}/entry_points.txt +0 -0
  40. {metaflow-2.12.7.dist-info → metaflow-2.12.9.dist-info}/top_level.txt +0 -0
metaflow/__init__.py CHANGED
@@ -150,6 +150,8 @@ from . import tuple_util
150
150
  if sys.version_info >= (3, 7):
151
151
  from .runner.metaflow_runner import Runner
152
152
  from .runner.nbrun import NBRunner
153
+ from .runner.deployer import Deployer
154
+ from .runner.nbdeploy import NBDeployer
153
155
 
154
156
  __version_addl__ = []
155
157
  _ext_debug("Loading top-level modules")
metaflow/cli.py CHANGED
@@ -707,10 +707,18 @@ def resume(
707
707
  "/".join((obj.flow.name, runtime.run_id)),
708
708
  ),
709
709
  )
710
- if clone_only:
711
- runtime.clone_original_run()
712
- else:
713
- runtime.execute()
710
+
711
+ # We may skip clone-only resume if this is not a resume leader,
712
+ # and clone is already complete.
713
+ if runtime.should_skip_clone_only_execution():
714
+ return
715
+
716
+ with runtime.run_heartbeat():
717
+ if clone_only:
718
+ runtime.clone_original_run()
719
+ else:
720
+ runtime.clone_original_run(generate_task_obj=True, verbose=False)
721
+ runtime.execute()
714
722
 
715
723
 
716
724
  @tracing.cli_entrypoint("cli/run")
@@ -180,6 +180,7 @@ _plugin_categories = {
180
180
  "datastore": lambda x: x.TYPE,
181
181
  "secrets_provider": lambda x: x.TYPE,
182
182
  "gcp_client_provider": lambda x: x.name,
183
+ "deployer_impl_provider": lambda x: x.TYPE,
183
184
  "azure_client_provider": lambda x: x.name,
184
185
  "sidecar": None,
185
186
  "logging_sidecar": None,
metaflow/flowspec.py CHANGED
@@ -28,7 +28,14 @@ except NameError:
28
28
 
29
29
  from .datastore.inputs import Inputs
30
30
 
31
- INTERNAL_ARTIFACTS_SET = set(["_foreach_values"])
31
+ INTERNAL_ARTIFACTS_SET = set(
32
+ [
33
+ "_foreach_values",
34
+ "_unbounded_foreach",
35
+ "_control_mapper_tasks",
36
+ "_control_task_is_mapper_zero",
37
+ ]
38
+ )
32
39
 
33
40
 
34
41
  class InvalidNextException(MetaflowException):
metaflow/lint.py CHANGED
@@ -293,6 +293,19 @@ def check_parallel_step_after_next(graph):
293
293
  raise LintWarn(msg.format(node))
294
294
 
295
295
 
296
+ @linter.ensure_static_graph
297
+ @linter.check
298
+ def check_join_followed_by_parallel_step(graph):
299
+ msg = (
300
+ "An @parallel step should be followed by a join step. Step *{0}* is called "
301
+ "after an @parallel step but is not a join step. Please add an extra `inputs` "
302
+ "argument to the step."
303
+ )
304
+ for node in graph:
305
+ if node.parallel_step and not graph[node.out_funcs[0]].type == "join":
306
+ raise LintWarn(msg.format(node.out_funcs[0]))
307
+
308
+
296
309
  @linter.ensure_static_graph
297
310
  @linter.check
298
311
  def check_parallel_foreach_calls_parallel_step(graph):
@@ -260,14 +260,6 @@ class Current(object):
260
260
  """
261
261
  return self._username
262
262
 
263
- @property
264
- def parallel(self):
265
- return Parallel(
266
- main_ip=os.environ.get("MF_PARALLEL_MAIN_IP", "127.0.0.1"),
267
- num_nodes=int(os.environ.get("MF_PARALLEL_NUM_NODES", "1")),
268
- node_index=int(os.environ.get("MF_PARALLEL_NODE_INDEX", "0")),
269
- )
270
-
271
263
  @property
272
264
  def tags(self):
273
265
  """
@@ -1,3 +1,5 @@
1
+ import sys
2
+
1
3
  from metaflow.extension_support.plugins import (
2
4
  merge_lists,
3
5
  process_plugins,
@@ -139,6 +141,13 @@ AZURE_CLIENT_PROVIDERS_DESC = [
139
141
  ("azure-default", ".azure.azure_credential.AzureDefaultClientProvider")
140
142
  ]
141
143
 
144
+ DEPLOYER_IMPL_PROVIDERS_DESC = [
145
+ ("argo-workflows", ".argo.argo_workflows_deployer.ArgoWorkflowsDeployer"),
146
+ (
147
+ "step-functions",
148
+ ".aws.step_functions.step_functions_deployer.StepFunctionsDeployer",
149
+ ),
150
+ ]
142
151
 
143
152
  process_plugins(globals())
144
153
 
@@ -164,6 +173,9 @@ SECRETS_PROVIDERS = resolve_plugins("secrets_provider")
164
173
  AZURE_CLIENT_PROVIDERS = resolve_plugins("azure_client_provider")
165
174
  GCP_CLIENT_PROVIDERS = resolve_plugins("gcp_client_provider")
166
175
 
176
+ if sys.version_info >= (3, 7):
177
+ DEPLOYER_IMPL_PROVIDERS = resolve_plugins("deployer_impl_provider")
178
+
167
179
  from .cards.card_modules import MF_EXTERNAL_CARDS
168
180
 
169
181
  # Cards; due to the way cards were designed, it is harder to make them fit