【问题标题】:Handling various resource requirements in an IPython cluster处理 IPython 集群中的各种资源需求
【发布时间】:2013-01-24 16:33:28
【问题描述】:

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

【问题讨论】:

  • 您的任务是独立的,还是需要在特定节点上维护一系列任务?
  • 我正在运行一个生物信息学管道,所以这些任务是原子的,但有依赖关系。许多任务只是对第三方软件的 subprocess.calls,其中一些可能需要多个内核并且需要大量内存。
  • 什么样的依赖?您的意思是某些任务必须先在节点上运行,还是只有某些节点才能运行某些任务?
  • 感谢耐心和有用的问题。一项工作依赖于一个或多个其他工作。否则,作业独立于节点分配。特别是,所有作业都会生成文件;先前作业的输出文件是相关作业的输入。作业依赖部分在 IPython 并行中有很好的记录。我的主要问题是管理系统资源。
  • 好的,那么我想我已经准备好给出一个答案了 - 你想根据节点资源 (cpu/mem) 指定这些初始任务的去向吗?

标签: python parallel-processing cluster-computing ipython


【解决方案1】:

除了您指出您已经获得的图形依赖关系之外,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

所以minimum_mem(4 * GB) 将返回 True 如果您的系统上至少有 4GB 内存。如果您想检查可用内存而不是总内存,您可以使用 /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))

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

这里是a notebook,它使用这些来限制分配一些愚蠢的任务。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2018-05-11
    • 2016-02-03
    相关资源
    最近更新 更多