JPU-Share는 제한된 GPU 자원을 여러 연구실이 공정하게 나누어 사용할 수 있도록 자동화된 배정 시스템을 운영합니다.
이 페이지에서는 GPU가 어떻게 할당되고, 어떤 기준으로 우선순위가 결정되며, 특수한 상황(메모리 부족, 작업 취소 등)에서 어떻게 동작하는지를 설명합니다.
핵심 원칙
최고 성능 우선 배정
가장 좋은 GPU부터 가용 여부를 확인하고 배정합니다. 사용자가 GPU를 선택할 필요 없이, 시스템이 최적의 자원을 자동으로 골라줍니다.
연구실 단위 공정성
GPU 사용량을 연구실(Lab) 단위로 추적하여, 누적 사용량이 적은 연구실이 우선 배정됩니다. 한 연구실이 자원을 독점할 수 없습니다.
자동 장애 대응
GPU 메모리 부족(OOM) 시 더 큰 GPU에서 자동 재시도합니다. 노드 장애 시 해당 노드를 비활성화하고 다른 노드에서 실행합니다.
유휴 자원 활용
연구 작업이 없는 GPU에서는 LLM 추론 서비스가 자동 배포됩니다. 연구 작업이 들어오면 LLM이 즉시 양보합니다.
GPU TIERS
GPU 티어 시스템
플랫폼의 GPU는 티어(Tier) 단위로 관리됩니다.
각 티어는 GPU 모델, VRAM, 연산 성능(TFLOPS)이 다르며, 성능 순위(sort_order)에 따라 높은 티어부터 배정됩니다.
현재 GPU 티어
GPU
VRAM
수량
CPU/GPU
RAM/GPU
우선순위
NVIDIA RTX 4090
24 GB
2장
10 코어
60 GB
높음 (우선 배정)
NVIDIA RTX 3080 Ti
12 GB
6장
4 코어
15 GB
보통
NVIDIA RTX Pro 6000
96 GB
2장
TBD
TBD
높음 (대형 모델 전용)
데이터 기반 확장: 새로운 GPU가 추가되면 티어 테이블에 행을 추가하는 것만으로 시스템에 반영됩니다. 코드 수정이 필요 없습니다.
배정 흐름
작업이 제출되면, 스케줄러가 5초 간격으로 다음을 수행합니다:
모든 활성 티어를 성능 순(높은 순)으로 정렬
각 티어의 Slurm 파티션에서 유휴 GPU 수를 조회
유휴 GPU가 있는 티어 중 가장 좋은 티어에 배정
모든 티어가 사용 중이면 대기열에서 대기
RTX 4090 유휴?YES → 배정
4090 없음3080 Ti 유휴?YES → 배정
모두 사용 중대기열에서 대기
SCHEDULING
배정 정책
스케줄러는 풀 스캔(Pool-Scan) 방식으로 동작합니다. 매 주기(5초)마다 전체 GPU 풀을 확인하고, 대기 중인 작업 중 가장 우선순위가 높은 작업을 가장 좋은 GPU에 배정합니다.
작업 생명주기
제출개인 대기열글로벌 대기열GPU 배정실행완료
상태
위치
설명
USER_QUEUE_WAIT
개인 대기열
동시 실행 한도 초과 시 개인 큐에서 대기
GLOBAL_QUEUE_WAIT
글로벌 대기열
GPU 배정 대기 중 (스케줄러가 여기서 작업을 선택)
ASSIGNED
Slurm
GPU가 배정되어 실행 준비 중
RUNNING
Slurm
GPU에서 실행 중
ESCALATION_WAIT
글로벌 대기열
OOM 후 더 큰 GPU 대기 중
스케줄러 주기
작업
주기
설명
스케줄러 (배정)
5초
대기 작업을 유휴 GPU에 배정
리콘실러 (상태 동기화)
10초
Slurm 상태를 DB에 반영
큐 스윕 (승격)
60초
개인 대기열 → 글로벌 대기열 승격
FAIR-SHARE
공정성 정책 (Fair-Share)
GPU 배정의 우선순위는 연구실(Lab) 단위 누적 사용량으로 결정됩니다.
같은 시점에 여러 연구실의 작업이 대기 중이라면, 누적 사용량이 가장 적은 연구실의 작업이 먼저 배정됩니다.
사용량 계산
사용량은 GPU를 점유한 시간 전체를 기준으로 계산됩니다 — 잡이 실제로 실행된 시간뿐만 아니라, 멀티 GPU 잡이 추가 GPU를 기다리며 일부 GPU를 선점하고 있던 시간도 포함됩니다.
2장을 30분 실행 + 1장을 10분 선점했다면 총합 = 297,360 + 49,560 = 346,920 TFLOP-s.
Lazy 가산: 사용량은 잡이 진행되는 동안에는 lab usage에 가산되지 않고, 잡이 어떤 형태로든 종료되는 시점(정상 종료, R3 강제 해제, cancel 등)에 한꺼번에 가산됩니다. 이 정책은 자기 잡의 reservation 비용이 자기 lab을 1순위에서 밀어내는 자살적 자기교정을 방지합니다. 자세한 산정 방식과 시점은 멀티 GPU 정책을 참고하세요.
반감기 소멸 (Half-Life Decay)
누적 사용량은 시간이 지나면 자동으로 감소합니다.
반감기는 1주일이며, 1주일이 지나면 사용량이 절반으로 줄어듭니다.
감쇠된 사용량 = 누적 사용량 × 0.5 ^ (경과 시간 / 1주일)
이 방식의 장점:
최근 GPU를 많이 쓴 연구실은 우선순위가 낮아짐
오랫동안 안 쓴 연구실은 자연스럽게 우선순위 회복
사용량이 무한히 누적되지 않아 장기 불이익 없음
OOM 면제: GPU 메모리 부족(OOM)으로 실패한 작업은 시스템 귀책이므로 사용량에 산정되지 않습니다.
배정 우선순위 결정 과정
글로벌 대기열의 모든 대기 작업을 조회
각 작업이 속한 연구실의 감쇠된 누적 사용량을 계산
사용량이 가장 적은 연구실의 작업을 선택
선택된 작업을 가장 좋은 유휴 GPU에 배정
소속 없는 작업: 연구실에 배정되지 않은 사용자의 작업은 사용량 0으로 간주되어 높은 우선순위를 받습니다. 모든 사용자는 연구실에 소속되는 것을 권장합니다.
QUEUE SYSTEM
대기열 시스템
대기열은 2단계 구조로 구성됩니다. 개인 대기열에서 동시 실행 한도를 관리하고, 글로벌 대기열에서 GPU 배정을 기다립니다.
2단계 대기열
개인 대기열 (User Queue)
각 사용자별로 독립적인 대기열입니다. 동시 실행 한도를 초과하면 여기서 대기합니다.
기본 동시 실행 한도: 6개
관리자가 사용자별로 1~100 범위에서 조절 가능
한도 이내의 작업은 즉시 글로벌 대기열로 이동
글로벌 대기열 (Global Queue)
GPU 배정을 기다리는 모든 작업이 여기에 위치합니다. 스케줄러가 Fair-Share 기준으로 여기서 작업을 선택합니다.
스케줄러가 5초마다 확인
Fair-Share 우선순위로 선택
OOM 후 재시도 작업도 여기서 대기
동시 실행 슬롯
다음 상태의 작업이 동시 실행 슬롯을 차지합니다:
상태
슬롯 차지
GLOBAL_QUEUE_WAIT (GPU 대기)
O
ASSIGNED (배정됨)
O
RUNNING (실행 중)
O
ESCALATION_WAIT (OOM 재시도 대기)
O
CANCEL_REQUESTED (취소 처리 중)
O
USER_QUEUE_WAIT (개인 대기)
X
승격 (Promotion)
작업이 완료되면 슬롯이 하나 비게 됩니다. 시스템은 자동으로 해당 사용자의 개인 대기열에서 다음 작업을 글로벌 대기열로 승격시킵니다.
OOM HANDLING
GPU 메모리 부족 (OOM) 처리
작업이 GPU 메모리 부족(Out of Memory)으로 실패하면, 시스템이 자동으로 더 큰 GPU에서 재시도합니다.
사용자가 직접 재제출할 필요가 없습니다.
재시도 시 JOB_ATTEMPT 환경변수가 증가합니다. 이를 활용해 체크포인트에서 학습을 재개할 수 있습니다.
사용량 면제: OOM으로 실패한 실행은 연구실 사용량에 산정되지 않습니다. 시스템이 적절한 GPU를 찾는 과정이므로 사용자에게 불이익이 없습니다.
MULTI-GPU
멀티 GPU 할당 정책
분산 학습이나 큰 모델 학습처럼 여러 장의 GPU가 필요한 작업도 같은 큐에서 공정하게 처리됩니다.
이 섹션은 우리가 채택한 정책을 — 핵심 원칙부터 미묘한 케이스까지 — 빠짐없이 설명합니다.
정책 설계 과정에서 검토한 옵션과 트레이드오프 전체는 설계 노트(2026-04-10)에서 확인할 수 있습니다.
한 문장 요약
전역 큐를 fair-share로 정렬하고, 1순위 잡이 멀티 GPU여서 매칭이 안 되면 가용한 GPU를 선점해 추가 GPU를 기다린다.
선점된 GPU 위에서 LLM 백필이 계속 동작하므로 GPU는 한순간도 놀지 않는다.
그동안의 점유 시간은 잡 종료 시점에 fair-share 사용량으로 정직하게 가산된다.
용어
용어
정의
식별자
GPU
1 GPU 디바이스 (기본 단위)
(node_name, gpu_index)
placement
같은 노드 + 같은 GPU 모델로 묶인 GPU들의 집합. 멀티 GPU 잡이 단일 단위로 받아야 하는 그룹
(node_name, tier_id)
placement는 별도 테이블이 아니라 gpu_resources를 (노드, 티어)로 GROUP BY 해서 자동 도출되는 derived view입니다.
노드를 추가/제거하면 자동 반영됩니다. 두 가지 속성 — capacity(정적 GPU 총수)와
idle(동적, 비어있는 GPU 수) — 을 가집니다. LLM 백필이 점유 중인 GPU도 idle로 봅니다(양보 가능하기 때문).
예시: gpu-4090x2 노드에 4090×2 → placement 1개 (capacity=2).
가상의 노드에 4090×4 + 5090×4 → placement 2개 (각각 capacity=4).
요청 가능 범위 — 모든 사용자에게 동일
잡 제출 시 num_gpus는 1~8 사이여야 합니다.
실제 배정은 매칭되는 placement의 capacity와 티어의 max_gpus를 넘지 못합니다.
현재 RTX 4090 / RTX 3080 Ti 모두 max_gpus = 2이므로 사실상 한 잡당 최대 2장입니다.
역할에 따른 차별 없음: 사용자 역할(Student / Professor / Admin)은 조직 관리용 개념입니다 —
연구실 멤버십, 멤버 추가/제거, 시스템 운영 권한 등에만 적용됩니다.
GPU 자원 사용 권한에는 역할에 따른 차이가 없습니다.
모든 사용자가 동일한 num_gpus 범위에서 잡을 제출하고, 동일한 fair-share 정책으로 매칭됩니다.
멀티 GPU 잡의 우선순위는 오직 연구실 누적 사용량(lab.cumulative_usage)으로만 결정됩니다.
잡의 매칭 조건 (2단계)
조건
정의
언제 평가
fit
잡이 이 placement에서 원리상 실행 가능: placement.tier.sort_order ≥ job.minimum_tier AND placement.capacity ≥ job.num_gpus
잡 제출 시 한 번 (정적)
available
지금 즉시 dispatch 가능: fit AND placement.idle ≥ job.num_gpus
매 5초 dispatch 주기 (동적)
잡 제출 시 fit한 placement가 하나도 없으면 즉시 거부합니다 (422 NO_FIT_PLACEMENT).
예를 들어 num_gpus=4를 요청했는데 모든 placement의 capacity가 2라면, 영원히 큐에서 못 빠져나오는 상황을 사전에 차단합니다.
큐 — 단일 전역, 매 주기 재계산
글로벌 대기열은 딱 하나입니다. GPU별/노드별/티어별/multi-single 분리 큐가 아닙니다.
모든 잡이 — num_gpus가 1이든 2든 8이든 — 같은 한 줄에 들어가서 fair-share로 정렬됩니다:
ORDER BY lab.cumulative_usage ASC, queue_entered_at ASC
이 정렬은 매 5초 dispatch 주기마다 다시 계산됩니다.
그래서 "1순위" 같은 표현은 잡의 고정 속성이 아니라 지금 이 주기에서의 위치를 의미합니다.
잡들이 들어오고 나가고, 사용량이 누적되면 다음 주기에 순위가 바뀔 수 있습니다.
[글로벌 대기열, 어느 한 주기]
├─ jobA (lab=BCG, num_gpus=2, cumulative=24k) ← 1순위
├─ jobB (lab=KDG, num_gpus=1, cumulative=30k)
├─ jobC (lab=OSL, num_gpus=2, cumulative=116k)
└─ jobD (lab=OSL, num_gpus=1, cumulative=116k)
핵심 원칙 — 큐 순서를 절대 어기지 않는다
JPU-Share의 매칭 정책은 한 줄로 요약됩니다:
fair-share 1순위 잡은 절대 다음 차례를 양보하지 않는다.
1순위 잡이 멀티 GPU여서 가용한 placement가 부족해도, 뒤에 있는 싱글 잡이 새치기해서 먼저 들어오는 일은 없습니다.
대신 1순위 잡은 가용 GPU를 선점(reservation)해두고 나머지 GPU가 모일 때까지 기다립니다.
Dispatch 알고리즘 (매 5초)
1. placement별 (capacity, idle) 조사
- 활성 reservation이 점유한 GPU는 idle에서 차감
2. 잡을 fair-share 키로 정렬
3. 1순위부터 잡을 차례로 검사:
(a) 잡의 fit placement 중 available한 게 있으면:
→ 즉시 dispatch
→ 만약 이 잡이 다른 placement에서 reservation 보유 중이었으면
그 reservation 해제 (★ swap — 더 빠른 경로로 점프)
(b) available 없음 + 잡이 reservation 보유:
→ 같은 placement의 추가 idle을 reservation에 흡수
→ 충족되면 (a)로 복귀하여 dispatch
(c) available 없음 + reservation 미보유 + 잡이 1순위 + num_gpus ≥ 2:
→ 새 reservation 시작
→ placement 선택: tier sort_order DESC, 같으면 idle DESC
4. 다음 순위 잡으로 진행 (이미 사용된 GPU는 빼고 계산)
핵심은 (a)의 swap입니다. 매 주기마다 "지금 즉시 dispatch 가능한 placement가 있는지"를 가장 먼저 확인합니다.
그래서 placement A에서 1장 reserve 중인데 placement B에서 갑자기 2장 동시에 free되는 시나리오가 자연스럽게 처리됩니다 —
다음 주기에 (a)가 B를 발견하고 그쪽으로 dispatch, A의 reservation은 자동 해제됩니다.
Reservation 규칙 5조
ID
규칙
R1
reservation은 num_gpus ≥ 2 잡에만 적용. 싱글 GPU 잡은 idle 1장 보이는 즉시 dispatch만
R2
reservation 시작 권한은 fair-share 1순위만. 2순위 이하 멀티 잡은 권한 없음 (그냥 대기)
R3
reservation 잡이 외부 사용량 변동(다른 잡 종료, 다른 lab의 새 잡 등)으로 1순위 자리에서 밀려나면 즉시 강제 해제. 그때까지의 선점 시간은 잡 종료 시점에 lab usage로 가산
R4
잡당 동시 reservation 1개만. 한 번 잡은 placement는 변경 불가 (단, swap rule (a)로 다른 placement에서 dispatch는 가능)
R5
노드 down 등으로 placement가 사라지면 reservation 강제 해제. 잡은 GLOBAL_QUEUE_WAIT로 복귀
사용량 가산 — Lazy 정책
Reservation 진행 중에는 lab의 cumulative_usage에 아무것도 가산하지 않습니다.
가산은 잡이 어떤 형태로든 종료되는 시점에 한꺼번에 일어납니다. 이 정책을 "Lazy 가산"이라고 부릅니다.
잡 종료 사건
가산되는 비용
dispatch 성공 → 정상 종료
선점 비용 + 실행 비용 (전부)
R3 강제 해제 (1순위에서 밀림)
선점 비용만
Cancel (reservation 중)
선점 비용만
Placement 사라짐 (R5)
선점 비용만
선점 비용 = (선점 GPU 수) × (선점 시간 초) × (티어 TFLOPS)
실행 비용 = (실행 GPU 수) × (실행 시간 초) × (티어 TFLOPS)
핵심 invariant: 잡이 점유한 모든 GPU-second는 빠짐없이 lab usage로 가산됩니다.
다만 가산 시점이 lazy(잡 종료 시점)일 뿐입니다.
예시 — num_gpus=2 잡이 4090 1장을 10분 선점한 뒤 추가 1장이 들어와 30분간 정상 실행되었다면:
단계
점유 GPU
시간
TFLOPS
사용량 (TFLOP-s)
선점
1장
10분 (600초)
82.6
49,560
실행
2장
30분 (1,800초)
82.6
297,360
잡 종료 시점에 한꺼번에 가산
346,920
R3 시나리오 예시 — internal vs external trigger
가장 미묘한 케이스입니다. Lazy 가산의 핵심은 자기 잡의 reservation 비용으로 자기가 1순위에서 밀려나는 자살적 자기교정을 차단하는 것입니다.
1순위에서 밀리는 일은 오직 외부 사용량 변동에 의해서만 발생해야 합니다.
T+0: 잡X (BCG, num_gpus=2) reservation 시작. 1순위. 1/2장 선점.
잡Y (BCG, num_gpus=1, 다른 사용자) 별도로 RUNNING 중.
BCG.cumulative_usage = 24k
T+5분: 잡Y 정상 종료 → record_job_usage(Y) → BCG.cumulative_usage += 잡Y 비용
→ BCG = 32k. 다른 lab KDG (28k) < BCG. KDG가 1순위로 올라옴.
T+5분+ε: 다음 dispatch 주기. 잡X는 2순위로 강등.
→ R3 발동: 잡X reservation 강제 해제
→ 선점 비용 (1장 × 5분 × 82.6 ≈ 24,780) BCG에 가산
→ 잡X는 GLOBAL_QUEUE_WAIT로 복귀
T+15분: KDG 잡들 진행/종료로 다시 BCG가 1순위 됨
→ 잡X 다시 reservation 시작 가능 (처음부터)
이게 사용자 직관과 일치합니다 — 내가 한 일 때문에 밀리는 게 아니라 다른 사람들의 활동 때문에 밀립니다.
Reservation 자체는 lab usage 변동을 만들지 않으므로, 자기 잡의 reservation 때문에 자기가 1순위에서 떨어지는 일은 발생하지 않습니다.
이 정책이 보장하는 것
Starvation 없음 — 1순위 잡은 어떤 경우에도 양보하지 않으므로, 멀티 GPU 잡이 영원히 밀리는 상황이 발생하지 않습니다
남용 자기교정 — 같은 lab이 멀티 GPU 잡을 연속해서 던지면 잡 종료 시점마다 사용량이 lab에 누적되어 다른 lab에게 차례가 넘어갑니다
큐 순서가 직관과 일치 — fair-share 점수가 낮은 lab의 잡이 먼저 처리되며, multi/single 구분으로 인한 새치기가 없습니다
이종 placement 자동 처리 — 한 노드에 여러 GPU 모델이 있어도 placement가 자동으로 분리되어 매칭됩니다
리소스 비례 할당 (CPU / RAM)
멀티 GPU 잡은 GPU 수에 비례해서 CPU와 RAM도 함께 점유합니다.
GPU 1장당 충분한 데이터로더/메모리를 보장하기 위한 설계입니다.
요청 GPU 수
RTX 4090 (CPU 10 / RAM 60GB per GPU)
RTX 3080 Ti (CPU 4 / RAM 15GB per GPU)
1장
CPU 10코어 + RAM 60GB
CPU 4코어 + RAM 15GB
2장
CPU 20코어 + RAM 120GB
CPU 8코어 + RAM 30GB
의도된 한계
이종 placement 분산 학습 불가: 멀티 GPU 잡은 단일 placement 안에서만 실행됩니다. 한 노드에 4090×4 + 5090×4가 있어도 num_gpus=8은 받을 수 없습니다 (각 placement는 capacity=4). 분산 학습은 동종 GPU 한정입니다.
2순위 이하 멀티 GPU 잡의 latency: 1순위가 reservation 중이면 2순위 멀티 잡은 reservation 권한 없이 그냥 기다립니다. 1순위가 dispatch되어야 자기 차례가 옵니다. starvation은 아니지만 latency는 길 수 있습니다.
설계 노트 — 우리가 고민한 것들
이 정책은 단순히 떠올린 게 아니라 여러 트레이드오프를 거쳐 결정된 것입니다. 핵심 결정과 그 이유를 짧게 정리합니다 — 전체 논의 흐름은 설계 노트(2026-04-10)를 참고하세요.
결정
대안
왜 이 선택?
단일 전역 큐
tier별 큐 / multi-single 분리 큐
단순함. 정렬 키는 fair-share 하나로 충분. 분리 큐는 starvation/관리 복잡도 폭증
placement 단위 매칭
노드 단위 / GPU 단위
이종 GPU 노드를 자연스럽게 처리. 멀티 GPU의 단일 노드 제약과 정확히 일치. 노드 분산 false positive 자동 해결
1순위 잡 절대 양보 안 함 (선점)
head-of-line skip (multi 잡 건너뛰고 single 우선)
skip은 멀티 GPU starvation의 위험이 큼. 큐 순서가 직관과 일치하는 게 운영자/사용자 모두에게 명확함
선점된 GPU 위에서 LLM 계속 동작
선점 = GPU idle 유지
LLM 백필이 있는 우리 환경에서는 utilization 손실 0이 자동으로 보장됨. reservation의 가장 큰 약점이 사라짐
Lazy 가산 (잡 종료 시점)
Eager 가산 (매 주기 incremental)
Eager는 자기 잡 reservation이 자기 lab usage를 끌어올려 자기를 1순위에서 밀어내는 자살적 자기교정이 발생. 사용자 직관과 어긋남. Lazy로 가면 외부 변동에 의한 R3만 발생, 빈도 자연 감소
multi-GPU 부담 인정
multi 보조 / 선점 비용 할인
multi 잡이 single보다 약간 비싸지는 건 클라우드 가격 모델과 일관됨. 정직한 청구권 소비. 보조는 매직 넘버를 만들고 인센티브를 왜곡함
LLM 즉시 종료, timeout 없음
30초 timeout 후 강제 종료
LLM 라우터가 종료 진행 중 모델로의 dispatch 차단을 자체 처리. 우리 쪽 코드가 단순해지고 책임 분리도 명확해짐
핵심 가치: 단순함과 정직함. 새 enum 0개, 새 테이블 0개, 새 worker loop 0개로 구현됩니다.
Job 테이블에 컬럼 4개만 추가하면 됩니다.
LLM BACKFILL
LLM 백필 (유휴 GPU 활용)
연구 작업이 없는 유휴 GPU에서는 LLM(대규모 언어 모델) 추론 서비스가 자동으로 배포됩니다.
이를 통해 GPU가 놀지 않고 항상 활용됩니다.
선점 (Preemption) 정책
연구 작업과 LLM의 관계는 명확합니다:
연구 작업이 항상 우선 — GPU가 필요하면 LLM이 즉시 양보합니다
LLM 서비스는 Slurm의 preemptible 파티션에서 실행됩니다
연구 작업이 제출되면, 스케줄러가 LLM이 점유한 GPU를 회수하고 연구 작업에 배정합니다
연구 작업이 끝나면 LLM이 다시 자동 배포됩니다
GPU 유휴LLM 자동 배포연구 작업 도착LLM 양보연구 작업 실행
사용자 영향 없음: LLM 백필은 완전히 자동이며 연구 작업의 대기 시간에 영향을 주지 않습니다. 연구 작업이 들어오면 LLM은 지연 없이 양보합니다.
선점된 GPU도 활용: 멀티 GPU 잡이 추가 GPU를 기다리며 일부 GPU를 선점한 상태에서도, 그 GPU 위에서는 LLM 백필이 계속 동작합니다. 선점은 "다른 연구 잡 배정 금지" 마크일 뿐이고, LLM은 양보 가능하므로 GPU는 한순간도 놀지 않습니다. 이것이 멀티 GPU 정책에서 utilization 손실이 발생하지 않는 이유입니다.
즉시 종료 정책: reservation이 충족되어 dispatch 시점이 되면, 우리 쪽에서는 그 placement의 LLM 컨테이너에 즉시 종료 명령을 보내고 곧바로 sbatch를 실행합니다. LLM 양보 timeout은 두지 않습니다 — 종료 진행 중인 LLM 모델로 신규 dispatch가 가지 않도록 하는 것은 LLM 라우터의 책임입니다. 책임 분리로 우리 쪽 스케줄러 코드가 단순해집니다.
ISOLATION & SECURITY
격리와 보안
모든 작업은 안전하게 격리된 환경에서 실행됩니다.
컨테이너 격리
모든 작업은 Apptainer(Singularity) 컨테이너 내부에서 실행됩니다
호스트 시스템에 직접 접근할 수 없습니다
각 사용자는 고유한 Unix UID로 실행되어, 다른 사용자의 프로세스나 파일에 접근할 수 없습니다
네트워크 격리
작업 실행 중 외부 네트워크가 완전히 차단됩니다
pip install, wget, wandb 원격 로깅 등 불가
필요한 패키지는 워크스페이스 빌드 시 미리 설치 (빌드 시에만 네트워크 허용)
외부 데이터는 관리자에게 요청하여 공유 경로에 사전 배치
스토리지 격리
출력 디렉토리(JOB_OUTPUT_DIR)는 작업별로 분리됩니다
NFS 공유 스토리지에서 UID 기반 파일 소유권 분리
다른 사용자의 출력 파일에 접근할 수 없습니다
작업 제한
항목
제한
기본 실행 시간
최대 24시간 (기본값)
최소 실행 시간
60초
최대 실행 시간
72시간
소스 코드 (zip)
최대 500 MB, 해제 후 10 GB, 파일 수 10,000 개
동시 실행 (기본)
6개
작업 취소
사용자가 작업을 취소하면 다음 절차로 처리됩니다:
SIGTERM 신호 전송 (정상 종료 요청)
30초 대기 (프로세스가 체크포인트를 저장할 시간)
여전히 실행 중이면 5분 후 SIGKILL 강제 종료
MAINTENANCE MODE
점검 모드 (Maintenance Mode)
NFS 볼륨 교체, Slurm controller 점검 등 전역 운영 작업이 필요할 때 관리자가 시스템을 점검 모드로 전환합니다.
점검 중에는 새로운 작업 제출이 차단되고, 웹 콘솔 상단에 배너가 표시됩니다.
상태 단계
DRAINING: 새 작업 제출 차단. 실행 중인 사용자 작업은 정상 완료. LLM backfill은 계속 동작하여 유휴 GPU 활용.
BACKFILL_RECOVERY: 사용자 작업이 모두 종료된 후 LLM backfill 자동 회수.
ACTIVE: backfill 완료 후 진입. 이 시점부터 운영 작업 수행 가능.
NORMAL 복귀: 관리자가 점검 종료 시 이전 대기 작업이 우선순위대로 자동 실행됩니다.
사용자 영향
작업 제출 (POST /v1/jobs)은 점검 중 503 SERVICE_MAINTENANCE 응답을 반환합니다.
기존 작업 취소 (POST /v1/jobs/{id}/cancel)는 DRAINING 단계에서 허용됩니다.
작업·파일·워크스페이스 조회 등 모든 GET 요청은 점검 중에도 정상 동작합니다.
점검 창구: 웹 콘솔 상단 배너 + GET /v1/maintenance/status 엔드포인트 (익명 허용).