1. Text Generation
- LLM은 다음 토큰을 예측하도록 학습되었다.
- 다음 토큰으로 가장 적합한 것을 선택하는 Decoding 방식은 다를 수 있다.
- Greedy Decoding (무조건 가장 확률이 높은 것)
- Top-K Sampling
Autoregressive Generation의 특성상 원하는 답이 나올때 까지 for loop을 도는 것과 같다.
다만, 이런 Naive Decoding의 경우에는 다음의 문제점이 있다.
- 매우 느림
- 계산 비용 높음
- Key, Value 관리 비효율성 (CPU only)
2. 추론 최적화
- Flash Attention v1
- H100 과 같은 최신 GPU에서 사용가능
- IO communication에 의한 병목현상 개선
- 기존 Attention 계산 보다 메모리, 속도면에서 월등한 성능
- Flash Attention v2
- Non-matmul operation 최적화
- Single head attention에서도 병렬처리를 수행하도록 변경
- Thread block 내 wraps communication 감소
- Flash Attention v1 대비 2배 빠른 속도
3. KV Caching, Paged Attention
- K,V Cache: 반복 계산을 줄이기 위해 키 와 벨류를 캐싱하자.
- 그런데 이렇게 하면 캐시 메모리가 너무 커지거나 동적으로 크기가 변하면서 병목현상 발생
- 그래서 나온 것이 Paged Attention
- KV Cache를 여러 physical KV Block으로 분산
- Dynamic 메모리 할당, Block 단위 메모리 공유 가능
- 효율적인 KV Cache 및 메모리 관리 가능, 병목 개선
이렇게 Paged Attention이 적용되어 나온 라이브러리가 vLLM
4. Speculative Decoding
- 여러 토큰을 병렬 계산하여 더 빠르게 샘플링
- 최적화 타겟 모델 Mp, 효율적인 approximation 모델 Mq
- Mq를 통해 다수의 샘플을 생성하고
- Mp가 앞에서 생성된 샘플을 병렬로 평가한다.
- 한번의 Mp 호출로 다수 +1 개의 토큰 생성 가능

출처: https://arxiv.org/pdf/2211.17192
5. Continuous Batching
엔지니어링 적인 관점으로
inference에서도 배치사이즈를 늘려보자라는 것.
- Naive Batching
- 인퍼런스가 완료되기 전까지 배치 크기 고정 상태로 대기
- Continuous Batching
- 배치 안의 모든 시퀀스들의 생성 완료를 기다리는 대신 Batch size를 dynamic 하게 결정
- 배치 안의 한 시퀀스 생성이 완료되면 새로운 시퀀스로 채워준다.
6. Kernel Fusion
커널? 연산이라고 보면 된다.
CUDA 코드 중에서 CPU 디바이스에서 동작하는 영역이 바로 그것.
여기서 kernel Fusion이라고 하는 것은
복수의 kernel을 하나로 합쳐서 실행하는 것을 말한다.
MatMul 후 Add 연산이 여태 MatMul과 Add 각각 하나씩 두개의 커널에서 진행됐다면 이제는 MatMulAdd 라는 하나의 kernel로 수행하자는 것.
7. 추론 시스템
VLLM
Python 기반으로 개발되었으며
LLM을 위한 고성능 추론 프레임 워크이다.
PagedAttention을 통해서 Attention Key, Value Memory를 효율적으로 관리할 수 있다.
TGI: Text Generation Inference
- Rust 기반 개발
- Tensor paralleslism을 통한 GPU 분산 처리
- Continuous Batching
- Flash Attention, Paged Attention 활용
VLLM과 거의 비슷하다.
SGLang
최근에 가장 트렌디함
- LLM, VLLM을 위한 모델 서빙 프레임워크
- 병렬처리, Multimodal, Function calling 등 지원
위 라이브러리들이 공통적으로 제공하는 것: OpenAI Compatible
- 다양한 LLM Provider가 OpenAI API와 유사한 인터페이스를 제공함
- Open AI의 chat completion은 LLM API의 스탠다드로 사용되고 있으며, 앞서 살핀 모든 추론 시스템들이 OpenAI 형태의 추론을 지원한다.
8. 추론 시스템 사용 가이드
- VLLM
pip install vllm으로 깔고 그냥 사용하면 된다.
- 보통 gpu-memory-utilization은 0.8~0.9로 줌
- TGI
- Docker install 하고 Docker로 사용가능
- SGLang
pip install sglang[all]
pip install flashinfer -i https://flashinfer.ai/whl/cu121/torch2.4/ 버전관련해서는 CUDA 및 Torch 버전에 맞게 수정
9. 이외 방법론
- Medusa(LLM Generation Accelerating Framework)
- Quantization
요약
속도, Latency 등을 비교하여 판단하자.