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

我有一个产生数字的函数(神经网络模型)。我希望使用带扭矩的标准集群上的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')

其中,input是表示输入的对象,input.name是字符串,do_lots_number_crunching可能持续数小时。
我的问题是:是否有一种正确的方法来转换参数扫描之类的东西,例如
for a in pylab.linspace(0., 1., 100):
    model(input, a)

进入“something”,它将为每次调用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

我正在考虑一个包含PBS模板的函数,并从python脚本调用它,但还不能弄清楚(decorator?)。

最佳答案

pbs_python[1]可以解决这个问题。如果实验用“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

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

本文翻译自 https://stackoverflow.com/questions/3307948/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 python pbs qsub embarrassingly-parallel


相关文章:

python - PBS群集节点上的多处理

c++ - 在程序源文件中使用脚本变量OMP_NUM_THREADS

c++ - 写入文件PBS MPI时出错

linux - 我如何找到在特定PBS作业上运行的当前进程

python - Django Admin代理模型权限Django 1.11

python - 结合也许和seq monads:在输出中混淆

python - 如何在Python中将self传递给类似方法的对象

python - 熊猫:在每组中选择前几行

linux - 扭矩嵌套/连续qsub调用

linux - linux:提交给sge的作业卡在“ dt”状态