기본기 다지기

[기본이론] CME295 공부 (Lecture 4)

syveany 2026. 4. 12. 00:39

.

1. LLM overview

Decoder-only Transformer-based model

: GPT, LLaMA, Gemma, DeepSeek, Mistral, Qwen, ...

2. MoE(Mixture of Experts)-based LLMs

Gating network가 여러 전문가 중에서 몇 개만 골라서 선택함

- Dense MoE: 모든 expert 사용

- Sparse MoE: top-k expert만 사용

 

Transformer 계열 모델들의 MoE

원래 하나였던 FFN을 여러개로 쪼개서 top-k만 선택해서 사용

 

문제: routing collapse. Gate가 특정 expert만 쓰는 현상. 다양성 줄어들고 모델 용량이 낭비됨

해결법: Auxiliary loss! (보조 loss)

3. Response generation

Predicting next token

3.1 with Greedy Decoding

확률 젤 높은거 선택

한계: 창의성 없음

3.2 with beam search

k개 후보 유지

한계: 계산량 많음. 다양성 창의성  없음

3.3 with sampling(top-k, top-p)

top-k중 랜덤 선택, 누적확률 p까지 중 랜덤 선택

다음 단어를 얼마나 랜덤하게 고를 것인가?를 뜻하는 temperature 값이 사용됨

Small T: 하나만 확 튀어서 하나만 선택되는 상태, High T: 다 비슷하게 높아서 여러 단어가 선택될 수 있는 상태임

 

Constraining the output via guided decoding: 가능한 token만 나오도록 하는 것

 

4. Prompting 전략

구조: context, instruction, input, constraint

input type, model에 따라서 모델 크기가 몇 배씩 차이나는데, *context rot 문제도 유의해야 한다.

* context rot: context가 길어질수록 성능 떨어지는 현상

 

In-context Learning (ICL): prompt 안에 예시를 넣어서 출력시키는 방식. 다시 학습할 필요가 없음

Zero-shot, Few-shot

Chain of thought: 사고과정 설명하는 것

Self-consistency: 답 여러 개 생성해서 투표하는 것

 

5. Inference 최적화

문제: Computations are expensive, any way to reduce complexity?

5.1 Exact efficiency로 해결

5.1.1 Avoid redundancies (중복성 방지)

KV cache: K, V를 저장

 

5.1.2 Memory management

PagedAttention: 일렬로 저장하지 않고 조각내서 저장함

KV cache는 한줄로 쭉 저장해서 안 쓰는 공간 생겨서 비효율적이었는데 PagedAttention은 여러 블럭에 나눠서 저장함

떨어져있는 모든 KV 블럭들을 가져와서 attention 계산을 함

 

5.1.3 Reformulate the math (계산 과정을 바꾸는거라 math가 붙은듯)

Speculative decoding (추측하는? 미리 가정해보는? 디코딩): 작은 모델 토큰 생성 → 큰 모델 검증

작은 모델이 먼저 빠르게 대충 토큰 생성하고 큰 모델이 얘를 한번에 넣어서 검증함

그러고 아래같은 샘플링 알고리즘 적용해서 채택할지말지 결정함

 

(i) P(큰모델) >= P(작은모델):

  무조건 채택

(ii) P(큰모델) < P(작은모델):

  P(작은모델)/P(큰모델) 확률로 채택 (즉, 1 - P(작은모델)/P(큰모델) 확률로 리젝)

 

5.2 Approximation으로 해결

5.2.1 Architectural changes

Grouped Query Attention: K, V를 여러 개 쓰지 말고 같이 서서 메모리를 줄이는 방법

Multi-Head Attention은 Q, K, V가 다 달랐는데 GQA는 여러 개의 Q에 같은 K, V를 씀

e.g. Q₁, Q₂ → K₁, V₁ (공유), Q₃, Q₄ → K₂, V₂ (공유)

MHA h
GQA G (중간)
MQA 1

 

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★

 

5.2.2 Embeddings representations

Latent attention: KV cache를 그대로 저장하지 않고 더 작게 압축해서 저장하는 방법

요약본 'shared'를 만들어놓고 나중에 필요하면 shared로 K, V를 각각 만들어서 사용함


5.2.3 Token prediction

Multi-token prediction: 여러 개의 토큰을 한번에 생성하는 방법

