AEGLOSLAB 엔비디아 기술 스택

제1부 GPU 아키텍처

1.14 수치 정밀도 II — 혼합정밀도·양자화 기초·구조적 희소성

1.14.1 이 장에서 배우는 것 / 선수 지식

1.13에서 포맷 자체(비트 구성·범위·정밀도)를 봤다. 이 장은 그 포맷을 실제로 쓰는 법 — 혼합정밀도 학습·양자화·구조적 희소성을 다룬다. 제1부의 마지막 장이며, 여기까지가 제2부(CUDA)·이후 전체의 정밀도 토대다.

학습 목표:

  • 혼합정밀도 학습의 두 축 — FP32 마스터 가중치와 손실 스케일링 — 이 왜 필요한지 안다.
  • 양자화(scale·zero-point) 의 affine 산수와 outlier 문제를 직접 계산한다.
  • 구조적 희소성 2:4 가 정밀도와 직교하는 처리량 축임을 안다.
  • 작업별로 어떤 포맷을 언제 쓰는지 의사결정한다.

선수 지식: 1.13(포맷·범위·정밀도·ULP), 1.11~1.12(텐서코어·트랜스포머 엔진). 추론 양자화 실무(PTQ·QAT·교정)는 5.4, 학습 통합은 6.2.

주의: 어떤 세대가 어떤 포맷·희소성을 가속하는지는 세대 의존(1.12). 저정밀은 항상 측정된 품질-속도 트레이드오프로 판단한다.

1.14.2 혼합정밀도 학습 — 마스터 가중치와 손실 스케일링

저정밀(FP16/BF16)로 학습하면 빠르고 메모리가 적지만, 순진하게 전부 FP16으로 하면 모델이 학습 안 된다. 두 고전적 실패와 처방이 핵심이다.

혼합정밀도 학습 한 스텝 (FP16 기준) forward 손실 × S 스케일업· 손실 스케일링 그래디언트 ÷ S 언스케일 다음 스텝용 FP16 가중치로 캐스팅 FP16 가중치 FP16 활성/손실 backward (FP16 그래디언트, ×S 만큼 키워진 상태) FP32 마스터 가중치 (옵티마이저 갱신 · FP32에서 누적)

1.14.2.1 마스터 가중치 (왜 FP32 사본인가)

옵티마이저 갱신 w ← w - lr × grad에서 lr × grad가 w에 비해 아주 작다. 예: w = 1.0, lr×grad = 1e-4.

  • FP16의 1.0 근처 ULP는 약 $2^{-10} \approx1\mathrm{e}-3$. 1e-4는 ULP보다 작아 더해도 사라진다(swamping) → 가중치가 갱신되지 않는다.
  • 처방: 가중치의 FP32 마스터 사본을 두고 갱신은 FP32에서(1.0 근처 ULP ~1.2e-7 = 2^-23이라 1e-4가 살아남는다). 순전파·역전파만 FP16 캐스트본으로.

BF16은 가수가 더 적어(1.0 근처 ULP ~7.8e-3 = 2^-7, FP16의 2^-10보다 큼) swamping이 더 심하므로 마스터 가중치는 BF16 학습에서도 거의 항상 둔다. "메모리 절감인데 FP32 사본을 두면 손해 아니냐"는 흔한 오해 — 활성·그래디언트가 메모리의 대부분이고 가중치 사본은 상대적으로 작아 순이득이 크다.

1.14.2.2 손실 스케일링 (FP16 한정)

