GQA와 MQA, Key와 Value를 얼마나 공유할까
요약
- GQA와 MQA는 어텐션에서 Key와 Value를 헤드끼리 공유해, 자기회귀 생성의 메모리 병목인 KV 캐시를 줄이는 기법입니다. Query 헤드 수는 그대로 두고 K와 V만 공유합니다.
- 세 방식이 있습니다. MHA는 헤드마다 K와 V를 따로 둬서 캐시가 크고, MQA는 전체가 한 벌만 공유해 캐시가 최소이며, GQA는 그룹당 공유하는 절충입니다.
- 핵심 트레이드오프는 명확합니다. K와 V 그룹 수를 줄이면 캐시가 줄고 속도가 오르지만 품질이 떨어질 위험이 있습니다.
- GQA는 MHA와 MQA 사이를 잇는 일반화입니다. 그룹 수가 헤드 수와 같으면 MHA, 1이면 MQA가 됩니다.
- 품질을 거의 안 깎으면서 캐시를 크게 줄여 Llama 3와 Mistral 같은 모던 오픈 LLM이 채택했습니다. 다음 단계는 저랭크 압축인 MLA입니다.
KV 캐시라는 병목에서 나왔습니다
LLM은 토큰을 하나씩 만드는 자기회귀 생성을 합니다. 매 스텝마다 이전 토큰들의 Key와 Value가 다시 필요한데, 이를 매번 재계산하지 않으려고 저장해두는 것이 KV 캐시입니다.
문제는 이 캐시가 시퀀스 길이와 헤드 수, 층 수에 비례해 커진다는 점입니다. 컨텍스트가 길어질수록 GPU 메모리를 잡아먹어 처리량과 최대 길이를 제한합니다.
GQA와 MQA는 바로 이 캐시를 줄이려고 나왔습니다.
세 방식은 한 가지만 다릅니다
"쿼리 헤드가 몇 벌의 K와 V를 나눠 쓰느냐"만 다릅니다.
MHA(Multi-Head Attention) 는 기본형입니다. 헤드마다 각자의 Q, K, V를 가집니다. 헤드가 H개면 K와 V도 H벌이라 KV 캐시가 가장 큽니다.
MQA(Multi-Query Attention) 는 쿼리는 헤드별로 두되 K와 V는 전체가 한 벌만 공유합니다. KV 캐시가 H분의 1로 급감합니다. 대신 K와 V의 표현력이 줄어 품질이 약간 떨어지고 학습이 불안정할 수 있습니다.
GQA(Grouped-Query Attention) 는 헤드를 몇 개 그룹으로 묶어 그룹당 K와 V를 한 벌씩 공유합니다. MQA와 MHA의 절충입니다.
흔한 오해가 하나 있습니다. GQA와 MQA가 어텐션 전체를 바꾸는 것 같지만, Query는 그대로이고 Key와 Value만 공유합니다. 쿼리 헤드 수는 셋 다 똑같습니다. 달라지는 건 K와 V를 몇 벌 두느냐뿐입니다.
도서관의 공용 색인과 책
헤드를 여러 독자라고 해보겠습니다.
MHA는 독자마다 자기 색인표와 책을 따로 갖습니다. 표현력은 좋지만 책장이 꽉 찹니다.
MQA는 모두가 색인 한 세트와 책 한 세트를 공유합니다. 책장은 텅 비지만 모두가 같은 자료만 봐서 세밀함이 줍니다.
GQA는 팀별로 색인과 책을 공유합니다. 팀 안에선 같은 자료를 보되 팀이 여럿이라 다양성은 어느 정도 유지됩니다.
쿼리 헤드 4개를 가정하고 그림으로 비교하면 이렇습니다.
MHA 헤드마다 K,V (캐시 큼)
Q1 ──► K1,V1
Q2 ──► K2,V2
Q3 ──► K3,V3
Q4 ──► K4,V4
MQA 전체가 K,V 1벌 (캐시 최소)
Q1 ──┐
Q2 ──┼──► K,V (공유)
Q3 ──┤
Q4 ──┘
GQA 그룹당 K,V (절충)
Q1 ──┬──► K,V (그룹 A)
Q2 ──┘
Q3 ──┬──► K,V (그룹 B)
Q4 ──┘계산 자체는 같습니다
셋 다 같은 스케일드 닷 프로덕트 어텐션을 씁니다. 달라지는 건 저장하고 재사용하는 K와 V의 수뿐입니다. 어텐션할 때는 공유하는 K와 V를 쿼리 헤드 수만큼 복제해서 맞춥니다.
정리하면 세 단계입니다.
1. 각 쿼리 헤드는 평소처럼 Q를 만든다
2. K와 V는 공유 단위만 만든다
MHA는 헤드마다, GQA는 그룹당 1벌, MQA는 전체 1벌
3. 어텐션 계산은 동일하되, 저장하는 K와 V가 적어 캐시가 작다캐시가 얼마나 줄어드나
KV 캐시 크기는 이렇게 나옵니다.
KV 캐시(bytes) = 2 × 층수 × 배치 × 시퀀스길이 × KV헤드수 × head_dim × dtype바이트
↑
여기가 핵심캐시가 KV 헤드 수에 정비례합니다. MHA는 이 값이 전체 헤드 수, MQA는 1, GQA는 그룹 수입니다. K와 V 헤드를 줄이면 그만큼 캐시가 곧바로 줍니다.
실제 숫자로 보겠습니다. Llama 3 8B는 모델 카드 기준 쿼리 헤드 32개에 K와 V 헤드 8개, 헤드 차원 128, 층 32개입니다.
8k 토큰 시퀀스 하나를 배치 1, fp16으로 돌리면 위 식으로 약 1GiB가 나옵니다.
같은 모델을 MHA로 뒀다면 KV 헤드가 32개라 4배인 약 4GiB가 필요합니다. GQA가 이 조건에서 시퀀스당 약 3GiB를 아끼는 셈입니다.
위는 식에서 곧바로 계산한 근사치입니다. 실제 구현은 정렬과 오버헤드로 조금 다를 수 있습니다.
그룹 수를 어떻게 정하나
그룹 수를 줄이면 캐시와 메모리 감소, 처리량 상승
대신 품질 하락 위험
그룹 수를 늘리면 품질 상승
대신 절약폭 감소실무에서는 보통 8 근처를 씁니다. 쿼리 헤드 32개에 K와 V 그룹 8개, 이런 식입니다. 품질을 거의 유지하면서 캐시를 4분의 1로 줄입니다.
여기서 자연스러운 의문이 하나 나옵니다. MQA가 캐시는 가장 작은데 왜 GQA가 더 많이 쓰일까요.
MQA는 절약폭이 가장 크지만 품질과 학습 안정성 손해도 상대적으로 큽니다. GQA는 캐시를 크게 줄이면서도 품질이 거의 안 깎여서 실무에서 더 나은 절충점이 됩니다.
내 모델이 뭘 쓰는지 확인하는 법
HuggingFace 설정에서 두 값을 비교하면 됩니다.
num_attention_heads 쿼리 헤드 수
num_key_value_heads K, V 그룹 수
둘이 같으면 MHA
K,V가 1이면 MQA
둘이 다르면 GQALlama 3 8B는 각각 32와 8이니 GQA입니다. 모델을 고를 때 이 값을 보면 KV 캐시 부담을 미리 가늠할 수 있습니다.
학습된 MHA를 GQA로 바꾸기
GQA 논문의 실용적 기여가 하나 더 있습니다. uptraining입니다.
기존 MHA로 학습된 체크포인트를 처음부터 다시 학습하지 않고 GQA로 전환하는 방법입니다. MHA의 K와 V 헤드들을 그룹별로 평균 풀링해 묶은 뒤, 원 사전학습에 비하면 소량인 추가 학습만으로 성능을 회복시킵니다.
덕분에 이미 있는 대형 MHA 모델을 값싸게 GQA로 바꿀 수 있습니다.
다음 단계는 MLA입니다
GQA가 K와 V를 공유해 캐시를 줄였다면, 그다음 단계인 MLA(Multi-head Latent Attention) 는 K와 V를 저랭크로 압축해 더 줄입니다. GQA보다 작은 캐시로 MHA급 품질을 노리는 방향이고, DeepSeek-V2가 제안했습니다.
| 시기 | 발전 | 핵심 |
|---|---|---|
| 2017 | MHA 헤드마다 K와 V. KV 캐시가 큼 | Vaswani et al. |
| 2019 | MQA 모든 헤드가 K와 V 한 벌 공유 | Shazeer |
| 2023 | GQA 그룹별 공유로 절충 + uptraining | Ainslie et al. |
| 2024 | MLA K와 V를 저랭크로 압축 | DeepSeek-V2 |
어디에 쓰이나
GQA는 Llama 2의 34B와 70B, Llama 3 전 계열, Mistral 7B, Qwen2.5 등 모던 오픈 LLM 다수가 채택했습니다. MQA는 PaLM 같은 일부 초기 모델에서 볼 수 있습니다.
추론 스택에서는 vLLM과 FlashAttention이 GQA를 기본 지원합니다. KV 캐시가 작아 같은 GPU에서 배치와 처리량을 더 키울 수 있습니다.
마치며
핵심 세 가지로 정리합니다.
- GQA와 MQA는 Query는 두고 Key와 Value만 공유해 자기회귀 생성의 메모리 병목인 KV 캐시를 줄입니다.
- 캐시는 KV 헤드 수에 정비례하며, MHA와 MQA 사이에서 GQA가 절충점을 잡습니다. Llama 3 8B 기준 GQA가 8k 시퀀스당 약 3GiB를 아낍니다.
- 품질을 거의 안 깎는 GQA가 모던 오픈 LLM에 널리 채택됐고, 다음은 저랭크 압축인 MLA입니다.
용어 정리
| 용어 | 한 줄 뜻 |
|---|---|
| MHA (Multi-Head Attention) | 헤드마다 각자 K와 V를 갖는 기본 어텐션. 캐시가 큼 |
| MQA (Multi-Query Attention) | 모든 쿼리 헤드가 K와 V를 한 벌만 공유. 캐시 최소 |
| GQA (Grouped-Query Attention) | 헤드를 그룹으로 묶어 그룹당 K와 V 공유. 절충 |
| KV 캐시 | 생성 시 이전 토큰의 K와 V를 저장해 재사용하는 캐시 |
| uptraining | 학습된 MHA를 소량 추가학습으로 GQA로 변환하는 기법 |
| MLA | K와 V를 저랭크로 압축해 캐시를 더 줄이는 후속 기법 |
num_key_value_heads |
HuggingFace 설정의 K,V 그룹 수. 쿼리 헤드 수와 다르면 GQA |
참고자료
- Vaswani et al., "Attention Is All You Need" (NeurIPS 2017, arXiv:1706.03762)
- Shazeer, "Fast Transformer Decoding: One Write-Head is All You Need" (arXiv:1911.02150)
- Ainslie et al., "GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints" (EMNLP 2023, arXiv:2305.13245)
- DeepSeek-AI, "DeepSeek-V2" (arXiv:2405.04434)
- Llama Team, "The Llama 3 Herd of Models" (arXiv:2407.21783)
- Llama 3.1 8B 모델 카드
- Jiang et al., "Mistral 7B" (arXiv:2310.06825)
'LLM > Architecture' 카테고리의 다른 글
| Agent Observability (Langfuse, LangSmith) (0) | 2026.04.15 |
|---|
댓글