2017-03-30 12 views
2

많은 작업을 독립적으로 수행 할 수있는 하나의 컴퓨터에서 실행되는 파이썬 코드가 있습니다. SGE 그리드에서 더 평행하게 만들 수 있는지 궁금합니다. 예를 들어 그리드의 각 노드는 이러한 독립적 인 작업에 대해 여러 스레드를 실행합니다.다중 처리와 같은 Python 병렬 모듈을 사용하는 방법 Sun SGE 그리드의 풀

은 원래 내가 가진 :

# function def 
# some_function(param1, param2, param3, process_index)  
func = functools.partial(some_function, file_list, param1, param2, param3) 
pool = multiprocessing.Pool(processes=some_integer) 
ret_list = pool.map(func, range(processes)) 
pool.close() 

그것은 로컬 컴퓨터에서 잘 작동하는 것 같지만입니다 같은 SGE 그리드에 제출하면, 그것은 참으로 오류 메시지를 뱉어하지 않고 비정상적으로 종료합니다. 제출 명령은 다음과 같이 보일 수 있습니다 :

qsub -V -b yes -cwd -l h_vmem=10G -N jobname -o grid_job.log -j yes "python worker.py" 

를 이상적으로, 나는 파이썬 코드의 로컬 버전에 대한 최소한의 변경을 찾고 있어요는 SGE 그리드에서 실행할 수 있도록, 그것은 새로운 도구를 설치하기 어렵다 때문에 그리드를 변경하거나 다른 사용자에게 영향을주지 않고 그리드 구성을 변경하십시오.

최소한 하나의 qsub 명령으로 각 작업 (file_list의 파일) 처리가 처리되도록 코드를 다시 작성할 수 있음을 이해합니다. 하지만 모범 사례가 무엇인지 궁금하네요.

답변

3

파이썬 스크립트가 파일 목록과 프로세스 수를 명령 줄 인수로 읽도록 만드는 것이 무엇입니까? 이렇게하면 더 쉽게 호출 할 수 있습니다. 파일 목록을 인수로 받고 원하는 작업에 따라 모든 작업을 제출하는 Bash 스크립트를 작성합니다. 이렇게하면 여러 노드 (qsub)와 노드 당 여러 프로세스 (파이썬 다중 프로세스)의 두 가지 수준의 병렬 처리를 수행 할 수 있습니다. 올바른 방법을 사용하려면 각 작업에 대해 원하는 SLOTS 수를 qsub에 알려야합니다. 당신의 SGE 클러스터가 어떤 병렬 환경이없는 경우

import sys 

nb_processes = int(sys.argv[1]) 
file_list = sys.argv[2:] 

pool = multiprocessing.Pool(processes=nb_processes) 
ret_list = pool.map(some_function, file_list) 
pool.close() 

:

#!/bin/bash 

NB_PROCESS_PER_JOB=2 
NB_FILE_PER_JOB=3 
CPT=0 
BUF="" 
NUMJOB=1 

for i in "[email protected]"; do 
    BUF="$BUF '$i'" 
    ((CPT++)) 
    if ((CPT == NB_FILE_PER_JOB)); then 
     echo qsub -pe multithread $CPT -V -b yes -cwd -l h_vmem=10G -N jobname$NUMJOB -o grid_job.log -j yes "python worker.py $NB_PROCESS_PER_JOB $BUF" 
     BUF="" 
     CPT=0 
     ((NUMJOB++)) 
    fi 
done 
if [[ "$BUF" != "" ]]; then 
    echo qsub -pe multithread $CPT -V -b yes -cwd -l h_vmem=10G -N jobname$NUMJOB -o grid_job.log -j yes "python worker.py $NB_PROCESS_PER_JOB $BUF" 
fi 

파이썬 스크립트의 모습 : 이것은 병렬 환경에 제출하고 슬롯 번호 (-pe ENV_NAME NBSLOTS)을 지정하여 수행됩니다 파이썬 스크립트를 병렬 처리하지 말고 (-pe ENV_NAME NBSLOTS 인수를 제거하고 파이썬 스크립트에서 풀을 사용하지 않거나 하나의 프로세스 만 생성하도록하십시오). 간단한 SGE 작업은 다중 스레드로되어 있지 않습니다. 단순 작업이 다중 스레드 인 경우 예약되지 않은 자원을 사용하므로 다른 사용자 작업의 속도가 느려질 수 있습니다.

+0

도움 주신 의견을 보내 주셔서 감사합니다. 네, SGE 직무를 단순하게 유지하는 것이 더 낫다는 것에 동의합니다. 더 많은 병렬 처리가 필요하다면 파일 목록을 더 많은 덩어리로 나누고 더 많은 그리드 노드에 제출할 수 있습니다. 이 방법은 SGE 스케줄러에 더 친숙하다고 생각합니다. – galactica

+0

스케줄러에 더 친숙한 지 모르겠지만, SGE 클러스터의 다른 사용자에게는 더 친숙하지 않습니다. 리소스를 공유하는 작업이 줄어들 기 때문입니다. 또한 여러 SLOTS에게 요청하는 작업이 동일한 노드에서 작업해야하기 때문에 클러스터가 거의 가득 차면 다중 ​​스레드 작업을 제출하는 것보다 몇 가지 간단한 작업을 제출하여 여러 번 슬롯을 여러 번 얻을 수있는 기회가 더 많습니다 (MPI는 또 다른 이야기입니다 ...) . 데이터가 병렬 처리가 가능하기 때문에 문제가 쉽게 병렬화 될 수 있습니다. –