작은 그래디언트들이 FP16 최소 표현값(~6e-5) 아래로 내려가 0(underflow) 이 되는 문제. 역전파 전에 손실에 큰 상수 S(예: 1024~65536)를 곱하면 연쇄율에 의해 모든 그래디언트가 S배 커져 FP16 범위 안으로 올라온다. 옵티마이저 적용 전 다시 ÷S.

  • 동적 손실 스케일링: S를 고정하지 않고, inf/NaN이 보이면 절반으로 줄이고 그 스텝을 건너뛰며, 안정적이면 점차 키운다(프레임워크 AMP가 자동).
  • BF16은 손실 스케일링이 거의 불필요하다. 지수가 FP32와 같아 underflow 위험이 사실상 없기 때문 — 별도 처리 없이 캐스팅하면 대체로 된다. 이것이 BF16이 대형 학습 표준이 된 이유.
FP16 학습BF16 학습
마스터 가중치(FP32)필요필요(권장)
손실 스케일링필요(동적)대개 불필요
주된 위험범위 좁음(over/underflow)정밀도 낮음(가수 7b)
실무 기본레거시·일부 비전대형 LLM 학습 표준

FP8 학습의 텐서별 동적 스케일링(트랜스포머 엔진)은 "움직이는 손실 스케일링"의 일반화다(1.12). 누산은 항상 FP32.

1.14.3 양자화 — 스케일·제로포인트

양자화는 실수 텐서를 저비트 정수(또는 저정밀 부동소수)로 매핑하는 일이다. 추론에서 INT8·FP8을 쓰려면 필수. 핵심 산수는 affine 매핑 하나다(상세 절차·PTQ/QAT·교정은 5.4).

  • 양자화: $q = \mathrm{round}(r / s) + \mathrm{zp}$ (실수 $r$ → 정수 $q$)
  • 역양자화: $\hat{r} = (q - \mathrm{zp}) \times s$ (정수 $q$ → 실수 근사)
  • $s = \mathrm{scale}$: 한 정수 단계가 표현하는 실수 폭
  • $\mathrm{zp} = \text{zero-point}$: 실수 0에 대응하는 정수 (대칭이면 $\mathrm{zp}=0$)

스케일 정하기(텐서 절댓값 최대 A를 INT8 대칭으로):

  • $A = \max(\lvert r \rvert)$, $s = A / 127$
  • 예) $A = 6.0$ → $s = 6.0/127 \approx 0.0472$
  • $r = 2.0$ → $q = \mathrm{round}(2.0/0.0472) = 42$
  • $\hat{r} = 42 \times 0.0472 = 1.984$ (오차 0.016 = 한 단계의 약 1/3)
  • per-tensor: 텐서 전체에 스케일 1개. 단순·빠르지만 텐서 안 크기 차가 크면 작은 값이 구분되지 않는다.
  • per-channel/per-token: 채널·토큰마다 스케일. 정확도↑, 메타데이터↑. LLM 가중치 양자화 표준.
  • outlier 문제: A를 정하는 max가 이상치 하나에 끌려가면 나머지가 거친 격자로 눌린다. 교정·클리핑·SmoothQuant류가 이를 다룬다(5.4).

FP8 양자화도 같은 affine 틀이지만, FP8 자체가 지수를 가져 0 근처가 자연히 촘촘하므로 분포가 넓은 텐서(특히 활성)에 유리. 그래서 LLM에서 가중치는 INT4/INT8, 활성·연산은 FP8 식의 혼합이 흔하다.

1.14.4 구조적 희소성 2:4

정밀도와 더불어 처리량을 높이는 다른 축이 희소성이다. 무작위 희소성은 하드웨어가 못 쓰지만, 엔비디아 텐서코어(Ampere+)는 구조적 2:4 희소성을 가속한다.

