XQuant란 무엇인가?

'연산 능력'보다는 '메모리'가 더 중요한 이슈가 되는 LLM 환경. 메모리 사용량을 최대 12배 절약하게 해 주는 XQuant, 그리고 XQuant-CL 기법에 대해 알아봅시다

들어가며

오늘 이야기할 XQuant가 어떤 것이구나 하는 감을 쉽게 잡으시게끔, 나름대로 간단히 먼저 세팅을 좀 해 볼까 합니다.

ChatGPT 같은 AI가, ‘아주 똑똑한 학생’이라고 한번 생각을 해 봅시다. 이 학생은 계산을 엄청나게 빠르게 잘해요. 그런데 학생의 책상이 아주 작아서 책이나 노트를 많이 올려놓을 수가 없어요. 즉, 계산은 잘하는데 기억하는 공간(메모리)이 부족한 거죠.

AI가 긴 글을 쓸 때는, 이전에 썼던 모든 내용을 전부 기억하고 있어야 앞뒤가 맞는 자연스러운 문장을 만들 수 있고, 이 ‘기억 공간’을 KV 캐시라고 부릅니다. 글이 길어질수록 이 공간이 너무 커져서 결국 속도가 느려지고 버벅거리게 되죠.

지금까지는, 이 문제를 해결하려고 노트를 아주 작게 줄이거나(Quantization), 간단히 요약해서 (LoRA) 책상 위에 억지로 꾸겨 넣었습니다. 문제는, 이렇게 하면 노트가 뭉개지거나 중요한 내용이 빠져서 글의 정확도가 떨어지는 일이 자주 발생한다는 겁니다.

XQuant는 아주 영리한 다른 방법을 사용합니다. 아예 모든 노트를 책상 위에 올리는게 아니라, 아주 핵심적인 ‘요약본’만 남겨두겠다는 겁니다. 그리고 나중에, 필요한 내용이 있을 때마다 그 요약본을 보고 즉석에서 원래의 노트를 다시 만들어내는 거예요.

이 방법은, 원래 노트를 다시 만드는데 약간의 시간(계산)이 더 필요하지만, 그 대신 책상(메모리)을 무려 최대 12배까지 넓게 쓸 수 있게 해 준다는 엄청난 장점이 있습니다.

한 마디로, 조금 더 머리를 써서 메모리를 아주 많이 아끼는 기술이다 라고 생각하시면 되겠습니다.

편집자 주

개발자의 입장에서, LLM이 정확하면서도 최대한 빠르게 반응하도록 하는, 높은 추론 속도를 확보하는 건 아주 중요하면서도 만만치 않은 과제입니다. LLM도 결국은 하드웨어를 통해서 구동되니까, 처리 속도에 영향을 미치는 두 가지의 핵심 요소가 있습니다.

  • 연산(Computation): 하드웨어가 얼마나 많은 수학 연산을 수행해야 하는가

  • 메모리(Memory): 얼마나 많은 데이터를 메모리에서 옮겨와야 하는가

LLM은 연산 능력보다는 메모리 용량에 더 크게 좌우됩니다. 지금 우리는 ‘토큰 하나 생성하는 데는 작은 행렬-벡터 곱셈만 하면 되지만, 엄청난 양의 데이터를 메모리에서 불러오는 과정이 끊임없이 반복되는 시대’에 살고 있으니까요. LLM 추론에서 메모리는 연산(하드웨어 계산)보다 더 큰 문제고, 그래서 메모리의 한계를 극복하려는 수많은 연구가 진행되고 있습니다.

그중 하나가 바로 UC 버클리, FuriosaAI, ICSI, LBNL의 최근 연구인 XQuant입니다. 이 기법은, 약간의 연산 비용을 추가해서 메모리 사용량을 최대 12배까지 줄일 수 있는 방법입니다. XQuant와 그 변형인 XQuant-CL 기법은, 일반적으로 정확도를 하락시키게 되는 ‘KV 캐시 양자화’ 같은 기술을 우회해서 작동하게 되는데요.

오늘 에피소드에서는 KV 캐싱부터 시작해서, 이 새로운 기술이 어떻게 작동하는지, 어떤 능력을 가졌는지, 한 번 XQuant 개발자들의 뒤를 함께 따라가 보겠습니다.

오늘 에피소드에서는 다음과 같은 내용을 다룹니다:

KV 캐시와 KV 캐싱

오늘 에피소드에서는 ‘대용량의 메모리 사용 문제’에 대한 이야기를 해야 합니다.

