TGI 성능 최적화 (Optimization)¶
개요¶
TGI를 쓰는 이유는 서빙 성능을 직접 최적화하지 않아도 되기 때문이에요. 하지만 "어떤 메커니즘이 성능을 만드는지"를 알면, 배포할 때 어떤 옵션을 주고 무엇을 측정해야 할지 감이 잡혀요. TGI의 성능은 연속 배칭, KV 캐시 관리, 양자화, 스펙큘레이티브 디코딩 같은 요소가 함께 만들어요. 이 페이지는 그 조합을 공식 문서 기준으로 설명합니다.
핵심 개념¶
연속 배칭 (Continuous Batching)¶
TGI는 요청을 도착하는 대로 배치에 계속 끼워 넣습니다. 하나가 끝나면 그 자리에 다음 요청을 넣는 방식이라, GPU가 놀지 않고 계산을 이어가요. 배치에 여유가 없으면 요청은 대기 풀로 보내지고, GPU가 리소스를 정리하면 다시 스케줄돼요. 여러 요청을 몰아서 처리할수록 처리량이 오르는 핵심 요소예요.
KV 캐시와 PagedAttention¶
TGI도 PagedAttention 기반 KV 캐시 관리를 써요. 생성 단계의 key·value 캐시를 고정 크기 페이지로 나눠 필요할 때만 할당해서, 메모리 단편화를 줄이고 더 큰 배치를 돌릴 수 있게 해줘요. 그래서 --max-batch-total-tokens 같은 배치 메모리 예산을 키울수록 실제 연산이 늘어날 수 있어요.
양자화 — 정밀도를 메모리·속도로¶
--quantize 옵션으로 모델을 양자화하면 메모리 사용이 줄어요. 그 여유를 배치 크기로 바꿀 수 있어요. 문서에서 언급하듯 gptq(4비트)나 특히 AWQ의 더 빠른 커널은, 지원하는 하드웨어에서 추론 속도를 끌어올립니다. 메모리 절감분을 어떻게 배치·응답 속도로 바꿀지는 튜닝 포인트예요.
스펙큘레이티브 디코딩 (Speculative Decoding)¶
스펙큘레이티브 디코딩은 토큰을 하나씩 순차 생성하는 비효율을 줄이는 기법이에요. --speculate 옵션으로 추천할 토큰 수를 주면, 작은 모델(또는 Medusa 헤드, n-gram)이 먼저 여러 토큰을 제안하고 큰 모델이 한 번에 검증하는 식이에요. 같은 품질을 유지하면서 생성 속도를 높일 수 있어요. Medusa 모델이면 헤드가 자동으로 잡히고, 아니면 상대적으로 계산이 저렴한 n-gram 스펙큘레이션을 써요(속도 향상은 작업에 따라 달라져요).
하드웨어별 최적화 — 커널 분리¶
TGI는 최적화 커널을 하드웨어별로 나눠서 지원해요. A100처럼 특정 GPU에서만 검증된 커스텀 CUDA 커널은 다른 하드웨어에서 문제가 나면 --disable-custom-kernels로 끌 수 있고, --cuda-memory-fraction으로 GPU 메모리 사용을 제한할 수도 있어요. 다른 백엔드(Neuron, Gaudi, TensorRT-LLM)는 각각 특화된 커널을 써요.
실제 적용 (데이터스케쳐스)¶
- 배치 예산으로 GPU를 꽉 채우기 —
--max-batch-total-tokens를 남는 메모리에 맞춰 키워, 연속 배칭이 실제로 많은 요청을 태우게 해요. - 양자화 + 스펙큘레이션 — INT4/AWQ 양자화로 메모리를 확보하고, 생성이 긴 작업엔 스펙큘레이티브 디코딩을 검토해 속도를 올려요.
- 측정 중심 접근 — 공식적으로 성능 수치를 단정하기보다, 우리 GPU와 모델로 처리량·지연을 측정해 최적 조합을 확정해요.
각 최적화 기법의 실제 효과는 모델·하드웨어·요청 패턴에 따라 크게 달라져요. 배포 환경에서 측정해 확정하는 게 원칙이에요.
더 알아보기¶
- 공식 문서 (1차): Streaming, Quantization, Tensor Parallelism, Speculation
- 배포: Installing TGI