无法使用 GNU 并行在多个节点上 运行 PBS 脚本
Unable to run PBS script on multiple nodes using GNU parallel
我一直在尝试在我的 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.dat
和 sort -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
这里,922
和901
是分配节点对应的编号,包含在nodelist.dat ($PBS_NODEFILE)
文件中。
我试图搜索这个问题,但找不到太多,因为其他人似乎都很好地处理了 --sshloginfile
参数,所以我不确定这是否是系统特定的问题。
编辑:
正如@Ole Tange 在他的回答和评论中提到的,我需要修改由 $PBS_NODEFILE 生成的 "node number",我在 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-.cluster.uni.edu/g" nodelist.dat
我确认 nodelist.dat
只包含一行,即 username@w-900.cluster.uni.edu
。
编辑 2:
我遇到的错误似乎是集群的架构造成的。我在不同的集群上 运行 相同的脚本(比如 cluster_2),它没有任何错误地完成了。用我的系统管理员的话来说,它在 cluster_2 上工作的原因是:"cluster_2 is a single machine. Once your job starts, you are actually on the head node of your PBS job like you would expect."
GNU Parallel 使用变量 $PARALLEL
作为选项。所以当你同时使用它时,很可能会造成混淆。不过,这似乎不是根本原因,但请帮自己一个忙,使用另一个变量名(或按照手册页中的描述使用它)。
这里的问题似乎是 ssh
不会将数字视为主机名:
$ ssh 8
ssh: connect to host 8 port 22: Invalid argument
添加域名,ssh
会将其视为主机名:
$ ssh 8.pi.dk
<<connects>>
如果我是你,我会与你的集群管理员交谈,询问是否可以将工作节点重命名为 w-XXX,其中 XXX 是它们的当前名称。
我一直在尝试在我的 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.dat
和 sort -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
这里,922
和901
是分配节点对应的编号,包含在nodelist.dat ($PBS_NODEFILE)
文件中。
我试图搜索这个问题,但找不到太多,因为其他人似乎都很好地处理了 --sshloginfile
参数,所以我不确定这是否是系统特定的问题。
编辑:
正如@Ole Tange 在他的回答和评论中提到的,我需要修改由 $PBS_NODEFILE 生成的 "node number",我在 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-.cluster.uni.edu/g" nodelist.dat
我确认 nodelist.dat
只包含一行,即 username@w-900.cluster.uni.edu
。
编辑 2:
我遇到的错误似乎是集群的架构造成的。我在不同的集群上 运行 相同的脚本(比如 cluster_2),它没有任何错误地完成了。用我的系统管理员的话来说,它在 cluster_2 上工作的原因是:"cluster_2 is a single machine. Once your job starts, you are actually on the head node of your PBS job like you would expect."
GNU Parallel 使用变量 $PARALLEL
作为选项。所以当你同时使用它时,很可能会造成混淆。不过,这似乎不是根本原因,但请帮自己一个忙,使用另一个变量名(或按照手册页中的描述使用它)。
这里的问题似乎是 ssh
不会将数字视为主机名:
$ ssh 8
ssh: connect to host 8 port 22: Invalid argument
添加域名,ssh
会将其视为主机名:
$ ssh 8.pi.dk
<<connects>>
如果我是你,我会与你的集群管理员交谈,询问是否可以将工作节点重命名为 w-XXX,其中 XXX 是它们的当前名称。