将任务提交到Dask分布式集群时,本地python文件导入问题

时间:2018-11-27 14:38:06

标签: python pickle dask dask-distributed

我有以下问题。如果将我的代码分成不同的文件,则不能简单地将函数导入并提交到集群,因为我的本地文件不存在于工作机上。为了解决该问题,我需要手动将文件合并为一个。对于较小的示例,它可以相对简单地完成,但是将大型项目分成多个文件夹非常耗时。示例:

localfile.py文件:

def custom():
  print("Remote run")
  return

现在让我们尝试将导入的功能提交到群集cluster.py文件中:

import localfile

x = client.submit(localfile.custom)

x.result()
# Import error here, details below

-

# The protocol we write by default.  May be less than HIGHEST_PROTOCOL.
  File "/usr/local/lib/python3.6/site-packages/cloudpickle/cloudpickle.py", line 944, in subimport
ModuleNotFoundError: No module named 'localfile'

如您所见,工作人员无法找到本地python文件,因此任务失败。

有什么办法可以将导入的本地文件与我的腌制代码一起发送?我知道可能的解决方案只是将本地文件上传到工作程序,但是当代码经常被修改且集群是动态的时,这并不是一个很好的解决方案。能够自动将“ client.py”代码与“ localfile.py”合并,将其腌制并发送到调度程序,将是很棒的。有可能吗?您还有其他解决办法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

我想您会知道,客户端API提供了upload_file,它可以处理将您的模块发送给工作人员的位置,以便将其导入。

在工作人员来来往往的情况下,您将无法确保新工作人员将文件放置在正确的位置。但是,pickle本质上是将对象/功能引用到源文件,大概是为了减小数据大小。

两种模糊的可能性:

  • 您只能在上载时处于活动状态的相同工作程序(compute(workers=))上执行计算操作,以及在您运行的函数中重新加载或执行其他importlib挂钩。
  • 如果愿意,您实际上可以将函数源作为文本分发,并执行定义,或者再次使用importlib将其放入工作程序的模块中。

在任何一种情况下,您都需要对函数进行修改或包装以处理额外的步骤。