繁体   English   中英

是否可以使用 SRUN 而不是 SBATCH 在后台运行 SLURM 作业?

[英]Is it possible to run SLURM jobs in the background using SRUN instead of SBATCH?

我试图在后台运行带有 srun 的 slurm 作业。 不幸的是,现在由于我必须通过 docker 运行它,所以使用 sbatch 有点烦人所以我试图找出是否可以一起避免它。

根据我的观察,每当我运行 srun 时,都会说:

srun docker image my_job_script.py

并关闭我运行命令的 window(以避免接收所有打印语句)并打开另一个终端 window 以查看命令是否仍在运行,似乎我的运行脚本由于某种原因被取消或其他原因。 由于它不是通过 sbatch,它不会向我发送带有错误日志的文件(据我所知),所以我不知道它为什么关闭。

我也试过:

srun docker image my_job_script.py &

在终端中将控制权还给我。 不幸的是,如果我这样做,它仍然会继续将内容打印到我的终端屏幕上,而我正试图避免这种情况。

本质上,我通过 ssh 登录到远程计算机,然后执行 srun 命令,但似乎如果我终止我的 ssh 连接的通信,srun 命令会自动终止。 有办法阻止这种情况吗?

理想情况下,我基本上希望发送脚本运行并且不会因为任何原因取消它,除非我通过scancel取消它并且它不应该打印到我的屏幕上。 所以我理想的解决方案是:

  1. 即使我退出 ssh session 也继续运行 srun 脚本
  2. 即使从我发送命令的地方关闭 window,也要继续运行我的 srun 脚本
  3. 继续运行我的 srun 脚本,让我离开 srun session 并且不打印到我的屏幕(即基本上运行到后台)

这将是我的想法解决方案。


对于想知道 sbatch 问题的好奇人群,我希望能够做到(这是理想的解决方案):

sbatch docker image my_job_script.py

但是,正如人们所知,它不起作用,因为 sbatch 收到命令 docker,这不是“批处理”脚本。 本质上,一个简单的解决方案(对我的情况并不适用)是将 docker 命令包装在批处理脚本中:

#!/usr/bin/sh
docker image my_job_script.py

不幸的是,我实际上正在使用我的批处理脚本来编码我正在运行的任务的大量信息(有点像配置文件)。 所以这样做可能会影响我所做的工作,因为它们的基础文件正在发生变化。 通过将作业直接发送到 sbatch 可以避免这种情况,因为它实际上创建了批处理脚本的副本(如本问题所述: Changing the bash script sent to slurm during run a bad idea? )。 所以我的问题的真正解决方案是让我的批处理脚本包含我的脚本所需的所有信息,然后以某种方式在 python 中调用 docker 并同时将所有信息传递给它。 不幸的是,一些信息是 function 指针和对象,所以我什至不清楚如何将这样的东西传递给在 python 中运行的 docker 命令。


或者也许能够直接运行 docker 到 sbatch 而不是使用批处理脚本也可以解决问题。

输出可以使用选项-o stdout重定向, -e用于stderr

因此,可以在后台启动作业并重定向输出:

$ srun -o file.out -e file.errr docker image my_job_script.py &

另一种方法是使用像tmux屏幕这样的终端多路复用器。

例如,创建一个新的tmux窗口类型tmux 在该窗口中,使用srun和脚本。 从那里,您可以分离tmux窗口,该窗口将您返回到主shell,以便您可以开展其他业务,或者您可以完全注销。 如果要签入脚本,只需重新连接到tmux窗口即可。 有关如何分离和重新连接操作系统的信息,请参阅文档tmux -h

使用-o-e任何输出重定向仍将使用此技术,您可以在不同的tmux窗口中同时运行多个srun命令。 我发现这种方法很有用,特别是在开发需要数小时才能运行的脚本时。

我也想知道这一点,因为sbatchsrun之间的差异不是很清楚地解释或动机。 我查看了代码,发现:

sbatch

sbatch几乎只是将 shell 脚本发送到 controller,告诉它运行它然后退出。 它不需要在作业进行时继续运行。 它确实有一个--wait选项可以保持运行直到作业完成,但它所做的只是每 2 秒轮询一次 controller 以询问它。

sbatch无法跨多个节点运行作业 - 代码根本不在sbatch.c中。 sbatch不是根据srun实现的,这是完全不同的事情。

此外,它的参数必须是 shell 脚本。 有点奇怪的限制,但它确实有一个--wrap选项,因此它可以自动为您将真实程序包装在 shell 脚本中。 祝所有 escaping 正确无误!

srun

srun更像是一个 MPI 运行程序。 它直接在许多节点上启动任务(默认情况下每个节点一个任务,但您可以使用--ntasks覆盖它)。 它适用于 MPI,因此所有作业都将同时运行。 直到所有节点都有空闲时,它才会开始。

必须在作业进行时保持运行。 您可以使用&将其发送到后台,但这仍然与sbatch不同。 如果您需要启动一百万srun ,您就会遇到问题。 一百万sbatch应该(理论上)可以正常工作。

没有办法让srun退出并让作业继续运行,就像sbatch srun本身充当作业中所有节点的协调器,并更新作业状态等,因此它需要在整个过程中运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM