6.5940 L01: Introduction and Overview

DNN의 성장과 효율화의 필요성

ImageNet에서 2012년 AlexNet이 Top-5 error 16.4%를 기록한 뒤 GoogLeNet 6.7%, ResNet 3.6%, SENet 2.3%로 내려왔고, 2015년부터 human error rate(5.1%)를 넘어섰다. 이 과정에서 모델 크기와 연산량도 같이 커졌다.

모델 크기는 Transformer(0.05B, 2017) → GPT-2(1.5B) → GPT-3(175B) → MT-NLG(530B, 2022)로 5년 동안 약 10,000배 커졌다. 같은 기간 GPU 메모리는 TPUv2 16GB에서 A100 80GB로 약 5배 늘었다. 이 차이 때문에 모델이 단일 GPU에 올라가지 않고, tensor parallelism 같은 분산 기법이 필요해진다. ChatGPT가 “at capacity"를 띄우거나 3시간 50메시지 제한을 걸었던 것도 서빙 비용 문제다.

Redundancy

DNN에는 redundancy가 많다. weight 상당수는 출력에 별로 기여하지 않거나 다른 weight와 역할이 겹친다. pruning, quantization, distillation이 성립하는 근거가 전부 이 redundancy다. 불필요한 weight는 지워도 되고, precision을 낮춰도 중요한 정보는 남고, 핵심 지식만 작은 모델로 옮길 수 있다. 큰 모델이 양자화에 강한 것도 redundancy가 많아서 일부 weight의 precision 손실을 나머지가 흡수하기 때문이다.

Model Compression

Model Compression이 상위 카테고리고, 아래에 pruning(중요하지 않은 weight/neuron/head/token 제거), quantization(FP32 → FP16 → INT8 → INT4), knowledge distillation, low-rank factorization, NAS가 있다. 이 기법들은 하나만 쓰는 게 아니라 조합해서 쓴다. Lite Transformer에 quantization과 pruning을 순서대로 적용한 예시에서 176MB → 9.7MB로 18.2배 줄었고, BLEU는 39.9 → 39.5로 거의 안 떨어졌다.

Integer vs Floating Point

Quantization은 FP16의 연속적인 weight 분포를 INT8(-128127)이나 INT4(-87) 같은 이산 값에 scale factor로 매핑하는 작업이다. FP16은 weight당 2바이트, INT8은 1바이트, INT4는 0.5바이트라서 메모리가 줄고, 정수 연산이 부동소수점 연산보다 하드웨어에서 빠르고 전력도 덜 쓴다. 대신 정확도가 떨어질 수 있다.

실제로는 용도별로 섞어 쓴다. training은 FP32나 BF16, 서버 inference는 FP16이나 W8A8, edge inference는 W4A16이나 W4A8을 쓰고, softmax가 있는 attention 연산은 FP16을 유지한다. Blackwell(B100/B200)부터는 FP4(NVFP4)가 하드웨어 지원에 들어왔다. 4-bit인데 floating point 형식이라 INT4보다 dynamic range가 넓고, NVIDIA는 FP8 대비 정확도 하락이 1% 이하라고 주장한다.

Quantization 기법

RTN(Round-To-Nearest)은 각 weight를 가장 가까운 정수로 반올림한다. 큰 모델(70B+)이나 INT8에서는 무난한데, 7B 모델에 INT4를 걸면 품질이 크게 깨진다. 강의에서는 모나리자 그림을 주고 “Leonardo da Vinci"를 못 답하는 예시로 보여준다.

AWQ(Activation-aware Weight Quantization)는 Song Han 랩 기법으로, activation 분포를 분석해서 중요한 weight 채널을 보호하면서 양자화한다. weight-only(W4A16) 쪽에서는 사실상 표준으로 쓰인다. 같은 INT4라도 RTN과 품질 차이가 크다.

SmoothQuant는 activation outlier 문제를 다룬다. activation은 outlier 때문에 양자화가 어렵고 weight는 분포가 균일해서 쉬운데, Y = XW = (X/s)(sW) 변환으로 양자화 난이도를 activation에서 weight 쪽으로 옮긴다. 이렇게 하면 양쪽 다 양자화하기 쉬워져서 W8A8이 가능해진다.

TinyChatEngine은 Han 랩이 C/C++로 작성한 경량 LLM inference 엔진이다. AWQ로 양자화한 모델을 edge 디바이스에서 서빙한다. Jetson Orin에서 LLaMA-2-7B W4A16을 30 tokens/s로 돌리는 데모가 있다.

Sparsity와 Pruning

Pruning은 중요하지 않은 weight를 0으로 만드는 과정이고, 그 결과 행렬이 sparse해진다. 0과의 곱은 결과가 항상 0이라 연산을 건너뛸 수 있다. A100의 2:4 structured sparsity는 4개 값 중 2개를 반드시 0으로 만드는 패턴을 Tensor Core가 하드웨어에서 인식해 건너뛰는 방식이고, 이론상 2배 빨라진다.

강의 그래프에서 Q8000(Turing) 261 TOPS → A100 1248 TOPS로 뛰는 구간은 sparsity 효과만으로 읽으면 안 된다. A100의 INT8 dense 성능이 624 TOPS라서, 261 → 624는 세대 교체(3세대 Tensor Core)에서 나온 것이고, 624 → 1248이 2:4 sparsity의 이론상 2배에 해당한다.

