주제: IO-1 LLM Inference (지연시간 / 처리량 / 메모리 Tradeoff)
문제 설정
LLM을 실제 서비스에서 사용할 때 가장 중요한 문제는 추론(inference) 성능입니다.
서비스 시스템에서는 다음 세 가지 지표가 핵심입니다.
- Latency (지연시간)
- Throughput (처리량)
- Memory (메모리 사용량)
이 세 지표는 서로 강한 tradeoff 관계를 가집니다.
직관 비유
- Latency -> 한 요청이 완료되는 속도
- Throughput -> 초당 처리 가능한 요청 수
- Memory -> 모델이 사용하는 GPU 자원
LLM 서빙에서는 이 세 가지를 균형 있게 최적화해야 합니다.
1. Latency (지연시간)
Latency는 요청이 완료될 때까지 걸리는 시간입니다.
기호 의미
- T_prefill : prompt 처리 시간
- T_decode : 토큰 생성 시간
왜 필요한가
사용자가 체감하는 응답 속도를 결정합니다.
주의점
LLM 생성 과정은 토큰을 순차적으로 생성합니다.
2. Prefill 단계
Prefill 단계에서는 전체 prompt를 한 번에 처리합니다.
Self-attention 계산:
기호 의미
- n : prompt token length
직관 설명
긴 prompt는 prefill latency를 크게 증가시킵니다.
주의점
prefill은 GPU 병렬화가 가능합니다.
3. Decode 단계
decode 단계에서는 토큰을 하나씩 생성합니다.
목표:
기호 의미
- x_t : 생성 토큰
직관 설명
각 토큰 생성은 이전 토큰에 의존합니다.
주의점
decode는 완전 병렬화가 어렵습니다.
4. Throughput (처리량)
Throughput은 일정 시간 동안 처리 가능한 요청 수입니다.
왜 중요한가
서비스 비용과 직결됩니다.
주의점
높은 throughput은 latency 증가를 유발할 수 있습니다.
5. Memory 사용량
LLM inference에서 메모리는 다음 요소로 구성됩니다.
기호 의미
- model : 파라미터 메모리
- KV cache : attention key/value 저장
- activation : 중간 계산
왜 중요한가
GPU 메모리가 inference batch 크기를 제한합니다.
6. KV Cache
Transformer decode 단계에서는 이전 attention을 저장합니다.
기호 의미
- n : sequence length
- d : hidden dimension
왜 필요한가
매 토큰마다 attention을 다시 계산하지 않도록 합니다.
주의점
긴 context는 KV cache 메모리를 증가시킵니다.
7. Latency vs Throughput Tradeoff
| 전략 | Latency | Throughput |
|---|---|---|
| batch size 증가 | 증가 | 증가 |
| 작은 batch | 감소 | 감소 |
즉 batch 크기 조절이 핵심입니다.
8. Inference 최적화 전략
- Continuous batching
- KV cache reuse
- quantization
- speculative decoding
예
Request queue
↓
Batch scheduler
↓
GPU inference
코드-수식 연결
| 개념 | 코드 | 설명 |
|---|---|---|
| generation | model.generate() |
토큰 생성 |
| batch | batch_size |
동시 요청 처리 |
| KV cache | past_key_values |
attention cache |
자주 하는 오해 5개
- Throughput이 높으면 latency도 항상 낮다고 생각한다
- decode 단계는 완전히 병렬화 가능하다고 생각한다
- context 길이는 메모리에 영향을 주지 않는다고 생각한다
- KV cache는 선택 사항이라고 생각한다
- batch size는 항상 크게 하는 것이 좋다고 생각한다
체크리스트 (스스로 설명 가능해야 하는 질문)
- LLM inference latency는 어떤 단계로 구성되는가?
- prefill과 decode의 차이는 무엇인가?
- 왜 decode 단계는 병렬화가 어려운가?
- KV cache는 무엇이며 왜 필요한가?
- latency와 throughput은 어떤 tradeoff 관계를 가지는가?