짧은 텍스트라면 ‘모델 가중치’ 정도가 메모리 부하의 대부분이겠지만, 긴 텍스트가 들어온다면 Key-Value(KV) 캐시가 더 큰 문제가 됩니다.

KV 캐시에는 모델이 전체 컨텍스트를 추적할 수 있도록 셀프 어텐션(Self-Attention)을 위해서 전체 시퀀스의 표현을 저장하는데요, 입력의 길이에 따라서 용량이 선형적으로 증가하기 때문에 여러 가지 한계를 초래하게 됩니다. 튜링포스트 코리아의 여러 글에서 이 문제, 그리고 이 문제를 해결하기 위해 등장한 다양한 방법들에 대해서 이야기하기도 했었죠.

그렇게, KV 캐시를 압축하기 위해서 가장 널리 쓰이는 방법 중 하나가 양자화거든요. 어쨌든 그 전에, 우선 KV 캐시가 정확히 뭔지부터 좀 살펴보겠습니다.

트랜스포머 모델에서는, 각각의 토큰이 처리될 때마다 어텐션 메커니즘이 Keys(K)와 Values(V)를 필요로 합니다 - 이걸 활용해서 각각의 이전 토큰이 현재 토큰에 얼마나 영향을 미치는지 파악하게 되구요. 각각의 토큰은 다음의 세 가지 벡터로 표현됩니다.

  • Key (K): 토큰이 어떤 정보를 나타내는지 인코딩합니다.

  • Value (V): 해당 토큰이 관련 있다고 판단될 경우에 전달될 실제 내용을 인코딩합니다.

  • Query (Q): Keys(K)와 유사성 점수를 계산하는 데 사용되는 특징들을 인코딩합니다.

모델의 어텐션 메커니즘은 한 토큰의 Query를 이전의 모든 Keys와 비교합니다. 그 결과로 얻은 유사성(Similarity) 점수는 해당하는 Values에 가중치를 부여하는 데 사용되고, 이를 통해서 토큰의 컨텍스트를 인지한 표현을 만들어내는 겁니다.

좀 더 쉽게 예를 들어본다면:

  • 상황: 도서관에서 책을 찾는다고 생각해 봅시다.

    • Query: 찾고 싶은 책의 주제나 키워드(예: "로보틱스 책").

    • Key: 도서관에 있는 모든 책의 제목이나 주제를 요약한 태그(예: "AI", "로보틱스", "소설").

    • Value: 책 자체의 내용(실제 페이지, 정보)

요약하면, Query("로보틱스 책")를 가지고 Key(책 태그)들과 비교해 관련 있는 책을 찾고, 그 책의 Value(내용)를 가져오는 식입니다. 어텐션 메커니즘은 이 과정을 수학적으로 수행해서 중요한 정보만 골라내는 거죠.

자동 회귀(Autoregressive) 방식의 텍스트 생성 과정에서는, 모델은 일반적으로 새로운 토큰이 나올 때마다 모든 K와 V 행렬을 처음부터 다시 계산합니다. 그런데 이 방식은, 상상하실 수 있겠지만, 시퀀스 길이에 따라 비용이 커지기 때문에 아주 비효율적인 과정이고, 계산 비용도 엄청나게 들죠. 그런데, 디코딩 각 단계에서 이걸 매번 모두 다시 계산할 필요가 없고, 그래서 KV 캐시라는, 이전에 계산된 Keys와 Values를 저장하는 메모리 구조가 등장합니다. 즉, KV 캐시에 이전에 계산한 K와 V를 저장해서 재사용하고, 디코딩 단계에서는 새 토큰의 K와 V만 계산하면 되니까 효율성을 크게 높일 수 있는 겁니다. 이 과정, 추론 과정에서 KV 캐시를 활용하는 걸 바로 KV 캐싱이라고 하는 거구요:

  • 먼저 GPU 메모리에 첫 번째 토큰에 대한 Keys와 Values를 계산하고 저장합니다.

  • 그다음 단계마다 모델이 저장된 Keys와 Values를 불러온 뒤에, 새로운 토큰의 Keys와 Values를 추가하고, 새로운 토큰의 Query에 대해서만 어텐션을 계산합니다.

Image Credit: Mastering LLM Techniques: Inference Optimization (엔비디아 블로그)

이렇게 하면, 캐시가 단계별로 증가하는 셈이라서 어텐션(Attention)이 훨씬 빠르게 계산되죠.

