본문 바로가기

Gate

sh script를 이용한 Gate의 효율적인 병렬 구동 ( wo condor)

반응형

2020년 최근 Gate의 버전은 9.0입니다. 사실 전 이전 버전의 Gate를 이용할 때도 9.0 버전 Gate에서는 병렬 처리가 될 것이라고 기대했습니다. 이유는 Geant4의 설치 옵션에 병렬 처리가 생겼습니다. 그래서 Gate에서도 지원되겠구나 했으나 9.0이 발표되고, 설치하면서 실망했습니다. Geant4의 병렬 처리 옵션을 킬 경우 아예 Gate 설치가 안되거든요.

그래서 이전에 know-how 문서로 만들었던 sh script를 이용한 Gate 병렬처리 내용을 포스팅합니다. 

우선, 최근 Gate 커뮤니티에서는 저같이 쉘 스크립트를 이용한 병렬처리 보다 condor와 같은 툴킷을 이용하는 게 대세로 보이고, 제가 보기에도 그쪽이 더 쉬울 것입니다. (설치 방법) 혹시 본인의 환경이 다수의 유저가 프로세서의 점유를 두고 경쟁하는 공용 시스템 이라면, condor를 사용하시길 추천드립니다. 그렇지 않고 한정된 유저만 사용하는 환경이라서 경쟁이 필요 없다면, 이 글과 같은 방법을 사용하시는 것도 좋은 설루션 일 것이라고 생각합니다.

현재 버전의 Gate는 병렬 처리가 되지 않기 때문에 코어가 2개 이상인 컴퓨팅 환경에서 구동 시켜도, 코어 하나를 이용해서 프로그램을 구동시킵니다. 이를 보완하기 위해 condor 같은 툴을 이용하긴 하지만 gjs와 gjm을 이용해서 condor 병렬 처리를 수행하면 굳이 필요 없는 파일들이 많이 요구됩니다. 그게 아닐 경우 코어수만큼 터미널을 열어 구동시키거나 백그라운드 실행을 합니다.

하지만 최신 컴퓨팅 기종은 16코어 이상의 코어수를 가지고 있어서 이런 식의 프로세스 관리는 번거롭습니다. 그래서 sh script를 이용한  병렬 처리 프로세스를 추천드립니다.

본 포스팅에서는 4개의 코어를 하이퍼 스레딩 하여, 8개의 프로세스를 동시 수행할 수 있는 intel cpu를 이용하는 환경에서 제작되었습니다. 이런 경우 원하는 Gate 코드를 8개로 나누어 구동시키면 되겠죠. 하지만 저는 32, 64 개 이상으로 나누어 줍니다. 그 이유는 첫 번째로 제가 실수했을 경우를 대비하는 것입니다. 시뮬레이션을 전부다 구동시킨 후에 코드가 잘못 되었다면, 그동안 소요되는 시간과 컴퓨팅 자원등이 낭비 됩니다. 이런 의미 없는 낭비는 줄여야 겠죠. 두번째는 분석의 용이성 때문입니다. 장시간 구동 시킨 시뮬레이션 결과는 크기도 크기 때문에 데이터 분석도 오래 걸리고 결과 파일 자체의 크기도 커집니다. 그에 비해 작게 분리해서 구동 시킨 결과는 데이터 분석이 쉽고, 만약 데이터 량이 부족하다면 여러 결과를 합쳐주면 됩니다. 따라서 전 코어수의 4배 에서 심하게는 몇 백개의 수준으로 시뮬레이션을 나누어 구동시킵니다.

예제로 쓸 Gate 코드는 이전 포스팅에서 이용된 코드로 아래 코드와 같습니다. 만약 Gate의 파라미터 설정법을 아직 배우지 못하셨다면, 해당 포스팅(하단 링크)을 참고하시기 바랍니다.

2020/09/24 - [Gate] - Gate 구동시 파라미터 설정

 

Gate 구동시 파라미터 설정

Gate 시뮬레이션 툴은 병렬처리가 되지 않습니다. (2020년 기준) 그로 인해 쉘 스크립트를 이용해서  강제로 병렬처리를 해야 할 수도 있고 ( 이건 향후 포스팅 예정) 설정을 약간씩만 바꾸어서 같�

sbinroom.tistory.com

그럼 이제 위 Gate 매크로를 sh script를 이용해서 병렬 구동해야겠죠. 먼저 터미널에서의 구동 명령어는 아래와 같습니다. 세부 설명은 위에 링크된 포스트를 참고해 주세요.

Gate -a [detectorFileName,/home/sbin550/detectorFile.mac][phantomFileName,/home/sbin550/phantomFileName][outputFileName,/home/sbin550/SPECT_result] /home/sbin550/S_SPECT.mac

