使用python提交作业

Vai*_*han 1 python jobs

我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)

问题是,系统在这一点上悬而未决.上述脚本中有任何明显错误吗?代码中提到的所有文件都可以在该目录中找到(我已经交叉检查过了).qsub是用于向我们的集群提交作业的命令.fname是我在流程中创建的文件的名称.

wfl*_*nny 6

我有一个脚本,我曾经使用qsub将多个作业提交到我们的集群.qsub通常在表单中提交作业

qsub [qsub options] job
Run Code Online (Sandbox Code Playgroud)

在我的工作中,job通常是一个bash(.sh)或python脚本(.py),它实际上调用要在每个节点上运行的程序或代码.如果我想提交一份名为"test_job.sh"的工作,最长时间,我会这样做

qsub -l walltime=72:00:00 test_job.sh
Run Code Online (Sandbox Code Playgroud)

这相当于以下python代码

from subprocess import call

qsub_call = "qsub -l walltime=72:00:00 %s"
call(qsub_call % "test_job.sh", shell=True)
Run Code Online (Sandbox Code Playgroud)

或者,如果你有一个看起来像的bash脚本怎么办?

#!/bin/bash

filename="your_filename_here"
ifort -openmp ran_numbers.f90 $filename ompscmf.f90 -o scmf.o
Run Code Online (Sandbox Code Playgroud)

那么通过提交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
Run Code Online (Sandbox Code Playgroud)

这将做的是一次在一个节点上提交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)
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用`for((i = 0; i <$ {PBS_NUM_PPN}; i ++))`而不是对for-loop中的8个内核进行硬编码. (2认同)