在IPython群集中处理各种资源需求

在IPython群集中处理各种资源需求,python,parallel-processing,cluster-computing,ipython,Python,Parallel Processing,Cluster Computing,Ipython,我使用基于PBS的集群,在一组节点上并行运行IPython,每个节点有24或32个内核,内存范围从24G到72G;这种异质性是由于我们的集群有它的历史。此外,我将作业发送到IPython集群,这些作业具有不同的资源需求(核心和内存)。我正在寻找一种向ipython集群提交作业的方法,以了解作业的资源需求和可用引擎的资源需求。我想有一种方法可以使用IPython功能优雅地处理这种情况,但我还没有找到。关于如何继续的任何建议?除了图形依赖项(您指出已经获得)之外,IPython任务还可以具有功能依赖

我使用基于PBS的集群,在一组节点上并行运行IPython,每个节点有24或32个内核,内存范围从24G到72G;这种异质性是由于我们的集群有它的历史。此外,我将作业发送到IPython集群,这些作业具有不同的资源需求(核心和内存)。我正在寻找一种向ipython集群提交作业的方法,以了解作业的资源需求和可用引擎的资源需求。我想有一种方法可以使用IPython功能优雅地处理这种情况,但我还没有找到。关于如何继续的任何建议?

除了图形依赖项(您指出已经获得)之外,IPython任务还可以具有功能依赖项。这些函数可以是任意函数,就像任务本身一样。函数依赖项在实际任务之前运行,如果它返回False或引发特殊的
并行.UnmetDependency
异常,则该任务将不会在该引擎上运行,并将在其他地方重试

所以要使用它,你需要一个函数来检查你需要的任何度量。例如,假设我们只希望在节点上以最小内存量运行任务。这是一个检查系统总内存(字节)的函数:

因此,如果系统上至少有4GB内存,
minimum_mem(4*GB)
将返回True。如果要检查可用内存而不是总内存,可以使用/proc/meminfo中的MemFree和Inactive值来确定尚未使用的内存

现在,通过应用
@parallel.dependent
decorator,您只能将任务提交给具有足够RAM的引擎:

@parallel.depend(minimum_mem, 8 * GB)
def big_mem_task(n):
    import os, socket
    return "big", socket.gethostname(), os.getpid(), n

amr = view.map(big_mem_task, range(10))
类似地,您可以根据cpu的数量应用限制(
多处理。cpu计数
是一个有用的函数)

下面是一个使用这些来限制一些哑任务分配的示例


通常,模型是每个核心(而不是每个节点)运行一个IPython引擎,但如果您有特定的多核任务,则可能需要使用较小的数量(例如N/2或N/4)。如果您的任务非常大,那么您实际上可能希望将其限制为每个节点一个引擎。如果要在每个节点上运行更多的引擎,那么在一起运行高资源任务时需要稍微小心。正如我所写的,这些检查不考虑同一节点上的其他任务,因此,如果一个节点的内存为16 GB,而您有两个任务,每个任务都需要10 GB,那么您需要更加小心地跟踪可用资源。

您的任务是否独立,或者您需要在特定节点上维护一系列任务吗?我正在运行一个生物信息学管道,因此这些任务是原子的,但具有依赖性。许多任务只是子流程。对第三方软件的调用,其中一些可能需要多个内核,并且有很大的内存需求。什么样的依赖关系?您的意思是某些任务必须在其他任务之前在节点上运行,还是只有某些节点可以运行某些任务?感谢您的耐心解答和帮助。一个作业依赖于一个或多个其他作业。否则,作业独立于节点分配。特别是,所有作业都会生成文件;先前作业的输出文件是从属作业的输入。作业依赖部分在IPython parallel中有很好的文档记录。我的主要问题是系统资源的管理。好的,那么我想我已经准备好给出一个答案了——你想根据节点资源(cpu/mem)指定这些初始任务的位置吗?
@parallel.depend(minimum_mem, 8 * GB)
def big_mem_task(n):
    import os, socket
    return "big", socket.gethostname(), os.getpid(), n

amr = view.map(big_mem_task, range(10))