无法使用GNU并行在多个节点上运行PBS脚本

时间:2019-01-17 23:25:41

标签: ssh hpc gnu-parallel pbs qsub

我一直试图在PBS脚本中使用多个节点来运行几个独立的作业。每个作业应该使用8个核心,集群中的每个节点都具有32个核心。因此,我希望每个节点运行4个作业。我的PBS脚本如下。

#!/usr/bin/env bash
#PBS -l nodes=2:ppn=32
#PBS -l mem=128gb
#PBS -l walltime=01:00:00
#PBS -j oe
#PBS -V
#PBS -l gres=ccm

sort -u $PBS_NODEFILE > nodelist.dat
#cat ${PBS_NODEFILE} > nodelist.dat

export JOBS_PER_NODE=4  

PARALLEL="parallel -j $JOBS_PER_NODE --sshloginfile nodelist.dat --wd $PBS_O_WORKDIR"
$PARALLEL -a input_files.dat sh test.sh {}

input_files.dat包含作业文件的名称。我已成功使用此脚本在一个节点上运行并行作业(在这种情况下,我从脚本中删除了--sshloginfile nodelist.datsort -u $PBS_NODEFILE > nodelist.dat)。但是,每当我尝试在多个节点上运行此脚本时,都会出现以下错误。
ssh: connect to host 922 port 22: Invalid argument
ssh: connect to host 901 port 22: Invalid argument
ssh: connect to host 922 port 22: Invalid argument
ssh: connect to host 901 port 22: Invalid argument
这里,922901是与分配的节点相对应的数字,并包含在nodelist.dat ($PBS_NODEFILE)文件中。
我尝试搜索此问题,但找不到很多,因为其他人似乎对--sshloginfile参数都做得很好,所以我不确定这是否是系统特定的问题。

编辑:

正如@Ole Tange在他的回答和评论中提到的那样,我需要修改$ PBS_NODEFILE生成的“节点号”,我将在PBS脚本中以以下方式进行此操作。

# provides a unique number (say, 900) associated with the node.
sort -u $PBS_NODEFILE > nodelist.dat

# changes the contents of the nodelist.dat from "900" to "username@w-900.cluster.uni.edu"
sed -i -r "s/([0-9]+)/username@w-\1.cluster.uni.edu/g" nodelist.dat

我验证了nodelist.dat仅包含一行,即username@w-900.cluster.uni.edu

编辑2:

似乎群集的体系结构是导致我遇到的错误的原因。我在不同的群集(例如cluster_2)上运行了相同的脚本,并且完成时没有任何错误。用我的系统管理员的话来说,它在cluster_2上工作的原因是:“ cluster_2是一台机器。一旦开始工作,您实际上就象您期望的那样处于PBS工作的头节点。”

1 个答案:

答案 0 :(得分:1)

GNU Parallel使用变量$PARALLEL作为选项。因此,当您同时使用它时,可能会引起混乱。但这似乎不是根本原因,但是请帮忙,使用另一个变量名(或按照手册页中的说明使用它)。

这里的问题似乎是ssh,它不会看到数字作为主机名:

$ ssh 8
ssh: connect to host 8 port 22: Invalid argument

添加域名,ssh将其视为主机名:

$ ssh 8.pi.dk
<<connects>>

如果我是我,我会与您的集群管理员联系,询问是否可以将工作节点重命名为w-XXX,其中XXX是其当前名称。