«смущающе параллельное» программирование с использованием Python и PBS в кластере - PullRequest
10 голосов
/ 22 июля 2010

У меня есть функция (модель нейронной сети), которая производит цифры. Я хочу протестировать несколько параметров, методов и различных входных данных (то есть сотни прогонов функции) из python с использованием PBS на стандартном кластере с Torque.

Примечание: я пробовал параллельный python, 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)

в "что-то", что запускает сценарий PBS для каждого вызова функции model?

#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, но пока не мог понять это (декоратор?).

Ответы [ 4 ]

4 голосов
/ 22 июля 2010

pbs_python [1] может работать для этого.Если эксперимент_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

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

3 голосов
/ 22 октября 2010

Вы можете сделать это легко, используя кувшин (который я разработал для аналогичной установки).

Вы написали бы в файле (например, model.py):

@TaskGenerator
def model(param1, param2):
     res = complex_computation(param1, param2)
     pyplot.coolgraph(res)


for param1 in np.linspace(0, 1.,100):
    for param2 in xrange(2000):
        model(param1, param2)

И это все!

Теперь вы можете запускать «задания кувшина» в своей очереди: jug execute model.py, и это будет распараллеливаться автоматически. Что происходит, так это то, что каждая работа будет в цикле делать что-то вроде:

while not all_done():
    for t in tasks in tasks_that_i_can_run():
        if t.lock_for_me(): t.run()

(На самом деле все сложнее, но вы понимаете, в чем дело).

Он использует файловую систему для блокировки (если вы находитесь в системе NFS) или сервер Redis, если хотите. Он также может обрабатывать зависимости между задачами.

Это не совсем то, что вы просили, но я считаю, что это более чистая архитектура, чтобы отделить это от системы очередей на работу.

2 голосов
/ 10 апреля 2012

Похоже, я немного опоздал на вечеринку, но у меня также был тот же вопрос о том, как несколько лет назад отобразить смущающе параллельные проблемы на кластер в python, и написал свое собственное решение.Я недавно загрузил его на github здесь: https://github.com/plediii/pbs_util

Чтобы написать вашу программу с помощью pbs_util, я сначала создал бы pbs_util.ini в рабочем каталоге, содержащем

[PBSUTIL]
numnodes=1
numprocs=1
mem=i1000mb
walltime=24:00:00

Затем скрипт Pythonкак это

import pbs_util.pbs_map as ppm

import pylab
import myModule

class ModelWorker(ppm.Worker):

    def __init__(self, input, N):
        self.input = input
        self.N = N

    def __call__(self, a):
        myModule.do_lots_number_crunching(self.input, a, self.N)
        pylab.savefig('figure_' + self.input.name + '_' + str(a) + '_' + str(self.N) + '.png')



# You need  "main" protection like this since pbs_map will import this file on the     compute nodes
if __name__ == "__main__":
    input, N = something, picklable
    # Use list to force the iterator
    list(ppm.pbs_map(ModelWorker, pylab.linspace(0., 1., 100),
                     startup_args=(input, N),
                     num_clients=100))

И это будет сделано.

0 голосов
/ 06 ноября 2013

Я только начал работать с кластерами и приложениями EP.Моя цель (я с Библиотекой) - научиться достаточно, чтобы помочь другим исследователям в университетском городке получить доступ к HPC с приложениями EP ... особенно исследователям вне STEM.Я все еще очень новичок, но подумал, что это может помочь в этом вопросе указать на использование GNU Parallel в сценарии PBS для запуска основных сценариев Python с различными аргументами.В файле .pbs есть две строки, на которые следует указать:

module load gnu-parallel # this is required on my environment

parallel -j 4 --env PBS_O_WORKDIR --sshloginfile $PBS_NODEFILE \
--workdir $NODE_LOCAL_DIR --transfer --return 'output.{#}' --clean \
`pwd`/simple.py '{#}' '{}' ::: $INPUT_DIR/input.*

# `-j 4` is the number of processors to use per node, will be cluster-specific
# {#} will substitute the process number into the string
# `pwd`/simple.py `{#}` `{}`   this is the command that will be run multiple times
# ::: $INPUT_DIR/input.* all of the files in $INPUT_DIR/ that start with 'input.' 
#     will be substituted into the python call as the second(3rd) argument where the
#     `{}` resides.  These can be simple text files that you use in your 'simple.py'
#     script to pass the parameter sets, filenames, etc.

Как новичок в суперкомпьютерах EP, хотя я пока не понимаю всех других опций в «параллельной», эта команда разрешиламне запускать скрипты Python параллельно с разными параметрами.Это будет хорошо работать, если вы сможете заранее создать множество файлов параметров, которые распараллелят вашу проблему.Например, запуск моделирования в пространстве параметров.Или обрабатывает много файлов с одинаковым кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...