Backfilling이 중요한 이유
HPC와 GPU 클러스터에서는 대규모 Job이 큐에 쌓이면서 자원 대기 시간이 길어지는 경우가 많습니다. 예를 들어 128개의 GPU가 필요한 Job이 제출되면, 스케줄러는 필요한 모든 자원이 확보될 때까지 기다려야 합니다. 그런데 이 대기 시간 동안 일부 노드는 비어 있는 상태로 남아 있게 됩니다.
이때 작은 Job이나 짧은 Job을 먼저 채워 넣어 자원을 활용하는 기법이 바로 Backfilling입니다. 즉, “큰 Job이 시작되기 전 남는 자원과 시간을 활용하여 다른 Job을 끼워 넣는 방식”입니다. 이를 통해 자원 활용률을 높이고, 전체 클러스터 처리량(Throughput)을 극대화할 수 있습니다.
Backfilling의 기본 원리
Backfilling의 핵심 개념은 우선순위 Job 보장 + Idle 자원 채우기입니다. 스케줄러는 대규모 Job을 큐의 최상단에 두고, 이 Job이 실행 가능한 시점을 예측합니다. 이후 그 시간까지 다른 Job을 끼워 넣어 실행하되, 우선순위 Job의 시작이 지연되지 않도록 조건을 설정합니다.
이 구조 덕분에 대규모 Job은 보장된 시간에 실행되면서, 소규모 Job도 병렬적으로 큐를 소화할 수 있습니다. Slurm, PBS, LSF 같은 주요 HPC 스케줄러는 모두 Backfilling을 지원하며, GPU 클러스터 운영에서 표준처럼 활용됩니다.
Slurm에서의 Backfilling
Slurm은 backfill 플러그인을 통해 Backfilling을 지원합니다. 기본적으로 slurm.conf에 SchedulerType=sched/backfill을 설정하면 활성화됩니다.
# slurm.conf 예시
SchedulerType=sched/backfill
SelectType=select/cons_res
SelectTypeParameters=CR_Core_Memory
Slurm은 주기적으로 스케줄링 시뮬레이션을 수행하여, 우선순위 Job의 예상 시작 시간을 계산합니다. 그리고 해당 시간까지 실행 가능한 Job을 찾아 즉시 실행합니다.
운영자는 sdiag 명령으로 Backfilling 동작을 확인할 수 있습니다.
# Backfilling 동작 확인
sdiag | grep -A 5 Backfilling
Backfilling과 Idle 자원 활용
Backfilling의 가장 큰 장점은 Idle 자원 최소화입니다. 예를 들어, 128GPU Job이 대기 중인데 현재 64GPU만 비어 있다면, 남는 자원에 소규모 2~4GPU Job을 넣어 자원을 낭비하지 않습니다.
또한 Backfilling은 작은 Job의 응답 속도 개선에도 기여합니다. 큰 Job이 대기열을 장악하는 상황에서도, 소규모 Job이 빠르게 끼어들어 실행될 수 있어 사용자 만족도가 올라갑니다.
실제 적용 사례
- 대학 슈퍼컴퓨터 센터: 대규모 MPI Job이 큐를 독점하는 경우가 많았으나 Backfilling을 활성화한 후, 전체 자원 활용률이 70%에서 95%로 개선되었습니다.
- AI 연구소: LLM 학습 Job이 수천 개의 GPU를 점유하는 동안, 실험적 Inference Job과 전처리 Job을 Backfilling으로 운영하여 Idle 시간을 거의 없앴습니다.
- 제조 기업 HPC: CFD(Computational Fluid Dynamics) 시뮬레이션 Job과 단기 분석 Job을 혼합하여 운영할 때, Backfilling을 통해 소규모 Job의 대기 시간을 크게 줄였습니다.
장점과 단점
장점
- Idle 자원 최소화로 전체 클러스터 효율이 극대화됩니다.
- 소규모 Job의 응답성이 개선되어 사용자 만족도가 향상됩니다.
- 운영자가 별도의 수동 조정을 하지 않아도 자동 최적화가 가능합니다.
단점
- 스케줄러가 지속적으로 시뮬레이션을 수행하기 때문에 오버헤드가 발생할 수 있습니다.
- 예측된 Job 실행 시간이 부정확하면 우선순위 Job이 지연될 위험이 있습니다.
- 공정성 문제(Fairness) 조율이 필요합니다. 일부 사용자는 Backfilling 덕분에 빠르게 실행되지만, 다른 Job은 상대적으로 더 지연될 수 있습니다.
실무 팁과 주의사항
- Backfilling 주기 조정
- Slurm에서는 Backfilling 주기를 SchedulerParameters=bf_interval=<초> 옵션으로 조정할 수 있습니다. 너무 짧으면 오버헤드가 크고, 너무 길면 기회를 놓칠 수 있으므로 클러스터 크기에 맞게 조정하는 것이 중요합니다.
- QoS 및 Fairshare와 병행
- Backfilling은 효율성을 극대화하지만 공정성을 보장하지는 않습니다. 따라서 QoS와 Fairshare 정책을 함께 사용해 사용자 불만을 줄여야 합니다.
- 작은 Job 우선 정책 설정
- 짧은 Job을 우선적으로 Backfilling 대상으로 설정하면 Idle 자원을 빠르게 메울 수 있습니다.
- 모니터링 필수
- sdiag, squeue, Grafana 대시보드를 통해 Backfilling 성과를 주기적으로 점검해야 합니다. Idle 자원이 실제로 줄어들고 있는지, 대규모 Job이 지연되지 않는지 확인하는 과정이 필요합니다.
정리하며
Backfilling은 HPC/GPU 클러스터 운영에서 자원 효율성을 극대화하는 핵심 기법입니다. Idle 자원을 최소화하면서도 대규모 Job의 실행 보장을 유지할 수 있기 때문에, 대부분의 HPC 환경에서 표준적으로 사용됩니다. 다만, Fairness 문제와 예측 정확도 한계를 고려해 QoS 및 모니터링 체계를 병행하는 것이 바람직합니다.
운영자는 Backfilling 정책을 클러스터 규모, 워크로드 특성, 사용자 기대치에 맞게 조정해야 하며, 이를 통해 클러스터 전체 생산성을 크게 끌어올릴 수 있습니다.