gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:00:37 25 4
gpt4 key购买 nike

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

最佳答案

除了您表示已经获得的图形依赖性之外,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它使用这些来限制一些愚蠢任务的分配。

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

关于python - 处理 IPython 集群中的各种资源需求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14506182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com