hpc - PBS:GNU parallel:分配的主机不同,多 CPU 作业,一些主机的多个作业

标签 hpc gnu-parallel pbs

有了 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/

相关文章:

java - COMPAS 应用程序被阻止

php - 嵌套GNU Parallel处理多个大文件,拆分每个文件数据作为队列处理

parallel-processing - 如何使用 gnu-parallel 处理具有两个输入的脚本?

linux - 将命令从 PBS 转换为 SLURM

linux - 如何将参数传递给作业并以并行方式保持不变

c - 并行二分查找的性能比串行版本差

ubuntu - GNU 并行取消链接错误

shell - 等待用户的所有作业完成,然后再将后续作业提交到 PBS 集群

pbs - PBS 批处理系统是否跨节点移动多个串行作业?

python - 为 RandomizedSearchCV 缩放 sklearn RandomForestClassifier