Slurm MPI 用户指南
MPI 的使用取决于所使用的 MPI 类型。这些不同的 MPI 实现使用三种根本不同的操作模式。
- Slurm 直接启动任务并通过 PMI-1、PMI-2 或 PMIx API 执行通信初始化。(大多数现代 MPI 实现都支持。)
- Slurm 为作业创建资源分配,然后 mpirun 使用 Slurm 的基础设施 (srun) 启动任务。
- Slurm 为作业创建资源分配,然后 mpirun 使用 Slurm 以外的某种机制(例如 SSH 或 RSH)启动任务。这些任务在 Slurm 的监视或控制之外启动,需要从批处理节点(例如 SSH)访问节点。Slurm 的 epilog 应该配置为在作业分配被放弃时清除这些任务。强烈建议使用 pam_slurm_adopt。
提示
在情况 3 中,Slurm 不会直接启动用户应用程序,这可能会阻止将任务绑定到 CPU 和/或记帐的预期行为,因此不推荐使用这种方式。
两个 Slurm 参数控制将支持哪个 PMI(流程管理接口)实现。正确的配置对于 Slurm 为 MPI 作业建立适当的环境至关重要,例如设置适当的环境变量。slurm.conf中的MpiDefault配置参数建立了要使用的系统默认 PMI。srun选项--mpi= (或等效的环境变量SLURM_MPI_TYPE)可用于指定何时将不同的 PMI 实现用于单个作业。
可以在 mpi.conf 文件中设置一些参数,这些参数允许您修改 PMI 插件的行为。
注意
在没有适当的 Slurm 插件的情况下使用 MPI 实现可能会导致应用程序失败。如果在系统上使用多个 MPI 实现,则可能需要某些用户明确指定合适的 Slurm MPI 插件。
注意
如果使用 RPM 安装 Slurm,则slurm-libpmi 包将与pmix -libpmi 包冲突(如果已安装)。如果您站点的政策允许您从源代码安装,这将允许您将这些包安装到不同的位置,这样您就可以选择要使用的库。
下面提供了有关将多种 MPI/PMI 与 Slurm 一起使用的说明的链接。
PMIx
Open MPI
Intel-MPI
MPICH
MVAPICH2
HPE Cray PMI Support
PMIx
在构建 PMIx 之前,建议阅读这些 操作指南。它们提供了有关 构建依赖项和安装步骤的一些详细信息,以及有关 Slurm 支持 的一些相关说明。
本节旨在通过一些关于如何准备 Slurm 和 PMIx 一起工作的注释来补充 PMIx 常见问题解答。PMIx 可以从官方 PMIx GitHub存储库中获取,方法是克隆存储库或下载打包版本。
Slurm 对 PMIx 的支持首先包含在基于 PMIx v1.2 版本的 Slurm 16.05 中。它已更新为支持 PMIx 系列的最高版本 5.x,如下表所示:
Slurm 20.11+ 支持 PMIx v1.2+、v2.x 和 v3.x。
Slurm 22.05+ 支持 PMIx v2.x、v3.x、v4.x。和 v5.x。
如果运行 PMIx v1,建议至少运行 1.2.5,因为旧版本可能存在一些与 pmi 和 pmi2 API 支持的兼容性问题。另请注意,Intel MPI 并未正式支持 PMIx。它可能会工作,因为 PMIx 提供了与 PMI-2 的一些兼容性,但不能保证它会。
注意
如果您使用 hwloc 构建 PMIx,请注意 hwloc 的 2.5.0 到 2.7.0(含)版本有一个错误,该错误会将不可访问的值推送到 environ 数组中,从而在访问它时导致段错误。建议避免使用这些版本。
使用 PMIX 支持构建 SLURM 在配置时,Slurm 默认在以下位置查找 PMIx 安装:
/usr
/usr/local
如果 PMIx 未安装在之前的任何位置,则可以请求 Slurm 配置脚本指向非默认位置。这是一个假设安装目录为/home/user/pmix/v4.1.2/的示例:
user@testbox:~/slurm/22.05/build$ ../src/configure \
> --prefix=/home/user/slurm/22.05/inst \
> --with-pmix=/home/user/pmix/4.1.2
或者类似于基于 RPM 的构建:
user@testbox:~/slurm_rpm$ rpmbuild \
> --define '_prefix /home/user/slurm/22.05/inst' \
> --define '_slurm_sysconfdir /home/user/slurm/22.05/inst/etc' \
> --define '_with_pmix --with-pmix=/home/user/pmix/4.1.2' \
> -ta slurm-22.05.2.1.tar.bz2
提示
也可以使用“:”分隔符针对多个 PMIx 版本进行构建。例如针对 3.2 和 4.1 构建:
...
> --with-pmix=/path/to/pmix/3.2.3:/path/to/pmix/4.1.2 \
...
然后,在提交作业时,可以使用 --mpi=list 中的任何可用选项来选择所需的版本。pmix 的默认值将是库的最高版本:
$ srun --mpi=list
MPI plugin types are...
cray_shasta
none
pmi2
pmix
specific pmix plugin versions available: pmix_v3,pmix_v4
继续配置,如果 Slurm 无法找到 PMIx 安装和/或找到它但认为它不可用,则配置输出应记录如下内容:
checking for pmix installation...
configure: WARNING: unable to locate pmix installation
检查 Slurm 构建目录中生成的 config.log 可能会提供更多详细信息以进行故障排除。配置后,我们可以继续安装 Slurm(相应地使用 make 或 rpm):
user@testbox:~/slurm/22.05/build$ make -j install
user@testbox:~/slurm/22.05/build$ cd /home/user/slurm/22.05/inst/lib/slurm/
user@testbox:~/slurm/22.05/inst/lib/slurm$ ls -l *pmix*
lrwxrwxrwx 1 user user 16 jul 6 17:17 mpi_pmix.so -> ./mpi_pmix_v4.so
-rw-r--r-- 1 user user 9387254 jul 6 17:17 mpi_pmix_v3.a
-rwxr-xr-x 1 user user 1065 jul 6 17:17 mpi_pmix_v3.la
-rwxr-xr-x 1 user user 1265840 jul 6 17:17 mpi_pmix_v3.so
-rw-r--r-- 1 user user 9935358 jul 6 17:17 mpi_pmix_v4.a
-rwxr-xr-x 1 user user 1059 jul 6 17:17 mpi_pmix_v4.la
-rwxr-xr-x 1 user user 1286936 jul 6 17:17 mpi_pmix_v4.so
如果还需要对 PMI-1 或 PMI-2 版本的支持,也可以从 contribs 目录安装:
user@testbox:~/slurm/22.05/build/$ cd contribs/pmi1
user@testbox:~/slurm/22.05/build/contribs/pmi1$ make -j install
user@testbox:~/slurm/22.05/build/$ cd contribs/pmi2
user@testbox:~/slurm/22.05/build/contribs/pmi2$ make -j install
user@testbox:~/$ ls -l /home/user/slurm/22.05/inst/lib/*pmi*
-rw-r--r-- 1 user user 493024 jul 6 17:27 libpmi2.a
-rwxr-xr-x 1 user user 987 jul 6 17:27 libpmi2.la
lrwxrwxrwx 1 user user 16 jul 6 17:27 libpmi2.so -> libpmi2.so.0.0.0
lrwxrwxrwx 1 user user 16 jul 6 17:27 libpmi2.so.0 -> libpmi2.so.0.0.0
-rwxr-xr-x 1 user user 219712 jul 6 17:27 libpmi2.so.0.0.0
-rw-r--r-- 1 user user 427768 jul 6 17:27 libpmi.a
-rwxr-xr-x 1 user user 1039 jul 6 17:27 libpmi.la
lrwxrwxrwx 1 user user 15 jul 6 17:27 libpmi.so -> libpmi.so.0.0.0
lrwxrwxrwx 1 user user 15 jul 6 17:27 libpmi.so.0 -> libpmi.so.0.0.0
-rwxr-xr-x 1 user user 241640 jul 6 17:27 libpmi.so.0.0.0
注意
由于低于 4.x 的 Slurm 和 PMIx 都提供了 libpmi[2].so 库,我们建议您将这两个软件安装在不同的位置。否则,这些相同的库最终可能会安装在 /usr/lib64 等标准位置,包管理器会出错,报告冲突。
如果您使用 multiple-slurmd 设置测试环境,则需要指定 slurm.conf 中的 TmpFS 选项,并且创建的目录路径数需要等于节点数。Slurm PMIx 插件使用这些目录来创建临时文件和/或 UNIX 套接字。下面是两个名为 compute[1-2] 的节点的示例设置:
slurm.conf:
tmpFS=/home/user/slurm/22.05/inst/tmp/slurmd-tmpfs-%n
$ mkdir /home/user/slurm/22.05/inst/tmp/slurmd-tmpfs-compute1
$ mkdir /home/user/slurm/22.05/inst/tmp/slurmd-tmpfs-compute2
测试 SLURM 和 PMIX 无需安装 MPI 实现即可直接测试 Slurm 和 PMIx。这是一个示例,说明这两个组件都可以正常工作:
$ srun --mpi=list
MPI plugin types are...
cray_shasta
none
pmi2
pmix
specific pmix plugin versions available: pmix_v3,pmix_v4
$ srun --mpi=pmix_v4 -n2 -N2 \
> /home/user/git/pmix/test/pmix_client -n 2 --job-fence -c
==141756== OK
==141774== OK
OpenMPI
当前版本的 Slurm 和 Open MPI 支持使用 srun 命令启动任务。
如果 OpenMPI 配置为--with-pmi=指向 Slurm 的 PMI-1 libpmi.so 或 PMI-2 libpmi2.so 库,则可以使用 srun 命令直接启动 OMPI 作业。这是首选的操作模式,因为 Slurm 完成的会计功能和亲和力将可用。如果启用了 pmi2 支持,则必须在 srun 命令行上指定选项“--mpi=pmi2”。或者在 slurm.conf 中配置“MpiDefault=pmi”或“MpiDefault=pmi2”。
从 Open MPI 版本 3.1 开始,原生支持 PMIx。要使用 PMIx 启动 Open MPI 应用程序,必须在 srun 命令行上指定“--mpi=pmix”选项,或者必须在 slurm.conf 中配置“MpiDefault=pmix”。
也可以使用外部 PMIx 安装来构建 OpenMPI。有关详细过程,请参阅 OpenMPI 文档,但它基本上包括在配置 OpenMPI 时指定--with-pmix=PATH 。请注意,如果使用外部 PMIx 安装构建 OpenMPI,则需要针对相同的 libevent/hwloc 安装构建 OpenMPI 和 PMIx。OpenMPI 配置脚本提供选项 --with-libevent=PATH 和/或--with-hwloc=PATH使 OpenMPI 匹配 PMIx 的构建对象。
一组参数可用于控制 Slurm PMIx 插件的行为,阅读mpi.conf了解更多信息。
注意
OpenMPI 有一个限制,即不支持 从 Slurm 分配中调用MPI_Comm_spawn() 。如果您需要使用MPI_Comm_spawn()函数,您将需要结合使用另一个 MPI 实现和 PMI-2,因为 PMIx 也不支持它。
注意
一些内核和系统配置导致锁定的内存太小而无法正常使用 OpenMPI 功能,从而导致应用程序因分段错误而失败。这可以通过将 slurmd 守护程序配置为以更大的限制执行来解决。例如,将“LimitMEMLOCK=infinity”添加到您的 slurmd.service 文件中。
Intel MPI
面向 Linux 操作系统的Intel® MPI 库支持以下启动 Slurm 作业管理器控制下的 MPI 作业的方法:
此说明提供了有关这两种方法的详细信息。
HYDRA 进程管理器上的 MPIRUN 命令
默认情况下,Intel® MPI 库的mpirun命令通过 Hydra 进程管理器支持 Slurm 。当在分配中启动时,mpirun命令将自动读取 Slurm 设置的环境变量,例如节点、cpus、任务等,以便在每个节点上启动所需的 hydra 守护进程。这些守护进程将使用 srun 启动,随后将启动用户应用程序。由于Intel® MPI 仅支持 PMI-1 和 PMI-2(不支持 PMIx),因此强烈建议将此 mpi 实施配置为使用 Slurm 的 PMI-2,它提供比 PMI-1 更好的可扩展性。不推荐使用 PMI-1,应该尽快弃用。
下面是一个示例,说明如何使用从 contribs 安装的 Slurm 的 PMI-2 库在 10 个节点的独占分配中启动用户应用程序:
$ salloc -N10 --exclusive
$ export I_MPI_PMI_LIBRARY=/path/to/slurm/lib/libpmi2.so
$ mpirun -np <num_procs> user_app.bin
SRUN 命令-SLURM推荐
Intel® MPI 库也支持此方法。此方法与 Slurm 集成最好,支持进程跟踪、记账、任务亲和性、挂起/恢复等功能。与之前的案例一样,我们展示了一个示例,说明如何使用从 contribs 安装的 Slurm 的 PMI-2 库在 10 个节点的独占分配中启动用户应用程序,从而使其能够利用所有 Slurm 功能。这可以通过sbatch或salloc命令来完成:
$ salloc -N10 --exclusive
$ export I_MPI_PMI_LIBRARY=/path/to/slurm/lib/libpmi2.so
$ srun user_app.bin
提示
我们手动指向 Slurm 的 PMI-1 或 PMI-2 库的原因是出于许可原因。IMPI 不直接链接到任何外部 PMI 实现,因此与其他堆栈(OMPI、MPICH、MVAPICH...)不同,Intel不是针对 Slurm 库构建的。指向此库将导致 Intel dlopen 并使用此 PMI 库。
注意
Intel不提供针对 PMIx 库的官方支持。由于 IMPI 基于 MPICH,将 PMIx 与 Intel 一起使用可能会起作用,因为 PMIx 保持与 pmi2(MPICH 中使用的库)的兼容性,但不能保证在所有情况下都能运行,并且 PMIx 可能会在未来版本中破坏这种兼容性。
有关详细信息,请参阅: Intel MPI 库 。
MPICH
MPICH以前被称为MPICH2。
MPICH 作业可以使用srun或mpiexec 启动。 下面介绍了这两种操作模式。MPICH 实现支持 PMI-1、PMI-2 和 PMIx(从 MPICH v4 开始)。
MPICH 与 SRUN 并与 SLURM 的 PMI-1 或 PMI-2 库链接 MPICH可以专门用于Slurm及其PMI-1或PMI-2 使用类似于下面所示的配置行的库。以这种方式构建 将强制在每次执行时使用此库。请注意, 根据您的 Slurm 安装路径,可能不需要LD_LIBRARY_PATH:
对于 PMI-2:
user@testbox:~/mpich-4.0.2/build$ LD_LIBRARY_PATH=~/slurm/22.05/inst/lib/ \
> ../configure --prefix=/home/user/bin/mpich/ --with-pmilib=slurm \
> --with-pmi=pmi2 --with-slurm=/home/lipi/slurm/master/inst
或对于 PMI-1:
user@testbox:~/mpich-4.0.2/build$ LD_LIBRARY_PATH=~/slurm/22.05/inst/lib/ \
> ../configure --prefix=/home/user/bin/mpich/ --with-pmilib=slurm \
> --with-slurm=/home/user/slurm/22.05/inst
这些配置线将检测 Slurm 已安装的 PMI 库和 链接,但不会安装mpiexec 命令。自 PMI-1 以来 已经很旧了,不能很好地扩展,我们不建议您针对它进行链接。 最好使用 PMI-2。您可以按照此示例运行作业 PMI-2:
$ mpicc -o hello_world hello_world.c
$ srun --mpi=pmi2 ./hello_world
Slurm 升级不会影响此 MPICH 安装。只有一个 不太可能出现的情况,即在 升级,即我们强行链接到 Slurm 的 PMI-1 和/或 PMI-2 库以及它们的 API 是否发生更改。这些不应该经常改变,但 如果发生这种情况,将在Slurm的RELEASE_NOTES文件中注明。
MPICH 与 PMIX 集成,并与 SLURM 集成 您还可以使用外部 PMIx 库构建 MPICH,该库应该是 与构建 Slurm 时使用的相同:
$ LD_LIBRARY_PATH=~/slurm/22.05/inst/lib/ ../configure \
> --prefix=/home/user/bin/mpich/ \
> --with-pmix=/home/user/bin/pmix_4.1.2/ \
> --with-pmi=pmix \
> --with-slurm=/home/user/slurm/master/inst
以这种方式构建后,任何执行都必须使用 Slurm (srun) 进行,因为 未安装Hydra进程管理器,就像在前面的示例中一样。 编译并运行进程:
$ mpicc -o hello_world hello_world.c
$ srun --mpi=pmix ./hello_world
MPICH及其内部PMI并与SLURM集成 另一种选择是只编译 MPICH,但不设置--with-pmilib,--with-pmix 或-with-pmi,并且只保留--with-slurm。 在这种情况下,MPICH 不会强制链接到任何 PMI 库,它会 默认情况下安装 mpiexec.hydra 命令。这将导致它使用其 内部 PMI 实现(基于 PMI-1)和 Slurm API 函数来检测 相应的作业环境和启动流程:
user@testbox:~/mpich-4.0.2/build$ ../configure \
> --prefix=/home/user/bin/mpich/ \
> --with-slurm=/home/user/slurm/22.05/inst
然后可以使用 srun 或 mpiexec 运行该应用程序:
$ mpicc -o hello_world hello_world.c
$ srun ./hello_world
或
$ mpiexec.hydra ./hello_world
mpiexec.hydra 将使用 srun 启动的 Slurm 步骤生成其守护进程,并且 将使用其内部 PMI 实现。
提示
在这种情况下,使用 --with-slurm选项进行编译 创建了 Hydra 引导程序命令(mpiexec.hydra 等)并链接它们 针对版本化的 Slurm 的主要公共 API (libslurm.so.X.0.0)。那是 因为这些命令使用一些 Slurm 函数来检测作业环境。 请注意,升级 Slurm 需要重新编译 MPICH 堆栈。 通常,将链接库的名称符号链接到新库就足够了, 但这并不能保证有效。
没有 SLURM 集成的 MPICH 最后,可以在不与 Slurm 集成的情况下编译 MPICH。在那种情况下,它不会识别作业,只会像在本地机器上一样运行进程。我们建议阅读 MPICH 文档和配置脚本以获取有关现有可能性的更多信息。
MVAPICH2
MVAPICH2 支持 Slurm。要启用它,您需要使用类似于此的命令构建 MVAPICH2:
$ ./configure --prefix=/home/user/bin/mvapich2 \
> --with-slurm=/home/user/slurm/22.05/inst/
注意
在某些 MVAPICH2 版本中以及使用 GCC > 10.x 构建时,可能必须将这些标志添加到配置行之前:
FFLAGS="-std=legacy" FCFLAGS="-std=legacy" ./configure ...
当使用 Slurm 支持构建 MVAPICH2 时,它将检测到它在 Slurm 分配中,并将使用“srun”命令生成其 hydra 守护进程。它不链接到 Slurm API,这意味着在升级 Slurm 期间无需重新编译 MVAPICH2。默认情况下,它将使用内部 PMI 实现。
带 SRUN 的 MVAPICH2 并与 SLURM 的 PMI-1 或 PMI-2 库链接 可以强制 MVAPICH2 使用 Slurm 的 PMI-1 (libpmi.so.0.0.0) 或 PMI-2 (libpmi2.so.0.0.0) 库之一。使用此模式构建将导致所有执行都使用 Slurm 及其 PMI 库。不会安装 Hydra 进程管理器二进制文件 (mpiexec)。事实上,mpiexec 命令将作为 Slurm 的 srun 命令的符号链接存在。建议不要使用 PMI-1,但至少使用 PMI-2 库。有关如何配置和使用的示例,请参见下文:
对于 PMI-2:
./configure --prefix=/home/user/bin/mvapich2 \
> --with-slurm=/home/user/slurm/master/inst/ \
> --with-pm=slurm --with-pmi=pmi2
对于 PMI-1:
./configure --prefix=/home/user/bin/mvapich2 \
> --with-slurm=/home/user/slurm/master/inst/ \
> --with-pm=slurm --with-pmi=pmi1
要在 Slurm 中编译和运行用户应用程序:
$ mpicc -o hello_world hello_world.c
$ srun --mpi=pmi2 ./hello_world
有关详细信息,请参阅其 网页 上的 MVAPICH2 文档
支持 SLURM 并与外部 PMIX 链接的 MVAPICH2 可以在 MVAPICH2 中使用 PMIx 并与 Slurm 集成。这样,将不会安装 Hydra Process Manager,并且用户应用程序将需要使用 srun 运行,假设 Slurm 已针对与构建 MVAPICH2 时使用的版本相同或兼容的 PMIx 版本进行编译。
要构建 MVAPICH2 以使用 PMIx 并与 Slurm 集成,需要类似于此的配置行:
./configure --prefix=/home/user/bin/mvapich2 \
> --with-slurm=/home/user/slurm/master/inst/ \
> --with-pm=slurm \
> --with-pmix=/home/user/bin/pmix_4.1.2/ \
> --with-pmi=pmix
运行作业看起来类似于前面的示例:
$ mpicc -o hello_world hello_world.c
$ srun --mpi=pmix ./hello_world
提示
在 MVAPICH2 的情况下,通过与 Slurm ( --with-slurm ) 的集成进行编译不会对命令或库添加任何依赖性,因此升级 Slurm 应该是安全的,无需重新编译 MVAPICH2。只有一种不太可能的情况是升级后需要重新编译 MPI 堆栈,即当我们强行链接到 Slurm 的 PMI-1 和/或 PMI-2 库并且它们的 API 发生变化时。这些不应经常更改,但如果发生更改,则会在 Slurm 的 RELEASE_NOTES 文件中注明。
HPE Cray PMI 支持
Slurm 默认带有一个 Cray PMI 供应商特定的插件,该插件提供与 HPE Cray 编程环境的 PMI 的兼容性。它旨在用于在 HPE Cray 机器上使用此环境构建的应用程序。
该插件被命名为cray_shasta(Shasta 是该插件支持的第一个 Cray 架构)并且在所有 Slurm 安装中默认构建。通过运行以下命令显示其可用性:
$ srun --mpi=list
MPI plugin types are...
cray_shasta
none
Cray PMI 插件将使用一些保留端口进行通信。这些端口可以通过在命令行上使用--resv-ports选项和srun进行配置,或者通过在 slurm.conf 中设置MpiParams=ports =[ port_range ] 来配置。此选项中列出的第一个端口将用作 PMI 控制端口,由 Cray 定义为PMI_CONTROL_PORT环境变量。使用相同的PMI_CONTROL_PORT在同一节点中启动的应用程序不能超过一个。
此插件不支持 MPMD/异构作业,它需要 libpals >= 0.2.8。