Dtype, Memory, Throughput

마지막 수정:

precisiondtypememorybandwidththroughputgemm

dtype을 낮추는 가장 직접적인 효과는 값 하나의 크기가 줄어드는 것이다.

FP32: 4 bytes
FP16/BF16: 2 bytes
FP8: 1 byte

같은 원소 10억 개를 저장한다고 하면:

FP32: 4 GB
BF16: 2 GB
FP8:  1 GB

Memory bandwidth

GPU kernel이 memory-bound라면 병목은 계산이 아니라 데이터를 가져오는 속도다.

이때 dtype을 낮추면 같은 bandwidth로 더 많은 원소를 가져올 수 있다.

같은 1 TB/s bandwidth

FP32: 4 bytes/value
BF16: 2 bytes/value
FP8:  1 byte/value

즉 dtype은 flops-and-bytes의 bytes 계산에 바로 들어간다.

GEMM throughput

낮은 precision은 저장 공간만 줄이는 것이 아니다. 하드웨어가 낮은 precision matrix multiplication을 더 빠르게 지원하는 경우가 많다.

예를 들어 최신 GPU에서는 BF16 GEMM이 FP32보다 빠르고, FP8 GEMM은 BF16보다 더 높은 이론 FLOPS를 제공할 수 있다.

하지만 처리량이 높다고 항상 바로 쓸 수 있는 것은 아니다.

낮은 precision
-> 빠르고 작다
-> range/resolution이 줄어든다
-> 안정성 문제가 생긴다

그래서 학습에서는 mixed precision이 필요하고, 추론에서는 quantization error를 관리해야 한다.

확인

  • BF16으로 바꾸면 같은 원소 수의 tensor memory는 FP32 대비 몇 배가 되는가?
  • dtype이 낮아지면 memory-bound kernel에 왜 도움이 되는가?
  • 낮은 precision GEMM이 빠르더라도 안정성 검토가 필요한 이유는 무엇인가?