LLM 추론 최적화 이해하기

LLM 추론은 토큰을 auto-regressive하게 하나씩 생성하는 과정이라 바닐라로 돌리면 매우 느리다. 이걸 빠르게 만드는 최적화 기법들을 메모리 이동, 반복 계산, 배치 처리 관점으로 나눠 정리해봤다. 생성 단계의 sampling/search 자체는 3. Sampling 기반 디코딩 - Temperature, Top-k, Top-p 쪽에서 다뤘다.

Flash Attention — 메모리 이동을 줄인다#

연산은 결국 GPU의 빠른 메모리인 SRAM에서 이루어져야 하는데, 데이터는 큰 메모리인 HBM에 있다. 둘 사이를 오가는 비용이 attention의 진짜 병목이다.

Flash Attention은 이 HBM과 SRAM 사이의 이동을 효율화한다. attention 중간 결과를 HBM에 썼다 다시 읽는 대신 SRAM에서 처리해, 메모리 사용을 에서 선형 수준으로 개선하고 속도도 올린다. 현재 v3까지 나와 있고 v3는 Hopper 이후 GPU에서 쓸 수 있다.

KV Caching — 반복 계산을 없앤다#

auto-regressive 생성은 토큰을 하나 만들 때마다 앞 토큰들에 대한 attention을 다시 계산한다. 그런데 앞 토큰들의 Key, Value는 매번 똑같다. KV Caching은 이 K, V를 캐싱해 반복 계산을 없앤다.

Paged Attention — KV 캐시 메모리를 알뜰하게#

KV Caching을 하면 이번엔 KV 캐시 메모리가 커져서 병목이 생긴다. Paged Attention은 운영체제의 가상 메모리와 페이징 아이디어를 빌려왔다.

  • 기존 방식: 단체 손님을 위해 긴 테이블 하나를 통째로 비워둔다. 자리가 남거나 부족하다.
  • Paged Attention: 손님이 오는 대로 빈 의자 아무 데나 앉히고, A팀은 1번·5번·12번 자리에 있다고 적어둔다. 빈 자리를 알뜰하게 다 쓴다.

KV 캐시를 연속된 큰 덩어리로 잡지 않고 페이지 단위로 흩어 담아 메모리 낭비를 줄이는 것이다.

Speculative Decoding — 작은 모델로 앞서 달리기#

큰 모델 가 최적화 타겟이고, 작은 모델 가 도우미다. 속도가 빠른 작은 모델이 토큰을 길게 먼저 생성하고, 큰 모델이 그걸 한 번에 점검해서 쓸만한 부분까지 받아들이는 방식이다. 큰 모델이 한 토큰씩 만드는 대신 여러 토큰을 한 번에 검증하니 빨라진다. 단, 두 모델의 토크나이저는 반드시 동일해야 한다.

Continuous Batching — 먼저 끝난 자리를 바로 채운다#

기존 배치는 batch 안의 sample이 모두 끝날 때까지 기다려야 했다. Continuous Batching은 어떤 sample이 먼저 끝나면 그 자리에 다음 sample을 바로 넣어 처리한다. GPU가 노는 시간을 줄인다.

Kernel Fusion — 커널 호출을 합친다#

GPU에서 실행되는 개별 함수(더하기, 곱하기, softmax 등)를 커널이라고 부른다.

  • 기존: A 커널(계산 후 HBM 저장) → B 커널(HBM에서 로드 후 계산). 중간 결과를 HBM에 썼다 읽는다.
  • Fusion: A+B 커널(계산 후 SRAM에 유지 → 이어서 계산 → 최종 결과만 HBM 저장).

여러 연산을 한 커널로 묶어 중간 메모리 왕복을 줄인다. Flash Attention과 같은 결의 아이디어다.

추론 시스템#

이 최적화들을 묶어 제공하는 서빙 시스템들이 있다. 모두 OpenAI compatible하게 쓸 수 있다.

  • vLLM
  • TGI
  • SGLang

이보다 더 빠르게 가려면 양자화나 Medusa 같은 방법도 있다고 한다.

정리
  • Flash Attention / Kernel Fusion: HBM↔SRAM 메모리 이동을 줄인다
  • KV Caching: 앞 토큰의 K·V 반복 계산 제거. Paged Attention으로 그 캐시 메모리를 페이징해 알뜰하게
  • Speculative Decoding: 작은 모델이 앞서 생성, 큰 모델이 일괄 검증(토크나이저 동일 필수)
  • Continuous Batching: 먼저 끝난 sample 자리를 바로 채워 GPU 유휴 감소
  • 서빙은 vLLM·TGI·SGLang, 모두 OpenAI compatible

댓글