3줄 요약

  1. 희소 어텐션은 긴 컨텍스트 추론의 계산량과 메모리 대역폭을 줄여 주었지만 두 가지 문제를 남겼다. KV 캐시 용량은 여전히 시퀀스 길이에 비례해 늘어나고, 이것을 CPU 메모리로 내려 두면 PCIe 전송이 새 병목이 된다. 게다가 어떤 블록을 읽을지 고르는 선택 단계는 O(T²), 곧 시퀀스 길이의 제곱에 비례하는 복잡도로 남아 있다. 컨텍스트가 길어지면 이 단계가 어텐션 계산보다 비싸진다.
  2. NVIDIA 연구진이 내놓은 SparDA는 층마다 Query, Key, Value 옆에 네 번째 투영인 Forecast를 하나 더 만든다. 각 층에서 나온 Forecast가 바로 다음 층이 읽을 KV 블록을 미리 골라 준다. 선택이 어텐션 질의에서 떨어져 나오는 덕분에, CPU에서 GPU로 블록을 당겨 오는 전송을 현재 층의 계산 뒤에 감출 수 있다.
  3. 희소 사전학습을 마친 80억 파라미터 규모의 모델 두 개에 파라미터를 0.41%만 더하고 Forecast 투영만 학습시켰더니, 정확도는 기존 희소 기준선과 같거나 조금 나으면서 프리필이 최대 1.25배, 디코드가 최대 1.7배 빨라졌다. 배치 크기를 키울 수 있게 된 덕분에 오프로딩하지 않는 희소 기준선과 견주면 디코드 처리량이 최대 5.3배까지 올라갔다.

희소 어텐션이 남겨 둔 두 개의 병목

왼쪽에서는 상자들이 너무 가느다란 관을 하나씩 힘겹게 통과하고, 오른쪽에서는 산더미처럼 쌓인 카드 목록이 쏟아질 듯 기울어 있다. 그 사이에 낀 치비 서소영이 진땀을 흘린다

긴 컨텍스트를 다루는 추론 서버는 세 가지 부담을 진다. 프리필 구간에서는 어텐션 계산량이 많고, 디코드 구간에서는 메모리 대역폭이 부족하며, 같은 디코드 구간에서 KV 캐시가 차지하는 용량도 계속 불어난다. 희소 어텐션은 이 가운데 앞의 두 가지를 상당히 덜어 주었고, 그래서 최근의 프런티어 모델들이 이 기법을 채택했다.

용량 문제는 그대로 남았다. 시퀀스가 길어지면 KV 캐시가 GPU 메모리를 다 먹기 때문에, 캐시 전체를 CPU 메모리에 내려놓고 디코드할 때마다 필요한 블록만 GPU로 올리는 방법을 쓰게 된다. 그런데 PCIe를 거쳐 CPU에서 읽어 오는 속도는 GPU 메모리에서 읽는 것보다 훨씬 느리다. 용량 병목을 전송 병목으로 바꿔 놓은 셈이다.

두 번째 문제는 조금 덜 알려져 있다. 희소 어텐션이 어텐션 자체의 복잡도를 O(T²)에서 O(T)로 낮춘 것은 맞지만, 어떤 블록이 중요한지 점수를 매겨 상위 k개를 고르는 선택 단계는 여전히 O(T²)다. 컨텍스트가 길어질수록 이 선택 비용이 어텐션 계산을 앞지른다. 논문은 128K 토큰 프리필 구간에서 블록 선택 시간이 블록 희소 어텐션 시간과 맞먹는 수준까지 올라갔다고 보고한다. 디코드 구간에서는 질의 토큰이 하나뿐이라 어텐션이 워낙 싸기 때문에 선택이 아예 지배적인 비용이 됐다.

기존 연구들도 이 두 문제를 따로따로 건드렸다. InfiniGen은 이전 층의 은닉 상태를 다음 층 어텐션의 대리 지표로 삼아 미리 가져오기를 시도했다. 인접한 층끼리 은닉 상태가 비슷하다는 가정에 기대는 방식이라, 그 가정이 깨지면 예측이 어긋난다. IndexCache와 HISA는 선택 비용을 줄였으나 정확도를 조금씩 희생하는 대가가 있었다.

네 번째 투영

걸이에 똑같은 등불 세 개가 걸려 있고 그 옆에 새로 걸린 가느다란 망원경 하나. 치비 서소영이 그 망원경을 문 열쇠구멍에 대고 옆방 선반을 미리 살피며 손가락으로 가리킨다

