在群集上使用python和PBS进行"令人尴尬的并行"编程

med*_*duz 10 python qsub pbs embarrassingly-parallel

我有一个产生数字的函数(神经网络模型).我希望在带有Torque的标准集群上使用PBS从python测试几个参数,方法和不同输入(意味着数百次运行的函数).

注意:我尝试了parallelpython,ipython等,并且从未完全满意,因为我想要更简单的东西.集群处于给定的配置中,我无法改变,这样的集成python + qsub的解决方案肯定会对社区有益.

为简化起见,我有一个简单的功能,例如:

import myModule
def model(input, a= 1., N=100):
    do_lots_number_crunching(input, a,N)
    pylab.savefig('figure_' + input.name + '_' + str(a) + '_' + str(N) + '.png')
Run Code Online (Sandbox Code Playgroud)

input表示输入的对象在哪里,input.name是一个字符串,do_lots_number_crunching可能持续数小时.

我的问题是:是否有正确的方法来转换像扫描参数之类的东西

for a in pylab.linspace(0., 1., 100):
    model(input, a)
Run Code Online (Sandbox Code Playgroud)

进入"东西",为每次调用model函数启动PBS脚本?

#PBS -l ncpus=1
#PBS -l mem=i1000mb
#PBS -l cput=24:00:00
#PBS -V
cd /data/work/
python experiment_model.py
Run Code Online (Sandbox Code Playgroud)

我正在考虑一个包含PBS模板的函数,并从python脚本中调用它,但还不能解决它(装饰器?).

小智 4

pbs_python[1] 可以用于此目的。如果 Experiment_model.py 'a' 作为参数,你可以这样做

import pbs, os

server_name = pbs.pbs_default()
c = pbs.pbs_connect(server_name)

attopl = pbs.new_attropl(4)
attropl[0].name  = pbs.ATTR_l
attropl[0].resource = 'ncpus'
attropl[0].value = '1'

attropl[1].name  = pbs.ATTR_l
attropl[1].resource = 'mem'
attropl[1].value = 'i1000mb'

attropl[2].name  = pbs.ATTR_l
attropl[2].resource = 'cput'
attropl[2].value = '24:00:00'

attrop1[3].name = pbs.ATTR_V

script='''
cd /data/work/
python experiment_model.py %f
'''

jobs = []

for a in pylab.linspace(0.,1.,100):
    script_name = 'experiment_model.job' + str(a)
    with open(script_name,'w') as scriptf:
        scriptf.write(script % a)
    job_id = pbs.pbs_submit(c, attropl, script_name, 'NULL', 'NULL')
    jobs.append(job_id)
    os.remove(script_name)

 print jobs
Run Code Online (Sandbox Code Playgroud)

[1]: https: //oss.trac.surfsara.nl/pbs_python/wiki/TorqueUsage pbs_python