我有以下问题。如果将我的代码分成不同的文件,则不能简单地将函数导入并提交到集群,因为我的本地文件不存在于工作机上。为了解决该问题,我需要手动将文件合并为一个。对于较小的示例,它可以相对简单地完成,但是将大型项目分成多个文件夹非常耗时。示例:
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”合并,将其腌制并发送到调度程序,将是很棒的。有可能吗?您还有其他解决办法吗?谢谢!
答案 0 :(得分:0)
我想您会知道,客户端API提供了upload_file,它可以处理将您的模块发送给工作人员的位置,以便将其导入。
在工作人员来来往往的情况下,您将无法确保新工作人员将文件放置在正确的位置。但是,pickle本质上是将对象/功能引用到源文件,大概是为了减小数据大小。
两种模糊的可能性:
compute(workers=)
)上执行计算操作,以及在您运行的函数中重新加载或执行其他importlib挂钩。在任何一种情况下,您都需要对函数进行修改或包装以处理额外的步骤。