FP4
FP4는 일반적으로 E2M1을 사용하는 4비트 부동소수점 형식으로, 블록별 스케일을 사용해 AI 모델의 크기를 줄이고 속도를 높입니다. NVFP4, MXFP4, 하드웨어, 코드를 다룹니다.
FP4는 모델 양자화에서 신경망의 가중치와 활성화를 저장하고 계산하는 데 사용하는 4비트 부동소수점 숫자 형식입니다. AI 하드웨어와 소프트웨어는 부호 비트 1개, 지수 비트 2개, 가수 비트 1개로 구성된 E2M1 레이아웃을 사용하며, 0, ±0.5, ±1, ±1.5, ±2, ±3, ±4, ±6만 표현할 수 있습니다. 각 값은 FP8의 절반, FP16(반정밀도)의 4분의 1 메모리를 차지합니다. 이는 메모리에서 가중치를 불러오는 작업이 추론 지연 시간의 주요 원인인 대규모 언어 모델과 기타 생성형 AI 모델에서 특히 중요합니다. NVIDIA Blackwell GPU와 AMD Instinct MI350 시리즈에서 네이티브 FP4 행렬 연산을 지원하기 시작했으며, FP4는 추론과 점차 학습에도 사용되고 있습니다.
FP4의 작동 방식#
서로 다른 값 15개로는 실제 가중치와 활성화의 범위를 표현할 수 없으므로, 실용적인 FP4 형식은 텐서를 작은 블록으로 나누고 블록마다 공유 스케일 하나를 저장합니다. 이 스케일은 블록에서 절댓값이 가장 큰 값이 E2M1의 최댓값 6에 가깝게 매핑되도록 선택합니다. 주요 형식 두 가지는 블록 크기와 스케일 정밀도가 다릅니다.
- MXFP4: Open Compute Project의 마이크로스케일링(MX) 사양에 정의된 MXFP4는 32개 값마다 8비트 2의 거듭제곱 스케일(E8M0) 하나를 적용합니다. 개방형 사양으로 AMD MI350 시리즈와 NVIDIA Blackwell GPU를 비롯한 여러 공급업체 제품에서 지원됩니다.
- NVFP4: NVIDIA 형식은 16개 값마다 FP8(E4M3) 스케일 하나를 적용하고 텐서마다 FP32 스케일을 하나 추가합니다. 더 작은 블록과 세밀한 스케일은 양자화 오차를 줄이며, NVIDIA는 DeepSeek-R1-0528 벤치마크에서 FP8 대비 정확도 손실이 1% 이하라고 보고했습니다.
아래 코드 조각은 이상치가 몇 개 포함된 텐서를 E2M1 값으로 반올림합니다. 전체 텐서에 스케일 하나를 적용한 다음, MXFP4와 NVFP4의 블록 크기인 32개 및 16개 값마다 스케일 하나를 적용합니다.
import torch
# The eight non-negative values FP4 E2M1 can represent; the sign bit mirrors them
grid = torch.tensor([0.0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0])
torch.manual_seed(0)
x = torch.randn(4096)
x[::512] *= 20 # a few large outliers, as real weight and activation tensors have
# One shared scale for the whole tensor, then MXFP4-sized and NVFP4-sized blocks
for block in [4096, 32, 16]:
blocks = x.reshape(-1, block)
scale = blocks.abs().amax(dim=1, keepdim=True) / 6.0 # map each block's largest value to 6
nearest = ((blocks.abs() / scale).unsqueeze(-1) - grid).abs().argmin(dim=-1)
dequantized = grid[nearest] * blocks.sign() * scale
error = (dequantized.flatten() - x).abs().mean()
print(f"Block size {block:>4}: mean absolute error {error:.4f}")전체 텐서에 스케일 하나를 적용하면 이상치 때문에 스케일 범위가 크게 늘어나 일반적인 값 대부분이 0으로 반올림되고 평균 절대 오차는 0.7238이 됩니다. 32개 및 16개 값으로 이루어진 블록을 사용하면 각 이상치가 단일 블록에 국한되므로 나머지 블록은 세밀한 스케일을 유지하며 오차가 각각 0.0901과 0.0747로 감소합니다.
FP4 추론 및 학습#
추론에서는 TensorRT와 같은 추론 엔진이 학습 후 가중치와 흔히 활성화도 FP4로 양자화하고, 행렬 곱셈을 FP4로 실행하며 결과는 더 높은 정밀도로 누적합니다. TorchAO의 NVFP4 및 MXFP4 구성을 사용하면 지원 GPU에서 동일한 워크플로를 PyTorch에 적용할 수 있습니다. OpenAI는 혼합 전문가 가중치를 MXFP4로 사후 학습한 gpt-oss-120b를 공개했습니다. 이를 통해 1,170억 파라미터 모델을 단일 80 GB GPU에서 실행할 수 있습니다.
FP4 학습은 혼합 정밀도 학습을 4비트까지 확장합니다. 학습 중 그래디언트와 활성화의 범위가 계속 변하므로 추론보다 구현하기 어렵습니다. NVIDIA의 NVFP4 사전 학습 연구는 이상치를 분산하는 무작위 Hadamard 변환, 그래디언트용 확률적 반올림, 일부 레이어의 더 높은 정밀도 유지를 결합해 NVFP4로 12억이 아닌 120억 파라미터 모델을 10조 토큰으로 학습했습니다. 학습 손실과 다운스트림 정확도는 FP8 기준선과 비슷했습니다.
FP4 모델 배포#
네이티브 FP4 텐서 코어를 사용하려면 NVIDIA Blackwell GPU 이후 제품(예: B200 및 GeForce RTX 50 시리즈)이나 MXFP4를 지원하는 AMD Instinct MI350 가속기가 필요합니다. H100과 같은 Hopper GPU는 FP8을 가속하지만 FP4는 가속하지 않습니다. TensorRT 지원 매트릭스에서 각 GPU가 지원하는 정밀도를 확인할 수 있습니다. 변환 후 모델 배포 전에 정확도를 확인해야 합니다. 민감한 레이어나 소형 모델의 성능이 저하될 수 있으며, 사후 학습 양자화만으로 충분하지 않을 때는 양자화 인식 학습으로 정확도를 복구할 수 있습니다. Ultralytics YOLO26의 TensorRT 내보내기는 quantize=16를 사용하는 FP16 또는 quantize=8를 사용하는 INT8 엔진을 빌드합니다. 이는 YOLO 모델에 제공되는 저정밀도 옵션입니다.
FP4와 관련 형식 비교#
- FP8: FP8(E4M3 또는 E5M2)은 서로 다른 값이 훨씬 많고 표현 범위도 더 넓습니다. 대규모 모델에서 FP8 학습이 널리 채택되어 FP4 결과를 비교하는 일반적인 기준선으로 사용됩니다.
- BFloat16: BF16은 전체 품질로 대규모 모델을 학습하고 서빙하는 표준 형식이며 FP4보다 비트 수가 4배 많습니다.
- INT4: INT4는 16개 레벨을 균일한 간격으로 배치하지만 FP4는 대부분의 가중치와 활성화가 모여 있는 0 주변에 레벨을 더 촘촘히 배치합니다. GPTQ와 AWQ 같은 방법을 사용하는 언어 모델의 가중치 전용 압축에는 여전히 INT4가 널리 사용됩니다.
- AMD Socket FP4: FP4는 관련 없는 AMD 노트북 프로세서 소켓의 이름이기도 합니다. FX-8800P와 같은 Carrizo 세대 모바일 APU에 사용되는 패키지입니다.










