본문 바로가기
[GPUaaS]/SLURM

[SLURM] 잡 스크립트 (sbatch) 예제!!

by METAVERSE STORY 2026. 2. 8.
반응형

 

 

 


0) 준비 (필수 개념 한 줄 요약)

  • 잡 스크립트: SLURM에게 “이렇게 실행해줘”라고 요청하는 설정+명령 모음 파일
  • 파일 확장자 예: run.sh 또는 train.sbatch
  • 제출 명령: sbatch run.sh
  • 상태 확인: squeue -u $USER
  • 취소: scancel <JOB_ID>

1) 단일 노드·단일 GPU (가장 기본)

 
 
 
 
Shell
 
#!/bin/bash
#SBATCH -J hello-gpu # 잡 이름
#SBATCH -p gpu # 사용할 파티션(클러스터마다 이름 다를 수 있음)
#SBATCH -N 1 # 노드(서버) 수: 1대
#SBATCH --gres=gpu:1 # GPU 1장 요청
#SBATCH -c 4 # CPU 코어 4개
#SBATCH --mem=16G # 메모리 16GB
#SBATCH -t 02:00:00 # 최대 실행시간(2시간)
#SBATCH -o logs/%x_%j.out # 표준출력 저장 위치(폴더는 미리 만들어두세요)
#SBATCH -e logs/%x_%j.err # 표준에러 저장 위치
 
# (선택) 환경 준비
source ~/.bashrc
conda activate myenv # 또는 module load cuda/xx.xx 등
 
echo "Node: $(hostname)"
echo "Start time: $(date)"
 
# GPU 확인
nvidia-smi
 
# 학습/실행 명령
python train.py --epochs 5 --batch-size 64
 
echo "End time: $(date)"
 
 
간단히 보기

 

포인트: --gres=gpu:1이 GPU 1장을 의미. 파티션 이름(-p gpu)은 환경에 따라 다를 수 있으니, 운영 문서/관리자에게 확인하세요.

 

 

 


2) 단일 노드·다중 GPU(예: 4장) + PyTorch DDP

 
 
 
 
Shell
 
#!/bin/bash
#SBATCH -J ddp-1node4gpu
#SBATCH -p gpu
#SBATCH -N 1
#SBATCH --gres=gpu:4 # GPU 4장
#SBATCH -c 16
#SBATCH --mem=64G
#SBATCH -t 08:00:00
#SBATCH -o logs/%x_%j.out
#SBATCH -e logs/%x_%j.err
 
source ~/.bashrc
conda activate myenv
 
# PyTorch DDP를 위한 기본 환경 변수
export MASTER_ADDR=$(hostname) # 마스터 호스트 (현재 노드)
export MASTER_PORT=23456 # 사용 가능한 포트(충돌 안 나게 선택)
export WORLD_SIZE=4 # 전체 프로세스 수(= GPU 수, 1 GPU당 1 프로세스)
export OMP_NUM_THREADS=4 # CPU 스레드 조정(옵션)
 
# (선택) NCCL/GLOO 환경 튜닝
export NCCL_DEBUG=INFO
export NCCL_SOCKET_IFNAME=eth0 # 네트워크 인터페이스(환경에 맞게)
export CUDA_VISIBLE_DEVICES=0,1,2,3
 
echo "Node: $(hostname)"
nvidia-smi
 
# 프로세스 런처: srun을 써서 GPU당 1 프로세스로 실행
srun --ntasks=${WORLD_SIZE} --cpus-per-task=4 \
python -m torch.distributed.run \
--nproc_per_node=4 \
--master_addr=${MASTER_ADDR} --master_port=${MASTER_PORT} \
train_ddp.py --epochs 50 --batch-size 64
 
간단히 보기

포인트: srun --ntasks=GPU수로 프로세스 수를 맞추고, torch.distributed.run으로 DDP 실행. MASTER_ADDR/PORT는 같은 노드에서만 유효.

 

 

 


3) 멀티 노드·다중 GPU(예: 2노드 × 4GPU = 8프로세스)

 
 
 
 
Shell
 
