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

sea*_*avi 2 python parallel-processing cluster-computing ipython

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

min*_*nrk 5

除了表明您已经获得的图依赖性之外,IPython任务还可以具有功能依赖性.这些可以是任意函数,如任务本身.功能依赖在真实任务之前运行,如果它返回False或引发特殊parallel.UnmetDependency异常,该任务将不会在该引擎上运行,并将在其他地方重试.

因此,要使用此功能,您需要一个能够检查所需指标的函数.例如,假设我们只想在节点上运行具有最小内存量的任务.这是一个检查系统总内存的函数(以字节为单位):

def minimum_mem(limit):
    import sys
    if sys.platform == 'darwin': # or BSD in general?
        from subprocess import check_output
        mem = int(check_output(['sysctl', '-n', 'hw.memsize']))
    else: # linux
        with open("/proc/meminfo") as f:
            for line in f:
                if line.startswith("MemTotal"):
                    mem = 1024 * int(line.split()[1])
                    break
    return mem >= limit

kB = 1024.
MB = 1024 * kB
GB = 1024 * MB
Run Code Online (Sandbox Code Playgroud)

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

现在,您可以通过应用@parallel.depend装饰器将任务仅提交给具有足够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))
Run Code Online (Sandbox Code Playgroud)

同样,您可以根据CPU的数量应用限制(multiprocessing.cpu_count在那里是一个有用的功能).

这是一个笔记本,使用这些来限制一些哑巴任务的分配.

通常,模型是每个核心运行一个IPython引擎(不是每个节点),但如果您有特定的多核任务,那么您可能需要使用较小的数字(例如N/2或N/4).如果您的任务非常大,那么您实际上可能希望将其限制为每个节点一个引擎.如果您为每个节点运行更多引擎,那么您将需要在一起运行高资源任务时要小心.正如我写的那样,这些检查没有考虑同一节点上的其他任务,所以如果一个节点为16 GB的RAM,并且你有两个任务,每个需要10个,你需要更加小心你的方式跟踪可用资源.