2020년 4월 8일 수요일

LSF 관련 Q&A : job의 suspend - resume, 방화벽 환경에서 뚫어놓아야 할 port들


Q1.  GPU를 사용하는 job의 경우에도 job을 suspend - resume하는 것이 가능한지요 ?

: LSF에서는 훨씬 더 긴급하고 중요한 job B가 생겼는데 이미 수행 중인 기존 job A가 자원을 다 쓰고 있어서 당장 가용한 자원이 없을 경우, 이미 RUNNING 상태로 수행 중인 기존 job A를 잠시 suspend 시키고, 그렇게 풀려난 자원을 이용하여 긴급하고 중요한 job B를 수행시킨 뒤, 그것이 다 끝나면 suspend 되었던 기존 job A를 다시 resume 할 수 있다고 들었습니다.  이것은 CPU 상에서 job이 수행될 때의 이야기일텐데, GPU 상에서 수행되는 job에 대해서도 suspend-resume이 잘 수행되는지요 ?

A1.  가능합니다만 tensorflow와 같은 deep learning training job에 대해서는 현실적인 효용성이 떨어집니다.   

: 이미 알고 계시는 것처럼 bkill 명령은 이미 submit 되어 수행 중인 LSF job을 글자 그대로 kill 하는 것이지만, bstop 명령은 중단시키는 것이 아니라 suspend 시키는 명령입니다.   (좀더 정확하게 말하자면 사용 옵션에 따라 bkill도 suspend를 시킬 수는 있습니다.)   그렇게 suspend 된 job은 나중에 bresume 명령 (또는 bkill -s CONT 명령)으로 resume할 수 있습니다.
다만, 이때 suspend된 job은 CPU 자원만 release할 뿐이고, memory 상에 올라가 있는 기존 process의 영역을 지우지는 않습니다.  따라서, bstop - bresume 명령을 통해 잠시 suspend 시킨 뒤에 나중에 다시 resume하기 위해서는 서버에 충분한 free memory 용량이 있어야 합니다.  대개의 경우 HPC cluster node들에는 큰 용량의 RAM이 장착되어 있으므로 CPU job에서는 bstop - bresume 명령을 통한 일시 중단 및 재개가 잘 됩니다.

그러나 GPU 상에서는 이야기가 좀더 복잡합니다.  GPU 상에서 돌아가는 deep learning application, 가령 tensorflow를 사용하는 python의 경우 효율적인 training을 위해 GPU 상에 존재하는 모든 GPU memory를 다 써버리는 경우가 대부분입니다.  이렇게 tensorflow를 이용한 python process에 대해서도 bstop 명령을 날리면 해당 procecss가 kill 되지는 않고 suspend되는데, 그때 tensorflow가 사용하던 메모리는 그대로 모두 사용된 채로 남아 있게 됩니다.  즉, nvidia-smi 등의 명령으로 GPU 사용량을 확인해보면 GPU compute %는 0%지만 해당 GPU를 여전히 tensorflow python이 쥐고 있고 특히 GPU memory 사용량도 거의 100% 다 사용 중인 것으로 나오는 것을 보실 수 있습니다.

그런 경우에도 suspend - resume이 가능하기는 합니다만, 애초에 그렇게 수행 중이던 job을 suspend 시키는 이유가 더 급한 다른 job을 수행하기 위함인데 정작 그 상태에서는 다른 job을 수행시킬 수가 없습니다.  새로 수행되는 job이 사용할 available GPU memory가 없는 것으로 나올테니까요.  물론 caffe나 h2o 등과 같이, GPU memory를 전체 다 사용해버리지 않고 필요한 만큼만 점거하는 application의 경우, CPU에서와 같이 bstop - bresume 명령을 통해 잠시 suspend 시켜놓고 더 중요한 다른 job을 수행하는 것이 가능합니다.


Q2.  LSF가 정상적인 동작을 하기 위해서 사용하는 network port들은 어떤 것들이 있는지요 ?

: 방화벽이 구현되어 있는 네트워크 환경에서 LSF를 구성해서 사용하려고 해보니 잘 되지 않습니다.  아마 LSF가 필요로 하는 network port가 방화벽에 막혀 있어서 그런 것 같은데, ssh에 필요한 22번 외에 어떤 port들을 뚫어놓아야 하는지요 ?

A2.  LSF 운용에 필요한 기본 network port들은 아래와 같이 확인하실 수 있습니다. 

$ cd $EGO_TOP/conf

$ grep PORT lsf.conf
LSF_LIM_PORT=7869
LSF_RES_PORT=6878
LSB_MBD_PORT=6881
LSB_SBD_PORT=6882
LSB_QUERY_PORT=6891

단, LSF_LIM_PORT=7869 은 tcp/udp 둘 다 뚫어놓아야 하고, 나머지는 모두 tcp 입니다.  이에 대해서는 아래 URL을 참조하시기 바랍니다.

https://www.ibm.com/support/pages/configure-firewall-ports-lsf-master-platform-rtm-monitoring
https://www.ibm.com/support/pages/purpose-different-lsf-ports

2020년 4월 7일 화요일

du와 df가 서로 다른 사용량을 보여주는 경우에 대한 설명


du (disk usage)와 df (disk free)에서 측정하는 filesystem의 사용률/사용량에 차이가 발생하는 경우가 많습니다.   이는 du는 fsstat을 이용하고 df는 statfs를 이용하기 때문입니다.  즉, df는 filesystem level에서의 metadata 값을 보기 때문에, 어떤 파일을 지우더라도 만약 어떤 process에서 어떤 방법으로든 아직 그 파일을 쥐고 있다면, disk를 아직 그 파일이 차지하고 있는 것으로 보입니다.

