HTCondor 사용법
본 문서에서는 HTCondor (HT: High Throughput) 를 사용하는 방법에 대해 다룹니다. HTCondor 가 기구축된 클러스터를 활용하는 사용자 측면에서 다룹니다.
HTCondor 는 한개 또는 한개 이상의 컴퓨터로 구성된 클러스터의 작업을 관리하는 프로그램으로서 CERN lxplus 부터, NERSC 등 초대형 클러스터부터 kCMS, koALICE 나 각 연구실의 클러스터에서도 광범위하게 활용되고 있습니다.
HTCondor 를 활용하여 프로그램을 병렬작동하기 위해서는 다음 과정을 따릅니다.
- 프로그램이 여러개의 작업으로 쪼개어져 작동할 수 있도록 병렬화 합니다.
- 프로그램이 각 노드에서 작업될 수 있도록 작업 환경 구축 과정을 구상하고, 쉘 스크립트를 작성합니다.
- 필요한 폴더를 생성하고, 이동할 파일과 출력될 파일위치를 파악합니다.
- 필요한 파일을 이동하고 쉘 스크립트가 각 작업별로 작동한 후 결과 파일을 가져올 수 있도록 condor_submit 의 submit file 을 작성합니다.
이 과정은 대부분의 작업에 대해 명시적이며 거의 변동되지 않습니다. (병렬컴퓨팅에서는 거의 비슷합니다)
프로그램 병렬화
HTCondor 을 활용하여 작업을 할 구상을 한다면, 가장 먼저 해야할 것은 프로그램을 병렬작업에 맞게 튜닝하는 것입니다. 프로그램을 병렬화하는 것에는 크게 두가지로 나눌 수 있습니다.
이 과정은 아주 간단하게 말해서 (1) 모든 작업에 대해 입력과 출력이 구분될 수 있도록 하고 (2) 그에 맞는 입출력을 할 수 있도록 Program Argument 를 프로그램에 부여하는 것 입니다. 만약 무작위연산을 기반으로 한 연산이 있다면 (몬테카를로연산 등) 랜덤 시드를 외부에서 argument 로 부여할 수 있도록 세팅해야합니다. (시간시드 금지, 중요)
입출력 구분
Argument 부여
C++
int main(int argc, char** argv) { … }
-c, -v, --version 등 위치 기반이 아닌 문자옵션 기반 구성은 getopt, getopt_long, getopt_long_only 검색하여 활용 (한국어 자료 많음, #include <unistd.h>)
python
import sys
# argc can be called via sys.argc
# argv can be called via sys.argv
python 도 getopt 활용 가능 (import getopt, 활용방법은 별도 검색)
작업 과정 구상
각 노드의 운영체제와 접근할 수 있는 스토리지(라이브러리)에 따라 작업 과정 구상이 다릅니다. 작업 과정을 구상하지 않고 바로 condor_submit 을 하는 과정으로 넘어갈 수도 있습니다. (작업 과정에 대한 구상이 필요없는 경우가 더 많습니다.)
본 과정은 하나의 실행파일로 작업을 정의할 수 없는 경우, (여러 과정의 실행이 필요한 경우) 그를 하나의 실행 파일을 실행하는 것으로 묶는 과정으로, 보통 Shell Script 하나를 만듦으로써 끝나게 됩니다. 마지막의 "하나의 실행파일" 은 python 스크립트가 될 수도 있습니다만, 본 과정에서는 Shell Script 로 다룹니다.
작업과정 구상을 하는 경우
작업 과정을 구상하는 경우는 다음과 같습니다.
- 작업환경 구성을 해야하는 경우
- 한개의 실행파일(executable)로 작업이 끝나지 않는 경우
- 프로그램이 자주 액세스하는 파일을 먼저 노드에 복사하는 경우
작업 환경 구성을 해야만 하는 경우
다음과 같은 경우 개별 노드에서 작업환경을 구성해야하며, 보통 새로 프로그램을 빌드해야만 합니다. 보통 잘 구성된 클러스터는, 이럴 일이 잘 없습니다.
- UI 기기(condor_submit을 하는 클러스터의 머신, 일반적으로 1차접속단)의 OS 가 개별 노드와 다른 경우
- 프로그램에서 호출하는 라이브러리의 경로를 각 노드에서 호출할 수 없는 경우 (동일한 스토리지 시스템이 마운트되지 않은 경우)
위 상황 이외에도 작업환경을 노드별로 구축해야하는 경우가 발생할 수 있으나, 이는 이를 아는 것은 매우 경험적인 부분입니다. (비명시적일 경우가 더 많습니다)
한개의 실행파일로 작업이 끝나지 않는 경우
여러 실행파일의 연속적 실행으로 작업을 해야하는 경우가 있습니다. 이 경우 또한 작업과정 구상을 따로 해야합니다.
파일을 노드에 복사하는 경우
일반적으로, 공통마운트 스토리지가 있어서 이에 액세스하면 되지만 네트워크 스토리지는 인트라넷 속도를 지속적으로 소모하여 전체 노드의 속도를 줄일 수 있습니다. 최초 1회 노드로 복사하여 내부에서 접근함으로서 이를 방지할 수 있습니다.
Argument Pass-Through
#!/bin/bash
condor_submit
condor_submit 은
숫자로 병렬화한 경우
이름으로 병렬화한 경우
ROOT 병렬화
자동화
주의 사항
예시
참고: https://gist.github.com/Isaac-Kwon/c062ba4abee8bebf2f64f95ea52e2068