본문으로 건너뛰기

Orca의 핵심 원리를 구현한 tinyorca: 반복 수준 스케줄링과 선택적 배칭 이해하기

LLM 서빙 최적화 기법인 Orca의 반복 수준 스케줄링과 선택적 배칭을 tinyorca 구현을 통해 상세히 분석한다.

섹션별 상세

정적 배칭은 배치 내 가장 긴 요청이 완료될 때까지 다른 요청들이 GPU 자원을 점유한 채 대기하게 만들어 처리량을 저하시킨다. (Problem)
tinyorca의 전체 시스템 아키텍처 다이어그램
DiagramEndpoint, RequestPool, OrcaScheduler, OrcaEngine으로 구성된 tinyorca의 구조를 보여준다. 요청이 들어와서 토큰화되고 스케줄링을 거쳐 엔진에서 실행되는 전체 흐름을 시각화한다.
정적 배칭에서 발생하는 유휴 슬롯 시각화
Diagram서로 다른 길이의 요청들이 묶였을 때, 짧은 요청이 먼저 끝나더라도 긴 요청이 끝날 때까지 GPU 자원이 낭비되는 문제를 보여준다.
반복 수준 스케줄링은 매 반복(Iteration)마다 스케줄러가 개입하여 완료된 요청을 즉시 제거하고 대기 중인 새 요청을 투입한다. (Solution)
python
def select(self) -> list[Request]:
    batch = []
    for request in self.request_pool.arrival_ordered_requests():
        if len(batch) == self.max_batch_size:
            break
        if request.state is RequestState.WAITING:
            if request.max_tokens > self.n_slots:
                raise ValueError(...)
            new_n_rsrv = self.n_rsrv + request.max_tokens
            if new_n_rsrv > self.n_slots:
                break
            self.n_rsrv = new_n_rsrv
            request.initiate()
        batch.append(request)
    return batch

FCFS(선입선출) 방식으로 요청을 선택하고 KV 캐시 슬롯을 예약하는 스케줄러 로직

반복 수준 스케줄링의 작동 방식
Diagram매 반복 단계마다 완료된 요청이 즉시 나가고 새로운 요청이 들어오는 과정을 보여주며, 정적 배칭 대비 자원 활용도가 어떻게 높아지는지 설명한다.
선택적 배칭은 레이어 노름이나 QKV 투영과 같은 토큰별 연산은 전체 배치를 평탄화하여 수행하고, 어텐션 연산 시에만 요청별로 분리하여 처리한다. (Mechanism)
python
def build_flat_batch(self, requests: list[Request]) -> FlatBatch:
    input_token_ids = []
    spans = []
    // ... (중략)
    for request in requests:
        if not request.output_ids:
            step_token_ids = request.prompt_ids
        else:
            step_token_ids = (request.output_ids[-1],)
        step_len = len(step_token_ids)
        spans.append(RequestSpan(request.request_id, flat_start, flat_start + step_len))
        input_token_ids.extend(step_token_ids)
        flat_start += step_len

서로 다른 길이의 요청들을 하나의 평탄화된 토큰 스트림으로 결합하는 과정

선택적 배칭의 연산 흐름도
Diagram토큰별 연산은 평탄화된 배치로 수행하고, 어텐션 연산 시에만 각 요청의 KV 캐시에 접근하기 위해 데이터를 분리하는 Orca의 핵심 아이디어를 도식화한다.
tinyorca는 Qwen3-0.6B 모델을 기반으로 이러한 복잡한 로직을 파이썬 환경에서 구현하여 교육적 목적으로 원리를 시각화한다. (Implementation)
Qwen3 디코더 블록 아키텍처
Diagramtinyorca의 기반 모델인 Qwen3의 내부 구조를 보여주며, RMSNorm, Masked GQA, MLP 등 선택적 배칭이 적용되는 지점들을 파악할 수 있게 한다.
혼합 워크로드 벤치마크에서 tinyorca는 정적 배칭 기반의 베이스라인 대비 처리량 44.1% 향상, 평균 지연 시간 31.4% 감소를 기록했다. (Result)
혼합 워크로드에서의 벤치마크 결과 그래프
Chart짧은 요청과 긴 요청이 섞인 환경에서 tinyorca가 베이스라인 대비 처리량(Requests/sec)은 44.1% 높고, 지연 시간(E2E latency)은 31.4% 낮음을 수치로 증명한다.
근거
  • 혼합 워크로드에서 tinyorca는 베이스라인 대비 처리량이 약 44% 향상되었다. Workload 2 (short–long mix) Results 섹션 및 Figure 7
  • 반복 수준 스케줄링을 통해 TTFT(첫 토큰 생성 시간)가 약 38% 감소했다. Workload 2 (short–long mix) Results 섹션 및 Figure 7
스케줄링 알고리즘은 FCFS(선입선출) 방식을 따르며, 새로운 요청 수용 시 최대 토큰 길이를 기준으로 KV 캐시 슬롯을 보수적으로 예약한다. (Algorithm)

용어 해설

반복 수준 스케줄링(Iteration-level Scheduling)
LLM 추론 시 요청 단위가 아닌 개별 토큰 생성(반복) 단위로 스케줄링을 수행하는 기법이다. 한 요청이 완료되는 즉시 새로운 요청을 배치에 투입할 수 있어 GPU 자원 활용도를 극대화한다.
선택적 배칭(Selective Batching)
서로 다른 길이의 요청들을 하나의 배치로 묶어 처리할 때, 어텐션 연산 전후로 토큰 스트림을 평탄화하거나 분리하는 기술이다. 프리필과 디코드 단계를 혼합하여 처리할 수 있게 해준다.
프리필 대 디코드(Prefill vs Decode)
LLM 추론의 두 단계로, 프리필은 입력 프롬프트를 한꺼번에 처리하고 디코드는 토큰을 하나씩 생성한다. 두 단계는 연산 특성이 달라 효율적인 배칭을 방해하는 주요 원인이 된다.
키-값 캐시(KV Cache)
이전 토큰들의 연산 결과를 저장하여 재사용함으로써 추론 속도를 높이는 메모리 영역이다. 효율적인 관리가 전체 시스템의 처리량과 지연 시간에 결정적인 영향을 미친다.
정적 배칭(Static Batching)
배치 내 모든 요청이 끝날 때까지 새로운 요청을 받지 못하고 기다리는 전통적인 방식이다. 짧은 요청이 먼저 끝나도 가장 긴 요청이 완료될 때까지 GPU 슬롯이 낭비되는 문제가 있다.

기술

  • Orca
  • Qwen3-0.6B
  • Python
  • PyTorch
  • Hugging Face

활용 사례

  • 고성능 LLM 추론 서버 구축
  • 실시간 챗봇 서비스 최적화
  • 혼합 워크로드 처리량 개선
AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 04. 05.수집 2026. 04. 05.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.