Cha*_*ker 7 python slurm sbatch
我试图在后台运行带有srun的slurm作业。不幸的是,由于现在我不得不通过docker运行某些东西,因此使用sbatch有点烦人,所以我试图找出是否可以完全避免。
根据我的观察,每当我运行srun时,请说:
srun docker image my_job_script.py
Run Code Online (Sandbox Code Playgroud)
并关闭我正在运行命令的窗口(以避免接收所有打印语句),并打开另一个终端窗口以查看命令是否仍在运行,看来我的运行脚本由于某种原因被取消了。由于它不是通过sbatch进行的,因此不会向我发送带有错误日志的文件(据我所知),所以我不知道为什么它会关闭。
我也尝试过:
srun docker image my_job_script.py &
Run Code Online (Sandbox Code Playgroud)
在终端将控制权还给我。不幸的是,如果我这样做,它仍然会继续在终端屏幕上打印内容,这是我试图避免的。
本质上,我通过ssh登录到远程计算机,然后执行srun命令,但是似乎如果我终止ssh连接的通信,则srun命令会自动终止。有办法阻止这种情况吗?
理想情况下,我基本上希望发送脚本以使其运行,并且不要由于任何原因取消该脚本,除非我将其取消,并且该脚本scancel不应打印到屏幕上。所以我理想的解决方案是:
这将是我的想法解决方案。
对于想了解sbatch问题的好奇人群,我希望能够这样做(这是理想的解决方案):
sbatch docker image my_job_script.py
Run Code Online (Sandbox Code Playgroud)
但是,人们会知道它是行不通的,因为sbatch接收到了不是“ batch”脚本的命令docker。本质上,一个简单的解决方案(实际上不适用于我的情况)是将docker命令包装在批处理脚本中:
#!/usr/bin/sh
docker image my_job_script.py
Run Code Online (Sandbox Code Playgroud)
不幸的是,我实际上是在使用批处理脚本来编码我正在运行的任务的很多信息(类似于配置文件)。因此这样做可能会影响我所做的工作,因为其基础文件正在更改。通过将作业直接发送到sbatch可以避免这种情况,因为它实际上创建了批处理脚本的副本(如本问题所述:在运行期间更改发送给sbatch的bash脚本运行时是一个坏主意吗?)。因此,解决我的问题的真正方法是使批处理脚本包含我的脚本所需的所有信息,然后在python中以某种方式呼叫docker并同时传递所有信息。不幸的是,其中一些信息是函数指针和对象,因此我什至不知道如何将此类信息传递给在python中运行的docker命令。
或者也许能够直接运行docker进行分批处理,而不是使用批处理脚本来解决问题。
输出可以通过选项被重定向-o 标准输出和-e为标准错误。
因此,可以在后台启动作业并重定向输出:
$ srun -o file.out -e file.errr docker image my_job_script.py &
Run Code Online (Sandbox Code Playgroud)