LLM 추론의 병목은 보통 모델 자체가 아니라 토큰 처리 순서에서 발생한다. 특히 여러 사용자의 요청을 동시에 처리해야 하는 상황에서는 어떤 요청을 먼저 처리할지, 그리고 어떻게 묶어서 처리할지가 성능에 큰 영향을 준다.
vLLM은 이 문제를 해결하기 위해 단순한 FIFO나 round-robin 방식이 아닌, "시맨틱(의미 기반)" 스케줄링을 도입했다. 그게 바로 Semantic-Aware Scheduling이다.
📌 핵심 개념: 의미를 고려한 요청 정렬
기존 스케줄링은 요청 순서나 길이 같은 표면적인 정보만 고려한다. 반면 Semantic-Aware Scheduling은 각 요청의 의미적 특성을 분석해 효율적인 실행 순서를 만든다. 여기서 말하는 의미는 아래와 같다:
- 프롬프트 처리 중인지, 디코딩 중인지
- 토큰 길이 (prompt length / output length)
- 요청의 상태 (초기 입력 vs. 반복 디코딩)
- 실시간 스트리밍 여부
- latency-critical인지 아닌지
요컨대, 요청이 지금 무엇을 하고 있는지와 어떻게 처리되면 좋을지를 이해하고 배치하는 방식이다.
⚙️ 어떤 방식으로 작동할까?
Semantic-Aware Scheduling은 다음과 같은 로직으로 작동한다:
1. 요청 상태 분류
- 각 요청을 분석해서 현재 단계(프롬프트 vs. 디코딩)를 파악한다.
- 예: 디코딩 요청은 GPU 연산을 많이 차지하고, 프롬프트 요청은 메모리 접근이 많다.
2. 유사한 요청끼리 그룹핑
- 상태가 유사하거나 토큰 길이가 비슷한 요청끼리 묶어서 batch를 구성한다.
- 덕분에 GPU 연산 효율이 높아지고, context switching 비용이 줄어든다.
3. 스코어 기반 스케줄링
- 각 요청에 대해 우선순위 스코어(score)를 부여한다.
- 이 스코어는 요청 상태, 길이, latency 민감도 등을 종합해서 계산된다.
- 높은 스코어를 가진 요청부터 배치에 포함시킨다.
4. dynamic reordering
- 스케줄러는 요청의 진행 상황에 따라 동적으로 순서를 바꾼다.
- 예: 짧은 요청은 먼저 처리해서 자리를 비우고, 긴 요청은 뒤로 미룬다.
📈 효과는?
이 스케줄링 덕분에 vLLM은 다음과 같은 장점을 얻는다:
- 낮은 지연 시간 (특히 streaming 응답 시)
- 높은 처리량 (throughput)
- GPU 자원의 효율적 사용
- Memory fragmentation 감소
특히 프롬프트 토큰과 디코딩 토큰이 섞이지 않도록 관리함으로써, 서로 다른 성격의 요청이 서로 발목을 잡는 일이 없도록 설계되었다.
🔍 예시: 왜 중요한가?
만약 디코딩 중인 긴 요청 하나와, 프롬프트 입력 중인 짧은 요청 여러 개가 같이 들어왔다고 하자. 단순 FIFO 방식이라면 긴 요청이 전체 배치를 잠식할 수 있다.
하지만 Semantic-Aware Scheduling은 다음처럼 처리한다:
- 짧고 빠르게 끝나는 요청들을 우선 배치
- 디코딩 요청은 나중에 비슷한 요청끼리 묶어서 처리
- 결과적으로 GPU는 놀지 않고, 사용자 응답 속도도 빨라진다
✨ 정리
Semantic-Aware Scheduling은 "모든 요청을 똑같이 다루지 않는다."
각 요청이 가진 의미와 상황을 이해하고, 그에 맞게 스마트하게 스케줄링하는 것이 핵심이다.
이는 단순한 성능 최적화를 넘어서, 실시간 응답 품질, 리소스 활용 효율, 사용자 경험을 모두 끌어올리는 핵심 전략이다.
'AI' 카테고리의 다른 글
| LLM 평가 방법론 - 벤치마크 (0) | 2025.12.10 |
|---|---|
| 학습시킨 LLM 얼마나 똑똑한지 알고있니? (0) | 2025.12.10 |
| vLLM의 핵심 이해: PagedAttention (0) | 2025.03.25 |
| vLLM 이란? (0) | 2025.03.25 |
| 트랜스포머 (Transformer) #3 (0) | 2025.03.24 |