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






댓글 없음:

댓글 쓰기