SparDA의 구조 변경은 하나다. 각 층의 선형 투영이 Query, Key, Value에 더해 Forecast라는 네 번째 출력을 내놓는다.

각 층의 Forecast는 자기 층에서 쓰이지 않는다. 대신 다음 층의 압축된 키에 점수를 매겨 상위 k개 블록을 고른다. 그 다음 층이 실제로 어텐션을 계산할 때는 원래의 Query를 그대로 쓴다. 고르는 일과 계산하는 일이 서로 다른 층으로 갈라진 것이다.

InfLLM-V2 계열의 블록 희소 어텐션은 어텐션 대상을 세 덩어리로 나눈다. 문서 앞머리의 고정 블록, 현재 위치 주변의 슬라이딩 윈도, 그리고 점수로 뽑은 상위 k개 블록이다. SparDA가 손대는 곳은 마지막 하나뿐이라, 같은 구조를 쓰는 NSA나 MoBA, QUEST 같은 방법에도 그대로 옮겨 붙일 수 있다고 저자들은 본다.

이 분리가 이득이 되는 방식은 구간마다 다르다.

  • 프리필 구간에서는 키가 이미 전부 GPU에 올라와 있으므로 미리 가져올 것이 없다. 여기서 얻는 것은 선택 자체가 싸진다는 점이다.
  • 디코드 구간에서는 KV 캐시가 CPU에 내려가 있다. 현재 층이 아직 실행 중일 때 이미 다음 층이 읽을 블록 목록이 나와 있으므로, 런타임은 그 사이 해당 블록을 CPU에서 GPU로 옮겨 놓는다. PCIe 전송이 층 실행 시간 뒤로 숨는다.

이것이 성립하려면 다음 층의 블록 선택이 아직 만들어지지 않은 값에 의존하지 않아야 한다. 저자들은 두 가지로 이 조건을 맞춘다. 압축된 키는 GPU에 남겨 두고 점진적으로 갱신하며, 상위 k개를 고를 대상에서 고정 블록과 지역 블록을 빼 둔다. 그래서 예측한 블록 집합이 다음 층에 새로 덧붙는 키와 무관해진다.

첫 층과 마지막 층은 예외 처리가 필요하다. 0번째 층에는 참조할 이전 Forecast가 없으므로 별도 투영으로 같은 층용 Forecast를 만들어 쓴다. 마지막 층의 Forecast는 예측해 줄 다음 층이 없으니 버린다.

헤드를 줄이고 소프트맥스를 건너뛴다

선택이 어텐션 질의에서 풀려나면 따라오는 이득이 하나 더 있다. 선택기가 어텐션과 같은 헤드 구조를 유지할 이유가 사라진다.

기존 블록 희소 선택기는 GQA 그룹 하나를 채점할 때, 그 그룹에 속한 여러 질의 헤드가 각각 점수를 내고 이를 합산한다. 질의가 곧 선택기였으니 어쩔 수 없었다. SparDA의 Forecast 인덱서는 GQA 그룹당, 그러니까 KV 헤드당 Forecast 헤드를 하나만 둔다. 질의 헤드별 채점 반복문이 통째로 사라지고, 그룹 내부에서 점수를 합칠 일이 없으므로 상위 k개를 뽑기 전에 적용하던 소프트맥스도 건너뛴다.

DeepSeek의 DSA가 쓰는 라이트닝 인덱서가 토큰 단위에서 이미 같은 착상을 활용하고 있었다. SparDA는 그것을 블록 단위 희소 어텐션으로 옮기면서, 한 층 앞서 작동하게 했다.

학습은 인덱서만

천으로 덮여 사슬과 자물쇠로 잠긴 커다란 기계 옆에서, 치비 서소영이 밖으로 드러난 작은 톱니 하나만 드라이버로 맞추고 있다. 그 오른쪽으로는 컨베이어가 상자를 실어 계속 흘려보낸다

SparDA는 이미 희소 어텐션으로 사전학습된 모델에 더하는 추가 모듈이다. 기본 모델은 고정한 채 Forecast 투영만 학습한다. MiniCPM4.1-8B와 NOSA-8B 양쪽에서 늘어난 파라미터는 3,350만 개로, 전체의 0.41%였다.

학습 목표는 원래 선택기가 내던 블록 어텐션 분포를 따라가는 것이다. DSA를 따라 상위 k개로 제한하고 재정규화한 뒤 KL 발산을 최소화한다. 목표 점수로는 마지막 맥스 풀링 단계를 거치기 전의 그룹 공유 중요도 점수를 쓴다. 맥스 풀링이 인덱서가 배워야 할 미세한 순위 정보를 지워 버리기 때문이다. 선택되지 않은 블록은 하나의 나머지 항으로 묶어 k+1차원 분포를 만든다. 이렇게 하면 상위 k개 안의 상대 순위에 집중하면서, 나머지 블록이 차지하는 확률 질량도 함께 통제할 수 있다.

