PBS:GNU 并行:分配的主机各不相同,多个 CPU 作业,多个作业分配给某些主机

PBS: GNU parallel: hosts allocated vary, multi CPU job, multiple jobs to some hosts

通过 PBSpro,我可以请求资源来 运行 我的工作。我的并行集群作业归结为 运行 多次使用同一个文件,每次使用不同的索引/作业 ID。每个任务都会产生自己的子流程,每个任务总共使用 4 CPUs。这项工作是令人尴尬的并行,每个任务彼此独立,因此非常适合 GNU 并行工具。为了充分利用集群并在有 space 的地方压缩我的任务,我向 PBS 发出资源请求,如下所示: PBS -l select=60:ncpus=4:mpiprocs=1。结果 $PBS_NODEFILE 然后包含分配给该任务的主机列表。

问题在于 PBSpro 作业管理器可以将多个作业分配给同一个节点,或者只能将 1 个作业分配给一个节点,并且必须以某种方式将此信息并行传递给 GNU。使用 --sshloginfile $PBS_NODEFILE 这样做不会传递每个节点上可用的不同资源信息(而且 GNU parallel 似乎只使用此列表中的唯一名称)。

出错的地方是 GNU parallel 看到 X 核数(主机/节点的核数),不管是否只有 1 个作业分配给该主机。限制每台主机的作业数量会导致内核闲置时主机使用效率低下,或者 运行主机上的任务多于可用资源超额订阅内核。

问题归结为:

使用 -S 标志指定服务器及其 x/$SERVERNAME 变体来限制该服务器的 CPU 数量 (x)。

第一步是使用bash生成输入-S标志

NCPU=4

HOSTS=`cat $PBS_NODEFILE | uniq -c | awk 'BEGIN{OFS=""}{print *$NCPU,"/",}'|tr '\n' ','|sed 's/,$/ /'` (credit to Hiu)

这个 bash 命令输出一个服务器列表,每个服务器都有可用的 cpu 个核心数。

此后运行并行如下:

PERC=$((100/$NCPU))

seq 0 999 | parallel -j $PERC% -N1 -u -S $HOSTS "cd $PBS_O_WORKDIR; python3 $WORKING_PATH$INPUT_FILENAME {}"

其中:

  • seq 0 999 运行s 1000个ID从0到999不等的任务
  • -j $PERC% = -j 25%100% / 4 4 个 CPU)
  • -N1 只向每个任务发送 1 个参数
  • -u 立即打印输出(并且有一些速度优势)