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 个作业分配给该主机。限制每台主机的作业数量会导致内核闲置时主机使用效率低下,或者 运行主机上的任务多于可用资源超额订阅内核。
问题归结为:
- 如何通过 PBSpro 高效地 运行 并行任务,
- 每个任务使用超过 1 个 CPU、
- 随机选择(分配 PBS)节点,
- 每个都有不同数量的分配资源,
- 不一定与节点的实际物理资源匹配。
使用 -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
立即打印输出(并且有一些速度优势)
通过 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 个作业分配给该主机。限制每台主机的作业数量会导致内核闲置时主机使用效率低下,或者 运行主机上的任务多于可用资源超额订阅内核。
问题归结为:
- 如何通过 PBSpro 高效地 运行 并行任务,
- 每个任务使用超过 1 个 CPU、
- 随机选择(分配 PBS)节点,
- 每个都有不同数量的分配资源,
- 不一定与节点的实际物理资源匹配。
使用 -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
立即打印输出(并且有一些速度优势)