AI VIDEO BRIEFING
어텐션 효율화 총정리: KV 캐시 131GB 문제와 MQA·GQA·MLA·희소 어텐션 작동 원리
긴 문맥을 다루는 LLM의 진짜 병목인 KV 캐시를 줄이려고 등장한 MQA와 GQA, 키와 값을 압축하는 잠재 어텐션, 그리고 중요한 토큰만 골라 보는 딥시크 희소 어텐션까지 작동 원리를 단계별로 짚었다.

핵심 메시지
쉽게 이해하기
언어 모델이 문장을 이해하는 출발점은 토큰을 벡터로 바꾸는 일이지만, 그 벡터만으로는 앞뒤 문맥이 담기지 않는다. 어텐션은 각 토큰이 앞선 토큰들에게 얼마나 주목해야 하는지를 계산해 문맥 정보를 끌어오는 장치다. 질의와 키 벡터의 내적으로 관련성을 재고, 소프트맥스로 정규화한 가중치를 값 벡터에 곱해 더하는 방식이며, 하나의 관계만으로는 부족하기 때문에 여러 개의 헤드를 두고 서로 다른 관계를 학습시킨다.
문제는 답을 만들어 낼 때 생긴다. 토큰을 하나씩 생성하는 동안 앞선 토큰들의 키와 값 벡터는 전혀 변하지 않는데, 이를 매번 다시 계산하는 것은 낭비다. 그래서 한 번 계산한 키와 값을 메모리에 쌓아 두고 재사용하는 KV 캐시가 쓰인다. 질의 벡터는 마스킹 때문에 이후 계산에 영향을 주지 않으므로 저장할 필요가 없다.
KV 캐시는 계산을 줄여 주는 대신 메모리를 먹는다. 헤드당 벡터 차원 128, 헤드 128개, 층 61개에 키와 값 두 벌을 16비트로 저장한다고 하면, 3만 2천 토큰짜리 시퀀스 하나에 약 131GB가 필요하다. 벡터 차원이나 층 수는 건드리기 어려우니 남은 선택지는 헤드 수였고, 여기서 효율화 기법들이 갈라져 나온다.
가장 단순한 방법은 키와 값의 헤드를 하나로 줄여 모든 어텐션 헤드가 나눠 쓰게 하는 것이다. 이 방식은 토큰당 메모리를 4MB에서 31KB로, 즉 128분의 1로 줄이지만 토큰 사이의 복잡한 관계를 담아내지 못해 성능이 눈에 띄게 떨어진다. 그래서 헤드를 몇 개의 그룹으로 묶어 그룹 안에서만 키와 값을 공유하는 절충안이 나왔고, 128개 헤드를 16개 그룹으로 묶으면 메모리를 8분의 1로 줄일 수 있다.
여기서 한 걸음 더 나아간 것이 잠재 어텐션이다. 그룹 방식이 사실은 고정된 행렬로 벡터를 복제하는 저랭크 분해와 같다는 점에 착안해, 압축 행렬과 복원 행렬을 아예 학습시킨다. 토큰 임베딩을 훨씬 작은 차원의 벡터로 눌러 저장했다가 필요할 때 키와 값으로 되살리는 방식이며, 딥시크 V3 계열에서는 압축 차원이 576으로 표준 방식 대비 약 57분의 1의 메모리를 쓴다. 게다가 추론 시에는 복원 행렬을 질의 쪽과 출력 행렬에 미리 합쳐 둘 수 있어 추가 연산도 사실상 사라진다.
주요 인사이트
- 잠재 어텐션에는 걸림돌이 하나 있다. 위치 정보를 회전으로 넣는 로터리 위치 임베딩을 쓰면 회전 행렬이 질의와 키의 복원 행렬 사이에 끼어들어, 행렬을 미리 합쳐 두는 최적화를 쓸 수 없게 된다. 그래서 위치 정보를 담당하는 별도의 질의 헤드와 공유 키를 만들어 원래 벡터와 회전된 벡터를 이어 붙이는 우회책을 쓴다.
- 메모리를 줄여도 속도 문제는 남는다. 생성이 길어질수록 현재 토큰과 앞선 모든 토큰 사이의 어텐션을 계산해야 하므로 초당 생성 토큰 수가 떨어진다. 딥시크가 내놓은 답은 모든 토큰을 보는 대신 볼 가치가 있는 토큰만 고르는 것이었다.
- 고르는 작업 자체가 무거우면 의미가 없다. 그래서 인덱서는 질의와 키를 8비트로 양자화해 대략적인 점수만 빠르게 계산한다. 정확한 어텐션 값을 구하는 것이 목적이 아니라 어떤 토큰이 중요한지 순위를 매기는 것이 목적이므로 낮은 정밀도로 충분하다는 발상이다.
- 양자화의 약점은 값의 크기 차이가 클 때 정보가 뭉개진다는 점이다. 이를 완화하려고 벡터를 회전시켜 값을 고르게 퍼뜨리는데, 무작위 직교 행렬보다 아다마르 변환이 더 정확하고 안정적이었으며 덧셈과 뺄셈만으로 빠르게 계산할 수 있다는 장점도 있다.
- 인덱서 학습은 두 단계로 진행된다. 먼저 본체 어텐션을 고정한 채 인덱서만 학습시켜 그 출력이 본체의 어텐션 분포를 따라가게 만들고, 다음 단계에서 실제 토큰 선택을 붙여 전체를 학습시킨다. 이때 인덱서는 자기 손실로만, 본체는 언어 모델링 손실로만 학습되도록 분리한다.
자주 묻는 질문
KV 캐시는 왜 필요한가요?
모델이 답을 한 토큰씩 만들어 내는 동안 앞선 토큰들의 키와 값 벡터는 변하지 않기 때문입니다. 매번 다시 계산하면 낭비이므로 한 번 계산한 값을 메모리에 저장해 두고 재사용해 생성 속도를 높입니다. 반면 질의 벡터는 마스킹으로 인해 이후 결과에 영향을 주지 않아 저장하지 않습니다.
MQA와 GQA는 어떻게 다른가요?
MQA는 키와 값의 헤드를 하나로 줄여 모든 어텐션 헤드가 공유하게 하는 방식으로, 메모리는 128분의 1로 줄지만 표현력 손실이 커 성능이 상당히 떨어집니다. GQA는 헤드를 여러 그룹으로 묶어 그룹 안에서만 공유하는 절충안이며, 128개 헤드를 16개 그룹으로 묶으면 메모리를 8분의 1로 줄이면서 성능 저하를 억제할 수 있어 라마, 큐원, 젬마 같은 모델이 채택했습니다.
딥시크 희소 어텐션은 어떤 효과를 냈나요?
가벼운 인덱서로 중요한 토큰만 골라 어텐션을 계산하게 만들어, 긴 시퀀스 처리를 2~3배 빠르게 하고 메모리 사용량을 30~40% 줄였습니다. 그러면서도 이전 모델과 같은 수준의 성능을 유지했다는 점이 핵심입니다.
원문과 출처
이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.
YouTube 원본 영상 보기 ↗