1

我想使用 LSF 提交一份工作:

  • 在 4 个节点上并行运行
  • 每个节点都有一个 mpi 进程
  • 每个进程有 12 个线程

在没有 LSF 的情况下,我只需在 4 个节点上使用 mpi 启动,例如:

mpirun -hosts host1,host2,host3,host4 -np 4 ./myprocess --numthreads=12

但是,在 LSF 的存在下,我看不到如何做到这一点?我确信可能有一种非常标准的方法可以做到这一点,但我对 LSF 还是很陌生。我四处搜索,但答案对我来说并不是很明显。我在 LSF 中找到了 Hybrid MPI/OpenMP,但它似乎并不完全相同,似乎一次只需要一个主机。

4

2 回答 2

6

您链接到的另一个问题正是您所需要的,但您必须稍微调整它,因为它是为线程数由OMP_NUM_THREADS环境变量控制的 OpenMP 应用程序编写的。

以下是作业脚本中最重要的部分:

  • #BSUB -n 4- 请求 4 个插槽
  • #BSUB -R "span[ptile=1]"- 请求每个节点分配一个插槽;此选项与前一个选项相结合,将作业跨越 4 个不同的节点,并指示 LSF 在生成的主机文件中为每个主机放置一个插槽
  • #BSUB -x- 请求对节点的独占访问

以上三个选项将指示 LSF 分配 4 个节点,并在每个节点上保留一个插槽。由于还请求独占访问,因此没有其他作业将与该作业共享相同的节点,并且您可以在每个节点上启动任意数量的线程。然后,您只需调用 Open MPI mpiexec,如果 LSF 集成已在您的 Open MPI 设置中编译,它将自动从 LSF 获取主机列表并为每个节点启动一个进程。

示例 LSF 作业文件如下所示:

#BSUB -n 4
#BSUB -R "span[ptile=1]"
#BSUB -x

mpiexec -np 4 ./myprocess --numthreads=12

确保您还使用该选项请求足够的运行时间,-W并使用该选项请求足够的内存量-M。LSF(以及大多数其他分布式资源管理器)中的内存是每个 slot请求的,因此您应该指定任何实例./myprocess将消耗的最大内存量。

如果 LSF 集成未在您的 Open MPI 发行版中编译,则该过程会涉及更多,因为您必须解析 LSF 主机文件并从前者创建一个 Open MPI 主机文件。

于 2013-06-25T19:43:57.740 回答
0

虽然我已经接受 Hristo 的回答是正确的,但这是我最后所做的,它避免了使用“-x”、-W 和 -M 的问题,并且与我的系统管理员告诉我的一致:

#!/bin/bash

machinefile="$(mktemp)"
n=0
cmdstring="mpirun -machinefile ${machinefile} "
for host in $LSB_MCPU_HOSTS; do {
   if [[ $host != 12 ]]; then {
       echo $host>>$machinefile
       n=$(($n+1))
   } fi
} done

echo $n
echo $@

mpirun -machinefile ${machinefile} -np $n $@

你使用这个脚本,假设它叫做'lsfrun.sh':

bsub -n 48 -R "span[ptile=12]" ./lsfrun.sh ./myprocess --threads 12
于 2013-06-27T00:52:54.420 回答