가장 대표적인 케이스가 아래와 같이 tail -f 등으로 파일을 read하고 있는 경우입니다.

먼저, /에 12G가 차있고 실제로 12G의 파일들이 있다는 것을 확인합니다.

bash-4.2# cd /

bash-4.2# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        94G   12G   78G  14% /

bash-4.2# du -sh .
12G     .

다음으로 1G짜리 파일을 하나 만듭니다.

bash-4.2# dd if=/dev/zero of=/home/cecuser/111 bs=1024k count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 0.324121 s, 3.2 GB/s

그 다음에 다시 df와 du로 크기를 확인합니다.

bash-4.2# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        94G   13G   77G  15% /

bash-4.2# du -sh .
13G     .

이제 이렇게 만들어진 111이라는 파일에 tail -f 를 백그라운드로 걸어 read를 하도록 합니다.

bash-4.2# tail -f /home/cecuser/111 &
[1] 8624

그리고 111을 삭제합니다.  

bash-4.2# rm /home/cecuser/111

그래도 아까 백그라운드로 걸었던 tail -f 는 아직 살아있음을 보실 수 있습니다.  즉, 111 파일은 아직 열려 있습니다.

bash-4.2# jobs
[1]+  Running                 tail -f /home/cecuser/111 &

이제 df와 du로 filesystem의 사용량을 확인합니다.

bash-4.2# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        94G   13G   77G  15% /

bash-4.2# du -sh .
12G     .

즉, 여전히 df로는 13G 사용 중인 것으로 나오지만 du는 12G로 줄어든 것을 정확하게 보여줍니다.

이제 아까 걸어둔 tail -f를 kill 하겠습니다.

bash-4.2# jobs
[1]+  Running                 tail -f /home/cecuser/111 &

bash-4.2# kill %1
bash-4.2#
[1]+  Terminated              tail -f /home/cecuser/111


그러면 이제 df도 제대로 된 값인 12G를 보여줍니다.

bash-4.2# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        94G   12G   78G  14% /

bash-4.2# du -sh .
12G     .


2020년 4월 6일 월요일

LSF Data Manager의 사용법 - 간단한 example과 함께


LSF HPC Suite의 좋은 점 중 하나는 LSF Data Manager가 포함되어 있다는 것입니다.  바로 전 posting에서 올린 방법대로 ansible-playbook으로 설치하면 LSF Data Manager도 자동으로 설치됩니다.

LSF Data Manager와 관련한 설정 파일들은 아래와 같은 것들이 있습니다.  기본적으로는 별도로 수정할 필요는 없습니다만, 딱 하나, lsf.datamanager.<cluster_name> 파일에서 STAGING_AREA는 cluster 내의 모든 서버들이 access 할 수 있는 NFS나 GPFS로 바꾸어주셔야 합니다.

[cecuser@p628-kvm1 ~]$ sudo vi /opt/ibm/lsfsuite/lsf/conf/lsbatch/myCluster/configdir/lsb.queues
...
Begin Queue
QUEUE_NAME    = dataq
PRIORITY      = 33
DATA_TRANSFER = Y
HOSTS         = p628-kvm1
End Queue

[cecuser@p628-kvm1 ~]$ sudo vi /opt/ibm/lsfsuite/lsf/conf/lsf.conf
...
LSB_RESOURCE_ENFORCE="memory cpu gpu"
LSF_DATA_PORT=9998
LSF_DATA_HOSTS="p628-kvm1"
LSF_SERVER_HOSTS="p628-kvm1"
LSF_GPU_AUTOCONFIG=Y
LSB_GPU_NEW_SYNTAX=extend

[cecuser@p628-kvm1 ~]$ sudo vi /opt/ibm/lsfsuite/lsf/conf/lsf.datamanager.myCluster
...
Begin Parameters
ADMINS = lsfadmin
#STAGING_AREA = /opt/ibm/lsfsuite/lsf/work/myCluster/staging
STAGING_AREA = /home/staging
# CACHE_INPUT_GRACE_PERIOD = 1440
# CACHE_OUTPUT_GRACE_PERIOD = 180
# CACHE_PERMISSIONS = user
# QUERY_NTHREADS = 4
# REMOTE_CACHE_REFRESH_INTERVAL = 15
End Parameters

위에서 지정된 /home/staging은 아래와 같이 NFS export된 directory로서, 아래와 같이 p628-kvm2,3 서버에도 같은 이름으로 mount 되어 있습니다.

[cecuser@p628-kvm1 ~]$ cat /etc/exports
/home/staging        p628-kvm2(rw,sync,no_subtree_check) p628-kvm3(rw,sync,no_subtree_check)

[cecuser@p628-kvm2 ~]$ df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/vda2                 94G  9.2G   81G  11% /
devtmpfs                  16G     0   16G   0% /dev
tmpfs                     16G     0   16G   0% /dev/shm
tmpfs                     16G   32M   16G   1% /run
tmpfs                     16G     0   16G   0% /sys/fs/cgroup
tmpfs                    3.2G     0  3.2G   0% /run/user/1000
p628-kvm1:/home/staging   94G   15G   75G  17% /home/staging
tmpfs                    3.2G     0  3.2G   0% /run/user/0

그리고 위와 같이 lsf.datamanager.myCluster 일부 내용을 수정한 경우, 다음과 같이 반드시 bdata admin reconfig 명령을 수행해주어야 그 변경이 효과를 냅니다.  그 외에도, 일부 옵션의 경우 lsf 자체를 restart 해야 하는 경우도 있으니 lsadmin limrestart 명령과 badmin mbdrestart 명령도 해주는 것이 좋습니다.