물론, 여전히 KV 캐시가 입력의 길이에 따라서 ‘선형적으로’ 늘어나는 건 변함이 없고, 그래서 메모리 사용량은 기하급수적으로 증가합니다. 그래서 KV 캐시를 압축하는 아이디어가 나오는 거죠. 여기에는 두 가지의 일반적 방법이 있습니다:

KV 캐시 압축 및 그 한계

KV 캐시를 압축하는 첫 번째 방법은 양자화(Quantization)입니다. 양자화를 이용해서 KV 캐시를 압축하는 건, 데이터를 더 적은 비트로 표현하는 것을 의미합니다. 이 기법으로 더 많은 토큰을 캐시할 수 있으니, 컨텍스트 길이를 늘리고 메모리 사용량을 줄일 수 있습니다. 하지만 양자화 수준이 2~3비트 정도로 너무 낮아지면, 모델의 정확도가 급격히 떨어집니다.

또 다른 접근법은, 저랭크 분해(Low-Rank Decomposition) 기법으로 KV 캐시를 작은 공간으로 압축하는 겁니다 - 큰 행렬을 더 작고 압축된 형태로 분해하는 것을 뜻하구요. 하지만 이 방법 역시 정확도의 손실이 따릅니다. 중요한 정보를 버릴 위험이 있고, 여러 랭크에 걸쳐 압축 및 압축 해제가 일어나기 때문에 수학적으로도 복잡합니다.

OpenMachine에서 나온 'Slim Attention'이라는 흥미로운 아이디어도 있습니다:

이 기법은, Keys만 저장하고 수학적 트릭을 사용해서 Values를 복구하는 방식입니다. 그렇지만, 혁신적인 만큼 불안정한 행렬 역변환을 해야 하고, RoPE(로터리 위치 임베딩)이나 GQA(그룹화된 쿼리 어텐션) 같은 기법과 함께는 잘 작동하지 않는다는 문제도 있구요.

이런 모든 방법들의 장단점을 살펴보면, 결국 중요한 문제들이 떠오릅니다:

  • GPU의 연산 속도는 계속 빨라지겠지만, 메모리 용량의 증가는 그 속도를 따라가지 못할 겁니다

  • 더불어서, KV 캐시 양자화나 저랭크 분해 같은 기존 방법들은 정확도 저하라는 문제를 초래할 수 밖에 없습니다.

결국, 메모리를 더 효과적으로 절약하고, 정확도는 유지하거나 높일 수 있고, 압축하기도 더 쉬운, 어떤 새로운 방법이 필요한 겁니다. 그리고 바로 여기, 최신의 해결책 중 하나가 등장합니다.

XQuant란 무엇인가?

XQuant는 UC 버클리, FuriosaAI, ICSI, LBNL의 연구팀에서 제안한 새로운 방법입니다. LLM을 실행할 때 약간의 추가적인 연산을 감수하는 대신 메모리 사용량을 획기적으로 줄여서, 연구자들이 보통 '메모리 장벽(Memory Wall)'이라 부르는 한계를 무너뜨려버립니다.

이 팀의 연구자들은, "GPU는 이론적으로 엄청난 양의 수학 연산을 할 수 있지만, 막상 그에 필요한 데이터를 충분히 빠르게 공급받지 못한다"는 아이디어에 주목했습니다. 여기서의 논리적인 해결책은, 추가적인 계산 비용이 좀 더 들더라도 메모리 작업을 줄인다는 접근이었죠.

튜링 포스트 코리아의 인사이트가 담긴 컨텐츠를 마음껏 읽어보세요!

튜링 포스트 코리아의 ‘AI 101’ 전체 에피소드는 프리미엄 구독자들께는 발행 즉시, 무료 구독자들께는 발행 2주 후 공개됩니다. 프리미엄 플랜으로 업그레이드하시면 튜링 포스트 코리아의 모든 컨텐츠를 제한없이 보실 수 있고, 튜링 포스트 코리아의 컨텐츠 제작에 큰 도움이 됩니다. 감사합니다!

  • 주간 AI 뉴스레터

  • AI 유니콘 기업들에 대한 심층 분석 기사

  • AI 기술, 산업, 정책 전문가 인터뷰

  • AI 기술 및 산업에 대한 심층 분석 시리즈

  • 분석 기사 요청 및 튜링 포스트 코리아 기고

읽어주셔서 감사합니다. 친구와 동료 분들에게도 뉴스레터 추천해 주세요!

Reply

or to participate.