2010-07-22 7 views
10

숫자를 생성하는 함수 (신경망 모델)가 있습니다. 내가 Torque와 표준 클러스터에서 PBS를 사용하여 파이썬에서 여러 매개 변수, 방법 및 다른 입력 (함수의 수백 실행 의미) 테스트하고 싶습니다.클러스터에서 파이썬과 PBS를 사용하여 "난처하게 평행 한"프로그래밍

참고 : 나는 parallelpython, ipython 등을 시도해 보았고 완전히 만족하지 못했다. 왜냐하면 나는 더 간단한 것을 원하기 때문이다. 클러스터는 내가 변경할 수없는 주어진 구성에 있으며, python + qsub를 통합하는 그러한 솔루션은 확실히 커뮤니티에 도움이 될 것입니다.

은 I와 같은 간단한 함수가 사물을 단순화 : input 입력을 나타내는 목적

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.name 문자열이며 do_lots_number_crunching는 시간 지속될 수있다.

내 질문은 : 같은 model 함수를 호출 할 때마다의 PBS 스크립트를 실행할 것 "무언가"에

for a in pylab.linspace(0., 1., 100): 
    model(input, a) 

과 같은 매개 변수의 검사 같은 것을 변형시키는 올바른 방법이?

#PBS -l ncpus=1 
#PBS -l mem=i1000mb 
#PBS -l cput=24:00:00 
#PBS -V 
cd /data/work/ 
python experiment_model.py 

나는 PBS 템플릿을 포함하고 파이썬 스크립트에서 호출하지만, 아직 그것을 알아낼 수없는 것 기능의 생각 (장식을?).

답변

4

pbs_python [1]이 작업 할 수 있습니다. experiment_model.py 경우 'A'인수로 당신이 할 수있는 [1]

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 

: 당신은 (내가 비슷한 설정을 위해 개발 된) 쉽게 jug를 사용하여이 작업을 수행 할 수 있습니다

3

https://oss.trac.surfsara.nl/pbs_python/wiki/TorqueUsage pbs_python.

당신은 파일에 쓸 것 (예를 들어, 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 jobs"를 실행할 수 있습니다 : 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 시스템을 사용하는 경우 잠금을 위해 파일 시스템을 사용하고 원하는 경우 파일 시스템을 사용합니다. 또한 작업 간의 종속성도 처리 할 수 ​​있습니다.

이것은 정확히 사용자가 요구 한 것이 아니지만 작업 대기열 시스템에서 이것을 분리하는 더 깨끗한 아키텍처라고 생각합니다.

2

저는 파티에 좀 늦은 것 같습니다.하지만 몇 년 전에 당황스럽게도 병렬 문제를 파이썬 클러스터에 매핑하는 방법과 동일한 질문을 던져 보았습니다.나는 최근에 여기 GitHub의에 업로드 : https://github.com/plediii/pbs_util

는 내가 처음이 포함 된 작업 디렉토리에 pbs_util.ini을 만들 것 pbs_util으로 프로그램을 작성하려면 다음

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

이 같은 파이썬 스크립트

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

방금 ​​클러스터 및 EP 응용 프로그램 작업을 시작했습니다. 내 목표 (필자는 도서관에있다)는 캠퍼스 내의 다른 연구원들이 HP 응용 프로그램 (특히 STEM 외부의 연구원)을 통해 HPC에 액세스 할 수 있도록 충분히 배울 수 있도록하는 것입니다. 나는 여전히 매우 새로운 것이지만이 질문이 PBS 스크립트에서 GNU Parallel의 사용을 지적하여 다양한 인수로 기본 파이썬 스크립트를 시작하는 데 도움이 될 것이라고 생각했습니다. .pbs 파일에서 지적하는 두 줄이 있습니다 : EP 슈퍼 컴퓨팅에 뉴비으로

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. 

은 아직 "병렬"다른 모든 옵션을 이해하지 못한다하더라도,이 명령에 저를 허용 파이썬 스크립트를 다른 매개 변수와 함께 실행합니다. 문제를 병렬화 할 미리 매개 변수 파일을 생성 할 수 있다면이 방법이 효과적입니다. 예를 들어, 매개 변수 공간에서 시뮬레이션을 실행합니다. 또는 동일한 코드로 많은 파일을 처리 할 수 ​​있습니다.