【问题标题】:PBS: GNU parallel: hosts allocated vary, multi CPU job, multiple jobs to some hostsPBS:GNU 并行:分配的主机不同,多 CPU 作业,某些主机的多个作业
【发布时间】:2018-05-11 10:08:05
【问题描述】:

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

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

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

问题归结为:

  • 如何通过 PBSpro 高效地运行并行任务,
  • 每个任务使用超过 1 个 CPU,
  • 随机(分配 PBS)选择节点,
  • 每个都有不同数量的分配资源,
  • 不一定与节点的实际物理资源匹配。

【问题讨论】:

    标签: hpc gnu-parallel pbs


    【解决方案1】:

    使用-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))

    seq 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 立即打印输出(并且有一些速度优势)

    【讨论】:

    • 短:seq 0 999 | parallel --slf <(sort $PBS_NODEFILE | uniq -c | awk 'BEGIN{ORS=","}{print $1"/"$2}') --wd "$PBS_O_WORKDIR" echo
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 2018-01-03
    相关资源
    最近更新 更多