트랜스포머 레이어의 개수입니다. 각 레이어는 자기 키와 값 텐서를 따로 보관하므로 캐시는 레이어 수에 비례해 커집니다.
키/값 어텐션 헤드의 개수입니다. 그룹 쿼리 어텐션에서는 이 값이 쿼리 헤드 수보다 작으며, 그 비율만큼 캐시가 줄어듭니다.
각 어텐션 헤드의 크기입니다. 모델의 은닉 차원은 대략 헤드 차원에 쿼리 헤드 수를 곱한 값입니다.
워크로드
컨텍스트에 들고 있는 전체 토큰 수로, 프롬프트와 생성된 토큰을 합한 값입니다. 캐시는 이 길이에 비례해 커지며, 과거 토큰 하나마다 한 슬롯을 차지합니다.
동시에 처리하는 시퀀스의 수입니다. 모든 시퀀스는 자기 캐시를 따로 보관하므로 메모리는 배치에 비례해 커집니다.
캐시된 수 하나를 저장하는 데 쓰는 바이트 수입니다. 반정밀도는 2바이트를 쓰고, 8비트 캐시 양자화는 1바이트를 써서 용량을 절반으로 줄입니다.
결과
값을 입력하면 계산 결과가 표시됩니다.
KV 캐시 메모리 추정치입니다. 레이어당 텐서 2개에 키/값 헤드 32개, 헤드 차원, 컨텍스트 길이, 배치를 곱하면 약 ... GB입니다.
KV 캐시 크기
트랜스포머 추론 중에 모델은 지금까지 본 모든 토큰을 어텐션합니다. 매 생성 스텝마다 전체 컨텍스트의 키와 값 벡터를 다시 계산하지 않으려고, 모델은 이를 저장해 두고 재사용합니다. 이것이 키-값 캐시입니다. 이 캐시는 긴 컨텍스트 서빙에서 가속기 메모리를 가장 많이 잡아먹는 요인이 되곤 하며, 때로는 모델 가중치 자체보다 커지기도 합니다. 이 계산기는 레이어 수, 키/값 헤드 수, 헤드 차원, 컨텍스트 길이, 배치 크기, 그리고 저장된 수 하나당 바이트로부터 그 크기를 추정합니다.
캐시가 존재하는 이유
텍스트를 한 번에 한 토큰씩 생성한다는 것은, 새 토큰마다 그 앞의 모든 토큰을 어텐션해야 한다는 뜻입니다. 캐시가 없으면 매 스텝마다 전체 프롬프트와 그동안의 출력을 다시 처리해야 하므로 생성 비용이 시퀀스 길이의 제곱으로 늘어납니다. 과거 토큰의 키와 값을 보관해 두면, 모델은 각 스텝을 새 토큰에만 비례하는 작업으로 바꿉니다. 그 속도의 대가는 메모리입니다. 레이어마다, 키/값 헤드마다, 컨텍스트의 토큰마다 키와 값이라는 벡터 한 쌍을 들고 있어야 합니다.
공식
캐시는 키와 값 두 텐서를 보관하므로, 바이트 단위 크기는 다음과 같습니다.
Kbytes=2⋅L⋅H⋅d⋅s⋅B⋅e
여기서 은 레이어 수, 는 키/값 헤드 수, 는 헤드 차원, 는 토큰 단위 컨텍스트 길이, 는 배치 크기, 는 저장 요소당 바이트입니다. 로 나누면 기가바이트가 됩니다. 크기는 각 요인에 선형으로 커지며, 이것이 핵심 직관입니다. 컨텍스트, 배치, 레이어 수 중 무엇이든 2배가 되면 캐시도 2배가 됩니다.
그룹 쿼리 어텐션
그룹 쿼리 어텐션(GQA)이 겨냥하는 대상이 바로 키/값 헤드 수 입니다. 평범한 멀티헤드 어텐션에서는 쿼리 헤드마다 키/값 쌍을 하나씩 소유합니다. GQA는 쿼리 헤드 한 그룹이 키/값 헤드 하나를 공유하게 하고, 멀티쿼리 어텐션은 레이어 전체에 걸쳐 단 하나만 공유합니다. 캐시가 에 비례하므로, 키/값 헤드를 32개에서 8개로 줄이면 쿼리 헤드와 모델 품질 대부분은 그대로 둔 채 캐시를 4분의 1로 줄일 수 있습니다. 최근의 대규모 모델 대부분이 바로 이 이유로 GQA를 채택합니다.
계산 예시
레이어 32개, 키/값 헤드 32개, 헤드 차원 128을 가진 모델이 4,096 토큰의 컨텍스트를 들고, 16비트 정밀도로 시퀀스 하나를 서빙한다고 합시다.
Kbytes=2×32×32×128×4096×1×2=2,147,483,648
약 2.15 GB입니다. 이런 시퀀스 4개를 동시에 서빙하면 4배가 되어 대략 8.59 GB가 됩니다. 캐시를 8비트 정밀도로 바꾸면 두 수치 모두 절반으로 줄어듭니다.
결과 읽기
모든 요인이 선형으로 곱해지므로, 긴 컨텍스트와 큰 배치를 함께 쌓으면 캐시가 가중치를 압도할 수 있습니다. 이것이 운영 추론 엔진이 요소당 바이트를 줄이는 캐시 양자화, 키/값 헤드를 줄이는 GQA, 단편화 없이 캐시를 채우는 페이지드 어텐션에 의존하는 이유입니다. 같은 하드웨어 예산의 연산 측면은 어텐션 메모리 계산기에서, 모델 가중치 부분은 LLM 추론 VRAM 계산기에서 다룹니다.
자주 묻는 질문 (FAQ)
KV 캐시란 무엇인가요?
자기회귀 생성 중에 트랜스포머는 이전의 모든 토큰을 어텐션합니다. 매 스텝마다 전체 컨텍스트의 키와 값 벡터를 다시 계산하는 대신, 이를 저장해 두고 재사용하는데 그 저장소가 바로 KV 캐시입니다. 캐시는 메모리를 내주고 속도를 얻는 거래입니다. 캐시가 없으면 새 토큰을 생성할 때마다 전체 프롬프트와 그동안 만든 출력을 모두 다시 처리해야 합니다. 캐시는 레이어마다, 키/값 헤드마다 키와 값 두 텐서를 보관하며, 컨텍스트의 토큰 하나마다 항목 하나를 둡니다.
그룹 쿼리 어텐션은 캐시를 어떻게 줄이나요?
표준 멀티헤드 어텐션은 쿼리 헤드마다 별도의 키/값 쌍을 둡니다. 그룹 쿼리 어텐션(GQA)은 여러 쿼리 헤드가 하나의 키/값 헤드를 공유하게 하고, 멀티쿼리 어텐션은 이를 극단으로 밀어붙여 키/값 헤드 하나만 공유합니다. 캐시 크기가 키/값 헤드 수에 비례하므로, 예를 들어 32개에서 8개로 줄이면 쿼리 헤드와 모델 품질 대부분은 그대로 둔 채 캐시를 4분의 1로 줄일 수 있습니다.
긴 컨텍스트는 왜 그렇게 메모리를 많이 쓰나요?
캐시는 컨텍스트 길이에 선형으로 커집니다. 컨텍스트의 토큰 수가 2배가 되면 캐시도 2배가 됩니다. 또한 배치 크기에도 선형으로 커지므로, 긴 컨텍스트 시퀀스를 한꺼번에 많이 서빙하면 두 요인이 곱해집니다. 긴 컨텍스트에서는 KV 캐시가 모델 가중치 자체가 차지하는 메모리를 넘어설 수 있는데, 그래서 긴 컨텍스트 서빙은 캐시 양자화, GQA, 페이지드 어텐션 같은 기법에 의존합니다.
면책조항
이 추정치는 명시된 정밀도에서 키와 값 텐서만 계산하며, 메모리 단편화나 페이징 메타데이터, 프레임워크 예약 같은 서빙 오버헤드는 무시합니다. 특정 추론 엔진에서의 실제 사용량은 이보다 다소 높습니다.