구조는 회로도, 가중치는 노브 위치 — 그리고 Attention 변형은 n² 을 피하려는 개조다
가중치가 공개되면 바로 쓸 수 있나, GQA 는 왜 긴 문맥에서 필수인가
「가중치가 뭔데? 공개만 되면 transformers 에서 바로 쓸 수 있는 거야?」와 「Attention 변형이라는 게 뭔데?」는 사실 한 덩어리 질문이다. 짧게 답하면 구조는 회로도, 가중치는 그 회로의 노브 위치다. 회로도는 논문으로 공개돼 있고, 노브를 어디에 맞출지 찾는 데 학습 비용이 다 들어간다. 이 글을 읽으면 공개 모델을 쓸 수 있는지 네 가지로 따져 보고, 모델 설명에 나오는 GQA · Sliding Window 같은 말이 뭘 줄이려는 건지 알 수 있다.
모델 파일 안에 든 두 가지
설계도 (config.json) 층 수 · 차원 수 · 헤드 수 ← Transformer 「패턴」 부분. 대개 공개
가중치 (weights) 학습으로 정해진 숫자 수십억 개 ← 모델의 지식 전부
Llama 8B 면 이 숫자가 80 억 개다. 구조가 같아도 다른 모델의 가중치를 바꿔 끼울 수는 없다. 노브 하나하나가 다른 노브 위치를 전제로 맞춰져 있으니까.
가중치만 공개되면 바로 쓸 수 있나 — 네 가지를 본다
그 구조가 라이브러리에 구현돼 있나. 유명한 구조는 대개 HF transformers 에 있다.
tokenizer 도 같이 공개됐나. 숫자로 바꾸는 규칙이 없으면 가중치는 못 쓴다.
라이선스가 내 용도를 허용하나. Llama 처럼 조건이 붙은 것도 있으니 라이선스 원문을 읽는다.
돌릴 하드웨어가 있나. 8B 는 노트북에서도 양자화하면 돌지만, 70B 급은 고성능 GPU 여러 장이 필요하다.
Claude · GPT · Gemini 는 가중치가 비공개라 API 로만 쓴다. Llama · Qwen · Mistral 은 가중치가 공개돼 로컬에서 돈다.
Attention 은 왜 개조되나 — n²
원래 Attention 은 모든 토큰이 다른 모든 토큰을 한 번씩 본다. 회의 참석자 전원이 서로 1:1 로 다 대화하는 셈이다. 토큰이 n 개면 쌍이 n² 개다. 1,000 토큰이면 100 만 쌍, 100,000 토큰이면 100 억 쌍. 문맥이 100 배 길어지면 일이 1 만 배가 된다.
그래서 덜 보거나, 나눠 보거나, 같은 걸 더 빨리 보는 개조가 나왔다.
| 변형 | 아이디어 | 줄이는 것 | 쓰이는 곳 |
|---|---|---|---|
| Multi-Head (원조) | 여러 관점(head)으로 동시에 본다 | — (기본형) | 원래 Transformer, BERT |
| MQA / GQA | 여러 head 가 Key · Value 를 나눠 쓴다 | KV cache 메모리 | Llama 2 70B · Llama 3, Mistral 7B |
| Sliding Window | 가까운 N 개만 본다 | 긴 입력의 계산량 | Mistral 7B |
| Sparse Attention | 정해진 일부 위치만 본다 | 계산량 | GPT-3 (dense 와 번갈아) |
| Linear Attention | n² 을 n 에 가깝게 근사 | 아주 긴 입력 | 주로 연구 단계 |
| FlashAttention | 결과는 그대로, GPU 메모리 읽는 순서를 바꾼다 | 메모리 이동 시간 | 최근 학습 · 추론 라이브러리 다수 |
FlashAttention 은 결과를 근사하지 않는다. 논문 제목부터 「Exact Attention」이다. 계산을 줄이는 게 아니라 GPU 메모리를 오가는 횟수를 줄여서 빨라진다.
GQA 가 왜 중요한가 — KV cache 를 직접 계산해 보면
생성 모델은 토큰을 하나 만들 때마다 앞 토큰들의 Key · Value 를 메모리에 쌓아 둔다. 이게 KV cache 다. head 마다 따로 들고 있으면 긴 대화에서 GPU 메모리가 금방 찬다.
Llama 3 8B 의 config.json 숫자로 계산해 봤다. 층 32 개, Key · Value 를 가진 head 8 개(질문 head 는 32 개), head 차원 128, fp16(2 바이트).
토큰 1개당 = 2 (K, V) × 32 층 × 8 head × 128 차원 × 2 바이트 = 131,072 바이트 = 128KB
GQA 없이 head 32개 전부가 따로 들면 = 512KB
8,192 토큰이면 → GQA 1GB / GQA 없으면 4GB
실측이 아니라 config 로 계산한 값이다. 그래도 4 배 차이는 구조에서 바로 나온다. 긴 문맥 모델에서 GQA 가 거의 기본이 된 이유다.
MVC 앱에 캐시나 쿼리 최적화를 넣는 것과 성격이 같다. 패턴은 그대로 두고 안쪽만 손본다.
Transformer 구조 자체가 헷갈리면 Transformer부터, 같은 가중치를 어떤 상자에 담아 배포하나는 ONNX 는 포장 규격이다에 있다.
공개 모델을 로컬이나 사내 서버에 올리려는데 메모리 · 라이선스 · 하드웨어를 어떻게 맞출지 막혔다면 negabaro 에 물어봐도 된다.
핵심 개념
모델 파일은 설계도(config.json)와 가중치로 나뉜다 — 지식은 전부 가중치에 있다
공개 가중치를 쓰기 전에 구현 · tokenizer · 라이선스 · 하드웨어 네 가지를 본다
Attention 은 n² — 문맥이 100 배 길면 일은 1 만 배
KV cache = 2 × 층 × KV head × head 차원 × 바이트 × 토큰 — GQA 는 여기서 KV head 를 줄인다