2016-06-03 7 views
0

SGE (QSUB)를 사용하여 클러스터의 다른 노드에 파이썬 함수, 예를 들어 my_fun(x1,x2)을 실행하고 싶습니다. 나는 명령 줄에서 숫자 인수에 소요 스크립트 my_script.py를 생성, 그래서 로컬로 실행 할 때, 나는 지금은 서로 다른 값을 가진 루프에서 클러스터에이 스크립트를 제출할Python을 사용하여 숫자 인수가있는 QSUB에 작업 제출

python my_script.py x1 x2 

로 호출 할 것 x1과 x2의 또한 노드가 설치된 모듈 인 파이썬 &에 액세스하려면 QSUB를 통해 파이썬 스크립트를 호출하기 전에 노드에서 module load Python/2.7을 실행해야합니다.

이것은 매우 단순하고 일반적인 사용 사례처럼 보이지만 파이썬에서이 작업을 수행하는 간단한 방법을 찾을 수 없습니다. BASH와 파이썬 사이를왔다 갔다하는 것은 다소 어색해 보인다.

+0

어레이 작업을 살펴보십시오. –

답변

0
을 찾을 수 있습니다

qsub -F "myarg1 myarg2 myarg3=myarg3value" myscript.sh 

: 당신이 qsub를 통해 추가 매개 변수를 전달하려면

, 당신이 당신의 스크립트에 전달 될 수있는 인수와 함께 qsub를 호출 할 수 있습니다

다소 차이는 있습니까?

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 
+0

물론, 나는 (파이썬) FOR 루프 안에서 본문을 실행할 것이다. – KartMan

1

노드의 수에 따라 작업을 여러 개의 독립적 인 작업으로 나눌 것을 제안합니다.

각 노드/코어에 대해이 하위 작업이 처리해야하는 매개 변수 목록이 들어있는 파일로 폴더를 만듭니다. 그런 다음 파이썬에서 파일을 읽고 스크립트를 호출하는 스크립트를 작성하십시오 (아마도 다중 코어 지원을 위해 다중 처리 모듈을 사용하여).

편집 : 당신은이 문서 here

+0

제출해야하는 작업 수가 극히 비효율적입니다. 디스크에 파일을 쓰지 않아도이를 수행 할 수있는 방법이 있다고 생각합니다. – KartMan

+0

x1 x2 값의 출처는 어디입니까? 왜냐하면 qsub은 작은 스크립트를 호출하는 데 비효율적이기 때문입니다. –

+0

작업을 수행 할 방법을 찾고 있다면 또 다른 제안은 ipython/jupyter를 사용하여 많은 수의 직원을 시작하고 계산을 제출하고 결과를 수집 할 수있게하는 것입니다. –