cudatraining · 학습 기록

LESSON 06 · 2026.04.18 · T4 · CAPSTONE

Flash Attention — 다섯 레슨이 80줄에 수렴하다

Tiled matmul + online softmax + HBM 트래픽 감량. 레슨 1–5 가 쌓아온 것들을 하나의 커널에 밀어넣었다. N=4096 에서 4.79× 빠르고 65× 적은 메모리 트래픽.

GPU · T4 d · 64, FP32 sweep · 8 runs

두 구현

결과

Nnaive msflash msspeedupnaive HBMflash HBMHBM ratio
5120.4020.5930.68×4.5 MB0.5 MB
10241.0880.8811.24×17.01.017×
20483.0761.2352.49×66.02.033×
409611.8572.4774.79×260.04.065×

GFLOP/s (연산량 기준): naive 169 → 366, flash 115 → 1754 (T4 peak 의 22%). 정확도: 둘 다 max_abs_err < 5e-7.

교훈 1 · HBM 절감은 N² → N·d 스케일링

N=4096, d=64:

비율 65×, N 제곱으로 벌어진다. 이게 FA 의 전부. 나머지는 이 절감을 시간으로 환산하는 엔지니어링.

교훈 2 · Crossover — N=512 에서는 naive 가 더 빠르다

N=512 에서 flash 는 오히려 느리다 (0.68×). 이유:

"FA 가 항상 빠르다" 는 거짓. sequence length 가 길어야 우위가 난다. 실제 LLM prefill (N=4096~32k) 에서 FA 가 결정적인 이유.

교훈 3 · HBM 절감 vs 실시간 속도

N=4096 에서 HBM 은 65× 주는데 시간은 4.79× 만 빨라진다. 왜?

FA 의 큰 성능은 H100 같은 고대역 + 고 peak 에서 빛난다. T4 에서도 절감은 실재하지만 극적이지 않다.

교훈 4 · 다섯 레슨이 한 커널에 수렴

Lesson 01 vector_add  → coalesced load 패턴 (FA 의 Q/K/V 로드)
Lesson 02 memory      → HBM↔L2 트래픽 의식 (FA 의 존재 이유)
Lesson 03 reduction   → warp reduce (row max/sum)
Lesson 04 matmul      → tiled matmul (S = Q@K^T, O += P@V)
Lesson 05 softmax     → online (max, sum) update (심장)
Lesson 06 flash       → 위 다섯의 fusion

80 줄짜리 커널 하나에 저게 다 들어있다. FA 논문이 "별로 새롭지 않은 기술의 날카로운 조합" 이라 평가되는 이유.

LLM serving 번역

우리 단일 커널 FA 는 prefill 쪽의 dynamics 를 설명한다. 여기서 "CUDA 레벨 1" 학습이 종료. 다음 레슨부터는 PyTorch 에 붙인다.