편집
552
번
편집 요약 없음 |
편집 요약 없음 |
||
1번째 줄: | 1번째 줄: | ||
본 문서에서는 HTCondor (HT: High Throughput) 를 사용하는 방법에 대해 다룹니다. HTCondor 가 기구축된 클러스터를 활용하는 사용자 측면에서 다룹니다. | 본 문서에서는 HTCondor (HT: High Throughput) 를 사용하는 방법에 대해 다룹니다. HTCondor 가 기구축된 클러스터를 활용하는 사용자 측면에서 다룹니다. HTCondor 는 한개 또는 한개 이상의 컴퓨터로 구성된 클러스터의 작업을 관리하는 프로그램으로서 CERN lxplus, NERSC 등 초대형 클러스터부터 kCMS, koALICE 나 각 연구실의 클러스터에서도 광범위하게 활용되고 있습니다. | ||
''다음과 같은 사전 지식이 필요합니다.'' | |||
* 컴퓨터 프로그램을 컴파일하여 실행파일을 만들수 있거나, ROOT 를 활용하여 매크로를 실행할 수 있을 것 | |||
* 파일 입출력 (txt, root 파일 무관) | |||
* 파일 실행 (Unix or Unix-like system 에서 bash 등 shell 을 통한) | |||
* Shell script 를 실행할 수 있을 것 | |||
* mv, cp | |||
* 상대 경로, 절대 경로 | |||
HTCondor 를 활용하여 프로그램을 병렬작동하기 위해서는 다음 과정을 따릅니다. | HTCondor 를 활용하여 프로그램을 병렬작동하기 위해서는 다음 과정을 따릅니다. | ||
178번째 줄: | 185번째 줄: | ||
=== 출력 파일 구분 === | === 출력 파일 구분 === | ||
'''구동하는 파일이나, 입력 파일을 노드에 복사'''한 경우 그 파일을 삭제하여야만 합니다. (그렇지 않으면 output file 로서 UI 머신에 카피됩니다.) 또는, 출력 파일명이 개별 작업별로 구별되지 않는 경우 그 파일명을 구별하기 위한 이름바꾸기를 해야합니다. 파일 삭제가 필요한 경우 rm -rf 를 쓰면 되고, 파일명 변경이 필요한 경우 mv 를 하면 됩니다. 다만, '''클러스터 노드의 폴더 측면에서 생각해야만 합니다.''' 상대 경로로 작업하는 것으로 생각하면 됩니다. | |||
== condor_submit == | == condor_submit == | ||
condor_submit | HTCondor 을 통한 작업을 진행하기 위해서는 condor_submit 를 통해 필요 사항을 전달해야합니다. 일반적으로는, condor_submit 에 맞는 [https://htcondor.readthedocs.io/en/latest/man-pages/condor_submit.html#submit-description-file-commands submit description file] 을 만들어 진행합니다. htcondor python api 를 통해 submit 하는 경우도 있습니다만, 일반적이지는 않습니다. | ||
=== 사전 작업 === | |||
* 출력 폴더 생성 및 위치 파악 | |||
** Log (Condor 작업 구동 로그), Output(Condor 작업 stdout 스트림), Error(Condor 작업 stderr 스트림) | |||
** output_destination (출력된 파일이 어디로 갈 지 경로) | |||
* 구동할 실행파일 파악 (Executable) | |||
=== | === 병렬화에 따른 queue 와 argument 구성 === | ||
=== | ==== 숫자로 병렬화한 경우 ==== | ||
=== ROOT 병렬화 === | ==== 이름으로 병렬화한 경우 ==== | ||
==== ROOT 병렬화 ==== | |||
=== 이외에 필요할 수 있는 설정 === | |||
getenv | |||
stream_output | |||
stream_error | |||
accounting_group | |||
=== 예시 === | |||
== 출력 파일 병합 == | |||
== 자동화 == | == 자동화 == | ||
HTCondor 에 필요한 여러 작업을 한번에 할 수 있도록, 다음과 같이 하나의 shell script 로 자동화할 수 있습니다.<syntaxhighlight lang="shell"> | |||
#! /bin/bash | |||
# USER DEFINED AREA | |||
WORKDIR=$(date +%y%m%d%H%M%S) | |||
ExeDir="/absolute/path/to/directory/executable/contained/" | |||
Executable="myexe.exe" | |||
NJOBQUUE=2000 | |||
######################################### | |||
# Make Directories | |||
mkdir -p $WORKDIR/log $WORKDIR/err $WORKDIR/out $WORKDIR/output | |||
######################################### | |||
# Make Merge Script | |||
cat <<EOF > $WORKDIR/merge | |||
#!/bin/bash | |||
echo "MERGING FILES IN " $(pwd)/$WORKDIR/output/*.root | |||
hadd merge.root $(pwd)/$WORKDIR/output/*.root | |||
EOF | |||
chmod 755 $WORKDIR/merge | |||
chmod +x $WORKDIR/merge | |||
######################################### | |||
# make condor.script | |||
cat <<EOF > condor.script | |||
Universe = vanilla | |||
Executable = ${ExeDir}${Executable} | |||
Log = ${WORKDIR}/log/\$(Cluster)_\$(ProcId).log | |||
Output = ${WORKDIR}/out/\$(Cluster)_\$(ProcId).log | |||
Error = ${WORKDIR}/err/\$(Cluster)_\$(ProcId).log | |||
should_transfer_files = YES | |||
when_to_transfer_output = ON_EXIT_OR_EVICT | |||
JobSuccessExitCode = 0 | |||
on_exit_remove = (ExitBySignal == False) && (ExitCode == 0) | |||
max_retries = 32 | |||
requirements = Machine =!= LastRemoteHost | |||
# Passing ProcID as argument -s for random seeding, -o for naming individial output file. | |||
arguments= -s \$(ProcID) -o ./result_\$(ProcId).root | |||
output_destination=file://${PWD}/${WORKDIR}/output/ | |||
getenv = true | |||
# Watch out to use stream; It needs I/O throughput | |||
# stream_output = true #default false | |||
# stream_error = true #default false | |||
Queue $NJOBQUUE | |||
EOF | |||
######################################### | |||
# Queue randseed from $INPUT_FILE | |||
cp condor.script ${WORKDIR}/condor.script | |||
condor_submit condor.script | |||
</syntaxhighlight> | |||
== 주의 사항 == | == 주의 사항 == |