[cecuser@p628-kvm1 ~]$ su
Password:

bash-4.2# bdata admin reconfig

Checking configuration files ...
No errors found.

LSF data manager daemon (dmd) on <p628-kvm1> is reconfiguring ...  initiated.

bash-4.2# lsadmin limrestart

bash-4.2# badmin mbdrestart

이제 설정을 확인하면 아래와 같이 STAGING_AREA가 변경된 것을 보실 수 있습니다.

[cecuser@p628-kvm1 ~]$ bdata showconf
LSF data management configuration at Thu Apr  2 02:30:30 2020
        ADMINS = lsfadmin
        CACHE_ACCESS_CONTROL = N
        CACHE_ACCESSIBLE_FILES = N
        CACHE_INPUT_GRACE_PERIOD = 1440 (minutes)
        CACHE_OUTPUT_GRACE_PERIOD = 180 (minutes)
        CACHE_PERMISSIONS = user
        CACHE_REFRESH_INTERVAL = 15 (minutes)
        FILE_TRANSFER_CMD = /usr/bin/scp
        LSB_TIME_DMD = 0
        LSF_DATA_BSUB_CHKSUM = N
        LSF_DATA_HOSTS = p628-kvm1
        LSF_DATA_PORT = 9998
        LSF_LOGDIR = /opt/ibm/lsflogs
        LSF_LOG_MASK = LOG_WARNING
        PERMISSION_MASK = 000
        QUERY_NTHREADS = 4
        REMOTE_CACHE_REFRESH_INTERVAL = 15 (seconds)
        STAGING_AREA = /home/staging

[cecuser@p628-kvm1 ~]$ bdata connections
LOCAL: (LSF_DATA_PORT=9998)
LSF_DATA_HOSTS
[*]p628-kvm1

CLUSTER             MASTER              STATUS
myCluster           p628-kvm1           ok

이제 간단히 LSF Data Manager의 동작을 테스트해보겠습니다.   먼저 data file을 하나 만듭니다.

[cecuser@p628-kvm1 ~]$ echo "beef jerky" > /tmp/test1.txt

그리고 수행할 job script를 하나 작성합니다.  여기서는 먼저 p628-kvm1 서버의 /tmp/test1.txt 파일을 stage in 한 뒤에 그걸 cat 하는 동작을 해보겠습니다.

[cecuser@p628-kvm1 ~]$ cat job1.sh
bstage in -src p628-kvm1:/tmp/test1.txt
cat test1.txt

이 script가 p628-kvm2 서버에서 수행되도록 해보겠습니다.  분명히 아직 p628-kvm2 서버에는 job1.sh script도, test1이라는 data file도 없습니다.

[cecuser@p628-kvm2 ~]$ pwd
/home/cecuser

[cecuser@p628-kvm2 ~]$ ls
support-scripts

이제 다음과 같이 -m 옵션을 써서 p628-kvm2 서버에서 p628-kvm1 서버의 /tmp/test1.txt 파일을 cat 명령으로 읽는 동작을 수행하겠습니다.

[cecuser@p628-kvm1 ~]$ bsub -I -m p628-kvm2 -data "p628-kvm1:/tmp/test1.txt" < job1.sh
Job <465> is submitted to default queue <interactive>.
<<Waiting for dispatch ...>>
<<Starting on p628-kvm2.cecc.ihost.com>>
beef jerky

위와 같이 잘 되는 것을 보실 수 있는데, 수행 뒤에 p628-kvm2 서버에 가보면 실제로 test1.txt가 p628-kvm2 서버의 current working directory (CWD)에 복사되어 있는 것을 보실 수 있습니다.

[cecuser@p628-kvm2 ~]$ ls -l
total 8
drwxr-xr-x. 2 cecuser cecuser 4096 Apr  5 03:15 support-scripts
-rw-r--r--. 1 cecuser cecuser   11 Apr  6 01:07 test1.txt


이 LSF Data Manager를 이용해서 각 서버에 장착된 고속 NVMe flash drive를 burst buffer처럼 사용하는 방안에 대해서 살펴보겠습니다.

먼저 각 서버에 고속 NVMe flash drive가 공유되지 않은 일반 directory인 /nvme로 mount되어 있다고 가정해보겠습니다.

[cecuser@p628-kvm1 ~]$ ls -l /nvme
total 0

[cecuser@p628-kvm2 ~]$ ls -l /nvme
total 0

[cecuser@p628-kvm3 ~]$ ls -l /nvme
total 0

그리고 data source는 p628-kvm1 서버의 /tmp/data1 밑에 들어있다고 가정하시지요.

[cecuser@p628-kvm1 ~]$ ls -l /tmp/data1
total 12
-rw-rw-r--. 1 cecuser cecuser 6 Apr  6 02:08 1.txt
-rw-rw-r--. 1 cecuser cecuser 8 Apr  6 02:08 2.txt
-rw-rw-r--. 1 cecuser cecuser 6 Apr  6 02:09 3.txt

