我使用 SLURM 启动器 srun
分发基于 OpenMPI 的应用程序。当一个进程崩溃时,我想在其他 PE 中检测到这一情况并执行一些操作。我知道 OpenMPI 没有容错功能,但我仍然需要在其他 PE 中执行正常退出。
为此,每个 PE 都必须能够:
- 在另一个 PE 崩溃的情况下继续运行。
- 检测其中一个 PE 是否崩溃。
目前我正在专注于第一个任务。根据手册,srun has --no-kill flag 。但是,它似乎对我不起作用。我看到以下日志消息:
srun: error: node0: task 0: Aborted // this is where I crash the PE deliberately
slurmstepd: error: node0: [0] pmixp_client_v2.c:210 [_errhandler] mpi/pmix: ERROR: Error handler invoked: status = -25: Interrupted system call (4)
srun: Jb step aborted: Waiting up to 32 seconds for job step to finish.
slurmstepd: error: ***STEP 12123.0 ON node0 CANCELLED AT 2020-12-02 ***
srun: error: node0: task 1: Killed // WHY?!
为什么会发生这种情况?是否有任何其他相关标志或环境变量,或任何可能有帮助的配置选项?
要重现该问题,可以使用以下程序(为了简洁起见,它使用 Boost.MPI,但不使用 Boost 也具有相同的效果):
#include <boost/mpi.hpp>
int main() {
using namespace boost::mpi;
environment env;
communicator comm;
comm.barrier();
if (comm.rank() == 0) {
throw 0;
}
while (true) {}
}
最佳答案
根据您链接的文档,--no-kill
标志仅影响节点故障时的行为。
在您的情况下,您应该使用 --kill-on-bad-exit=0
选项,该选项将防止其余任务在其中一个任务以非 - 退出时被终止。零退出代码。
关于mpi - SLURM:如何在一台 PE 崩溃时禁用自 Action 业清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65105301/