개요
35편은 숫자를 어떻게 담느냐의 이야기였다. 2의 보수, 고정소수점, 부동소수점, 그리고 GPU가 세대마다 더 짧은 포맷을 하나씩 늘려온 이유까지.
이번 편은 그 다음이다. 담는 법을 알았으니 이제 줄인다.
자료에서 이 대목을 꺼내는 방식이 인상적이었다. 기법을 바로 설명하지 않고, 먼저 “안 줄이면 어떻게 되는지” 를 그래프 몇 장으로 보여준다. 모델 파라미터는 매년 커지고, 학습 비용은 연 2.4배씩 오르고, 2030년쯤이면 전력·칩 생산량·데이터가 각각 한계에 부딪힌다는 예측까지.
읽고 나면 결론이 하나로 모인다.
이번 글이 답할 질문 경량화는 왜 선택이 아니라 필수가 됐을까? 그리고 정말 줄이기만 하면 빨라질까?
경량화 기법은 크게 세 갈래다. 양자화(quantization) 는 숫자의 정밀도를 깎고, 가지치기(pruning) 는 숫자의 개수를 줄이고, 지식 증류(distillation) 는 아예 작은 모델을 새로 만든다. 이번 편에서 셋을 전부 다루고, 파인튜닝과 LoRA/QLoRA는 37편으로 넘긴다.
교육 과정 자료는 대외비라 원본 슬라이드는 싣지 않는다.
1. 왜 필수가 됐나 — 모델은 커지는데 지갑은 그만큼 안 커진다
30~34편을 정리하면서 계속 걸렸던 게 이 문제였다. 하나를 잘 만들면 되나 싶다가, 여럿을 붙이면 토큰이 몇 배가 되고, 계획을 세우게 하면 호출이 또 늘어난다.
자료가 보여준 숫자들은 이랬다.
- 모델의 파라미터 수는 2010년대 초 백만 단위에서 지금은 1,000억 단위까지 올라왔다
- 학습에 드는 연산량(FLOP) 은 딥러닝 시대 들어 훨씬 가파른 기울기로 뛰었다
- 학습 비용은 대략 연 2.4배씩 오르고 있다. AlphaGo 무렵 백만 달러 안팎이던 게 최근 프런티어 모델에서는 천만 달러를 훌쩍 넘는다
- 2030년 기준 예측에서는 전력, 칩 생산 능력, 데이터 부족, 지연(latency) 한계 네 가지가 각각 벽으로 지목됐다
여기서 중요한 건 추론(inference) 쪽이다. 학습은 한 번 하고 끝나지만, 서비스는 매일 돌아간다. 사용자가 늘수록 추론 비용이 선형으로 붙는다.
그래서 경량화는 “성능이 좀 떨어져도 괜찮으면 하는 것” 이 아니다. 안 하면 서비스 자체가 안 나오는 단계에 와 있다.
물론 공짜는 아니다. 자료도 이 점을 먼저 못 박는다.
- 일반적으로 경량화 정도가 좋아질수록 모델 성능은 떨어진다
- 그래서 무엇을 개선할 것인지를 먼저 정해야 한다 — 모델 크기인가, 속도인가, 전력인가
그리고 하나 더. GPU와 궁합이 맞는 기법과 안 맞는 기법이 따로 있다.
| GPU와 궁합이 좋은 쪽 | 전용 가속기가 있어야 빛나는 쪽 |
|---|---|
| LoRA / QLoRA | 공격적인 양자화, 혼합 정밀도 양자화 |
| 지식 증류 | 비정형(unstructured) 가지치기 |
| 제한된 범위의 양자화 | 부분적으로만 정형화된 가지치기 |
| 정형(structured) 가지치기 |
이 표가 6번 섹션의 복선이다. 왼쪽 열은 지금 쓰는 GPU에서 바로 이득이 나고, 오른쪽 열은 “이론상 4배 작아졌는데 왜 안 빨라지지” 를 겪게 되는 쪽이다.
2. 양자화 (1) — 언제 깎을 것인가, QAT와 PTQ
양자화는 연산과 메모리 부하를 줄이는 가장 직관적인 방법이다. 35편에서 본 대로 FP32를 INT8로 바꾸면 그것만으로 크기가 4분의 1이 된다.
문제는 언제 깎느냐다. 여기서 두 갈래로 갈린다.
QAT — 학습하면서 미리 깎아둔다
Quantization-Aware Training. 학습 단계의 순전파(forward pass)에서 이미 양자화를 같이 수행한다. 모델이 “나는 앞으로 8비트로 살게 될 것” 이라는 걸 알고 학습하는 셈이다.
- 같은 정확도 기준으로 압축률을 더 높일 수 있다
- 대신 학습 복잡도가 엄청나게 올라간다. 재학습·파인튜닝을 다시 돌려야 하니까
- CNN처럼 원래 학습 복잡도와 데이터가 크지 않은 경우엔 쉽게 적용 가능
여기서 한 가지 기술적인 걸림돌이 있다. 양자화는 값을 계단처럼 뚝뚝 끊는 연산이라 미분이 안 된다. 기울기가 0이거나 정의되지 않으니 역전파가 막혀버린다. 그래서 순전파는 계단 함수로 하고, 역전파에서는 그냥 직선처럼 취급하는 STE(Straight-Through Estimator) 같은 우회로를 쓴다.
PTQ — 다 학습하고 나서 깎는다
Post-Training Quantization. 이미 학습이 끝난 모델을 놓고 양자화만 수행한다.
- LLM처럼 모델도 학습 데이터도 너무 큰 경우엔 QAT 자체가 불가능하다. 학습을 다시 돌릴 수가 없으니까
- 대신 보정(calibration) 데이터를 소량 넣어서, 값들이 실제로 어느 범위에 분포하는지 재본 뒤 그에 맞춰 깎는다
- 보정 데이터를 잘 고르면 경량화 효율이 꽤 올라간다
정확도만 보면 QAT가 낫다. 그런데 LLM 영역에서는 선택지가 사실상 PTQ 하나다. 좋아서 쓰는 게 아니라 그것밖에 못 해서 쓰는 것에 가깝다..
더 쉬운 비유로
QAT: 작은 집에 이사 갈 걸 알고 미리 짐을 줄이며 산다 PTQ: 이미 다 채워놓은 집에서 이사 당일에 짐을 줄인다
미리 알고 살면 애초에 큰 가구를 안 산다. 옷장도 작은 걸로 맞추고, 물건도 그 크기 안에서 정리하며 지낸다. 이사할 때 버릴 게 거의 없다.
반대로 다 채워놓고 이사 당일에 줄이면, 뭘 버려야 할지 급하게 판단해야 한다. 그래서 집 안을 한 바퀴 둘러보고 “이건 자주 쓰네, 저건 안 쓰네”를 확인하는 과정이 필요하다. 그게 보정 데이터가 하는 일이다.
집이 너무 커서 다시 지을 수 없을 땐, 어쩔 수 없이 두 번째 방법을 쓴다.
3. 양자화 (2) — 어디를 어떻게 깎을 것인가
언제 깎을지를 정했으면, 이제 세부 결정이 줄줄이 나온다. 자료에서 “이외에도 생각보다 많은 고려사항이 있다” 고 적어둔 게 이 부분이다.
대칭이냐 비대칭이냐
양자화의 첫 단계는 어느 범위를 잘라낼지(clipping range) 정하고 배율을 계산하는 것이다. 여기서 방식이 둘로 갈린다.
- 대칭(symmetric): 0을 정확히 한가운데 두고, 절댓값이 큰 쪽에 양 끝을 맞춘다
- 비대칭(asymmetric): 값이 실제로 존재하는 구간의 최소·최대에 맞춰 범위를 통째로 옮긴다
왜 비대칭이 필요한가 — 활성화 함수 때문이다
여기서 활성화 함수가 등장한다. 신경망은 층마다 계산 결과를 활성화 함수에 한 번 통과시키는데, 지금 가장 많이 쓰이는 ReLU는 하는 일이 아주 단순하다. 음수가 들어오면 전부 0으로 만들고, 양수는 그대로 내보낸다.
그러니 ReLU를 지나온 값들, 즉 활성값(activation)에는 음수가 아예 없다. 0 아니면 양수뿐이다.
이 상태에서 대칭 양자화를 쓰면 어떻게 되는지가 문제다. 값의 최댓값이 0.9라면 대칭은 범위를 −0.9 ~ +0.9로 잡는다. 그런데 −0.9 ~ 0 구간에는 값이 하나도 없다.
- 8비트는 256칸이다
- 그중 음수 쪽 절반인 128칸이 통째로 논다
- 결국 실제로 쓰는 건 128칸, 8비트를 썼는데 해상도는 7비트짜리가 된다
비대칭은 범위를 0 ~ 0.9로 잡는다. 256칸이 전부 실제 값에 쓰이니 같은 비트로 두 배 촘촘해진다. 대신 0이 몇 번 칸인지 기억할 zero-point 값을 따로 들고 다녀야 한다.
활성값이 한쪽으로 쏠리는 건 데이터가 이상해서가 아니다. ReLU가 그렇게 만들도록 설계된 함수라서 그렇다. 구조상 예정된 쏠림이니 양자화도 거기에 맞춰야 한다.
반대로 가중치(weight) 는 사정이 다르다. 학습된 가중치는 0을 중심으로 양쪽에 퍼져 있는 경우가 많아서 대칭이 잘 맞는다. 그래서 실무에서는 가중치는 대칭, 활성값은 비대칭처럼 서로 다른 방식을 섞어 쓰는 경우가 많다.
자료의 실험 결과도 그 방향이었다. ImageNet, GLUE, WikiText 어느 쪽이든 활성값에 비대칭을 쓴 쪽이 같은 모델 크기에서 더 나은 정확도를 보였다.
그런데도 대칭을 쓰는 자리가 남아 있는 이유는 하드웨어다. 비대칭은 계산할 때마다 zero-point를 빼주는 보정이 붙는다. 연산기가 그걸 처리해주지 않으면 소프트웨어로 해야 하고, 그러면 아낀 시간을 도로 뱉는다.
가중치만 깎느냐, 계산까지 정수로 하느냐
이게 개인적으로 제일 헷갈렸던 구분이었다.
- W8A8 — 가중치(Weight)도 활성값(Activation)도 INT8. 행렬곱 자체가 정수 연산으로 돌아간다. 중간 결과는 INT32로 받고 다시 INT8로 줄인다
- W4A16 — 가중치만 4비트로 저장해두고, 쓸 때마다 FP16으로 되돌려서(de-quantization) 계산은 실수로 한다
W4A16은 저장 공간만 줄이는 방식이다. 곱셈기는 여전히 FP16 곱셈기를 쓴다. 그런데도 이걸 쓰는 이유가 있다. LLM 추론에서 병목이 계산이 아니라 거대한 가중치를 메모리에서 읽어오는 것인 경우가 많기 때문이다.
“모델을 못 올리는 게 문제인가, 계산이 느린 게 문제인가.” 이 질문의 답이 W4A16과 W8A8을 가른다.
정수 말고 짧은 실수로 깎기도 한다
양자화라고 하면 정수만 떠올렸는데, 실수 포맷을 짧게 쓰는 것도 양자화다. 35편에서 본 BF16, TF32, FP8이 전부 이쪽이다.
| 포맷 | 지수 | 가수 | 성격 |
|---|---|---|---|
| FP32 | 8 | 23 | 기준 |
| TF32 | 8 | 10 | FP32의 범위 + FP16의 정밀도 |
| BF16 | 8 | 7 | 범위 유지, 정밀도 포기 |
| FP8 (E5M2) | 5 | 2 | 범위 쪽에 무게 |
| FP8 (E4M3) | 4 | 3 | 정밀도 쪽에 무게 |
FP8만 봐도 지수와 가수를 어떻게 나눌지에 따라 두 가지 변종이 있다. 같은 8비트인데 하나는 범위를, 하나는 정밀도를 조금 더 챙긴다.
여기에 혼합 정밀도 양자화(mixed-precision quantization) 도 있다. 레이어마다 민감도가 다르니 어떤 층은 8비트, 어떤 층은 4비트로 다르게 깎는 방식이다. 정확도를 잘 지키지만, 층마다 다른 연산기를 굴려야 해서 하드웨어 지원이 없으면 오히려 손해가 난다.
4. 가지치기 — 지운 자리를 기억하는 데도 돈이 든다
양자화가 숫자를 짧게 만드는 일이라면, 가지치기는 숫자를 아예 없애는 일이다. 기여도가 작은 가중치를 0으로 만들어 버린다.
가장 단순한 기준은 절댓값이 작은 것부터 자르는 것(magnitude-based pruning)이다. 값이 0에 가까우면 곱해봤자 결과에 별 영향이 없을 테니까.
그런데 여기 함정이 있다.
값을 지우면 남은 값이 원래 몇 번째 자리에 있었는지를 따로 기록해야 한다. 행렬은 위치가 곧 의미이기 때문이다. 3번 칸에 있던 값과 7번 칸에 있던 값은 계산에서 하는 일이 다르니, 그냥 붙여서 저장해버리면 복원할 방법이 없다. 그래서 값 배열 옆에 인덱스 데이터가 따라붙는다.
숫자 8개에서 절반을 지우면 값은 4개가 되지만, 그 4개가 각각 몇 번 칸이었는지도 4개가 필요하다. 4 + 4 = 8. 저장량이 그대로다. 실제로는 CSR(compressed sparse row) 같은 포맷을 쓰지만 본질은 같다. 자료의 실험에서도 희소도가 0.95를 넘어가야 희소 행렬 라이브러리(cuSPARSE)가 일반 행렬 라이브러리(cuBLAS)보다 빨라졌다. 그 전까지는 그냥 다 계산하는 게 더 빠르다.
가지치기의 진짜 비용은 “얼마나 지웠나”가 아니라 “지운 걸 어떻게 기억하나” 에 있다.
비정형 vs 정형
그래서 지우는 방식도 갈린다.
| 방식 | 무엇을 지우나 | 특징 |
|---|---|---|
| 비정형 (unstructured) | 아무 위치나 낱개로 | 압축률이 가장 높다. 대신 패턴이 없어 GPU가 못 써먹는다 |
| 블록 기반 (block-based) | 4×4 같은 덩어리 단위 | 중간 타협 |
| 정형 (structured) | 채널이나 레이어를 통째로 | 압축률은 낮지만 행렬이 그냥 작아진다. 인덱스가 필요 없다 |
정형 가지치기가 GPU와 궁합이 좋은 이유가 이거다. 채널을 통째로 잘라내면 남는 건 그냥 더 작은 행렬이다. 특별한 커널도, 인덱스도 필요 없다.
얼마나 자를 수 있나
모델 구조에 따라 차이가 컸다.
- CNN 기반 이미지 처리: 80% 이상 가지치기해도 정확도 하락이 1~2% 수준
- LLM 계열: 50% 내외가 한계
자료의 실험 하나를 보면 LLaMA-7B에서 20%를 자르면 평균 정확도가 63.25% → 59.23%로, 50%를 자르면 48.65%까지 떨어졌다. 속도는 1.85배 빨라졌지만 정확도를 꽤 크게 내준 셈이다.
CNN은 비슷한 특징을 잡는 필터가 겹쳐서 학습되는 경우가 많다고 알려져 있는데, 이 차이가 거기서 오는 것 같다. 언어 모델은 파라미터 하나하나가 훨씬 조밀하게 쓰이고 있는 것이다.
그리고 가지치기도 양자화와 똑같은 딜레마가 있다. 작은 모델은 학습 단계부터 도입할 수 있지만, LLM처럼 크면 학습 후 가지치기(post-training pruning)가 현실적인 옵션이다.
5. 지식 증류 — 정답 대신 선생님의 헷갈림을 배운다
앞의 둘은 있는 모델을 손보는 방식이었다. 지식 증류는 다르다. 큰 모델을 선생님으로 두고, 작은 모델을 새로 가르친다.
여기서 핵심은 무엇을 가르치느냐다. 학생 모델의 손실 함수는 두 개를 더한다.
$$ L_{total} = L_{student} + L_{distill} $$
- Student loss: 학생의 추론과 정답(ground truth) 의 차이
- Distillation loss: 같은 데이터에 대해 선생님의 결과와 학생의 결과 의 차이
두 번째가 이 기법의 전부다. 그냥 정답만 보고 배우면 되지 왜 선생님 답을 따로 배우나 싶었는데, 이유가 있었다.
정답은 딱딱하다. 고양이 사진의 정답은 고양이 100%, 개 0%, 자동차 0%다. 그런데 잘 학습된 선생님 모델의 출력은 고양이 85%, 개 12%, 자동차 0.1% 같은 모양이다.
이 분포에는 정답이 담지 못한 정보가 들어있다. “이 사진은 개랑 좀 헷갈리게 생겼지만 자동차랑은 전혀 안 닮았다” 는 판단이다. 이걸 soft label이라고 부르고, 온도(temperature) 값을 올려 분포를 더 부드럽게 만들어서 학생에게 넘긴다.
학생은 정답보다 선생님의 헷갈림에서 더 많이 배운다. 그게 딱딱한 정답 하나로는 전달되지 않는 정보라서 그렇다.
조교를 한 명 더 넣는다 — TAKD
여기가 재밌었다. 선생님이 똑똑할수록 학생이 잘 배울 것 같은데, 실제로는 그렇지 않았다.
- 학생의 잠재력이 고정된 상태에서 선생님이 너무 똑똑하면 오히려 효율이 떨어진다
- 반대로 선생님이 고정된 상태에서 학생이 너무 뛰어나도 효율이 떨어진다
그래서 나온 게 조교(Teacher Assistant) 를 중간에 한 명 끼우는 방식이다. 110층짜리 선생님이 8층짜리 학생을 바로 가르치는 대신, 20층짜리 조교를 거친다.
| 방식 | CIFAR-10 (CNN) |
|---|---|
| NOKD — 학생 혼자 학습 | 70.16 |
| BLKD — 선생님이 직접 가르침 | 72.57 |
| TAKD — 조교를 거침 | 73.51 |
LLM에서는 합성 데이터로
LLM 쪽에서는 방식이 조금 다르다. 학습에 쓸 데이터 자체가 너무 크다는 문제가 여전히 남기 때문이다.
그래서 합성 데이터를 쓴다. 프롬프트를 넣어 선생님 모델의 응답을 잔뜩 뽑아내고, 그걸 데이터셋 삼아 학생 모델을 파인튜닝한다. 자료의 실험에서도 같은 크기의 작은 모델을 처음부터 학습시킨 것보다 증류로 만든 쪽이 성능이 좋았다.
다만 이 대목에 샘 알트만의 트윗이 인용돼 있었는데, 요지는 이미 되는 걸 따라 만드는 건 상대적으로 쉽고, 될지 안 될지 모르는 걸 처음 만드는 게 훨씬 어렵다는 이야기였다. 증류가 강력한 만큼 논란도 따라붙는 영역이라는 뜻으로 읽혔다.
더 쉬운 비유로
양자화: 글씨를 작게 쓴다 가지치기: 덜 중요한 문장을 지운다 지식 증류: 요약본을 새로 쓴다
같은 노트를 줄이는 세 가지 방법이라고 생각하면 편하다. 글씨를 작게 쓰면 내용은 그대로인데 흐릿해진다. 문장을 지우면 남은 문장은 선명한데 빈 곳이 생기고, 어디를 지웠는지 표시해둬야 한다.
요약본은 아예 다른 노트다. 원본을 보면서 새로 쓰는 거라 분량이 확 줄지만, 원본이 있어야 쓸 수 있다.
6. 그래서 빨라지나 — 배치 크기에서 순위가 뒤집힌다
여기가 이번 편에서 가장 인상 깊었던 부분이다.
INT4가 INT8보다 작으니 더 빠를 것 같다. 그런데 자료의 사례를 보면 상황에 따라 순위가 뒤집힌다.
같은 Llama-3 8B 모델, 같은 H100 GPU인데 배치 크기 하나로 결과가 달라진다.
- 배치 1 — 한 번에 요청 하나만 처리할 때는 INT4가 1.56배로 가장 빠르다
- 배치 32 — 몰아서 처리하면 INT4는 1.08배로 내려앉고, FP8이 1.45배로 앞선다
이유는 병목이 어디냐가 달라지기 때문이다.
- 배치가 작으면 GPU가 놀고 있고, 가중치를 메모리에서 읽어오는 시간이 병목이다. 그러니 가중치를 가장 많이 줄인 INT4가 유리하다
- 배치가 커지면 읽어온 가중치를 여러 요청이 나눠 쓰니 메모리 부담이 상대적으로 줄고, 계산 자체가 병목이 된다. 이때 INT4는 계산 전에 역양자화를 해야 하니 그 비용이 그대로 드러난다
경량화의 효과는 기법만 보고 정할 수 없다. 어떤 하드웨어에서, 어떤 배치 크기로, 무엇이 병목인지까지 세트로 봐야 한다.
1번 섹션에서 봤던 “GPU와 궁합” 표가 여기로 이어진다. 공격적인 양자화나 비정형 가지치기가 오른쪽 열에 있던 이유가 이거다. 줄인 만큼 빨라지려면 그 형태를 처리해줄 회로가 있어야 한다.
가지치기 쪽도 같았다. 자료의 CNN 실험에서 80%를 자른 모델은 밀집 모델 대비 정확도가 오히려 조금 올라갔는데 실제 GPU 속도는 1.24배 수준이었고, 30%까지 남긴 극단적인 경우에 2.89배가 나왔지만 정확도는 76.20%에서 74.60%로 떨어졌다. 어느 지점에서 멈출지를 정하는 게 결국 사람의 일이더라..
정리
- 경량화는 선택이 아니라 필수다. 학습 비용이 연 2.4배로 오르고, 2030년 기준으로 전력·칩·데이터·지연이 각각 벽으로 예측되고 있다
- 양자화는 정밀도를 깎는다. 학습하면서 깎는 QAT가 정확도는 낫지만, LLM에서는 학습을 다시 돌릴 수 없어 PTQ가 사실상 유일한 선택이다
- 대칭은 연산이 단순하고 비대칭은 칸을 안 버린다. 어느 쪽을 쓸지는 하드웨어가 zero-point를 처리해주느냐로 갈린다
- W8A8은 계산까지 정수로, W4A16은 저장만 줄인다. 모델이 안 올라가는 게 문제면 후자, 계산이 느린 게 문제면 전자
- 가지치기의 진짜 비용은 인덱스다. 희소도가 0.95는 넘어야 희소 연산이 이득이고, 그래서 채널을 통째로 자르는 정형 가지치기가 GPU와 궁합이 좋다
- CNN은 80%까지, LLM은 50% 내외가 가지치기 한계였다
- 지식 증류는 정답이 아니라 선생님의 확률 분포(soft label)를 배운다. 선생님이 너무 크면 오히려 효율이 떨어져서 조교(TAKD) 를 끼우기도 한다
- 줄인다고 항상 빨라지지 않는다. 배치 1에서 1.56배였던 INT4가 배치 32에서는 1.08배로 내려앉는다. 병목이 메모리에서 계산으로 옮겨가기 때문
참고 자료
- How Much Does It Cost to Train Frontier AI Models? — Epoch AI
- Compute Trends Across Three Eras of Machine Learning — Epoch AI
- Post-Training Quantization of LLMs with NVIDIA NeMo and TensorRT Model Optimizer
- LLM-Pruner: On the Structural Pruning of Large Language Models (NeurIPS 2023)
- Improved Knowledge Distillation via Teacher Assistant (TAKD)
한줄 평
줄이면 빨라진다고 단순하게 생각했는데, 배치 크기 하나에 순위가 뒤집히는 걸 보고 나니 경량화는 기법 고르는 일이 아니라 병목 찾는 일이었다!