【问题标题】:How to launch multithreaded mpi processes in lsf?如何在 lsf 中启动多线程 mpi 进程?
【发布时间】:2013-06-22 09:38:38
【问题描述】:

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

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

在没有 LSF 的情况下,我会简单地在 4 个节点上使用 mpi 启动,例如:

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

但是,在有 LSF 的情况下,我不知道该怎么做?我确信可能有一种非常标准的方法可以做到这一点,但我对 LSF 还是很陌生。我四处搜索,但答案对我来说并不是很明显。我找到了 Hybrid MPI/OpenMP in LSF ,但似乎不太一样,似乎一次只需要一个主机。

【问题讨论】:

    标签: multithreading mpi openmp distributed-computing lsf


    【解决方案1】:

    您链接到的另一个问题正是您所需要的,但您必须稍微调整一下,因为它是为线程数由 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(以及大多数其他分布式资源管理器)中的内存,因此您应该指定 ./myprocess 的任何实例将消耗的最大内存量。

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

    【讨论】:

    • 谢谢!问题:这将如何计费?即,我是否会为主机上的所有核心付费(这将是更可取的),还是只为每个主机的单个核心付费(这可能会导致“-x”选项不受欢迎)。
    • 这取决于配置。询问您的系统管理员。
    • 为什么不-n 48-R "span[ptile=12]"?这不是更直接而且不需要-x吗?
    • @MichaelGoerz,由于两个原因,它不会更简单。首先,它将创建一个 MPI 主机文件,每个节点有 12 个插槽,并且必须明确指示库每个节点只启动一个进程。其次,像内存限制这样的资源是按槽指定的,然后应用于每个进程(LSF 假设每个槽都由正在运行的进程填充)。使用span[ptile=12],每个进程只能指定 1/12 的节点内存(LSF 应用内存限制作为软 RSS 大小限制)。
    【解决方案2】:

    虽然我已经接受 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
    

    【讨论】:

      猜你喜欢
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 2014-12-24
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      相关资源
      最近更新 更多