【问题标题】:Dask "no module named xxxx" errorDask“没有名为xxxx的模块”错误
【发布时间】:2017-02-20 00:25:46
【问题描述】:

使用 dask 分布式我尝试提交位于另一个名为 worker.py 的文件中的函数。 在工人中我有以下错误:

没有名为“worker”的模块

但是我无法弄清楚我在这里做错了什么......

这是我的代码示例:

import worker

def run(self):
    dask_queue = queue.Queue()
    remote_queue = self.executor.scatter(dask_queue)
    map_queue = self.executor.map(worker.run, remote_queue)
    result = self.executor.gather(map_queue)

    # Load data into the queue
    for option in self.input.get_next_option():
        remote_queue.put([self.server, self.arg, option])

这是在worker端获取的完整traceback:

distributed.core - 信息 - 无法反序列化 b'\x80\x04\x95\x19\x00\x00\x00\x00\x00\x00\x00\x8c\x06worker\x94\x8c\nrun\x94\x93\x94。 Traceback(最近一次通话最后一次):文件 “/usr/local/lib/python3.5/dist-packages/distributed/core.py”,第 74 行, 在负载 return pickle.loads(x) ImportError: No module named 'worker'distributed.worker - 警告 - 无法反序列化任务 Traceback (最近一次通话最后):文件 “/usr/local/lib/python3.5/dist-packages/distributed/worker.py”,行 496,在compute_one中 任务)文件“/usr/local/lib/python3.5/dist-packages/distributed/worker.py”,行 284,在反序列化中 函数 = 加载(函数)文件“/usr/local/lib/python3.5/dist-packages/distributed/core.py”,第 74 行, 在负载 return pickle.loads(x) ImportError: No module named 'worker'

【问题讨论】:

    标签: python dask


    【解决方案1】:

    编辑:查看 MRocklin 评论以获得更清洁的解决方案

    实际上,如果要在 dask worker 中执行的代码在外部模块中,则必须从 dask worker 路径中知道它(它不是从客户端序列化到 worker)。

    更改我的 PYTHONPATH 以确保工作人员知道该模块解决了问题。 dask issues 中发布了类似的问题:

    https://github.com/dask/distributed/issues/344

    【讨论】:

    • 您可能还想查看 Client.upload_file 方法:distributed.readthedocs.io/en/latest/…
    • 它看起来确实比我自己的解决方案更好:) Thx
    • @Bertrand 我知道这是一篇旧帖子,但我无法理解您所说的“更改我的 PYTHONPATH ...”是什么意思。我试图将我的项目文件夹添加到 PYTHONPATH 但这并没有解决我的问题。我正在使用venv。你认为这可能与venv有关吗?你是如何“改变你的 PYTHONPATH”的?
    • 是的。但我意识到了一些事情。缺少的不是实际的模块,而是项目中的脚本。我已经打包了脚本并使用 pip 模块安装了它。这解决了问题。
    • 我发现了一些如何使用 dask 的线程总是没有任何解决方案。
    【解决方案2】:

    我面临着类似的问题。创建 dask 图时使用了 python 模块中的函数。但是工作进程找不到python模块。

    工作人员控制台中出现以下错误。在这里,tasks.py 包含在 dask 图中使用的工作函数。

    [ worker 10.0.2.4 ] : ModuleNotFoundError: No module named 'tasks'
    [ worker 10.0.2.4 ] : distributed.protocol.pickle - INFO - Failed to deserialize b'\x80\x04\x95\x14\x00\x00\x00\x00\x00\x00\x00\x8c\x05tasks\x94\x8c\x06ogs_mk\x94\x93\x94.'
    

    当使用Client.upload_file(如下所示)向工作人员发送本地 python 模块时,问题得到了解决。

    client.upload_file('tasks.py')     ## Send local package to workers
    results = client.get(dsk, 'root')  ## get the results
    

    【讨论】:

    • 作为文件夹的模块呢?
    【解决方案3】:

    此问题可能发生在 2 种情况下:未找到调用 dask 分布式函数的主代码中的导入,或未找到 dask 分布式函数内部的导入。无论哪种方式,解决方案都是更新 sys.path 以指向这些模块所在的位置。

    就我而言,我都更新了。

    例如,假设在您的主脚本中有模块 xxx,而在您要分发的 dask 函数中,您有模块 yyy。罐头应该是这样的:

    from dask.distributed import Client
    import sys
    
    def update_syspath():
      sys.path.insert(0, 'module_xxx_location')
    
    # you have to update sys.path first before import the xxx module
    import xxx
    
    def dask_function():
      sys.path.insert(0, 'module_yyy_location')
      import yyy
    
    client.submit(dask_function, params)
    

    【讨论】:

      猜你喜欢
      • 2015-09-25
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 2020-02-12
      • 2017-12-26
      • 2019-01-17
      • 2014-12-25
      • 2018-04-29
      相关资源
      最近更新 更多