반응형

Slurm을 사용하여 클러스터에서 작업을 스케줄링할 때, Slurm이 아닌 foreground에서 실행되는 작업이 있을 수 있습니다. 이럴 경우, Slurm이 해당 자원을 사용하지 않도록 강제로 예약하는 방법이 필요합니다. 이를 위해 Slurm의 예약용 더미 작업을 활용할 수 있습니다.

1. Slurm에서 특정 자원 예약하기

Foreground에서 실행되는 작업이 특정 CPU, 메모리, GPU 등의 자원을 사용하고 있다면, Slurm이 해당 자원을 스케줄링하지 못하도록 예약해야 합니다. 가장 간단한 방법은 Slurm의 sbatch --wrap 옵션을 이용하여 sleep 명령어로 더미 작업을 실행하는 것입니다.

sbatch --exclusive --cpus-per-task=16 --mem=32G --gres=gpu:1 --wrap="sleep 86400"

위 명령어는 다음과 같은 의미를 가집니다:

  • --exclusive : 해당 노드의 자원을 Slurm 내 다른 작업과 공유하지 않도록 지정
  • --cpus-per-task=16 : 16개의 CPU를 예약
  • --mem=32G : 32GB의 메모리를 예약
  • --gres=gpu:1 : 1개의 GPU를 예약
  • --wrap="sleep 86400" : 24시간(86400초) 동안 해당 자원을 점유하는 더미 작업 실행

2. 무기한으로 예약하는 방법

위 방법은 24시간 동안만 예약되므로, 더 긴 시간 동안 예약하려면 sleep 시간을 늘리거나 주기적으로 예약을 갱신하는 스크립트를 작성할 수 있습니다.

(1) 무기한 예약하는 방법 (sleep infinity 사용)

sleep infinity를 사용하면 Slurm 작업이 수동으로 종료될 때까지 계속 실행됩니다.

sbatch --exclusive --cpus-per-task=16 --mem=32G --gres=gpu:1 --wrap="sleep infinity"

이렇게 하면 Slurm 작업이 수동으로 취소되기 전까지 계속 자원을 점유하게 됩니다.

(2) Slurm 예약을 자동으로 갱신하는 스크립트

다음과 같은 스크립트를 작성하여 일정 시간마다 Slurm 예약을 갱신할 수 있습니다.

#!/bin/bash
while true; do
    sbatch --exclusive --cpus-per-task=16 --mem=32G --gres=gpu:1 --wrap="sleep 86400"
    sleep 86300  # 24시간마다 예약을 갱신
done

이 스크립트를 실행하면 Slurm이 24시간마다 새로운 예약을 자동으로 생성합니다.

(3) Crontab을 활용한 자동 예약

Crontab을 이용하여 23시간마다 예약을 갱신하는 방법도 있습니다.

crontab -e

그리고 다음 줄을 추가합니다.

0 */23 * * * sbatch --exclusive --cpus-per-task=16 --mem=32G --gres=gpu:1 --wrap="sleep 86400"

이렇게 하면 매 23시간마다 Slurm에 새로운 예약 작업이 제출됩니다.

3. 특정 노드에서만 예약하고 싶을 때

만약 특정 노드에서만 자원을 예약하고 싶다면 --nodelist 옵션을 추가하면 됩니다.

sbatch --exclusive --nodelist=node01 --cpus-per-task=16 --mem=32G --gres=gpu:1 --wrap="sleep 86400"

이 명령어는 node01에서만 자원을 예약합니다.

결론

Slurm을 사용하는 환경에서 foreground에서 실행되는 작업이 있을 경우, 위와 같은 방법으로 자원을 강제 예약할 수 있습니다. sbatch --wrap="sleep 86400" 방식은 간단하고 효과적인 방법이며, 무기한 예약이 필요하다면 sleep infinity를 활용할 수도 있습니다. 또한, cron 또는 스크립트를 이용하여 자동으로 갱신할 수도 있습니다. 이를 통해 Slurm이 불필요하게 자원을 점유하는 문제를 방지하고, 특정 작업을 안정적으로 실행할 수 있습니다.

반응형

+ Recent posts