LLM 성능 최적화: 동시 요청을 위한 프리필 및 디코드
요약
대규모 언어 모델(LLM) 성능을 최적화하려면 프리필 단계(입력 프롬프트 처리)와 디코드 단계(후속 토큰 생성) 사이의 근본적인 차이를 관리해야 합니다. 연속 배치와 청크 프리필을 구현함으로써 개발자는 GPU 자원 활용도를 극대화하고 전체 토큰 처리량을 크게 늘릴 수 있습니다—TNG는 표준 vLLM 배포에서 청크 프리필을 사용했을 때 처리량이 50% 증가한 것을 관찰했습니다.
토큰 생성의 두 단계
LLM은 텍스트를 자동 회귀 방식으로 생성하며, 이는 각 새로운 토큰이 이전 모든 토큰에 의존함을 의미합니다. 이 과정은 두 개의 별도 계산 단계로 나뉩니다:
프리필 단계
- 기능: 모든 입력 프롬프트 토큰을 처리하여 첫 번째 출력 토큰을 계산합니다.
- 계산 프로필: 높은 병렬성을 갖고 GPU 연산 집약적입니다. 모든 입력 토큰이 시작 시점에 알려져 있기 때문에 모델은 전체 프롬프트에 대한 키와 값 벡터를 동시에 계산할 수 있습니다.
- 핵심 지표: 첫 토큰까지 시간 (TTFT) 으로 측정됩니다.
디코드 단계
- 기능: 이후 토큰을 하나씩 순차적으로 계산합니다.
- 계산 프로필: 순차적이며 메모리 대역폭에 제한됩니다. 토큰당 하나의 키와 값 벡터 집합만 계산하면 되지만, 모델은 매 단계마다 GPU 메모리에서 가중치와 키-값(KV) 캐시에 접근해야 합니다.
- 핵심 지표: 출력 토큰당 시간 (TPOT) 으로 측정됩니다.
자원 활용도와 처리량
GPU 활용도는 이 두 단계 사이에서 크게 차이납니다. 긴 프롬프트를 가진 단일 요청은 프리필 단계에서 GPU 연산 능력을 포화시킬 수 있습니다. 반면, 단일 요청의 디코드 단계는 매우 적은 연산 자원을 사용하므로, 여러 요청을 배치하여 GPU 연산 용량을 채우면 처리량이 증가합니다.
처리량은 일반적으로 낮은 수준의 동시성에서는 (메모리 제한 구간) 선형적으로 증가하다가 GPU 연산 능력이 포화되는 (연산 제한 구간) 시점에 도달하면, 동시성이 더 증가해도 처리량은 변하지 않습니다.
동시 처리 전략
추론 엔진은 동시에 도착하는 다수의 요청을 처리하기 위해 다양한 배치 전략을 사용하며, 각각은 지연 시간과 효율성에 대한 서로 다른 트레이드오프를 가집니다.
정적 배치
정적 배치는 요청을 고정된 배치로 묶어, 배치 내 가장 긴 요청이 완료될 때까지 처리하고 그 후에 새로운 배치를 시작합니다.
- 장점: 디코드 단계가 중단되지 않아 TPOT를 최적화합니다.
- 단점: 자원 활용도가 매우 비효율적이며, 새로운 요청이 이전 배치 전체가 끝날 때까지 기다려야 하므로 TTFT가 크게 증가할 수 있습니다.
연속 배치 (프리필 우선)
연속 배치는 완료된 요청을 즉시 제거하고 새로운 요청을 삽입합니다. “프리필 우선” 전략은 새로운 프리필이 도착하는 즉시 스케줄링합니다.
- 장점: 새로운 요청을 즉시 처리함으로써 TTFT를 최소화합니다.
- 단점: 기존 요청의 디코드 단계를 중단시킵니다. 프리필 작업이 GPU 실행 시간을 지배하기 때문에, 디코드 단계에 있는 동시 요청은 큰 프리필 전체 기간 동안 단 하나의 토큰만 생성할 수 있어 스트리밍 출력에 “일시 정지”가 발생합니다.
청크 프리필
청크 프리필은 입력 프롬프트를 여러 단계에 걸쳐 작은 청크로 나눕니다. 이를 통해 프리필 과정 중에 여러 디코드 단계가 동시에 진행될 수 있습니다.
- 장점: 연산 집약적인 프리필과 메모리 제한 디코드를 병렬로 실행함으로써 자원 효율성을 극대화합니다. 토큰 생성이 완전히 멈추는 것을 방지해 평균 TPOT를 감소시킵니다.
- 영향: TNG는 청크 프리필을 사용한 표준 vLLM 배포에서 전체 토큰 처리량이 50% 증가했다고 보고했습니다.
- 트레이드오프: TTFT가 약간 증가하고, TTFT와 TPOT 사이의 우선순위를 맞추기 위해 청크 크기(보통 512~8192 토큰)를 조정해야 합니다.