DNN의 성장과 효율화의 필요성
ImageNet ILSVRC 대회에서 2012년 AlexNet이 Top-5 Error Rate를 16.4%로 끌어내린 이후, GoogLeNet(6.7%) → ResNet(3.6%) → SENet(2.3%)까지 발전하면서 2015년부터 이미 Human Error Rate(5.1%)를 넘어섰다. 모델 성능은 올라갔지만 크기와 연산량도 폭발적으로 증가했고, 이게 Efficient Deep Learning이 필요한 근본적인 이유다.
모델 크기 증가 속도가 GPU 메모리 증가 속도를 압도적으로 앞지른다. Transformer(0.05B, 2017) → GPT-2(1.5B) → GPT-3(175B) → MT-NLG(530B, 2022). 5년 만에 약 10,000배 증가. 같은 기간 GPU 메모리는 TPUv2 16GB → A100 80GB로 약 5배 증가에 그쳤다. 이 gap은 단일 GPU에 모델이 올라가지 않는다는 뜻이고, tensor parallelism과 같은 분산 기법이 필요한 이유다.
ChatGPT의 “at capacity” 메시지나 3시간 50메시지 제한은 LLM 서빙 비용이 얼마나 심각한지를 보여주는 실제 사례다.
Redundancy — 이 수업의 근본 전제
Efficient ML의 모든 기법은 하나의 관찰에서 출발한다: DNN에는 redundancy(중복, 잉여)가 매우 많다. 신경망의 weight 중 상당수는 최종 출력에 의미 있게 기여하지 않거나, 비슷한 역할을 중복으로 수행하고 있다.
이 redundancy의 존재가 모든 compression 기법의 전제 조건이다:
- Pruning이 가능한 이유: 불필요한 weight를 제거해도 성능이 유지됨
- Quantization이 가능한 이유: precision을 낮춰도 중요 정보는 보존됨
- Distillation이 가능한 이유: 핵심 지식만 작은 모델에 담을 수 있음
- 큰 모델이 양자화에 강한 이유: redundancy가 더 많아서 일부 weight의 precision 손실을 나머지가 보상
Model Compression
Model Compression은 상위 카테고리이고, 하위 기법들은 다음과 같다:
- Pruning — 중요하지 않은 weight, neuron, head, token을 제거
- Quantization — FP32 → FP16 → INT8 → INT4 등으로 precision을 낮춤
- Knowledge Distillation — 큰 모델(teacher)이 작은 모델(student)을 가르침
- Low-rank Factorization — weight matrix를 저랭크 행렬 곱으로 분해
- Architecture Design / NAS — 애초에 효율적인 구조를 설계
핵심은 기법 하나만 쓰는 게 아니라 조합하면 효과가 곱해진다는 것이다. Lite Transformer 예시에서 architecture(Lite Transformer) + quantization + pruning을 순서대로 적용하여 176MB → 9.7MB (18.2x 축소), BLEU 39.9 → 39.5 (거의 차이 없음)를 달성했다.
Integer vs Floating Point — INT8/INT4와 FP32/FP16의 차이
Quantization을 이해하려면 데이터 표현 방식의 차이를 알아야 한다.
Floating Point (부동소수점): FP32, FP16, BF16 등. 소수점 표현이 가능하고 dynamic range가 넓다. 0.3752, -1.2841 같은 세밀한 값을 표현할 수 있다.
Integer (정수): INT8(-128127), INT4(-87) 등. 소수점 없이 고정된 정수 범위만 표현 가능하다.
Quantization이 하는 일은 FP16의 연속적인 weight 분포를 INT8/INT4의 이산적 값에 매핑하는 것이다. scale factor를 곱해서 정수로 변환한다.
왜 정수형을 쓰냐면: FP16은 weight 하나당 2 bytes, INT8은 1 byte, INT4는 0.5 byte이다. 정수 연산이 부동소수점보다 하드웨어에서 더 빠르고 전력 소모도 적다. 단, 정확도와의 트레이드오프가 있다.
실제 사용 패턴은 섞어 쓰는 것이다:
- Training: FP32 또는 BF16 (정확도 우선)
- Inference (서버): FP16 또는 W8A8 (균형)
- Inference (edge): W4A16 또는 W4A8 (메모리 제한)
- Attention 연산: FP16 유지 (softmax precision 문제)
최신 NVIDIA Blackwell(B100/B200)에서는 FP4(NVFP4)까지 하드웨어 지원이 추가되었다. 4-bit이면서도 floating point semantics를 유지하여 INT4보다 dynamic range가 넓고, FP8 대비 정확도 하락이 1% 이하인 결과를 보여주고 있다.
Quantization 핵심 기법들
RTN (Round-To-Nearest)
가장 단순한 quantization. 각 weight를 가장 가까운 정수로 반올림한다. 큰 모델(70B+)이나 높은 bit(INT8)에서는 무난하지만, INT4 + 작은 모델(7B)에서는 중요한 정보가 날아간다. 모나리자 그림을 보고 “Leonardo da Vinci"를 답하지 못하는 예시가 이를 잘 보여준다.
AWQ (Activation-aware Weight Quantization)
Song Han 연구실의 기법. “모든 weight가 동등하게 중요하지 않다"는 관찰에 기반하여, activation 분포를 분석해서 중요한 weight 채널을 보호하면서 quantize한다. Weight-only quantization(W4A16)에서 사실상 표준이 되었다. 같은 INT4인데 RTN과 품질 차이가 크다.
SmoothQuant
Activation의 outlier 문제를 해결하는 기법. 원래 activation은 outlier가 크게 튀어나와서 quantize하기 어렵고, weight는 분포가 균일해서 quantize하기 쉽다. SmoothQuant는 수학적 변환 Y = XW = (X/s)(sW)를 통해 quantization 난이도를 activation에서 weight 쪽으로 이전(migrate)시킨다. 결과적으로 양쪽 다 quantize하기 쉬워진다(W8A8).
TinyChatEngine
Han Lab에서 C/C++로 바닥부터 작성한 경량 LLM inference 엔진. AWQ quantization된 모델을 edge 디바이스에서 서빙한다. Jetson Orin에서 LLaMA-2-7B W4A16을 30 tokens/s로 실행하는 데모가 있다.
Sparsity와 Pruning
Sparsity: 행렬에서 대부분의 값이 0인 상태. 0과의 곱셈은 결과가 항상 0이므로 연산 자체를 건너뛸 수 있어 연산량이 줄어든다.
Pruning → Sparsity: Pruning은 중요하지 않은 weight를 0으로 만드는 과정이고, 이로 인해 모델이 sparse해진다.
Structured Sparsity (2:4): NVIDIA A100에서 도입. 4개 값 중 2개를 반드시 0으로 만드는 패턴을 하드웨어 Tensor Core가 직접 인식하여 0인 값은 연산을 건너뛴다. 이론상 2배 speedup.
이것이 앞서 본 GPU 성능 그래프에서 A100이 Q8000 대비 급격히 뛴 이유다: INT8 Tensor Cores(261 TOPS) → Structured Sparsity 적용 시(1248 TOPS).
SpAtten — Token/Head-level Dynamic Pruning
SpAtten은 attention 연산에서 중요하지 않은 토큰과 head를 런타임에 pruning하는 기법이다.
“As a visual treat, the film is almost perfect"라는 문장에서 sentiment classification을 수행할 때:
- Layer 1: 11 tokens, 12 heads → 100% 연산
- Layer 2: 5 tokens, 10 heads → 38%
- Layer 3: 2 tokens, 8 heads → 12%
- 최종: “film perfect"만으로 Positive 분류 성공
Attention probability를 세로로 누적(accumulate vertically)하면 각 토큰의 중요도 점수가 나온다. “I”, “a”, “the” 같은 기능어는 cumulative importance가 낮고, “video”, “game”, “fun” 같은 의미 있는 토큰은 높다. 낮은 토큰을 다음 layer에서 날린다 — cascade pruning.
핵심은 weight pruning이 아니라 token-level + head-level dynamic pruning이라는 점이다. 입력마다 어떤 토큰을 날릴지가 달라지므로 static pruning보다 유연하다. FlashAttention이 attention의 메모리 효율을 잡는 것이라면, SpAtten은 attention의 연산량 자체를 줄이는 접근으로 상호보완적이다.
On-Device / Edge AI
클라우드로 데이터를 보낼 수 없는 경우(privacy, 오프라인 환경, 개인화)에는 edge 디바이스에서 직접 inference와 training을 수행해야 한다.
문제는 training이 inference보다 메모리를 훨씬 많이 먹는다는 점이다:
- Inference: forward pass 한 번이면 끝
- Training: forward → activation 전부 저장 → backward로 gradient 계산 → optimizer state 업데이트
MCUNet V3 — 256KB MCU에서 Training 가능하게
TensorFlow(cloud) 기준 652MB가 필요한 training 메모리를 141KB까지 줄였다(2300x 절감). 세 가지 기법을 순서대로 적용한 결과:
- Quantization-Aware Scaling: gradient를 weight의 scale 역수 제곱으로 보정. 5.7MB → 2.9MB (2.0x)
- Sparse Layer Update: 중요한 레이어만 선택적으로 backward 수행. 2.9MB → 355KB (8.8x)
- Sparse Tensor Update: 텐서 내에서도 중요한 부분만 업데이트. 355KB → 141KB (2.5x)
VLM과 VILA
- ViT (Vision Transformer): 이미지만 처리하는 vision encoder. 이미지를 패치로 쪼개서 Transformer에 넣는 구조.
- VLM (Vision Language Model): ViT + LLM. 이미지와 텍스트를 모두 이해하는 모델. LLaVA, GPT-4V, Claude 등이 해당.
- LLaVA: Vision Encoder(CLIP ViT) + Projection Layer + LLM(LLaMA) 구조.
- VILA: NVIDIA + MIT(Song Han) 연구실에서 LLaVA를 개선한 VLM. Jetson에서 AWQ로 quantize하여 edge 배포 가능.
참고로 VLM(이미지 → 텍스트, 이해)과 Stable Diffusion(텍스트 → 이미지, 생성)은 방향이 반대이다. 공통점은 CLIP 같은 vision-language alignment 모델을 활용한다는 정도.
Hardware Trend — Memory Wall과 전력 효율
Dennard Scaling 종말과 전용 연산 유닛
42년간의 마이크로프로세서 데이터에서, 트랜지스터 수는 계속 증가하지만 클럭 주파수와 싱글스레드 성능은 2005년경부터 정체되었다(Dennard Scaling 종말). 해법은 범용 코어를 늘리는 것에서 전용 연산 유닛(Tensor Core 등)으로의 전환이었다.
Single-Chip Inference Performance는 precision을 낮추고(FP32 → FP16 → INT8) sparsity를 하드웨어 레벨에서 지원함으로써 8년 만에 317배 향상되었다(K20X 3.94 TOPS → A100 1248 TOPS).
Memory Wall
연산 성능(TOPS)은 세대당 2~3배 뛰지만, HBM bandwidth는 약 2배 수준에서 증가한다. 이 gap이 누적되면서 memory wall 문제가 심화되고 있다. 연산은 빠른데 데이터를 메모리에서 가져오는 속도가 병목이 되는 것이다.
이것이 FlashAttention이 존재하는 근본적 이유이다: 연산량을 늘리더라도(recomputation) 메모리 접근(HBM read/write)을 줄이는 것이 전체적으로 더 빠르다.
Cloud vs Edge Hardware
| Performance | Power | TOPS/W (전성비) | |
|---|---|---|---|
| NVIDIA B100 | 1,750 TOPS | 700W | 2.5 |
| Qualcomm S8G1 | 52 TOPS | 10W | 5.2 |
| Apple ANE (A17) | 35 TOPS | 8W | 4.4 |
Edge 칩들은 절대 성능은 낮지만 전력 효율(TOPS/W)은 오히려 높다. 배터리, 발열, 크기 제약 때문에 같은 와트당 최대한 많은 연산을 뽑아내는 방향으로 설계되어 있다.
이것이 efficient ML이 edge에서 더 중요한 이유다. 전력 예산이 10W밖에 없으면 소프트웨어에서 quantization/pruning으로 연산량을 줄여야 한다.
Course Overview
6.5940은 이 Lecture 1에서 소개한 기법들을 이후 강의에서 하나씩 깊게 다룬다:
- Pruning and Sparsity
- Quantization
- Neural Architecture Search (NAS)
- Knowledge Distillation
- On-Device Training
- Efficient Attention (FlashAttention 등)
- Distributed Training and Inference
Software(6.5940)와 Hardware(6.5930)가 함께 가야 한다는 것이 이 슬라이드들의 핵심 메시지다.