Skip to main content
 首页 » 编程设计

python之使用 python 提交作业

2025年05月04日17kevingrace

我正在尝试使用 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 

在我的工作中,作业通常是 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)