Transformer 하나에 출력 head 여러 개를 붙임. 각각 head가 얼마 뒤 단어를 predict하라고 제시함!

 

 

 

GPT3 pretraining 300B token, fine-tune 13000

LLaMA3 pretraining15 trillion token, fine-tune 10 million

 

FLOPs: 총 계산량

small NN 10^7, Large RNN 10^14, LLM $10^25$

FLOPS or FLOP/s: 계산 속도

스마트폰 10^12, 컴퓨터 10^14, 슈퍼컴퓨터 ${10}^{18}$

 

LLM 성능 결정하는 3가지 법칙

Scaling: 계산량이 많을수록, 데이터 양이 많을수록, 모델이 클수록 성능 좋아짐

Sample efficiency: 모델이 클수록 적은 데이터로도 성능이 빨리 좋아짐

Chinchilla law: 하지만! 모델 크기만 키우면 되는 게 아니다. 데이터 양도 같이 늘려야 된다.

 

 

forward pass, backwards pass, optimizer state

 

memory가 제일 큰 병목임

모델은 수십~수백GB가 필요한데 GPU 한장 메모리는 수십GB밖에 안됨

1. 메모리 사용량 줄이기

2. 같은 메모리에서 더 빠르게 계산하기

 

Data parallelism

데이터 batch를 여러 디바이스에 나눔. 모델은 각 device에 복제됨

예를 들어서 batch size=128이면 GPU1 32, GPU2 32, GPU3 32, GPU4 32 이 됨

한계: 모델이 각 device에 복제되기 때문에 GPU마다 optimizer state, gradients, parameters 등이 중복 저장됨

 

Data parellelism with ZeRO(Zero Redundancy Optimization)

ZeRO1: optimizer state 공유

ZeRO2: optimizer state + gradients 공유

ZeRO3: optimizer state + gradients + parameters 공유

 

Model parallelism

data parallelism이 데이터를 나누고 모델은 복제, model parallelism은 모델 자체를 나눔

Tensor Parallelism (TP)

Pipeline Parallelism (PP)

Sequence Parallelism (SP)

Context Parallelism (CP)

Expert Parallelism (EP)

 

Flash Attention 정확도 희생 없이 빠르게만 함!

GPU 내부에 HBM(크지만 느림), SRAM(작지만 빠름), CU가 있는데, 얘를 전략적으로 활용하는거임

 

전략1: Tiling (큰 행렬 전체를 한번에 넣지 않고 작은 tile 단위로 쪼개서 SRAM에 올려서 계산. 최종 결과만 HBM에 씀)

Standard self-attention computation은 계속 중간결과를 HBM에 쓰고 읽음

  • Q, K를 HBM에서 불러옴
  • QK^T 계산
  • QK^T 를 HBM에 씀
  • QK^T 를 HBM에서 다시 읽음
  • softmax(QK^T) 계산
  • softmax(QK^T)를 HBM에 씀
  • softmax(QK^T)와 V를 다시 불러옴
  • softmax(QK^T)V 계산
  • softmax(QK^T)V를 HBM에 씀

근데 No need to compute the full before applying softmax!

 

전략2: 저장하지 않고 그냥 recompute하기

 

 

Mixed precision training

 

전체를 low precision으로 바꾸는게 아니라 섞어서 쓰자!

forward 때 생성되는 activation은 FP16/BF16 같은 낮은 정밀도로 저장한다. (32->16)
이게 메모리 절감에 매우 크다. activation이 엄청 많기 때문이다.

gradient 관련 계산도 낮은 정밀도로 수행해서 속도와 메모리 효율을 챙긴다. (16)

왜 weight는 high precision으로 남기냐면, 업데이트가 수없이 반복되기 때문에 low precision만 쓰면 오차가 누적되어 학습이 불안정해질 수 있기 때문이다. (32)

 

벤치마크 종류

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★

 

LoRA 위치

원래 Masked Multi-Head Attention, 요즘에는 FFN!

 

 

LoRA needs a higher learning rate, small batch-size

QLoRA: 학습 안 하는 W는 압축해서 저장하자! (NF4로 압축함)

double quantization

weights → NF4

constants → FP8 (or 더 작은 표현)

 

LLaMA 65B 기준 VRAM 약 16배 절약, double quantization이 추가로 6% 메모리 절약