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

向Dask分布式集群提交任务时本地python文件导入问题,python,pickle,dask,dask-distributed,Python,Pickle,Dask,Dask Distributed,我有以下问题。如果我的代码被分成不同的文件,我就不能简单地将函数导入并提交到集群,因为我的本地文件不在workers机器上。为了解决这个问题,我需要手动将文件合并成一个文件。对于小的例子,这可以相对简单地完成,但是对于一个分为多个文件夹的大型项目,这是非常耗时的。例如: localfile.py文件: def custom(): print("Remote run") return import localfile x = client.submit(localfile.custom

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

localfile.py
文件:

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

x = client.submit(localfile.custom)

x.result()
# Import error here, details below
现在,让我们尝试将导入的函数提交到集群,
cluster.py
文件:

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

x = client.submit(localfile.custom)

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

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


有什么方法可以将我的pickle代码与导入的本地文件一起发送吗?我知道可能的解决方案只是将本地文件上传给工作人员,但当代码经常修改并且集群是动态的时,这并不是一个优雅的解决方案。如果能够自动将“client.py”代码与“localfile.py”合并,并对其进行pickle处理并发送到调度程序,那就太好了。这有可能吗?你对如何解决这个问题还有其他想法吗?谢谢大家!

我想您会知道,客户机API提供了,它可以处理将您的模块交给工作人员到一个可以导入模块的地方

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

两种模糊的可能性:

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

在这两种情况下,您都需要修改或用一些东西包装您的函数来处理额外的步骤。

将函数作为源文本分发是什么意思?只是在任务中复制并发送它?实际上,一个新问题已经出现,它与dask无关,它与更新后刷新的模块有关。是的,这就是我的意思,您需要运行自己的代码来创建函数对象和/或插入工作模块结构。