2:4 패턴: 연속한 4개 원소 묶음마다 정확히 2개를 0으로 밀집 0.3 -0.1 0.8 0.2 -0.5 0.4 0.0 0.7 2:4 0.3 0 0.8 0 -0.5 0 0 0.7 압축 0.3 0.8 | -0.5 0.7 + 2비트 인덱스/묶음
  • 저장은 절반(0이 아닌 값 2개/4개) + 작은 인덱스 메타데이터.
  • 텐서코어는 압축 포맷을 직접 먹어 GEMM을 최대 2배 처리량(이론치, 세대·작업 의존)으로 실행된다 — 0과의 곱셈을 건너뛴다.
  • 적용: 보통 밀집 학습 → 2:4 가지치기 → 짧은 재학습(fine-tune) 으로 정확도 회복 뒤 추론에. 구조가 고정(2:4)이라 무작위 희소성과 달리 하드웨어 친화적.
  • 정밀도와 직교: FP16·BF16·INT8·FP8 위에 2:4를 겹쳐 쓸 수 있다 — 비트 줄이기 × 절반 건너뛰기.

함정: 모든 모델·레이어가 2:4로 정확도를 유지하지는 않는다. 어텐션·작은 레이어는 손실이 클 수 있어 레이어별로 적용 여부를 본다. APEX·TensorRT가 도구를 제공(5.4).

1.14.5 트레이드오프 — 어떤 포맷을 언제

작업1순위대안이유
대형 LLM 학습BF16(+FP32 마스터)FP8(TE, 큰 모델·클러스터)범위 안전·캐스팅만으로 동작. FP8은 처리량↑이나 레시피·검증 필요
비전·중소 학습BF16FP16+동적 손실 스케일링BF16 가용하면 손스케일 불필요로 단순
TF32 자동 가속(기본 켜짐)FP32(정밀 요구 시)코드 변경 없이 행렬연산 가속, 정밀도 ~FP16급
LLM 추론 가중치INT4/INT8 per-channelFP8메모리·대역폭 절감 핵심. 가중치가 양자화 더 견딤
LLM 추론 활성·연산FP8(E4M3)INT8(SmoothQuant)활성 분포가 넓어 FP8 지수가 유리
극한 추론(Blackwell)FP4(MX 블록스케일)FP8최대 처리량, 품질 검증 필수(발표 기준)

비엔비디아 정직: BF16·FP16·INT8·FP8(OCP) 포맷 자체는 하드웨어 중립 표준이라 타사 가속기도 지원한다. 엔비디아 이점은 포맷이 아니라 텐서코어 가속 폭·트랜스포머 엔진 자동 스케일링·통합 성숙도. TF32와 2:4 가속은 엔비디아 특유.

견해: 대형 학습의 무난한 기본은 BF16 + FP32 마스터 가중치다. FP8 학습은 충분히 큰 모델·클러스터에서 검증 후 도입할 처리량 카드로 보고, "켜면 무비용"으로 여기지 않는다.

1.14.6 중간 점검 (체크포인트)

  • [ ] 마스터 가중치가 FP32인 이유(작은 갱신 swamping)와 손실 스케일링이 FP16엔 필요·BF16엔 대개 불필요한 이유(underflow vs 범위)를 구분해 설명한다.
  • [ ] INT8 양자화에서 s = A/127로 스케일을 설정하고 한 값의 q·역양자화·오차를 직접 계산한다.
  • [ ] 2:4 희소성이 정밀도와 직교하며 압축·처리량 이득을 내는 방식을 말한다.
  • [ ] 작업별 포맷 선택(학습 BF16, 추론 가중치 INT, 활성 FP8)을 근거와 함께 고른다.

디버깅 단서: 학습 손실이 수 스텝 만에 NaN → FP16 손실 스케일링 누락/S 과대. 가중치가 정체 → FP32 마스터 없이 저정밀 직접 갱신(swamping). 양자화 후 정확도 급락 → per-tensor outlier로 본문 값이 소실됨 → per-channel·클리핑·교정(5.4).

