parallel programming

How to make multi-thread support galaxy cluster using grid engine and DRMAA

hongiiv 2013. 12. 9. 08:32
반응형
1개의 마스터 노드와 2개의 worker 노드로 구성된 클러스터를 qhost 명령을 통해 현재 노드들의 상태를 확인 할 수 있습니다. 각 노드당 CPU의 갯수(NCPU)는 4개이며 노드당 메모리는 7.8G(MEMTOT)임을 확인 할 수 있습니다.
root@biomaster:/BIO# qhost

HOSTNAME ARCH NCPU LOAD MEMTOT MEMUSE SWAPTO SWAPUS

-------------------------------------------------------------------------------

global - - - - - - -

bioworker1 linux-x64 4 0.01 7.8G 174.4M 929.0M 8.1M

bioworker2 linux-x64 4 0.01 7.8G 170.4M 929.0M 7.7M

다음으로 모든 큐(queue)의 리스트를 확인해보면 기본적으로 all.q가 생성되어 있는 것을 확인 할 수 있습니다. 

root@biomaster:/BIO# qconf -sql

all.q
root@biomaster:/BIO# qconf -sq all.q

문제는 해당 큐에 job을 할당하는 경우 노드의 1개의 cpu에 job을 할당하게 된다는 것입니다. 따라서 멀티쓰레드를 사용하는 job의 경우에는 문제가 발생할 수 있습니다. 예를 들어 BWA를 실행하는 경우  -t 옵션을 통해 사용할 쓰레드의 갯수를 지정할 수 있습니다. 위의 노드는 총 4개의  CPU로 구성되어 있기 때문에 -t 4 옵션을 주어  BWA를 실행하는 경우 한 노드의 자원을 BWA가 모두 점유하게 됩니다. 그러나 grid engine은 별도의 쓰레드에 대한 내용을 지정하지 않았기 때문에 노드의 cpu를 1개만 사용한다고 인지하고 있습니다만 실제는 4개를 모두 사용하고 있는 상태죠. 

자. 그럼 어떻게 해결해야 하는가 하는 것을 보여드리겠습니다.
grid engine에게 현재 제출하는 job은 쓰레드 4개를 사용하는 병렬환경의 job임을 알려주면 됩니다. spl 옵션을 주면 다음과 같이 현재 정의된 병렬 환경(parallel environments)을 보여줍니다.

root@biomaster:/BIO# qconf -spl

make

자. make라는  환경은 어떻게 구성되어 있는지 자세히 살펴보면, allocation_rule 부분에 $round_robin이라고 적혀 있다. 이부분은 job slot들을 어떻게 host들에게 배분할 것인지를 정의하는 부분으로 $round_robin의 경우 하나의 호스트에 하나의 slot을 배분한다. 즉, 노드가 4개이며 총 4개의 slot을 할당해야 한다면  노드당 1개의 slot을 할당하게 된다. 노드가 분산되므로 multi-thread job이 아닌 병렬의 MPI나 PVM의 job을 할당하는데 사용된다. 우리는 하나의 노드에 모든  slot이 할당(즉, multi-thread가 되도록)되도록 해야하기 때문에 이부분을 $pe_slots(모든 job slot을 하나의 machine에 할당)으로 변경한다. parallel 환경을 수정하려면 -mp 옵션을 주어 변경한다.

root@biomaster:/BIO# qconf -sp make
pe_name make
slots 999
user_lists NONE
xuser_lists NONE
start_proc_args NONE
stop_proc_args NONE
allocation_rule $pe_slots
control_slaves TRUE
job_is_first_task FALSE
urgency_slots min
accounting_summary TRUE
root@biomaster:/BIO# qconf -mp make

이제 병렬 실행을 구성할 수 있는 환경설정을 마쳤다. 이제 BWA job을 thread 4개로 스케줄러에 할당하고자 하는 경우에는 다음과 같이 qsub을 통해 job을 제출한다.

root@biomaster:/BIO# qsub -pe make 4 bwa_thread.sh

Galaxy에서도 각 툴을 실행할때마다 서로 다른 옵션의 병렬환경을 qsub을 통해 전달되도록 설정해야 한다. galaxy의 각 툴은 wrapper로 둘러싸여 있는데  BWA의 경우에는  bwa_wrapper.xml라는 파일을 보면 command 태그내에 --threads="4" 라고 강제로 thread 갯수 옵션이 지정되어 있다.

이제부터 galaxy에게 bwa 작업을 수행하는 경우 "-pe make 4" 옵션을 통해서 실행하도록 한다. galaxy에서 각 툴을 실행하는 방법 중 스케줄러가 DRMAA(Distributed Resource Management Application API)를 Open Grid Scheduler를 사용하도록 설정되어 있다.

Galaxy의 설정 파일인 universe_wsgi.ini 파일을 통해서 "[galaxy:tool_runners]" 섹션에 각 툴을 실행할 수 있는 runner를 설정한다.

[galaxy:tool_runners] biomart = local:///
encode_db1 = local:///
hbvar = local:///
microbial_import1 = local:///
ucsc_table_direct1 = local:///
ucsc_table_direct_archaea1 = local:///
ucsc_table_direct_test1 = local:///
upload1 = local:///
bwa_wrapper = drmaa://-pe make 4/
tophat = drmaa://-pe make 4/
gatk_unified_genotyper = drmaa://-pe make 4/
cuffmerge = drmaa://-pe make 4/

이제부터 bwa를 비롯한 tophat, gatk, cuffmerge등 multi-thread를 사용하는 툴들은 qsub 실행시  병렬환경을 통해서 실행되게 된다. 아래와 같이 tophat을 실행하면 bioworker1과 bioworker2에 각각 slot이 4개씩 할당되어 돌아가는 것을 확인할 수 있다.



끝.

참고 
Configuring a New Parallel Environment
Open Grid Scheduler/Grid Engine 
DRMAA working group (open grid forum)

반응형