흥미로운 세부 설계가 하나 있다. 목표 점수를 만들 때 쓰는 키 압축 창을, 추론 때와는 다르게 잡는 편이 낫다고 한다. 예측 쪽은 추론 설정과 맞추어 커널 32, 스트라이드 16을 쓰지만, 목표 쪽은 커널 2, 스트라이드 1이라는 훨씬 촘촘한 창을 쓴다. 압축 단위가 작을수록 각 압축 키가 대표하는 토큰 수가 줄어 목표 점수가 더 또렷해지고, 인덱서가 더 날카로운 선택을 배운다는 설명이다. 그렇게 만든 목표 점수 텐서는 KL을 계산하기 전에 맥스 풀링으로 추론 때와 같은 격자로 되돌린다.

학습 비용은 크지 않다. H100 32장으로 옵티마이저 스텝 2,000회를 돌렸고, 학습 데이터는 ProLong-64K, 시퀀스 길이는 65,536 토큰이다. MiniCPM4.1-8B는 64K 설정에서 48시간, NOSA-8B는 32K 설정에서 24시간 안에 끝났다.

전송을 감추는 상주 커널

블록 목록을 한 층 먼저 안다고 해서 전송이 저절로 숨겨지지는 않는다. 저자들은 이 부분을 커널 수준에서 따로 설계했다.

선택된 블록은 고정된 CPU 메모리에서 전용 CUDA 스트림을 타고 올라온다. SparDA는 작고 불규칙한 복사를 여러 번 실행하는 대신, 통합 가상 주소 지정(UVA)에 기반한 상주 Triton 커널을 쓴다. 소수의 GPU 스레드 블록(CTA)을 한 번 띄워 놓고, 이들이 한 번의 커널 실행 내내 전송 작업을 계속 받아 처리한다. 커널 실행 부담이 줄고, 잦은 동기화가 없어지며, 주 계산 스트림과 부딪히는 정도도 줄어든다.

CTA를 몇 개나 떼어 줄지는 배치 크기에 따라 달라진다. CTA를 늘리면 전송이 PCIe 대역폭 한계까지 빨라지지만, 그만큼 어텐션과 FFN이 쓸 SM을 뺏는다. 배치가 작을 때는 GPU가 놀고 있고 층 실행이 전체 시간을 좌우하므로 적은 CTA로 충분하다. 배치가 커지면 SM 점유율이 좋아져서 층 실행 시간은 생각만큼 늘지 않는다. 그런데 전송량 쪽은 배치에 그대로 비례해 불어난다. 어느 지점을 넘어서면 전송이 새 병목 자리를 차지한다. H100에서는 배치 32 미만이면 CTA 16개, 그 이상이면 32개를 쓰는 단순한 규칙을 채택했다. 이 규칙과 최적 고정 설정의 성능 차이는 모든 배치 크기에서 4% 이내였다. A100에서는 기준점이 배치 64로 옮겨 간다.

정확도는 유지되거나 조금 올라갔다

평가 대상은 8B 모델 두 개다. MiniCPM4.1-8B는 InfLLM-V2를 희소 백본으로 쓰고, NOSA-8B는 그 위에 질의 비의존 축출 헤드를 하나 더 얹은 모델이다. 벤치마크는 HELMET, LongBench, RULER, 그리고 추론 묶음(MATH-500, AIME 2024, AIME 2025) 네 갈래다. 아래 표에서 Dense는 희소화하지 않은 조밀 어텐션, Sparse는 SparDA를 얹기 전의 희소 어텐션 기준선을 가리킨다.

먼저 MiniCPM4.1-8B를 보자. 평균은 네 갈래 점수의 산술 평균이다.

방법HELMETLongBenchRULER추론평균
Dense41.744.885.382.363.5
Sparse38.945.078.283.661.4
InfiniGen33.545.168.483.757.7
SparDA38.345.178.784.761.7

NOSA-8B에서는 순위가 이렇게 갈린다.

방법HELMETLongBenchRULER추론평균
Dense39.342.586.241.652.4
Sparse32.242.472.250.749.4
InfiniGen28.141.665.247.645.6
SparDA33.442.373.957.251.7

