Отправка заданий с числовыми аргументами в QSUB с использованием Python
Я хочу запустить функцию Python, скажем, my_fun(x1,x2)
, на разных узлах кластера с SGE (QSUB). Я создал скрипт my_script.py
который принимает числовые аргументы из командной строки, поэтому при локальном запуске я бы назвал его
python my_script.py x1 x2
Теперь я хочу отправить этот сценарий в кластер в цикле с различными значениями x1 и x2. Кроме того, чтобы узел имел доступ к python и установленным модулям, мне нужно запустить module load Python/2.7
на узле перед вызовом скрипта Python через QSUB.
Это кажется довольно простым и типичным вариантом использования, но я не могу найти простой способ сделать это из Python. Переход назад и вперед между BASH и Python кажется немного неуклюжим.
2 ответа
Это более или менее делает то, что я ищу:
https://gist.github.com/timflutre/a9085660271bd059f71c
import sys
import subprocess
job_param1 = 12.5
job_param2 = 5.0
jobName = "python my_script.py %f %f" % (job_param1,job_param2)
cmd = "module load Python/2.7; sleep 0.2; %s" % jobName
echoArgs = ["echo", "-e", "'%s'" % cmd]
print(" ".join(echoArgs))
qsubArgs = ["qsub","-cwd"]
print(" ".join(qsubArgs))
wholeCmd = " ".join(echoArgs) + " | " + " ".join(qsubArgs)
out = subprocess.Popen(wholeCmd, shell=True, stdout=subprocess.PIPE)
out = out.communicate()[0]
jobId = out.split()[2]
print jobId
Я предлагаю вам разделить задание на несколько независимых заданий в зависимости от количества имеющихся у вас узлов.
Для каждого узла / ядра создайте папку с файлом, содержащим список параметров, которые этот обработчик должен обработать. Затем в python напишите скрипт, который читает файл и вызывает ваш скрипт (возможно, используя многопроцессорный модуль для поддержки многоядерности).
РЕДАКТИРОВАТЬ:
Если вы хотите передать дополнительные параметры через qsub, вы можете вызвать qsub с аргументами, которые можно передать в ваш скрипт:
qsub -F "myarg1 myarg2 myarg3=myarg3value" myscript.sh
Вы можете найти эту документацию здесь