[cecuser@p628-kvm1 ~]$ cat /tmp/data1/*.txt
donut
biscuit
bagel

Linux의 paste라는 명령어를 이용하여 이 파일들을 하나로 합쳐서 화면으로 뿌려주는 일을 해보겠습니다.  단, 이 파일들을 합치기 전에 먼저  p628-kvm1~3의 3대 서버 중 한 대의 고속 I/O인 /nvme로 stage-in 해놓은 뒤에 paste 명령을 쓰는 것으로 하겠습니다. 

이떄 사용할 것은 bsub 명령어 중 -cwd (current working directory) 옵션입니다.  이 옵션을 써서 각 서버의 /nvme를 현재 작업 directory로 지정할 수 있습니다.

즉, 다음과 같이 하면 됩니다.  먼저 수행할 script를 아래와 같이 작성합니다.

[cecuser@p628-kvm1 ~]$ cat paste.sh
bstage in -src p628-kvm1:/tmp/data1/*
cd data1
paste 1.txt 2.txt 3.txt

그리고 -cwd 옵션을 써서 p628-kvm1 서버의 /tmp/data1/ 디렉토리에서 모든 파일을 execution host로 가져갑니다.  아직 어느 서버가 execution host가 될지는 모릅니다.

[cecuser@p628-kvm1 ~]$ bsub -I -cwd /nvme -data "p628-kvm1:/tmp/data1/*" < paste.sh
Job <493> is submitted to default queue <interactive>.
<<Waiting for dispatch ...>>
<<Starting on p628-kvm3.cecc.ihost.com>>
donut   biscuit bagel

위와 같이 p628-kvm3에서 수행이 된 것을 보실 수 있습니다.   실제로 p628-kvm3 서버의 /nvme 디렉토리를 살펴보면 해당 file들이 복사된 것을 보실 수 있습니다.

[cecuser@p628-kvm3 ~]$ ls -l /nvme/data1/
total 12
-rw-r--r--. 1 cecuser cecuser 6 Apr  6 02:33 1.txt
-rw-r--r--. 1 cecuser cecuser 8 Apr  6 02:33 2.txt
-rw-r--r--. 1 cecuser cecuser 6 Apr  6 02:33 3.txt

그리고 이렇게 한번 staging area로 cache된 파일은 기본적으로 24시간 남아 있기 때문에 다시 부를 경우 stage in 하지 않고 곧장 다시 사용이 가능합니다.

[cecuser@p628-kvm1 ~]$ bdata cache p628-kvm1:/tmp/data1/*
--------------------------------------------------------------------------------
INPUT:
p628-kvm1:/tmp/data1/*

HASH    STATUS       REF_JOB                XFER_JOB               GRACE
e9e6f1* TRANSFERRED  -                      484@myCluster          23hr29min

이제 paste.sh를 약간 수정해서 paste_back.sh을 만들어 보겠습니다.  여기서는 결과물을 파일로 저장해서 -dst 옵션을 통해 특정 위치로 stage out 시키는 것까지 합니다.  여기서는 원래 data source가 있던 p628-kvm1 서버의 /tmp/data1에 보내도록 하겠습니다.

[cecuser@p628-kvm1 ~]$ cat paste_back.sh
bstage in -src p628-kvm1:/tmp/data1/*
cd data1
paste 1.txt 2.txt 3.txt > result.txt
bstage out -src result.txt -dst p628-kvm1:/tmp/data1/result.txt

수행해보면 다음과 같습니다.

[cecuser@p628-kvm1 ~]$ bsub -I -cwd /nvme -data "p628-kvm1:/tmp/data1/*" < paste_back.sh
Job <495> is submitted to default queue <interactive>.
<<Waiting for dispatch ...>>
<<Starting on p628-kvm3.cecc.ihost.com>>

이제 -dst로 지정한 위치를 살펴보면 정말 result.txt 파일이 들어와 있습니다.

[cecuser@p628-kvm1 ~]$ ls -l /tmp/data1/
total 16
-rw-rw-r--. 1 cecuser cecuser  6 Apr  6 02:08 1.txt
-rw-rw-r--. 1 cecuser cecuser  8 Apr  6 02:08 2.txt
-rw-rw-r--. 1 cecuser cecuser  6 Apr  6 02:09 3.txt
-rw-rw-r--. 1 cecuser cecuser 20 Apr  6 03:33 result.txt

물론 p628-kvm3 서버의 /nvme에도 해당 파일들이 있는데, 여기서 한번 사용되었던 1~3.txt 파일들은 data가 변경되지 않고 그대로인 것을 눈여겨 보시기 바랍니다.  즉, 기존의 파일 그대로이기 때문에 새로 copy하지 않고 재활용하여 I/O 시간을 줄인 것입니다.

[cecuser@p628-kvm3 ~]$ ls -l /nvme/data1/
total 16
-rw-r--r--. 1 cecuser cecuser  6 Apr  6 02:33 1.txt
-rw-r--r--. 1 cecuser cecuser  8 Apr  6 02:33 2.txt
-rw-r--r--. 1 cecuser cecuser  6 Apr  6 02:33 3.txt
-rw-rw-r--. 1 cecuser cecuser 20 Apr  6 03:33 result.txt

만약 이 파일 중 하나의 내용만 살짝 바꾸면 어떻게 될까요 ?

[cecuser@p628-kvm1 ~]$ echo "baguette" > /tmp/data1/1.txt

이제 다시 해보겠습니다.  이번에도 p628-kvm3에서 수행되도록 이번에는 아예 -m 옵션을 쓰겠습니다.

[cecuser@p628-kvm1 ~]$ bsub -I -m p628-kvm3 -cwd /nvme -data "p628-kvm1:/tmp/data1/*" < paste_back.sh
Job <504> is submitted to default queue <interactive>.
<<Waiting for dispatch ...>>
<<Starting on p628-kvm3.cecc.ihost.com>>

[cecuser@p628-kvm1 ~]$ cat /tmp/data1/result.txt
baguette        biscuit bagel

예, 바뀌어 있습니다.  p628-kvm3 서버에 가서 보면 1.txt 뿐만 아니라  2.txt와 3.txt까지 파일 3개가 모두 시간이 바뀐 것을 보실 수 있습니다.

[cecuser@p628-kvm3 ~]$ ls -l /nvme/data1/
total 16
-rw-r--r--. 1 cecuser cecuser  9 Apr  6 03:41 1.txt
-rw-r--r--. 1 cecuser cecuser  8 Apr  6 03:41 2.txt
-rw-r--r--. 1 cecuser cecuser  6 Apr  6 03:41 3.txt
-rw-r--r--. 1 cecuser cecuser 23 Apr  6 03:41 result.txt

[cecuser@p628-kvm3 ~]$ cat /nvme/data1/result.txt
baguette        biscuit bagel


위에서 수행된 job id 504는 물론 bhist 명령으로 좀 더 자세히 볼 수 있습니다.  그런데, 이렇게 data stage in/out 명령이 수반되는 job은 사실 하나의 job id가 추가로 생성됩니다.  즉, 504 외에 자동으로 505라는 job id도 생성되는데, 이건 우리가 사용한 interactive queue가 아니라 dataq 라는 LSF Data Manager에서만 사용하는 특수 queue로 갑니다.

[cecuser@p628-kvm1 ~]$ bhist -l 504

Job <504>, User <cecuser>, Project <default>, Interactive mode, Command <bstage
                      in -src p628-kvm1:/tmp/data1/*;cd data1;paste 1.txt 2.txt
                      3.txt > result.txt;bstage out -src result.txt -dst p628-k
                     vm1:/tmp/data1/result.txt>
Mon Apr  6 03:41:35: Submitted from host <p628-kvm1>, to Queue <interactive>, C
                     WD <$HOME>, Specified CWD </nvme>, Specified Hosts <p628-k
                     vm3>, Data Requirement Requested;
Mon Apr  6 03:41:49: Dispatched 1 Task(s) on Host(s) <p628-kvm3.cecc.ihost.com>
                     , Allocated 1 Slot(s) on Host(s) <p628-kvm3.cecc.ihost.com
                     >, Effective RES_REQ <select[type == any] order[r15s:pg] >
                     ;
Mon Apr  6 03:41:49: Starting (Pid 1611);
Mon Apr  6 03:41:55: Done successfully. The CPU time used is 0.1 seconds;
Mon Apr  6 03:41:56: Post job process done successfully;


MEMORY USAGE:
MAX MEM: 3 Mbytes;  AVG MEM: 3 Mbytes

Summary of time in seconds spent in various states by  Mon Apr  6 03:41:56
  PEND     PSUSP    RUN      USUSP    SSUSP    UNKWN    TOTAL
  14       0        6        0        0        0        20

[cecuser@p628-kvm1 ~]$ bhist -l 505

Job <505>, User <cecuser>, Project <default>, Command </opt/ibm/lsfsuite/lsf/10
                     .1/linux3.10-glibc2.17-ppc64le/etc/dm_stagein_transfer.sh>
                     , Job Description <4#user#7#cecuser#9#p628-kvm1#12#/tmp/da
                     ta1/*#32#3e53101b571911387ba9e9f222243bf9#>
Mon Apr  6 03:41:41: Submitted from host <p628-kvm1>, to Queue <dataq>, CWD <$H
                     OME>, Specified CWD </home/staging/stgin/user/cecuser/p628
                     -kvm1/tmp/data1/*/3e53101b571911387ba9e9f222243bf9>, Outpu
                     t File </dev/null>, Specified Clusters <myCluster>;