MiniCPM4.1-8B에서는 평균이 0.3점 올랐다. RULER가 0.5점, 추론이 1.1점 올랐고 LongBench는 거의 같으며 HELMET만 0.6점 내려갔다. NOSA-8B에서는 평균이 2.3점 올랐다. 추론 점수가 6.5점 오른 것이 가장 큰 몫이었다.

두 모델 모두 Dense와 Sparse 사이에 눈에 띄는 간격이 있다. 저자들은 평가 길이 탓이라고 설명한다. 각 모델을 최대 시퀀스 길이에서 평가했는데, 그 길이가 MiniCPM4.1-8B는 64K, NOSA-8B는 32K다. 반면 두 모델의 희소 어텐션 사전학습은 그보다 짧은 길이에서 이뤄졌다. 각각 32K와 16K다.

InfiniGen은 두 모델 모두에서 정확도가 크게 떨어졌다. 학습 없이 인접 층의 은닉 상태 유사도에 기대다 보니, 그 유사도가 낮은 구간에서 엉뚱한 블록을 집어 온다.

길이를 늘려 가며 RULER를 다시 재면 학습된 Forecast의 성질이 더 잘 드러난다.

모델방법32K64K96K128K
MiniCPM4.1-8BSparse86.178.268.767.7
MiniCPM4.1-8BSparDA87.678.770.868.8
NOSA-8BSparse72.256.648.840.7
NOSA-8BSparDA73.960.552.945.0

NOSA-8B에서 간격이 32K의 1.7점에서 128K의 4.3점으로 꾸준히 벌어진다. 학습으로 얻은 선택기는 학습하지 않은 기준 선택기에 못지않게 일반화한다. 일부 구간에서는 더 낫다.

속도는 두 갈래에서 온다

모래시계 두 개가 나란히 놓여 있다. 왼쪽은 모래가 위쪽에 그대로 남아 있고 오른쪽은 거의 다 흘러내렸다. 치비 서소영이 더 빨리 흐른 오른쪽 모래시계에 손을 얹고 흐뭇하게 견준다

프리필 처리량부터 보자. H100에서 배치 4로 MiniCPM4.1-8B를 측정했으며, 단위는 초당 토큰이다.

방법32K64K96K128K
Dense (오프로드 없음)20388.313673.710228.38085.8
Sparse (오프로드 없음)18706.616377.314774.113676.1
Sparse18548.416254.414707.713661.8
InfiniGen18445.316249.914749.213643.9
SparDA19845.618379.517715.217087.6

Dense는 짧은 시퀀스에서 앞서다가 이차 증가 때문에 뒤처진다. SparDA는 64K부터 모든 방법을 앞지른다. 128K에서는 Sparse보다 1.25배, Dense보다 2.11배 빠르다. NOSA-8B에서는 96K부터 선두에 서고, 128K에서 각각 1.16배와 1.40배가 된다. 이 차이는 전부 블록 선택 비용을 줄인 데서 나온다. 128K 프리필에서 SparDA는 선택 시간을 최대 2.50배 줄이면서 블록 희소 어텐션 시간은 기존과 비슷하게 유지했다.

프리필에서는 오프로딩으로 인한 손해가 거의 없다. 오프로드하지 않는 Sparse와 오프로드하는 Sparse가 거의 같은 수치를 낸다. 프리필 중에 일어나는 전송이라고는 새로 만든 KV 캐시 항목을 어텐션에 쓴 뒤, 비동기로 CPU에 내려보낼 뿐이기 때문이다.

디코드는 얘기가 다르다. 128K 구간, H100 기준으로 SparDA는 Sparse 대비 MiniCPM4.1-8B에서 1.69배, NOSA-8B에서 1.40배 빨라진다. 가장 큰 이득은 배치 8에서 16 사이, 그러니까 미리 가져오기와 층 실행이 엇비슷하게 맞물리는 구간에서 나온다.

오프로딩하지 않는 기준선과 비교하면 그림이 더 크게 벌어진다. 그 두 기준선은 긴 컨텍스트에서 배치 16을 넘기면 메모리 부족으로 아예 돌지 못한다. SparDA는 오프로딩 덕분에 훨씬 큰 배치를 감당한다. 그래서 MiniCPM4.1-8B에서 오프로드 없는 Sparse보다 최대 5.28배, 오프로드 없는 Dense보다 최대 9.21배의 디코드 처리량을 낸다.