SpAtten

SpAtten은 attention에서 중요하지 않은 토큰과 head를 런타임에 pruning한다. “As a visual treat, the film is almost perfect” 문장의 sentiment 분류 예시에서 layer 1은 11 토큰 12 head를 전부 계산하고, layer 2에서 5 토큰 10 head(38%), layer 3에서 2 토큰 8 head(12%)로 줄어들고, 마지막에는 “film perfect"만 남은 상태로 Positive를 맞춘다.

토큰 중요도는 attention probability를 세로로 누적해서 계산한다. “I”, “a”, “the” 같은 기능어는 누적 중요도가 낮아서 먼저 잘린다. weight pruning이 아니라 입력마다 결과가 달라지는 token/head 단위 dynamic pruning이라는 점이 다르다. FlashAttention이 attention의 메모리 접근을 줄이는 쪽이라면 SpAtten은 연산량 자체를 줄이는 쪽이다.

On-Device / Edge AI

privacy나 오프라인 환경, 개인화 요구 때문에 데이터를 클라우드로 못 보내는 경우에는 edge 디바이스에서 inference와 training을 직접 해야 한다. training이 특히 어렵다. inference는 forward 한 번이면 되지만, training은 forward에서 activation을 전부 저장했다가 backward로 gradient를 계산하고 optimizer state까지 유지해야 한다.

MCUNet V3

MCUNet V3 논문은 PyTorch 기준 303MB가 필요한 training 메모리를 141KB까지 줄인 2300x 절감을 보고한다. TensorFlow(cloud) 기준 652MB와 비교하면 약 4600x 절감이다. 세 가지 기법을 순서대로 적용한 결과:

  1. Quantization-Aware Scaling: gradient를 weight의 scale 역수 제곱으로 보정. 5.7MB → 2.9MB (2.0x)
  2. Sparse Layer Update: 중요한 레이어만 선택적으로 backward 수행. 2.9MB → 335KB (8.8x)
  3. Sparse Tensor Update: 텐서 내에서도 중요한 부분만 업데이트. 335KB → 141KB (2.4x)

VLM과 VILA

ViT는 이미지를 패치로 잘라 Transformer에 넣는 vision encoder다. VLM은 ViT에 LLM을 붙여 이미지와 텍스트를 같이 이해하는 모델이고, LLaVA, GPT-4V 등이 여기 속한다. LLaVA는 CLIP ViT + projection layer + LLaMA 구조다. VILA는 NVIDIA와 Song Han 랩이 LLaVA를 개선한 VLM으로, AWQ로 양자화해서 Jetson에서 돌릴 수 있다. VLM(이미지 → 텍스트, 이해)과 Stable Diffusion(텍스트 → 이미지, 생성)은 방향이 반대고, CLIP 같은 vision-language alignment 모델을 쓴다는 점이 공통이다.

Hardware Trend

42년치 마이크로프로세서 데이터를 보면 트랜지스터 수는 계속 늘지만 클럭 주파수와 싱글스레드 성능은 2005년쯤부터 정체다(Dennard scaling 종말). 이후 방향은 범용 코어를 늘리는 대신 Tensor Core 같은 전용 연산 유닛을 넣는 쪽으로 갔다.

강의에 나오는 “8년 만에 317배”(K20X 3.94 → A100 1248)는 주의해서 읽어야 한다. K20X 쪽 숫자는 FP32 TFLOPS고 A100 쪽은 INT8에 sparsity까지 포함한 값이라, 같은 precision에서의 성능 향상이 아니다. precision 축소와 Tensor Core, sparsity를 전부 합친 추세선이다.

Memory Wall

연산 성능(TOPS)은 세대당 2~3배 늘어나는데 HBM bandwidth는 2배 정도 늘어난다. 이 차이가 누적되면 병목이 연산이 아니라 메모리 접근이 된다. FlashAttention이 recomputation으로 연산을 늘리면서도 HBM read/write를 줄이는 이유가 이거다.

Cloud vs Edge

강의 슬라이드에는 B100(1,750 TOPS, 700W)과 Qualcomm, Apple 모바일 칩을 TOPS/W로 비교하는 표가 있고, edge 칩들이 전성비에서 앞선다. edge는 배터리와 발열 제약이 있어서 와트당 연산량 위주로 설계되기 때문이다. 다만 이 표의 숫자들은 업체별 마케팅 수치라 직접 비교는 어렵다. TOPS의 precision 기준이 업체마다 다르고 공개도 안 되어 있고, 전력 쪽도 GPU 모듈 TDP와 SoC 전체 추정치가 섞여 있다. 여기서 가져갈 내용은, 전력 예산이 10W 수준이면 소프트웨어에서 quantization/pruning으로 연산량을 줄여야 한다는 것 정도다.

Course Overview

이후 강의에서 pruning/sparsity, quantization, NAS, knowledge distillation, on-device training, efficient attention(FlashAttention 등), distributed training/inference를 하나씩 다룬다. Software(6.5940)와 Hardware(6.5930)를 같이 보는 게 좋다.