거대 언어 모델(LLM)을 실제 서비스 환경에 적용할 때 가장 중요한 과제 중 하나는 추론(Inference) 효율성입니다. LLM은 기본적으로 입력 프롬프트 전체를 처리한 후, 다음 토큰을 예측하며 순차적으로 응답을 생성합니다. 이 과정은 계산 비용이 매우 높기 때문에, 여러 사용자의 요청을 동시에 처리할 수 있는 최적화 기법이 필수적입니다.
가장 영향력 있는 최적화 중 하나가 바로 **지속적 배치 처리(Continuous Batching)**입니다. 이는 여러 개의 독립적인 대화 세션들을 병렬로 처리하고, 한 세션의 처리가 끝나면 지체 없이 다른 세션으로 교체하여 GPU 자원 활용률을 극대화하는 기술입니다.
1. LLM 작동 원리 및 어텐션 메커니즘 (Attention Mechanism)
LLM은 텍스트를 '토큰(Token)'이라는 단위로 분해하여 처리합니다. 토큰 시퀀스 내의 각 토큰이 독립적으로 처리되는 연산도 있지만, 문장 속 단어들 간에 상호작용을 만들어내는 핵심 부분이 바로 **어텐션 레이어(Attention Layer)**입니다.
어텐션 메커니즘은 다음과 같은 과정을 거칩니다. (단일 프롬프트 기준)
- 입력 텐서: $L$ 길이의 토큰 시퀀스는 크기 $(1, L, d)$의 텐서를 형성합니다. 여기서 $d$는 히든 차원(hidden dimension)입니다.
- 투영 (Projection): 입력 텐서는 세 개의 가중치 행렬을 통해 각각 Query ($ ext{Q}$), Key ($ ext{K}$), Value ($ ext{V}$) 상태로 투영됩니다. 이들은 모두 $(1, L, h)$ 크기의 텐서를 갖습니다.
- 어텐션 점수 계산: $ ext{Q}$와 $ ext{K}$를 곱하여 토큰 간의 유사도를 측정하는 어텐션 스코어를 얻습니다. 이 과정은 시퀀스 길이 $L$에 대해 이차 복잡도($O(L^2)$)를 가집니다.
- 마스크 적용: 계산된 점수에 '어텐션 마스크(Attention Mask)'를 적용합니다. 특히, LLM의 순차적 특성을 반영하기 위해 각 토큰이 자신보다 앞선 토큰하고만 상호작용하도록 제한하는 **인과 마스크(Causal Mask)**가 사용됩니다.
- 출력 계산: 마스킹된 스코어에 소프트맥스(softmax)를 적용한 후, $ ext{V}$ 상태와 곱하여 최종 출력을 얻습니다.
2. 지속적 배치 처리를 위한 일반화 (Generalization for Continuous Batching)
지속적 배치는 여러 세션과 다양한 길이의 시퀀스를 동시에 처리해야 하므로, 위 과정을 더욱 일반화해야 합니다.
- 다중 세션: 이제 $ ext{Q}, ext{K}, ext{V}$는 각각 $(B, L_q, h), (B, L_k, h), (B, L_v, h)$ 형태를 갖습니다. 여기서 $B$는 배치 크기(Batch Size)이고, $L_q, L_k, L_v$는 각 세션의 쿼리, 키, 값 시퀀스 길이입니다.
- 핵심 제약 조건: 어텐션 메커니즘이 작동하려면 $ ext{Q}$와 $ ext{K}$가 곱해져야 하므로, $ ext{Q}$의 마지막 차원($h$)과 $ ext{K}$의 마지막 차원은 반드시 같아야 합니다.
- 마스크 및 점수: 어텐션 스코어는 $(B, L_q, L_k)$ 형태를 가지며, 마스크 역시 이와 동일한 형태입니다.
이러한 일반화된 접근 방식을 통해 시스템은 각 세션의 상태(State)가 다르더라도 일관되게 높은 처리량을 유지하며 토큰 생성 작업을 수행할 수 있습니다. 이는 GPU 자원을 낭비하지 않고 지속적으로 최대 부하를 유지하는 핵심 원리입니다.