전 보통 위 코드를 연속 구동하는 script1과 script1을 코어 수만큼 연속 구동하는 script2를 만들어 구동시킵니다. 먼저 코드를 연속 구동하는 script1 입니다. 위 매크로를 총 40회 구동 시킵니다.  같은 매크로를 수회 구동 시 반드시 주의해야 할 것은 결과물입니다. 만약 결과 출력 파일명을 동일하게 하면, 이전의 시뮬레이션 결과를 덮어쓰게 됩니다. 아래 script 구문에서는 변수 i를 이용해서 결과물에 세 자리 숫자를 붙여 중복을 방지합니다. 

for i in $(seq $1 8 9)
do
    Gate -a [detectorFileName,/home/sbin550/GATE/PinholeCollimator_AA45.Ver82_diam0.45.mac][phantomFileName,/home/sbin550/GATE/LR_Derenzo_dose_1000.mac][outputFileName,/home/sbin550/GATE/S_SPECT2/00${i}] /home/sbin550/GATE/S_SPECT_v2.mac
done
for i in $(seq $2 8 99)
do
    Gate -a [detectorFileName,/home/sbin550/GATE/PinholeCollimator_AA45.Ver82_diam0.45.mac][phantomFileName,/home/sbin550/GATE/LR_Derenzo_dose_1000.mac][outputFileName,/home/sbin550/GATE/S_SPECT2/0${i}] /home/sbin550/GATE/S_SPECT_v2.mac
done
for i in $(seq $3 8 319)
do
    Gate -a [detectorFileName,/home/sbin550/GATE/PinholeCollimator_AA45.Ver82_diam0.45.mac][phantomFileName,/home/sbin550/GATE/LR_Derenzo_dose_1000.mac][outputFileName,/home/sbin550/GATE/S_SPECT2/${i}] /home/sbin550/GATE/S_SPECT_v2.mac
done

상기 script는 세 개의 for 루프문으로 만들어져 있습니다. 이유는 파일명 때문이죠. 일반적으로 파일을 보여 줄때 정렬순에따라 2보다 1X 나 1XX과 같은 파일명을 가진 파일이 더 위로 정렬 됩니다. 아무래도 구동 순서대로 정렬되는게 관리에 이롭기 때문에 세자리 숫자로 저장할 경우 2는 002로 변경합니다. 스크립트 명령어 상에서 해당 포맷을 만드는 방법을 몰라서 그냥 세개의 for 루프로 해결하고 있습니다. (만약 아시는 분은 댓글로 알려주세요. )

sh script에서 for문은 다양한 방식이 있으나 상기 방식이 가장 좋습니다. ( 다른 for문은 sh의 버전이나 종류에 따라 구동이 안되기도 합니다.) 변수명 var를 start로 시작해 inc 씩 증가시키며 end까지 loof를 구동합니다. script 상에서 $숫자 의 경우 해당 script를 구동시킬 때 파라미터로 입력받는 순서입니다.

for var in $(seq start inc end)
do
	loof
done

각 루프는 변수 i를 증가시키며 구동됩니다. 증가량은 동시 구동 가능 프로세스 개수인 8로 설정되어 있죠. 지정된 i는 outputFileName 파라미터에서 이용됩니다. 변수를 script 상에서 이용할 때는 $를 붙여 주게 됩니다. 에러를 최소화하기 위해 {}로 정확한 변수명을 지정하는 게 좋습니다. 

다음으로 script2입니다. 여기선 당연히 프로세스의 수만큼 script1을 구동시킵니다. 다수를 프로세스를 구동시켜야 하니 백그라운드에서 구동되어야 하니 nohup을 이용합니다. 구동 시 잊지 말고 script1의 변수 3개를 지정해 줍니다. nohup 사용법은 이전 포스팅을 참조해 주세요.

nohup sh script1.sh 0 16 104 &
nohup sh script1.sh 1 17 105 &
nohup sh script1.sh 2 10 106 &
nohup sh script1.sh 3 11 107 &
nohup sh script1.sh 4 12 100 &
nohup sh script1.sh 5 13 101 &
nohup sh script1.sh 6 14 102 &
nohup sh script1.sh 7 15 103 &

2020/09/22 - [ubuntu] - nohup 사용법 ( 터미널 로그아웃 후 프로세스 실행 유지 )

 

nohup 사용법 ( 터미널 로그아웃 후 프로세스 실행 유지 )

대부분은 nohup의 목적을 알고 오셨으리라 생각해서 사용 방법부터 간단히 짚어 드린 뒤 자세한 설명을 하겠습니다. nohup [command] > [output file name] & [command]에는 보통 스크립트의 구동 명령이 들어 �

sbinroom.tistory.com

해당 스크립트를 구동시킬 때도 nohup을 이용합니다. 명령어는 당연히 아래와 같습니다.

nohup sh script2.sh &

이렇게 만들어진 스크립트는 0부터 320까지 321개의 시뮬레이션을 8개씩 구동합니다. 

반응형