Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.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 在HPC集群上使用dask分配大量作业的策略_Python_Dask_Hpc_Dask Distributed_Dask Delayed - Fatal编程技术网

Python 在HPC集群上使用dask分配大量作业的策略

Python 在HPC集群上使用dask分配大量作业的策略,python,dask,hpc,dask-distributed,dask-delayed,Python,Dask,Hpc,Dask Distributed,Dask Delayed,我有一个相当复杂的python算法,需要分布在HPC集群中 该代码从一个具有60 gb内存的Jupyterhub实例运行。 PBS集群的配置为1个进程,1个核心,每个工作线程30Gb,nanny=False(否则计算不会运行),总共26个工作线程(总内存约为726GB) 我不需要取回任何数据,因为所需要的是在计算结束时写入磁盘的。 请注意,独立运行时,每次计算大约需要7分钟 我遇到的问题如下:每个独立的worker(Jobname:dask worker)似乎运行良好,它有大约20Gb的可用空间

我有一个相当复杂的python算法,需要分布在HPC集群中

该代码从一个具有60 gb内存的Jupyterhub实例运行。 PBS集群的配置为1个进程,1个核心,每个工作线程30Gb,nanny=False(否则计算不会运行),总共26个工作线程(总内存约为726GB)

我不需要取回任何数据,因为所需要的是在计算结束时写入磁盘的。 请注意,独立运行时,每次计算大约需要7分钟

我遇到的问题如下:每个独立的worker(Jobname:dask worker)似乎运行良好,它有大约20Gb的可用空间,其中最多使用5Gb。但每当我尝试启动大约50个以上的作业时,中央工作者(Jobname:jupyterhub)就会在大约20分钟后耗尽内存

以下是我如何分配计算:

def complex_python_func(params):
    return compute(params=params).run()
然后我尝试使用client.map或delayed:

list_of_params = [1, 2, 3, 4, 5, ... n] # with n > 256

# With delayed
lazy = [dask.delayed(complex_python_func)(l) for l in list_of_params]
futures = client.compute(lazy)
# Or with map
chain = client.map(complex_python_func, list_of_params)
以下是群集的配置:

cluster = PBSCluster(
    cores=1,
    memory="30GB",
    interface="ib0",
    queue=queue,
    processes=1,
    nanny=False,
    walltime="12:00:00",
    shebang="#!/bin/bash",
    env_extra=env_extra,
    python=python_bin,
)
cluster.scale(32)
我不明白为什么它不起作用。我希望Dask运行每个计算,然后释放内存(每个任务大约6/7分钟)。 我使用qstat-f jobId检查工作进程的内存使用情况,它会一直增加,直到工作进程被杀死


是什么导致jupyterhub员工失败?实现这一点的好方法(或至少更好的方法)是什么?

两个潜在的潜在客户是:

  • 如果不希望worker返回任何内容,那么将return语句更改为
    returnnone
    (不清楚
    compute()
    在脚本中的作用):
  • def complex_python_func(参数):
    返回compute(params=params).run()
    
  • dask
    可能会为每个工作人员分配多个作业,并且在某些情况下,工作人员的任务超过了它的处理能力。一种解决方法是减少员工在任何给定时间使用
    资源
    可以完成的任务数量,例如使用:
  • #创建集群时添加资源
    集群=PBSCluster(
    #所有其他设置均保持不变,但添加此行可为每个辅助对象
    额外=['--resources foo=1'],
    )
    #已跳过其余代码,但请确保指定任务所需的资源
    #提交计算时
    lazy=[dask.delayed(complex_python_func)(l)表示参数列表中的l]
    futures=client.compute(惰性,资源={'foo':1})
    #还是用地图
    chain=client.map(complex_python_func,参数列表,资源={'foo':1})
    

    有关资源的更多信息,请参阅文档或此相关问题

    谢谢,您的建议确实有所帮助。但是,调度程序在某个时候会耗尽内存。在检查复杂的_python_func时,我发现它包含一些dask.delayed和一个dask.compute调用。。。。在检查内存使用情况后,似乎这个dask.compute是调度程序失败的原因。。。也许我应该尝试处理这个问题(但这段代码不是我写的,所以我可能无法更改任何内容)。我尝试了您的建议来约束资源,但编写了chain=client.map(complex_python_func,list_of_params,resources={CPU':1})暂停执行..启动集群时您是否提供了资源?在
    complex_python_func
    中嵌套的
    是有问题的:选项1(最佳):重构以使用最佳计算能力;选项2(第二好):从python连续启动它(因此没有嵌套调用),这将导致一些资源利用不足,但不费什么力气/新错误的风险很低;选项3:使用外部工作流管理器为每个参数启动单独的集群实例(可能使用较小大小的集群,但这取决于
    复杂的\u python\u func
    ),例如snakemake、sbatch或只是在特定文件上循环的简单bash脚本。。。