Computer

ubuntu slurm 설정 방법

Novelism 2021. 9. 2. 18:36

slurm은 리눅스 클러스터 환경에서 많이 사용되는 스케줄러입니다. 비슷한 것으로 pbs, torque 등이 있습니다.

slurm이 gpu 스케줄 관리 기능을 지원하면서 사용자가 늘었습니다.

 

클러스터에서 잡 관리할 때도 사용할 수 있지만, PC 1대에서도 사용하면 장점이 있습니다.

리눅스에선 기본적으로 유저의 터미널이 끊기면 그 터미널 아래에서 돌아가던 잡은 백그라운드일지라도 중단됩니다.

 그래서 nohup이나 screen이나 tmux 같은 여러 툴들을 사용합니다. 스케쥴러를 사용할 수도 있습니다.

다른 툴들에 비해 스케쥴러의 장점이라 한다면, 여러 잡을 순차적으로 돌리고 싶을 때, 한 번에 여러 개의 잡을 제출 해도 동시에 실행되지 않고 순차적으로(queue) 잡이 실행 가능합니다.

그렇긴 해도 클러스터에서 사용할 때 유용성이 더 커집니다. 물론 세팅을 잘해둬야 한다는 문제가 있지만요.

세팅 잘된 클러스터는 정말 사용하기 편하고, 묶지 않고 사용하는 것보다도 훨씬 효율적입니다.

예를 들어 서로 데이터나, 작업환경이 공유되지 않으면 매번 다른 서버에서 일할 때마다 세팅을 해주고 데이터를 옮겨야겠죠.

물론 이런 것들을 세팅하려면 nfs나 luster 같은 저장장치 공유도 필요합니다.

 

 대학원에 처음 입학했을 때는 컴퓨터 견적부터 구매, 조립, 운영체제 설치, 클러스터 세팅, 소프트웨어 세팅 전부 다 했었는데...

 요즘엔 그런 것을 하나하나 할 여유가 없네요. 지금은 인터넷이 잘 발달해서 더 쉬워지긴 했지만, 그래도 깊이 파고들 여력이 안됩니다. 스토리지는 이미 잘 공유되어있다고 가정하고 slurm 설정에 대해서만 이야기하려고 합니다.

 

다른 블로그들을 참고하여 세팅을 했었고, 제가 사용하는 시스템에 맞게 수정했습니다.

slurm 설치 후 정상 작동을 하지 않는 경우에 상당수 원인은 권한 (파일 소유권, 사용권) 문제였습니다. 만약 안되시면 관련 파일들을 찾아보고 권한을 확인해보시는 것을 추천드립니다.

 

