⚡ 3줄 요약
- 문맥이 길어질수록 어텐션이 추론 시간의 대부분을 잡아먹는다 — DeepSeek-R1은 4K에서 18%였던 것이 128K에서 85%까지 치솟는다.
- 범인은 어텐션의 제곱 스케일이다. 토큰이 2배 늘면 프리필 계산량은 대략 4배가 된다.
- 같은 어텐션이라도 프리필은 계산이, 디코드는 메모리가 병목이다. 하나로 뭉뚱그려 최적화하면 어느 쪽도 못 잡는다.
긴 문맥에서 추론을 진짜로 붙잡는 건 파라미터가 아니라, 제곱으로 불어나는 어텐션 연산이다. 모델 성능을 이야기할 때 우리는 보통 파라미터 수나 벤치마크 점수를 본다. 그런데 긴 문맥을 다루기 시작하면 진짜 발목을 잡는 건 다른 곳에 있다. 바로 어텐션이다. 짧은 프롬프트에서는 존재감도 없던 이 연산이, 문맥이 128K로 길어지면 추론 시간의 85%를 통째로 차지해 버린다. NVIDIA 개발자 블로그가 DeepSeek-R1로 측정한 숫자다. 이 글은 “어텐션이 왜 하필 긴 문맥에서 병목이 되는가”만 파고든다.
범인은 어텐션의 ‘제곱 스케일’이다
어텐션은 모든 토큰이 모든 토큰을 본다. 애초에 Transformer가 순환을 걷어내고 이 방식을 택한 것도 긴 입력에서 정보를 놓치지 않기 위해서였다. 토큰이 n개면 서로를 비교하는 짝은 n×n, 즉 n²다. 문맥을 2배 늘리면 비교해야 할 짝은 2배가 아니라 4배가 된다. 반면 모델의 다른 연산(피드포워드 등)은 대체로 토큰 수에 비례해 선형으로만 늘어난다. 그래서 문맥이 짧을 땐 어텐션이 전체에서 차지하는 몫이 작지만, 길어질수록 제곱 항이 선형 항을 순식간에 압도한다. 이게 어텐션이 긴 문맥에서만 유독 병목이 되는 근본 이유다.
| 문맥 길이 | 프리필 시간 중 어텐션 비중 | 읽는 법 |
|---|---|---|
| 4K | 18% | 어텐션은 아직 조연이다 |
| 32K | 4K와 128K 사이 중간 | 비중이 빠르게 넘어가는 구간 |
| 128K | 85% | 사실상 어텐션이 곧 추론 시간 |
수치는 NVIDIA가 DeepSeek-R1로 측정한 프리필 단계 기준이다. 4K에서 32배 늘어난 128K로 가는 동안 어텐션 비중은 18%에서 85%로 뛴다. 문맥을 늘린다는 건 단순히 “더 많이 읽는다”가 아니라, 추론 비용의 무게중심 자체를 어텐션으로 옮긴다는 뜻이다.

프리필과 디코드는 병목의 종류가 다르다
여기서 한 번 더 갈린다. 같은 어텐션이라도 추론의 두 단계에서 막히는 지점이 서로 다르다. 이걸 구분하지 못하면 엉뚱한 곳을 최적화하게 된다. 프리필은 연산, 디코드는 메모리라는 이 구분이 긴 문맥 추론 최적화의 출발점이다.
프리필은 프롬프트 전체를 한 번에 병렬로 처리한다. 모든 토큰이 서로를 보므로 계산량이 입력 길이의 제곱(ISL²)으로 불어난다. GPU 입장에서 할 일이 산더미라 계산이 병목(compute-bound)이다. 반면 디코드는 한 번에 토큰 하나씩 뱉는다. 매 스텝마다 지금까지 쌓인 KV 캐시 전체를 읽어야 하는데, 정작 계산할 양은 적다. 그래서 메모리 대역폭이 병목(memory-bound)이다.
| 구분 | 프리필(Prefill) | 디코드(Decode) |
|---|---|---|
| 처리 방식 | 프롬프트 전체를 병렬로 | 토큰 1개씩 순차로 |
| 비용이 커지는 축 | 입력 길이(ISL)² | KV 캐시 길이(KVSL)에 비례 |
| 병목 | 계산(compute-bound) | 메모리(memory-bound) |
| 길이 2배 → 시간 | 약 4배 | 약 2배 |
⚠️ 흔한 오해
“프리필과 디코드는 같은 어텐션이니 같은 방식으로 최적화하면 된다”는 착각이 가장 비싸다. 한쪽은 GPU 연산 유닛이, 다른 한쪽은 메모리 대역폭이 막힌다. 계산이 막힌 곳에 메모리 트릭을, 메모리가 막힌 곳에 연산 트릭을 쓰면 효과가 없다.
왜 FlashAttention만으로 끝나지 않나
어텐션 비용을 줄이는 대표 해법이 FlashAttention이다. 핵심은 n×n 어텐션 행렬을 통째로 메모리에 만들지 않는 것이다. Q·K·V를 타일 단위로 잘라 느린 HBM에서 빠른 SRAM으로 흘려보내며, 점수 계산(BMM1) → 온라인 소프트맥스 → 값 가중합(BMM2)을 한 번의 패스로 묶는다. 덕분에 거대한 중간 행렬을 저장하는 메모리 낭비가 사라진다.
그런데 이건 어텐션을 더 빠르게 굴리는 기법이지, 제곱 스케일 자체를 없애진 못한다. 토큰이 4배 계산을 요구하는 성질은 그대로다. 게다가 프리픽스 캐시가 흔한 에이전트·멀티턴 앱에서는 새 턴의 입력이 짧아도 뒤에 붙은 긴 캐시를 매번 봐야 해서, 프리필이 디코드처럼 메모리에 발목 잡히기도 한다. 그래서 커널 최적화만으로는 부족하고 모델 구조 자체를 손봐야 한다.

