Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用--preload在dask工作进程中初始化任务模块全局?_Python_Dask_Dask Distributed - Fatal编程技术网

Python 使用--preload在dask工作进程中初始化任务模块全局?

Python 使用--preload在dask工作进程中初始化任务模块全局?,python,dask,dask-distributed,Python,Dask,Dask Distributed,我试图实现类似于这些问题(,)的东西,我有一个(相对)大的模型,我想对接受需要该模型的任务的工作人员子集进行预初始化。理想情况下,我甚至不希望客户机拥有该模型 在发现这些问题之前,我最初的尝试是在共享模块中定义一个延迟的任务,工作者任务.model,并在工作者的脚本中分配一个模块全局变量(例如工作者任务.model.model),以便该任务使用;但是,由于某些原因,这不起作用-变量在预加载脚本中设置,但在调用任务时仍然是None init\u model\u worker.py: import

我试图实现类似于这些问题(,)的东西,我有一个(相对)大的模型,我想对接受需要该模型的任务的工作人员子集进行预初始化。理想情况下,我甚至不希望客户机拥有该模型

在发现这些问题之前,我最初的尝试是在共享模块中定义一个
延迟的
任务,
工作者任务.model
,并在工作者的
脚本中分配一个模块全局变量(例如
工作者任务.model.model
),以便该任务使用;但是,由于某些原因,这不起作用-变量在预加载脚本中设置,但在调用任务时仍然是
None

init\u model\u worker.py:

import logging
from uuid import uuid4

from worker_tasks import model


def dask_setup(worker):
    model.model = f'<mock model {uuid4()}>'

    logger = logging.getLogger('distributed')
    logger.warning(f'model = {model.model}')
import logging
import random
from time import sleep
from uuid import uuid4

import dask

model = None


@dask.delayed
def compute_clinical(inp):        
    if model is None:
        raise RuntimeError('Model not initialized.')

    sleep(random.uniform(3, 17))

    return {
        'result': random.choice((True, False)),
        'confidence': random.uniform(0, 1)
        }
这是我启动工作日志并向调度程序提交内容时的工作日志:

> dask-worker --preload init_model_worker.py tcp://scheduler:8786 --name model-worker
distributed.utils - INFO - Reload module init_model_worker from .py file                                  
distributed.nanny - INFO -         Start Nanny at: 'tcp://172.28.0.4:41743'                         
distributed.diskutils - INFO - Found stale lock file and directory '/worker-epptq9sh', purging      
distributed.utils - INFO - Reload module init_model_worker from .py file                                  
distributed - WARNING - model = <mock model faa41af0-d925-46ef-91c9-086093d37c71>                   
distributed.worker - INFO -       Start worker at:     tcp://172.28.0.4:37973                       
distributed.worker - INFO -          Listening to:     tcp://172.28.0.4:37973                       
distributed.worker - INFO -              nanny at:           172.28.0.4:41743                       
distributed.worker - INFO -              bokeh at:           172.28.0.4:37766                       
distributed.worker - INFO - Waiting to connect to:       tcp://scheduler:8786                       
distributed.worker - INFO - -------------------------------------------------                       
distributed.worker - INFO -               Threads:                          4                       
distributed.worker - INFO -                Memory:                    1.93 GB                       
distributed.worker - INFO -       Local Directory:           /worker-mhozo9ru                       
distributed.worker - INFO - -------------------------------------------------                       
distributed.worker - INFO -         Registered to:       tcp://scheduler:8786                       
distributed.worker - INFO - -------------------------------------------------                       
distributed.core - INFO - Starting established connection                                           
distributed.worker - WARNING -  Compute Failed                                                      
Function:  compute_clinical                                                                         
args:      ('mock')                                                                                 
kwargs:    {}                                                                                       
Exception: RuntimeError('Model not initialized.')                                                   
>dask worker——预加载init_model_worker.pytcp://scheduler:8786 --劳模姓名
distributed.utils-INFO-从.py文件重新加载模块init_model_worker
distributed.nanny-信息-启动保姆地点:'tcp://172.28.0.4:41743'                         
distributed.diskutils-INFO-找到过时的锁文件和目录“/worker-epptq9sh”,正在清除
distributed.utils-INFO-从.py文件重新加载模块init_model_worker
分布式-警告-模型=
distributed.worker-信息-在以下位置启动工作程序:tcp://172.28.0.4:37973                       
distributed.worker-信息-侦听:tcp://172.28.0.4:37973                       
distributed.worker-INFO-保姆电话:172.28.0.4:41743
distributed.worker-INFO-bokeh电话:172.28.0.4:37766
distributed.worker-信息-正在等待连接到:tcp://scheduler:8786                       
distributed.worker-信息-----------------------------------------
distributed.worker-信息-线程:4
distributed.worker-信息-内存:1.93 GB
distributed.worker-INFO-本地目录:/worker-mhozo9ru
distributed.worker-信息-----------------------------------------
distributed.worker-信息-注册到:tcp://scheduler:8786                       
distributed.worker-信息-----------------------------------------
distributed.core-信息-启动已建立的连接
distributed.worker-警告-计算失败
功能:计算机辅助临床
参数:('mock')
kwargs:{}
异常:RuntimeError('模型未初始化')
您可以看到,在重新加载预加载脚本之后,
模型是
;但是当我试图从任务中调用它时,我得到了
None

我将尝试根据其他问题的答案实施解决方案,但我有几个与worker preload相关的问题:

  • 为什么在我在预加载脚本中分配任务后,调用任务时模型
    None
  • 通常是否建议在worker
    --preload
    脚本中避免这样做?从客户端调用工作状态的初始化是否更好?若然,原因为何

  • 我怀疑模型变量是通过Python序列化函数而立即绑定到函数中的。您可以尝试以下方法:

    @dask.delayed
    def compute_clinical(inp):       
        from worker_tasks.model import model
    
        if model is None:
            raise RuntimeError('Model not initialized.')
    
    或者,与其将变量分配给全局模块作用域(在Python中可能很难理解),不如尝试将其分配给工作者本身

    from dask.distributed import get_worker
    
    def dask_setup(worker):
        worker.model = f'<mock model {uuid4()}>'
    
    @dask.delayed
    def compute_clinical(inp):       
        if get_worker().model is None:
            raise RuntimeError('Model not initialized.')
    
    来自dask.distributed import get\u worker
    def dask_设置(工作人员):
    worker.model=f''
    @达斯克
    def计算机临床(inp):
    如果get_worker().model为无:
    引发运行时错误('模型未初始化')
    
    我的一部分喜欢使用
    worker
    来存储这种类型的上下文,但我的另一部分担心污染对象的名称空间和潜在的未来冲突,例如,如果您(开发人员)出于某种原因需要向
    worker
    类添加
    模型
    属性。您是否愿意将
    context
    属性添加到
    Worker
    类中,作为用户存储用户定义的Worker配置/状态的定义位置?或者仅仅在文档中说该属性将保留给用户就足够了?您可以使用任意复杂的名称来保护自己。如果愿意,您可以创建自己的
    \u user\u data
    属性或类似的属性。我认为这种做法不够普遍,不足以将其编纂成法典。