slurm 설치 전에 먼저 세팅해야 할 것들이 있습니다. 당연히 관리자 권한으로 해야 하는 일들이고, 편의상 sudo는 생략될 수도 있습니다.

  • 서버와 노드에 스토리지를 공유하고, 서버와 노드에 일관되게 계정을 만듭니다. 같은 uid, gid를 사용해야 합니다.
    • useradd -u "uid" "user"
    • -u 옵션을 사용하면 원하는 uid를 부여할 수 있습니다.
    • 아니면 이미 존재하는 계정이라면 직접 passwd 파일에서 uid를 고쳐줄 수도 있습니다.
    • 리눅스에는 많은 설정 파일들이 존재하고, useradd 같은 명령어는 그 설정 파일에 원하는 정보를 기록하는 기능을 할 뿐입니다. 그러니까 굳이 명령어 없이도 설정 파일들을 직접 고쳐서 세팅할 수도 있습니다.
  • 서버와 각 노드에 host name을 설정합니다.
    • 호스트 네임은 /etc/hostname 파일에서 고쳐줄 수 있습니다.
  • /etc/hosts 파일 설정
    • 127.0.0.1 localhost
      127.0.1.1 server.novelism.co.kr server
      192.169.0.11 node1.novelism.co.kr node1
      192.169.0.12 node2.novelism.co.kr node2
    • 이런 식으로 ip 주소, 도메인(임의로), alias를 기록해줍니다.
    • alias를 사용하면 ssh 연결 시에 ip 주소를 전부 입력할 필요 없이 대신 alias를 입력해서 사용할 수 있습니다.
  • 네트워크를 재시작해줍니다.
    • systemctl restart networking
  • munge 세팅
    • 이게 뭔지 정확히는 모르겠지만, 서버-노드 간 인증과 관련된 프로그램입니다.
    •  컴퓨터 1대만 사용할 것이라면 굳이 설치하지 않아도 됩니다.
    • 일단 munge를 설치하기 전에 uid와 gid를 설정해줍니다.
      • uid와 gid는 991입니다.
      • groupadd -g 991 munge
        useradd -m -c "MUNGE Uid 'N' Gid Emporium" -d /var/lib/munge -u 991 -g munge -s /sbin/nologin munge
    • 서버, 노드에 munge 설치
      • apt-get update
        apt-get install munge
    • 서버 세팅
      • 키 생성 및 파일에 저장 및 권한 수정
      • apt-get install rng-tools -y
        rngd -r /dev/urandom
        /usr/sbin/create-munge-key -r
        dd if=/dev/urandom bs=1 count=1024 > /etc/munge/munge.key
        chown munge: /etc/munge/munge.key
        chmod 400 /etc/munge/munge.key
    • 노드 세팅
      • 서버의 인증키를 노드로 전달
      • scp /etc/munge/munge.key root@서버주소:/etc/munge
        systemctl stop munge
        systemctl enable munge
        systemctl start munge
    • 동작 확인
      • 서버에서 실행
      • munge -n | ssh 노드주소 unmunge
      • 성공할 경우 다음과 같은 메시지가 나옵니다.
        • STATUS:           Success (0)
  • slurm 세팅
    • slurm uid, gid 설정
      • munge와 마찬가지로 uid와 gid를 통일합니다. 이 작업은 모든 서버와 노드에서 해줍니다.
      • groupadd -g 994 slurm
        useradd  -m -c "SLURM workload manager" -d /var/lib/slurm -u 994 -g slurm -s /sbin/nologin slurm
    • 설치:
      • slurm에는 3가지 프로그램이 있습니다.
      • slurmctld는 slurm 서버 툴입니다. 서버 노드에 설치합니다.
        • apt-get install slurmctld
      • slurmd는 slurm 계산 노드 툴입니다. 계산 노드에 설치합니다. 만약 서버도 계산 노드로 사용할 것이라면, 서버에도 설치합니다.
        • apt-get install slurmd
      • slurm-client는 클라이언트가 서버를 사용하기 위한 툴입니다.
        • sbatch, sinfo, scontrol 등 slurm을 실제로 사용하는데 필요한 명령어들이 포함되어 있습니다.
        • 서버, 계산노드에 설치합니다.
        •  굳이 서버와 계산 노드가 아니더라도, 특정 컴퓨터에 클라이언트가 설치되어있으면서, slurm.conf가 동일하게 세팅되어있다면 그 컴퓨터에서도 slurm 명령어로 서버와 계산 노드를 제어할 수 있는 것 같습니다.
        • apt-get install slurm-client
      • slurm-wlm 공통 프로그램입니다. 위의 프로그램들을 설치하다 보면 의존성 때문에 알아서 설치될 듯...
    • slurm.conf 파일 세팅
      • https://slurm.schedmd.com/configurator.easy.html
      • 여기서 Cluster Name, Control Machines, Compute Machines 등을 세팅해줍니다.
        • slurm.conf 파일을 생성하기 위한 것이고, 일부는 직접 고쳐줘야 합니다. 모르는 항목은 그냥 디폴트로 둡니다.
        • submit을 누르면 slurm.conf 파일을 얻을 수 있습니다. 이를 /etc/slurm-llnl 폴더에 붙여둡니다.
        • slurm.conf 파일에서
          • SlurmctldHost라고 서있는 항목이 있는데, 아마도 예전 변 수명이었는지 에러가 납니다. SlurmctldHost을 ControlMachine로 고쳐줍니다.
        • 예시: 제가 사용하는 설정 파일을 약간 고친 것입니다.
          • # slurm.conf file generated by configurator easy.html.
            # Put this file on all nodes of your cluster.
            # See the slurm.conf man page for more information.
            #
            #SlurmctldHost=server
            ControlMachine=server
            #ControlAddr=192.168.0.1
            
            #
            #MailProg=/bin/mail
            MpiDefault=none
            #MpiParams=ports=#-#
            ProctrackType=proctrack/pgid
            ReturnToService=1
            #SlurmctldPidFile=/var/run/slurmctld.pid
            SlurmctldPidFile=/var/run/slurm-llnl/slurmctld.pid
            #SlurmctldPort=6817
            #SlurmdPidFile=/var/run/slurmd.pid
            SlurmdPidFile=/var/run/slurm-llnl/slurmd.pid
            #SlurmdPort=6818
            SlurmdSpoolDir=/var/spool/slurmd
            SlurmUser=slurm
            #SlurmdUser=root
            StateSaveLocation=/var/spool/slurmctld
            SwitchType=switch/none
            TaskPlugin=task/affinity
            #
            #
            # TIMERS
            #KillWait=30
            #MinJobAge=300
            #SlurmctldTimeout=120
            #SlurmdTimeout=300
            #
            #
            # SCHEDULING
            FastSchedule=1
            SchedulerType=sched/backfill
            SelectType=select/cons_tres
            SelectTypeParameters=CR_Core
            #
            #
            # LOGGING AND ACCOUNTING
            AccountingStorageType=accounting_storage/none
            ClusterName=
            #JobAcctGatherFrequency=30
            JobAcctGatherType=jobacct_gather/none
            #SlurmctldDebug=info
            SlurmctldLogFile=/var/log/slurm-llnl/slurmctld.log
            #SlurmdDebug=info
            SlurmdLogFile=/var/log/slurm-llnl/slurmd.log
            DebugFlags=NO_CONF_HASH
            #
            #
            # COMPUTE NODES
            NodeName=node01 NodeAddr=192.168.0.11 Procs=256 Sockets=2 CoresPerSocket=64 ThreadsPerCore=2 State=idle
            NodeName=node02 NodeAddr=192.168.0.11 Procs=256 Sockets=2 CoresPerSocket=64 ThreadsPerCore=2 State=idle
            PartitionName=debug Nodes=node01 Default=Yes MaxTime=INFINITE State=UP
            PartitionName=nodes Nodes=node01, node02 Default=No MaxTime=INFINITE State=UP
          • 로그 파일 위치를 디폴트 설정에서 조금 바꿔주었습니다.
            • /var/log/slurm-llnl/slurmctld.log ,/var/log/slurm-llnl/slurmd.log
            • /var/log/slurm-llnl 폴더를 만들고 권한 변경도 해야 합니다.
          • 이렇게만 해도 되는 경우가 있는데, 저는 잘 안돼서 파일을 2개 더 추가했습니다.
            • /etc/slurm-llnl/cgroup.conf
            •     CgroupMountpoint="/sys/fs/cgroup"
                  CgroupAutomount=yes
                  CgroupReleaseAgentDir="/etc/slurm-llnl/cgroup"
                  AllowedDevicesFile="/etc/slurm-llnl/cgroup_allowed_devices_file.conf"
                  ConstrainCores=yes
                  TaskAffinity=no
                  ConstrainRAMSpace=yes
                  ConstrainSwapSpace=no
                  ConstrainDevices=no
                  AllowedRamSpace=100
                  AllowedSwapSpace=0
                  MaxRAMPercent=100
                  MaxSwapPercent=100
                  MinRAMSpace=30
            •  
            • /etc/slurm-llnl/cgroup_allowed_devices_file.conf
            •     /dev/null
                  /dev/urandom
                  /dev/zero
                  /dev/sda*
                  /dev/cpu/*/*
                  /dev/pts/*
          • slurm.conf를 보시면 몇 개의 파일과 폴더가 필요함을 알 수 있습니다. 이 파일의 소유주는 slurm 이어야 합니다. 그래서 먼저 폴더와 파일을 만들고, 권한을 이전해야 합니다.
        • 서버 설정:
          •     mkdir /var/spool/slurmctld /var/log/slurm-llnl
                touch /var/log/slurm-llnl/slurmctld.log 
                chown slurm: /var/spool/slurmctld /var/log/slurm-llnl /var/log/slurm-llnl/slurmctld.log 
                chmod 755 /var/spool/slurmctld /var/log/slurm-llnl /var/log/slurm-llnl/slurmctld.log
        • 서버 서비스 시작

          •     sudo systemctl stop slurmctld.service
                sudo systemctl enable slurmctld.service
                sudo systemctl start slurmctld.service
                sudo systemctl status slurmctld.service
        • 노드 설정
          •     mkdir /var/spool/slurmd /var/run/slurm-llnl /var/log/slurm-llnl
                touch /var/log/slurm-llnl/slurmd.log
                chown -R slurm: /var/spool/slurmd /var/run/slurm-llnl /var/log/slurm-llnl​
        • 노드 서비스 시작
          •     systemctl stop slurmd.service
                systemctl enable slurmd.service
                systemctl start slurmd.service
                systemctl status slurmd.service
          •  
        •  참고사항
          • 아마도 여기까지 세팅을 해도 환경에 따라서 에러가 날 수도 있는데, 그럴 경우 관련 파일과 폴더의 권한을 확인해보시기 바랍니다.
          • 상당수의 에러는 로그 파일에 정보가 남아있으니 로그 파일을 확인해보는 편이 좋습니다.
            •  /var/log/slurm-llnl/slurmctld.log
            •  /var/log/slurm-llnl/slurmd.log
          • 노드에 문제가 있을 경우 제외하거나 다시 추가하는 명령어
            •     sudo scontrol update NodeName="node_name" State=down Reason=hung_proc
                  sudo scontrol update NodeName="node_name" State=resume
  • slurm 사용법
    • slurm 명령어
      • sinfo: 노드 정보 보기
        • 옵션: sinfo -N -O "partition,prioritytier,nodeaiot,nodeaddr,cpusstate,cpusload,gres,gresused:30,reson" -S "P,N"'
        • alias sinfo2='sinfo -N -O "partition,prioritytier,nodeaiot,nodeaddr,cpusstate,cpusload,gres,gresused:30,reson" -S "P,N"'
      • squeue: queue 정보 확인
      • sbatch : script로 잡 제출
      • srun: 실행파일을 직접 queue에 제출
      • scontrol : 노드,  queue 제어
    • slurm batch script 예시
      •     #!/bin/bash
            #SBATCH --job-name=debug # Job name
            #SBATCH --partition=debug # Job name
            #SBATCH --nodes=1
            #SBATCH --ntasks-per-node=256
            #SBATCH --time=72:00:00 # Time limit hrs:min:sec
            #SBATCH --output=debug_%j.log # Standard output and error log
        
            ## --mail-user=
            ## --mail-type=All
        
            pwd; hostname; date
        
            NPROCS=$SLURM_NPROCS
            echo NPROCS=$NPROCS
        
            sleep 10
        
            date
    • interactive job submit
      • 미리 정해진 스크립트만 돌리는 방식으로는 불편할 때가 있으므로 interactive 모드를 지원함
      • srun --partition=debug --nodes=1 --ntasks-per-node=256 --pty bash -i
      • 명령어를 실행하면 필요한 자원이 할당되고 queue에 접속됨
      • 종료: exit
    • 주의사항
      • 서버와 노드에 동일한 디렉터리가 있어야 잡 제출
      • 서버의 /home/user/aa/test.sh라는 잡을 던졌는데, node에 /home/user/aa 가 없으면 안 됨
      •  이름만 같은 것이 아니라, 실제로 서로 공유되어 내용이 같아야 함