구조로 병목을 줄이는 네 갈래
NVIDIA가 제시하는 처방은 한 숫자만 보지 말라는 것이다. 어텐션 병목은 서로 다른 손잡이 여러 개로 갈린다.
- 그룹 크기(G) — GQA에서 KV head 하나를 여러 query head가 공유한다. G가 클수록 디코드 효율이 좋아진다. NVIDIA Nemotron 3가 KV head를 단 2개로 줄여 디코드를 가볍게 만든 게 대표 사례다.
- 헤드 차원(Hsz) — 128 또는 256으로 맞추는 편이 유리하다. GPU 타일과 128바이트 전송 정렬에 잘 맞기 때문이다. 64는 128폭 타일 값을 다 못 쓰고, 512 이상은 온칩 메모리 한계에 부딪힌다.
- KV 상태 크기 — 캐시를 줄이려면 KV 캐시 압축, 희소·슬라이딩 윈도 어텐션, 하이브리드 구조를 검토한다. 디코드의 메모리 병목을 직접 건드리는 축이다.
- 병렬화 — 텐서 병렬화(TP)는 KV head 수(KH)를 넘기면 안 된다. 넘기면 KV가 중복 복제돼 이득이 사라진다. KV head가 적은 모델은 ADP, KVP, Wide EP, Helix Parallelism 같은 방식을 봐야 하며, 이들은 TensorRT-LLM에 구현돼 있다.
🎯 FEEDON의 관점 — 긴 문맥의 진짜 비용
“컨텍스트 100만 토큰”을 마케팅 문구로 내세우는 시대다. 하지만 그 숫자가 자랑스러울수록 어텐션 병목은 더 커진다. 문맥을 32배 늘리면 어텐션 비중이 18%에서 85%로 뛴다는 건, 긴 문맥이 공짜가 아니라 제곱으로 비싸다는 뜻이다.
그래서 우리는 긴 문맥 모델을 평가할 때 “얼마나 넣을 수 있나”보다 “그 길이에서 얼마나 버티나”를 본다. 병목은 벤치마크 표지에 안 적힌다. 프리필이 계산에, 디코드가 메모리에 막히는 구조를 이해한 팀만이 실제 서비스 속도를 잡는다.
정리 — 어텐션 병목 체크포인트
- 문맥이 길수록 어텐션이 추론 시간의 제곱적으로 커진다 (4K 18% → 128K 85%)
- 프리필은 계산, 디코드는 메모리 — 병목의 종류가 다르다
- FlashAttention은 속도를 높이지만 제곱 스케일 자체는 못 없앤다
- 구조 손잡이는 넷: 그룹 크기 G · 헤드 차원 Hsz · KV 상태 · 병렬화
- 병렬화는 KV head 수부터 확인 — TP는 KH를 넘기지 마라
출처: NVIDIA 개발자 블로그 「Co-Designing AI Model Attention for Fast, Interactive Long-Context Inference」 · 수치는 DeepSeek-R1·Nemotron 3 사례 기준
이 글은 FEEDON이 공개 1차 자료를 바탕으로 작성·검증했습니다.



