有了 PBSpro,我可以请求资源来运行我的工作。我的并行集群作业归结为多次运行同一个文件,每次都使用不同的索引/作业 ID。每个任务都会产生自己的子进程,每个任务总共使用 4 个 CPU。这项工作是令人尴尬的并行,每个任务彼此独立,因此非常适合 GNU 并行工具。为了充分利用集群并在有空间的地方压缩我的任务,我向 PBS 发出资源请求,如下所示:
PBS -l select=60:ncpus=4:mpiprocs=1
。生成的 $PBS_NODEFILE
然后包含分配给该任务的主机列表。
问题在于 PBSpro 作业管理器可以将多个作业分配给同一个节点,或者仅将 1 个作业分配给一个节点,并且必须以某种方式将此信息并行传递给 GNU。使用 --sshloginfile $PBS_NODEFILE
这样做不会传递每个节点上可用的不同资源信息(而且 GNU parallel 似乎只使用此列表中的唯一名称)。
出错的地方是 GNU parallel 看到 X 核数(主机/节点的核数),不管是否只有 1 个作业分配给该主机。限制每台主机的作业数量会导致内核闲置时主机使用效率低下,或者在主机上运行的任务多于超额订阅内核的可用资源。
问题归结为:
- 如何通过 PBSpro 高效地运行并行任务,
- 每个任务使用超过 1 个 CPU,
- 随机选择(分配 PBS)节点,
- 每个都有不同数量的分配资源,
- 不一定与节点的实际物理资源相匹配。
最佳答案
使用-S
标志来指定服务器和x/$SERVERNAME
变体来限制CPU的数量(x
)对于那个服务器。
第一步是使用bash生成输入-S
标志
NCPU=4
HOSTS=`cat $PBS_NODEFILE | uniq-c | awk 'BEGIN{OFS=""}{print $1*$NCPU,"/",$2}'|tr '\n' ','|sed 's/,$//'`
( credit to Hiu )
这个 bash 命令输出一个服务器列表,每个服务器都有可用的 cpu 核心数。
然后并行运行如下:
PERC=$((100/$NCPU))
序列 0 999 | parallel -j $PERC% -N1 -u -S $HOSTS "cd $PBS_O_WORKDIR; python3 $WORKING_PATH$INPUT_FILENAME {}"
地点:
seq 0 999
运行 1000 个任务,ID 范围从 0 到 999(包括 999)-j $PERC%
=-j 25%
(100%/4
4 个 CPU)-N1
仅向每个任务发送 1 个参数-u
立即打印输出(并且有一些速度优势)
关于hpc - PBS:GNU parallel:分配的主机不同,多 CPU 作业,一些主机的多个作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50289943/