부록의 분해 실험이 두 이득의 비중을 갈라 놓는다. 128K에서 Forecast 인덱서만 쓰고 미리 가져오기는 끄면, 배치 4에서는 이미 Sparse보다 빠르다. 선택 비용이 줄어든 몫이다. 그런데 배치 64까지 올라가면 이 변형은 오히려 Sparse보다 느려진다. 배치가 커질수록 선택 비용을 아끼는 몫은 줄어들지만, 인덱서 투영 비용은 그대로 남기 때문이다. 미리 가져오기를 함께 켠 SparDA는 배치 16부터 앞서기 시작해, 배치 64에서 40% 가까이 빨라진다. 큰 배치에서는 선택 비용을 아끼는 것보다 전송을 층 실행과 겹치는 효과가 더 크다.

InfiniGen은 디코드에서 Sparse보다 일관되게 느렸다. 상위 k개 블록을 CPU에서 먼저 모은 다음 GPU로 보내는 구조라, CPU 쪽 수집이 병목이 된다.

저자들이 인정하는 한계

SparDA는 그 자체로 희소 어텐션 방법이 아니다. 이미 있는 희소 어텐션 백본 위에 얹어 추론 효율을 올리는 추가 구성 요소다. 분리된 인덱서는 선택 경로를 갈아 끼울 뿐 희소 어텐션 계산이나 희소 패턴 자체를 바꾸지 않으므로, 정확도의 상한은 기본 희소 어텐션 방법이 정한다.

메모리 쪽으로도 작은 대가가 있다. 0번째 층은 미리 가져올 근거가 되는 이전 Forecast가 없어서 KV 캐시를 GPU에 남겨 둔다. 이 때문에 긴 컨텍스트에서 SparDA가 Sparse보다 조금 먼저 메모리 부족에 걸린다. Sparse가 더 큰 배치로 돌 때에도 SparDA의 최고 처리량이 여전히 높기는 했다.

확장 방향은 열려 있다. 분리된 인덱서라는 착상은 블록 단위에만 매여 있지 않다. 저자들은 DeepSeek-V3.2나 GLM-5가 쓰는 토큰 단위 DSA에도, DeepSeek-V4의 압축 희소 어텐션 경로에도 같은 앞서보기 설계를 옮길 수 있다고 본다. 해당 모델들은 실험에 쓴 8B 모델보다 훨씬 커서, 저자들은 이를 후속 과제로 남겼다.

내가 곱씹은 대목

결론 문단의 한 문장이 이 논문 전체를 요약한다. 희소 어텐션은 앞으로 어떤 메모리를 읽을지에 관한 정보를, 서빙 시스템이 손을 쓸 수 있을 만큼 일찍 내놓아야 한다는 것이다. 희소성을 계산을 아끼는 장치로만 보지 말고 오프로딩이 가능한 일정표로 보자는 제안이다.

논문이 다루는 두 문제는 서로 다른 층위에 있다. 선택이 비싸다는 것은 알고리즘 문제고, 전송이 느리다는 것은 시스템 문제다. Forecast 투영 하나가 두 문제를 함께 건드린다. 선택을 질의에서 떼어내니 인덱서의 헤드 수를 줄일 수 있어 알고리즘 비용이 내려간다. 그리고 그 선택이 한 층 앞서 계산되니 시스템이 전송을 감출 시간이 생긴다. 구조 변경 하나가 두 층위에서 각각 값을 치르지 않고 이득을 낸다는 점이 이 설계에서 가장 눈에 띄었다.

InfiniGen과의 대비도 오래 들여다봤다. InfiniGen은 학습 없이 은닉 상태를 대리 지표로 삼는다는 점에서 훨씬 가볍고 적용하기 쉽다. 그런데 결과는 정확도에서도 속도에서도 밀렸다. 3,350만 개의 파라미터를 더하고 H100 32장으로 하루에서 이틀을 학습한 대가로, 대리 지표를 두지 않고 목표를 직접 배우게 한 선택이 양쪽을 다 가져간 셈이다. 학습 없는 근사가 감당할 수 있는 범위가 어디까지인지를 보여 주는 사례로 읽었다.

출처

Yaosheng Fu, Guangxuan Xiao, Xin Dong, Song Han, Oreste Villa (NVIDIA, Thinking Machines Lab, ByteDance Seed, MIT), “SparDA: Sparse Decoupled Attention for Efficient Long-Context LLM Inference”, arXiv:2606.04511v1, 2026-06-03. CC BY 4.0.

이 글의 삽화는 원문에 재사용할 수 있는 도식 파일이 공개되어 있지 않아 직접 그린 것으로 대신했다. 「느낌적인 느낌을 숫자로 옮기는 일」의 치비 서소영 라인아트를 참조하여 gpt-image-2 image-to-image로 생성했다.

원문: https://arxiv.org/abs/2606.04511

소스 코드: https://github.com/NVlabs/SparDA