기본절차
프로그램을 실행하는 코드의 계산이 많은 경우 서버의 클러스터를 이용하면 수월하다. 서버 클러스터를 이용하기 위해서는 먼저 클러스터의 master에 대한 계정이 필요하다. 클러스터 계정 생성을 하려면 연구실 구성원에게 문의하여 생성하도록 하자. 계정 생성이 완료되었으면 자신의 계정으로, 클러스터에 SSH 접속을 한다.
ssh your_account@clusterip
your_account에 자신의 계정, clusterip에 클러스터 IP를 입력한다. 패스워드를 입력하면 클러스터의 bash로 접속이 될 것이다. 아래와 같이 변경되면 성공적으로 로그인이 된 것이다.
[your_account@master ~]$
- ※ 클러스터 IP는 보안적인 문제로 공개하지 않습니다.
- ※ 클러스터는 외부 접속을 차단하므로 연구실에서만 이용할 수 있습니다.
클러스터 스크립트 작성
클러스터는 기본적으로 쉘 스크립트를 작성하고 이것을 실행하는 명령을 내림으로 시작된다. 기본적인 형태의 예제 스크립트는 아래와 같이 작성할 수 있다.
[your_account@master ~]$ vi test.sh
- test.sh
#!/bin/sh #PBS -N my-python-code #PBS -l nodes=1:ppn=4 #PBS -q g4 cd #PBS_O_WORKDIR python3 code.py
위의 코드는,
- 'my-python-code' 라고 job의 이름을 설정
- '하나의 노드 (nodes), 프로세서 (ppn) 4개에 할당'
- 'G4 GN에 할당'
- 그리고 스크립트가 실행할 디렉토리로 이동
- code.py를 python3로 실행
으로 해석된다. 이 때 주의할 점은 '#PBS'의 #은 주석이 아니기 때문에 반드시 '#PBS'로 입력하고 명령어를 입력해야 한다. 'cd #PBS_O_WORKDIR'의 경우, qsub를 실행할 위치로 이동해주는 것이므로, 만약 하위코드에서 절대경로가 아닌, '상대경로'를 입력한 경우 이 명령어를 넣지 않으면 스크립트가 오작동 할 수 있다.
사용가능 명령어
작업 실행
원하는대로 스크립트를 작성했으면, 클러스터에 작업을 실행시켜보자. test.sh 를 작업하는 명령은 아래와 같이 입력한다.
[your_account@master ~]$ qsub test.sh
입력하고 나면 'xxxxxx.master.hpc' (x는 할당된 작업번호) 로 echo 된다. 이는 xxxxxx 라는 번호로 할당이 되었다는 것이다.
작업 보기
클러스터가 실행하고 있는 작업을 보는 명령어는
- 현재 클러스터에서 실행중인 작업 보기
- 클러스터의 모든 노드의 상태 보기
- 현재 실행중인 작업과 클러스터의 자원상태 보기
가 있다. 첫 번째로 현재 클러스터에서 실행중인 작업을 보는 명령어는 qstat 이다. 명령어를 입력하면 아래와 같이 나타난다.
[your_account@master ~]$ qstat Job ID Name User Time Use S Queue ------------------------- ---------------- --------------- -------- - ----- xxxxxx.master my-python-code your_account 00:00:00 R g4
Job ID는 qsub 명령어를 입력했을 때 나타난 작업의 번호, Name에 스크립트에 입력했던 이름, User에 계정 이름, Time Use에 실행한 시간, S에는 상태, Queue 에는 할당한 GN이다. 이 때 S가 상태에 따라 나타나는 이니셜이 다르며 보통 아래와 같이 나타난다.
- R: Run. 작업 진행중.
- C: Completed. 작업 종료됨. (정상적으로 작업을 끝낸 경우)
- E: Exit. 작업 나감. (일반적으로 모든 작업 강제 종료시 나타나는 상태)
- Q: Queue. 대기. (모든 노드에서 작업이 실행중이여서 대기하는 중)
- W: Wait. 시간 대기. (qsub 명령어에서 -A 옵션으로 작업 실행 대기중)
- H: Hold. (작업 중간에 잠시 일시정지 하는 경우)
두 번째로 모든 노드의 상태를 보는 명령어는 pestat 이다. 명령어를 입력하면 아래와 같이 나타난다.
[your_account@master ~]$ pestat Node GN state load pmem ncpu mem resi usrs tasks NetMbit jobids/users x001.hpc g1 free 0 15984 4 15984 319 0/0 0 0 x002.hpc g1 free 0 15984 4 15984 286 0/0 0 0 ... x012.hpc g1 free 0 15984 4 15984 301 0/0 0 0 x013.hpc g1 free 0 15984 4 15984 317 0/0 0 0 x014.hpc g2 free 0 15733 4 15733 299 0/0 0 0 x015.hpc g2 free 0 15733 4 15733 295 0/0 0 0 ... x021.hpc g2 free 0 15733 4 15733 297 0/0 0 0 x022.hpc g2 free 0 15733 4 15733 332 0/0 0 0 x023.hpc g3 free 0 15637 4 15637 222 0/0 0 0 x024.hpc g3 free 0 15637 4 15637 221 0/0 0 0 x025.hpc g4 excl 1 15953 4 15953 225 1/1 1 0 xxxxxx your_account x026.hpc g4 free 0 15953 4 15953 221 0/0 0 0 ... x039.hpc g4 free 0 15953 4 15953 221 0/0 0 0 x040.hpc g4 free 0 15953 4 15953 221 0/0 0 0
GN을 g4로 선택하였기 때문에, g4로 시작하는 x025.hpc 노드에 작업이 할당된 것을 볼 수 있다. 또한 test.sh에서 4개의 cpu로 계산을 실행했기 때문에, 다른 작업을 g4에 할당하는 경우, x026.hpc로 작업이 할당된다. 만약에 스크립트 파일에서 1개의 cpu로 계산을 실행하게 되면, x025.hpc에 다른 작업명으로 또 할당되게 된다.
세 번째로 현재 실행중인 작업과 클러스터의 자원상태를 보는 명령어는 showq 이다.
[your_account@master ~]$ showq ACTIVE JOBS-------------------- JOBNAME USERNAME STATE PROC REMAINING STARTTIME xxxxxx your_account Running 4 99:22:52:31 Mon Jun 7 18:00:00 1 Active Jobs 4 of 96 Processors Active (4.17%) 1 of 24 Nodes Active (4.17%) IDLE JOBS---------------------- JOBNAME USERNAME STATE PROC WCLIMIT QUEUETIME BLOCKED JOBS---------------- JOBNAME USERNAME STATE PROC WCLIMIT QUEUETIME Total Jobs: 1 Active Jobs: 1 Idle Jobs: 0 Blocked Jobs: 0
앞의 명령어들과의 차이점은, 자신이 작업을 언제 실행시켰는지, 컴퓨터의 남은 자원은 얼마나 있는지 알 수 있다는 것이다.
작업 종료
코드가 제대로 실행되지 않거나 또는 중간에 작업을 중단해야 할 경우가 있다. 이 경우에는 qdel '작업번호' 를 입력하면 작업이 중단된다. 예를들어 작업번호 xxxxxx의 작업을 중단하려면
[your_account@master ~]$ qdel xxxxxx
를 입력해주면 된다. 그리고 자신이 할당한 모든 작업을 중단하는 경우,
[your_account@master ~]$ qselect -u your_account | xargs qdel
을 입력하면 된다.