<aside>
💡
어텐션 병목을 해결하기 위한 방법론들과 터보퀀트가 가져올 것들
</aside>
트랜스포머의 근본문제
- 어텐션은 모든 토큰 쌍을 비교함
- 그래서 토큰 수가 T면, 트랜스포머는 T X T 행렬 연산을 해야 하고 그 행렬 자체도 메모리에 들고 있어야 함
- 연산량 폭발
- 1K 토큰 → 1M번 비교, 10K 토큰 → 100M번 비교
- 핵심: 토큰이 10배 늘면 계산은 100배 늘어남
- 행렬 한 변인 T가 커질수록 학습 비용이 제곱으로 커짐
- 메모리 한계
- T X T 어텐션 행렬도 저장해야 함. T=10,000 이면 행렬 하나가 약 200MB임
- 결국, 긴 문맥으로 갈수록 VRAM이 먼저 막힘
- 그래서 긴 시퀀스에서는 연산량도, 메모리도 함께 폭발
- 토큰 10배 증가 → 비용 100배 증가
사전학습, 파인튜닝, 추론
같은 Transformer 라도 병목은 단계마다 다르게 드러남
- 사전학습(Pre-training)
- 문제: 모든 토큰이 한 번에 들어오므로 T X T 병목이 가장 크게 터짐
- 해법: Flash Attention 등으로 O(T^2) → O(T) 로 메모리를 줄임
- 파인튜닝(Fine-tuning)
- 문제: 학습과 동일한 구조 문제
- 해법: LoRA, QLoRA 같은 파라미터 효율화로 필요한 가중치만 가볍게 조정
- 추론(Inference)
- 문제: 토큰을 하나 생성할 때마다 이전 KV cache를 계속 저장해야 해서 캐시가 폭발함
- 해법: Paged Attention, 양자화, TurboQuant 같은 추론 최적화가 이 단계를 직접 겨냥
- Paged Attention: KV cache 메모리를 효율적으로 관리하는 기술. 원래는 긴 대화를 위한 메모리를 통째로 잡아두었는데, 실제로 다 쓰지 않으면 낭비가 되기 때문에 그래서 필요한 만큼만 그때그때마다 할당하는 기술. 운영 체제가 메모리를 Page 단위로 쪼개서 관리하는 부분에서 이름이 유래 되었음
- 양자화: 숫자를 더 작게 표현하는 것. 16bit → 4bit 등으로 숫자의 범위를 줄임
- TurboQuant 도 양자화 중 하나라고 볼 수 있음
어텐션 문제 해결의 두 방향
어텐션을 바꾸거나, 어텐션 밖으로 나가거나
- Attention 구조 변형
- Flash Attention (알고리즘 최적화)
- T X T 행렬을 블록 단위로 쪼개 계산해 메모리 병목을 O(T^2) → O(T) 로 낮춤
- MLA (DeepSeek)
- KV 벡터 자체를 저랭크 압축해서 메모리를 절감
- 고화질 사진을 압출 파일로 만드는 것 처럼 진행
- RoPE
- 회전 행렬로 상대 위치를 표현해 위치 인코딩을 효율화
- Attention 탈출 시도
- SSM-Mamba
- 선택적 상태공간 모델로, 어텐션 없이 시퀀스 입력에 따라 어떤 정보를 기억할지 동적으로 결정
- 트랜스포머는 모든 단어를 전부 기억하면서 비교 진행하는데, Mamba는 지금 이 입력이 들어왔을 때 무엇을 기억하고 무엇을 버릴지 그때그때 결정함(중요한 부분만 기억)
- 단점: 복잡한 추론에 약함
- MoE
- Hybrid-Jamba
- 긴 시퀀스에서는 SSM, 복잡한 추론에서는 Attention을 사용
소프트웨어 최적화
소프트웨어 최적화는 단계별로 다른 병목을 겨냥함
- 사전학습
- Flash Attention
- attention 행렬 저장을 피하고 메모리, I/O 병목을 줄임
- Mixed Precision
- ZeRO / FSDP
- 파인튜닝
- LoRA / QLoRA
- 파라미터 효율화
- Unsloth
- 별도 방법론이라기보다 LoRA/QLoRA 훈련을 빠르게 돌려주는 구현 최적화
- 추론
- Paged Attention
- KV cache를 페이지 단위로 관리해 메모리 낭비를 줄임
- 양자화
- GPTQ, AWQ, GGUF 등으로 가중치와 캐시를 더 작게 만듬
- TurboQuant
- 3.5bit(kv cache를 약 1/4.6 압축) 에서 정확도 손실 0%
- 2.5bit(약 1/6 압축) 에서도 미미한 손실