[英]Submitting jobs using python
我正在尝试使用python脚本在我们研究所的集群中提交作业。
compile_cmd = 'ifort -openmp ran_numbers.f90 ' + fname \
+ ' ompscmf.f90 -o scmf.o'
subprocess.Popen(compile_cmd, shell=True)
Popen('qsub launcher',shell=True)
问题是,系统此时已挂起。 上面的脚本中有明显的错误吗? 代码中提到的所有文件都可以在该目录中找到(我已对此进行了交叉检查)。 qsub是用于将作业提交到我们的集群的命令。 fname是我在此过程中创建的文件的名称。
我有一个脚本,我曾经使用qsub将多个作业提交到我们的集群。 qsub通常采用以下形式提交作业
qsub [qsub options] job
在我的工作中,job通常是一个bash(.sh)或python脚本(.py),它们实际上调用要在每个节点上运行的程序或代码。 如果我想提交一个名为“ test_job.sh”的工作,并且需要最多的时间,我会这样做
qsub -l walltime=72:00:00 test_job.sh
这相当于以下python代码
from subprocess import call
qsub_call = "qsub -l walltime=72:00:00 %s"
call(qsub_call % "test_job.sh", shell=True)
另外,如果您的bash脚本看起来像
#!/bin/bash
filename="your_filename_here"
ifort -openmp ran_numbers.f90 $filename ompscmf.f90 -o scmf.o
然后通过qsub job.sh
提交了这个?
编辑:老实说,最佳的作业排队方案因群集而异。 一种简化作业提交脚本的简单方法是找出每个节点上有多少个CPU。 一些较新的排队系统使您可以提交许多单CPU作业,它们将在尽可能少的节点上一起提交这些作业。 但是,某些较旧的集群无法做到这一点,因此提交许多单独的工作变得令人厌烦。
假设集群中的每个节点都有8个CPU。 你可以这样写你的脚本
#!/bin/bash
#PBS -l nodes=1;ppn=8
for ((i=0; i<8; i++))
do
./myjob.sh filename_${i} &
done
wait
要做的是一次在一个节点上提交8个作业( &
表示在后台执行),然后等待所有8个作业完成。 对于每个节点具有许多CPU的群集,这可能是最佳选择(例如,我使用的一个群集每个节点具有48个CPU)。
另外,如果提交许多单核作业是最佳选择,并且上面的提交代码不起作用,则可以使用python生成bash脚本以传递给qsub。
#!/usr/bin/env python
import os
from subprocess import call
bash_lines = ['#!/bin/bash\n', '#PBS -l nodes=1;ppn=1\n']
bash_name = 'myjob_%i.sh'
job_call = 'ifort -openmp ran_numbers.f90 %s ompscmf.f90 -o scmf.o &\n'
qsub_call = 'qsub myjob_%i.sh'
filenames = [os.path.join(root, f) for root, _, files in os.walk(directory)
for f in files if f.endswith('.txt')]
for i, filename in enumerate(filenames):
with open(bash_name%i, 'w') as bash_file:
bash_file.writelines(bash_lines + [job_call%filename, 'wait\n'])
call(qsub_call%i, shell=True)
您收到任何错误了吗? 因为似乎您错过了第二个Popen的“ 子进程”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.