Mon Apr  6 03:41:41: Dispatched 1 Task(s) on Host(s) <p628-kvm1>, Allocated 1 S
                     lot(s) on Host(s) <p628-kvm1>, Effective RES_REQ <select[t
                     ype == local] order[r15s:pg] >;
Mon Apr  6 03:41:41: Starting (Pid 26673);
Mon Apr  6 03:41:41: Running with execution home </home/cecuser>, Execution CWD
                      </home/staging/stgin/user/cecuser/p628-kvm1/tmp/data1/*/3
                     e53101b571911387ba9e9f222243bf9>, Execution Pid <26673>;
Mon Apr  6 03:41:44: Done successfully. The CPU time used is 0.3 seconds;
Mon Apr  6 03:41:44: Post job process done successfully;


MEMORY USAGE:
MAX MEM: 10 Mbytes;  AVG MEM: 6 Mbytes

Summary of time in seconds spent in various states by  Mon Apr  6 03:41:44
  PEND     PSUSP    RUN      USUSP    SSUSP    UNKWN    TOTAL
  0        0        3        0        0        0        3


여기서 사용된 dataq는 lsfadmin 유저만 사용할 수 있는 특수 queue로서, 일반 사용자는 여기에 job을 submit할 수 없습니다.

[cecuser@p628-kvm1 ~]$ bqueues
QUEUE_NAME      PRIO STATUS          MAX JL/U JL/P JL/H NJOBS  PEND   RUN  SUSP
admin            50  Open:Active       -    -    -    -     0     0     0     0
owners           43  Open:Active       -    -    -    -     0     0     0     0
priority         43  Open:Active       -    -    -    -     0     0     0     0
night            40  Open:Active       -    -    -    -     0     0     0     0
short            35  Open:Active       -    -    -    -     0     0     0     0
dataq            33  Open:Active       -    -    -    -     0     0     0     0
normal           30  Open:Active       -    -    -    -     0     0     0     0
interactive      30  Open:Active       -    -    -    -     0     0     0     0
idle             20  Open:Active       -    -    -    -     0     0     0     0

이 dataq에 사용되는 host는 lsb.queues 파일에 HOSTS로 등록된 서버, 즉 STAGE AREA에 read/write를 주관하는 서버 뿐입니다.

[cecuser@p628-kvm1 ~]$ bqueues -l dataq

QUEUE: dataq
  -- No description provided.

PARAMETERS/STATISTICS
PRIO NICE STATUS          MAX JL/U JL/P JL/H NJOBS  PEND   RUN SSUSP USUSP  RSV PJOBS
 33    0  Open:Active       -    -    -    -     0     0     0     0     0    0     0
Interval for a host to accept two jobs is 0 seconds

SCHEDULING PARAMETERS
           r15s   r1m  r15m   ut      pg    io   ls    it    tmp    swp    mem
 loadSched   -     -     -     -       -     -    -     -     -      -      -
 loadStop    -     -     -     -       -     -    -     -     -      -      -

USERS: all
HOSTS:  p628-kvm1
DATA_TRANSFER:  Y

==============================

위에서는 STAGING_AREA를 NFS나 GPFS(Spectrum Scale) 같은 shared filesystem을 썼습니다만, 경우에 따라서는 병렬 파일시스템이 없는 경우도 있습니다.  그런 경우에도 LSF DM을 쓸 수 있는데, 그런 경우에는 STAGING_AREA를 다음과 같이 설정하면 됩니다.

[cecuser@p628-kvm1 ~]$ grep STAGING $EGO_TOP/conf/lsf.datamanager.myCluster
# STAGING_AREA = [host_name:]abs_file_path
STAGING_AREA = p628-kvm1:/opt/ibm/lsfsuite/lsf/work/myCluster/staging

즉, STAGING_AREA로 지정된 directory 앞에 DM master의 hostname을 붙이면 됩니다.   큰 cluster에서는 DM master 외에도 I/O를 담당하는 I/O node들이 있을 수 있는데, 그런 경우에는 STAGING_AREA는 반드시 (execution host들은 아니더라도) DM master와 I/O node들 간에는 NFS나 GPFS와 같은 공유 파일시스템을 이용해서 마운트해야 합니다.

또한, 위와 같이 non-shared STAGING_AREA를 사용하는 경우엔 execution host들, 즉 slave들이 DM master로부터 scp를 이용해서 파일을 copy 해가므로, 해당 user에서 'no-password-access'가 가능하도록 미리 구성을 해놓아야 합니다.


[cecuser@p628-kvm1 ~]$ bdata showconf | grep STAGING
        STAGING_AREA = p628-kvm1:/opt/ibm/lsfsuite/lsf/work/myCluster/staging


[cecuser@p628-kvm1 ~]$ cat job1.sh
bstage in -src p628-kvm1:/tmp/test1.txt
cat test1.txt

[cecuser@p628-kvm1 ~]$ bsub -I -m p628-kvm2 -data "p628-kvm1:/tmp/test1.txt" < job1.sh

Job <585> is submitted to default queue <interactive>.
<<Waiting for dispatch ...>>
<<Starting on p628-kvm2.cecc.ihost.com>>
beef jerky

이렇게 수행이 된 뒤에 p628-kvm2로 가서 확인해보면 current working directory에 test1.txt가 copy되어 있는 것을 보실 수 있습니다.

[cecuser@p628-kvm2 ~]$ ls -ltr
total 4
-rw-r--r--. 1 cecuser cecuser 11 Apr  9 00:44 test1.txt






2020년 4월 1일 수요일

LSF HPC Suite v10.2 설치 - CentOS 7.6 (ppc64le, IBM POWER8) 환경


LSF HPC Suite v10.2를 CentOS 7.6 (ppc64le, IBM POWER8) 환경에서 설치하는 과정을 정리했습니다.

먼저 LSF 설치에 필요한 사전 준비를 합니다.  Password를 넣지 않고 ssh가 되도록 하는 것이 관건입니다.  저는 일단 root user로도 ssh가 가능하도록 아래와 같이 설정했습니다.  여기서는 p628-kvm1~3 총 3대의 가상서버가 있습니다.

[cecuser@p628-kvm1 ~]$ sudo yum install -y openssh-clients

[cecuser@p628-kvm1 ~]$ ssh-keygen

[cecuser@p628-kvm1 ~]$ ssh-copy-id p628-kvm1

[cecuser@p628-kvm1 ~]$ ssh-copy-id p628-kvm2

[cecuser@p628-kvm1 ~]$ ssh-copy-id p628-kvm3

[cecuser@p628-kvm1 ~]$ sudo vi /etc/ssh/sshd_config
#PermitRootLogin yes
PermitRootLogin yes

[cecuser@p628-kvm1 ~]$ sudo systemctl restart sshd

[cecuser@p628-kvm1 ~]$ su -
Password:

-bash-4.2# ssh-keygen

-bash-4.2# ssh-copy-id p628-kvm1

-bash-4.2# ssh-copy-id p628-kvm2

-bash-4.2# ssh-copy-id p628-kvm3


이제 LSF HPC Suite의 installation bin file을 수행합니다.  이 파일이 수행하는 것은 LSF를 설치하는 것이 아니라, 그 설치를 위한 ansible 기반의 installer를 설치 및 구성하는 것입니다.

[cecuser@p628-kvm1 ~]$ sudo ./lsfshpc10.2.0.9-ppc64le.bin

Installing LSF Suite for HPC 10.2.0.9 deployer ...

Checking prerequisites ...
httpd is not installed.
Installing httpd ...
createrepo is not installed.
Installing createrepo ...
Installed Packages
rsync.ppc64le                      3.1.2-6.el7_6.1                      @updates
Installed Packages
curl.ppc64le                         7.29.0-51.el7                         @base
Installed Packages
python-jinja2.noarch                   2.7.2-3.el7_6                    @updates
Installed Packages
yum-utils.noarch                       1.1.31-50.el7                       @base
httpd is not running. Trying to start httpd ...
Copying LSF Suite for HPC 10.2.0.9 deployer files ...
Installing Ansible ...
Spawning worker 0 with 1 pkgs
,,,,
Gathering deployer information ...
Creating LSF Suite repository ...
LSF Suite for HPC 10.2.0.9 deployer installed

To deploy LSF Suite to a cluster:
 - Change directory to "/opt/ibm/lsf_installer/playbook"
 - Edit the "lsf-inventory" file with lists of machines and their roles in the cluster
 - Edit the "lsf-config.yml" file with required parameters
 - Run "ansible-playbook -i lsf-inventory lsf-deploy.yml"

Installing ibm-jre ...

Connecting to IBM Support: Fix Central to query the latest fix pack level ...
This is the latest available fix pack.

이제 아래와 같이 lsf-inventory 파일 속의 hostname 등을 등록합니다.  여기서는 p628-kvm1  p628-kvm2  p628-kvm3의 총 3대 중에서, p628-kvm1이 master 역할을 함과 동시에 compute host 역할까지 하는 것으로 설정했습니다.  p628-kvm1에서는 연산작업을 하지 않고 master 역할만 하기를 원한다면 [LSF_Servers]에서는 p628-kvm1이 빠져야 합니다.

[cecuser@p628-kvm1 ~]$ cd /opt/ibm/lsf_installer/playbook

[cecuser@p628-kvm1 playbook]$ sudo vi lsf-inventory
[LSF_Masters]
p628-kvm1
[LSF_Servers]
p628-kvm[1:3]     # p628-kvm1  p628-kvm2  p628-kvm3을 쉽게 표현한 것입니다

같은 directory의  lsf-config.yml도 필요시 수정합니다만, 여기서는 일단 하지 않겠습니다.

[cecuser@p628-kvm1 playbook]$ sudo vi  lsf-config.yml
(필요시)
  my_cluster_name: myCluster   # 이것이 default cluster name입니다.  여기서는 굳이 cluster 이름을 수정하지 않았습니다.
  HA_shared_dir: none  # High-Availability를 위한 directory로서, 설정하면 여기에 configuration file들과 work directory가 copy됩니다.
  NFS_install_dir: none  # 여기에 NFS mount point를 등록하면 그 directory에  LSF master, server & client binary file들과 config file들이 설치되어 cluster 내에서 공유됩니다

수정이 끝났으면 다음과 같이 문법에 오류가 없는지 테스트를 해봅니다.

[cecuser@p628-kvm1 playbook]$  sudo ansible-playbook -i lsf-inventory lsf-config-test.yml
...
TASK [Check if Private_IPv4_Range is valid] ************************************

TASK [Check if Private_IPv4_Range IP address is available] *********************

PLAY RECAP *********************************************************************
localhost                  : ok=0    changed=0    unreachable=0    failed=0
p628-kvm1                  : ok=16   changed=0    unreachable=0    failed=0
p628-kvm2                  : ok=11   changed=0    unreachable=0    failed=0
p628-kvm3                  : ok=11   changed=0    unreachable=0    failed=0

원래 manual에는 아래와 같이  lsf-predeploy-test.yml를 이용해서 추가 검증 테스트를 해보라고 되어 있는데, 해보면 아래와 같이 remote 서버 2대에서만 엉뚱한 error가 납니다.  아무리 이것저것 해봐도 계속 같은 오류가 나던데, 그냥 무시하셔도 될 것 같습니다.  저는 무시하고 그냥 진행했는데, 결과적으로는 문제가 없었습니다.

[cecuser@p628-kvm1 playbook]$ sudo ansible-playbook -i lsf-inventory lsf-predeploy-test.yml
...
TASK [debug deployer] **********************************************************
fatal: [p628-kvm2]: FAILED! => {"failed": true, "msg": "The conditional check 'LSF.Private_IPv4_Range is defined and LSF.Private_IPv4_Range != 'none' and LSF.Private_IPv4_Range is not none' failed. The error was: error while evaluating conditional (LSF.Private_IPv4_Range is defined and LSF.Private_IPv4_Range != 'none' and LSF.Private_IPv4_Range is not none): 'LSF' is undefined\n\nThe error appears to have been in '/opt/ibm/lsf_installer/playbook/roles/config/tasks/check_private_ips.yml': line 8, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: debug {{ target_role }}\n  ^ here\nWe could be wrong, but this one looks like it might be an issue with\nmissing quotes.  Always quote template expression brackets when they\nstart a value. For instance:\n\n    with_items:\n      - {{ foo }}\n\nShould be written as:\n\n    with_items:\n      - \"{{ foo }}\"\n"}

이제 다음과 같이 ansible-playbook으로 실제 설치를 수행합니다.  이 명령 하나로 3대의 서버에 모두 LSF HPC Suite가 설치되는 것입니다.  위의 test 오류에도 불구하고, 설치는 전혀 이상없이 잘 됩니다.  서버 및 네트워크 사양에 따라 다르겠지만 시간은 꽤 많이 걸립니다.  저는 1시간 정도 걸렸습니다.   아래와 같이 끝 부분에 IBM Spectrum Application Center를 열 수 있는 URL이 주어집니다.  접속해보면 실제로 잘 열립니다.

[cecuser@p628-kvm1 playbook]$ sudo ansible-playbook -i lsf-inventory lsf-deploy.yml
...
PLAY [Summary] *****************************************************************

TASK [debug] *******************************************************************
ok: [p628-kvm1 -> localhost] => {
    "msg": [
        "LSF Suite for HPC 10.2.0.9 deployment is done",
        "Open IBM Spectrum Application Center with the following URL: http://p628-kvm1.cecc.ihost.com:8080"
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0
p628-kvm1                  : ok=296  changed=127  unreachable=0    failed=0
p628-kvm2                  : ok=107  changed=48   unreachable=0    failed=0
p628-kvm3                  : ok=107  changed=48   unreachable=0    failed=0





** 혹시 위의 설치 과정에서 뭔가 실수 등으로 잘못되어 다시 설치하고자 한다면, 그냥 다시 하면 안되고 다음과 같이 uninstall 하고 진행해야 합니다.  그러지 않을 경우 "Check if an installation was made before" 등의 error가 나면서 fail 합니다.

[cecuser@p628-kvm1 playbook]$ sudo ansible-playbook -i lsf-inventory lsf-uninstall.yml

이제 다음과 같이 lsf.conf에서 RSH이나 RCP 대신 ssh, scp를 쓰도록 설정합니다.

[cecuser@p628-kvm1 playbook]$ sudo vi /opt/ibm/lsfsuite/lsf/conf/lsf.conf
LSF_RSH=ssh
LSF_REMOTE_COPY_CMD="scp -B -o 'StrictHostKeyChecking no'"

[cecuser@p628-kvm1 ~]$ sudo ln -s /opt/ibm/lsfsuite/lsf/conf/lsf.conf /etc/lsf.conf

이제 lsfshutdown & lsfstartup을 통해 restart 합니다.  이건 root에서 해야 합니다.

[cecuser@p628-kvm1 ~]$ su -
Password:
Last login: Tue Mar 31 05:05:59 EDT 2020

-bash-4.2# . /opt/ibm/lsfsuite/lsf/conf/profile.lsf   (이 profile.lsf를 수행해야 PATH 등의 환경변수가 자동설정됩니다.)

-bash-4.2# lsfshutdown
Shutting down all slave batch daemons ...
Shut down slave batch daemon on all the hosts? [y/n] y
Shut down slave batch daemon on <p628-kvm1> ...... done
Shut down slave batch daemon on <p628-kvm2.cecc.ihost.com> ...... done
Shut down slave batch daemon on <p628-kvm3.cecc.ihost.com> ...... done
Shutting down all RESes ...
Do you really want to shut down RES on all hosts? [y/n] y
Shut down RES on <p628-kvm1> ...... done
Shut down RES on <p628-kvm3.cecc.ihost.com> ...... done
Shut down RES on <p628-kvm2.cecc.ihost.com> ...... done
Shutting down all LIMs ...
Do you really want to shut down LIMs on all hosts? [y/n] y
Shut down LIM on <p628-kvm1> ...... done
Shut down LIM on <p628-kvm3.cecc.ihost.com> ...... done
Shut down LIM on <p628-kvm2.cecc.ihost.com> ...... done

-bash-4.2# lsfstartup
Starting up all LIMs ...
Do you really want to start up LIM on all hosts ? [y/n]y
Start up LIM on <p628-kvm1> ......
Starting up all RESes ...
Do you really want to start up RES on all hosts ? [y/n]y
Start up RES on <p628-kvm1> ......
Starting all slave daemons on LSBATCH hosts ...
Do you really want to start up slave batch daemon on all hosts ? [y/n] y
Start up slave batch daemon on <p628-kvm1> ......
Done starting up LSF daemons on the local LSF cluster ...

이제 다시 일반 user에서 각종 LSF 명령을 내려 봅니다.

[cecuser@p628-kvm1 ~]$ . /opt/ibm/lsfsuite/lsf/conf/profile.lsf

[cecuser@p628-kvm1 ~]$ lsid
IBM Spectrum LSF 10.1.0.9, Oct 16 2019
Suite Edition: IBM Spectrum LSF Suite for HPC 10.2.0.9
Copyright International Business Machines Corp. 1992, 2016.
US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.

My cluster name is myCluster
My master name is p628-kvm1

[cecuser@p628-kvm1 ~]$ lshosts
HOST_NAME      type    model  cpuf ncpus maxmem maxswp server RESOURCES
p628-kvm1   LINUXPP   POWER8  25.0     2  31.9G   3.9G    Yes (mg)
p628-kvm3.c LINUXPP   POWER8  25.0     2  31.9G   3.9G    Yes ()
p628-kvm2.c LINUXPP   POWER8  25.0     2  31.9G   3.9G    Yes ()


[cecuser@p628-kvm1 ~]$ bhosts
HOST_NAME          STATUS       JL/U    MAX  NJOBS    RUN  SSUSP  USUSP    RSV
p628-kvm1          ok              -      2      0      0      0      0      0
p628-kvm2.cecc.iho ok              -      2      0      0      0      0      0
p628-kvm3.cecc.iho ok              -      2      0      0      0      0      0


[cecuser@p628-kvm1 ~]$ bqueues
QUEUE_NAME      PRIO STATUS          MAX JL/U JL/P JL/H NJOBS  PEND   RUN  SUSP
admin            50  Open:Active       -    -    -    -     0     0     0     0
owners           43  Open:Active       -    -    -    -     0     0     0     0
priority         43  Open:Active       -    -    -    -     0     0     0     0
night            40  Open:Active       -    -    -    -     0     0     0     0
short            35  Open:Active       -    -    -    -     0     0     0     0
dataq            33  Open:Active       -    -    -    -     0     0     0     0
normal           30  Open:Active       -    -    -    -     0     0     0     0
interactive      30  Open:Active       -    -    -    -     0     0     0     0
idle             20  Open:Active       -    -    -    -     0     0     0     0