#!/bin/bash
#SBATCH -J ddp-2node4gpu
#SBATCH -p gpu
#SBATCH -N 2 # 노드 2대
#SBATCH --gres=gpu:4 # 노드당 GPU 4장
#SBATCH -c 16
#SBATCH --mem=64G
#SBATCH -t 08:00:00
#SBATCH -o logs/%x_%j.out
#SBATCH -e logs/%x_%j.err
 
source ~/.bashrc
conda activate myenv
 
# SLURM이 제공하는 노드 리스트를 사용
MASTER_ADDR=$(scontrol show hostnames "$SLURM_JOB_NODELIST" | head -n 1)
export MASTER_ADDR
export MASTER_PORT=23456
export NNODES=$SLURM_JOB_NUM_NODES # 총 노드 수(2)
export GPUS_PER_NODE=4
export WORLD_SIZE=$(($NNODES * $GPUS_PER_NODE)) # 총 프로세스(8)
 
# 네트워크/NCCL 설정 (환경 맞춰 조정)
export NCCL_DEBUG=INFO
export NCCL_SOCKET_IFNAME=eth0 # IB 환경이면 mlx5_0 등 환경에 맞게
export CUDA_VISIBLE_DEVICES=0,1,2,3
 
echo "Node list:"
scontrol show hostnames "$SLURM_JOB_NODELIST"
 
# 멀티 노드에서는 srun이 각 노드에 분산 실행
srun --nodes=$NNODES --ntasks=$WORLD_SIZE --ntasks-per-node=$GPUS_PER_NODE \
--cpus-per-task=4 \
python -m torch.distributed.run \
--nproc_per_node=$GPUS_PER_NODE \
--master_addr=$MASTER_ADDR --master_port=$MASTER_PORT \
--nnodes=$NNODES --node_rank=$SLURM_NODEID \
train_ddp.py --epochs 50 --batch-size 64
간단히 보기

포인트:

  • SLURM_JOB_NODELIST로 마스터 노드 주소를 정하고, srun이 각 노드에 프로세스를 분산합니다.
  • IB(Infiniband) 환경이면 NCCL_SOCKET_IFNAME를 mlx5_x운영 가이드에 맞게 지정하세요.
  • 환경에 따라 GLOO/NCCL 백엔드·포트·인터페이스 값을 조금씩 바꿔야 할 수 있습니다.

 

 

 


4) 자원·시간·로그 관리 팁 (초보용 Check 리스트)

  • 시간 초과: -t를 넉넉히(예: -t 12:00:00)
  • 로그 폴더: logs/를 미리 생성
  • 메모리: --mem=xxG를 충분히
  • CPU 코어: Dataloader가 많으면 -c를 늘리기
  • 우선순위/파티션: 운영 정책에 따라 다른 파티션/큐 존재
  • 환경 모듈: module load cuda/12.1, module load nccl 등(클러스터 정책에 따름)
  • 의존성: requirements.txt로 관리하고 pip/conda로 설치

 

 

 


5) 제출·모니터링·취소 간단 명령어

 
 
 
 
Shell
 
# 제출
sbatch run.sh
 
# 내 잡 상태 확인
squeue -u $USER
 
# 잡 상세 정보(자원 배정, 노드 등)
scontrol show job <JOB_ID>
 
# 취소
scancel <JOB_ID>
 
# 현재 노드 정보
sinfo
간단히 보기

6) 자주 나는 오류와 빠른 해결

  • Pending 상태가 길다
    • 자원이 없음/파티션 제한 → 다른 파티션 시도, 자원 요청 축소
    • 시간 너무 길게 요청 → -t를 줄여서 큐 통과 유도
    • 계정/쿼터 제한 → 관리자 문의
  • NCCL/GDR/통신 오류
    • 네트워크 인터페이스 이름 불일치 → NCCL_SOCKET_IFNAME 점검
    • 포트 충돌 → MASTER_PORT 다른 값으로
    • 방화벽/보안 정책 → 운영 가이드/관리자 확인
  • 메모리 부족(Out of Memory)
    • --mem/-c/batch-size 조정
    • 데이터 로더 num_workers 조절

 

 

 

반응형

댓글