1.14.7 흔한 함정

  • 손실 스케일을 BF16에서도 키우기. BF16은 underflow가 거의 없어 큰 손실 스케일이 오히려 오버플로를 부른다. BF16엔 보통 불필요.
  • FP8/INT8을 스케일 없이 캐스팅. 비트가 적어 분포를 표현 범위로 끌어오지 않으면 거의 무의미.
  • per-tensor outlier 무시. 활성의 큰 이상치 하나가 스케일을 좌우해 본문을 0 근처로 누른다. LLM 활성은 per-token·SmoothQuant류가 거의 필수(5.4).
  • 2:4를 모든 레이어에 일괄 적용. 어텐션·작은 레이어는 손실이 클 수 있다. 레이어별 검증·재학습 없이 쓰면 품질이 깨진다.
  • 검증 없이 정밀도 강등. "FP8/FP4로 바꿨더니 빨라졌다"만 보고 품질 지표(perplexity·정확도)를 안 재는 것이 최대 함정. 저정밀은 항상 측정된 품질-속도 트레이드오프로 판단.

1.14.8 연습문제

연습 1 (swamping 산수). FP16에서 w=4.0, lr×grad=2e-4일 때 w + lr×grad가 갱신을 잃는지 판정하라.

정답

4.0의 ULP = 2^2 × 2^-10 = 2^-8 ≈ 3.9e-3. 갱신량 2e-4 < ULP 절반(~2e-3) → 반올림되어 사라진다. FP32 마스터(ULP ≈4.8e-7)면 살아남는다.

연습 2 (양자화 오차). 대칭 INT8, A=2.5. r=0.7을 양자화→역양자화하고 오차를 구하라. outlier로 A가 25로 잘못 설정되면 r=0.7의 오차는?

정답

정상: s=2.5/127≈0.01969, q=round(0.7/0.01969)=36, r̂=0.709, 오차≈0.009. Outlier: s=25/127≈0.1969, q=round(0.7/0.1969)=4, r̂=0.787, 오차≈0.087 — 약 10배 악화. outlier가 정밀도를 망치는 정량 확인.

연습 3 (손실 스케일링 선택). (a) FP16, (b) BF16 학습 각각 손실 스케일링이 필요한가? FP16에서 S=1이면?

정답

(a) FP16: 필요. S=1이면 작은 그래디언트가 FP16 최소값(~6e-5) 아래로 underflow→0이 되어 그 파라미터가 안 학습됨. 동적 스케일링 권장. (b) BF16: 대개 불필요 — 지수가 FP32와 같아 underflow 사실상 없음.

연습 4 (2:4 설계). FP16 모델에 2:4 희소성으로 추론 처리량을 높이려 한다. 절차 4단계와 정확도가 떨어졌을 때 점검할 것 둘.

정답

① 밀집 FP16 확보 → ② 레이어별 2:4 마스크로 가지치기 → ③ 마스크 고정 채 짧게 재학습으로 회복 → ④ 텐서코어 희소 경로로 추론(TensorRT 등). 점검: (i) 어떤 레이어에 적용했나(어텐션·작은 레이어 제외 검토), (ii) 재학습 충분했나·품질 지표 측정. 정밀도와 직교하므로 둘을 분리해 원인 격리.

1.14.9 요약 · 다음 장

  • 혼합정밀도 학습의 두 기둥은 FP32 마스터 가중치(작은 갱신 swamping 방지)와 손실 스케일링(FP16 underflow 방지, BF16엔 대개 불필요). 누산은 항상 FP32.
  • 양자화는 q=round(r/s)+zp의 affine 매핑. outlier·per-channel이 정확도를 가른다(상세 5.4).
  • 구조적 2:4 희소성은 정밀도와 직교하는 처리량 축 — 4개 중 2개 0, 압축 저장, 텐서코어 가속.
  • 저정밀은 항상 측정된 품질-속도 트레이드오프로 판단한다.

제1부(GPU 아키텍처)가 끝났다. 다음 2.1부터 제2부(CUDA 프로그래밍) — 여기서 익힌 SIMT·메모리·텐서코어·정밀도 토대 위에서 직접 CUDA 커널을 작성하고 빌드·실행·검증한다.