FP8
FP8이 무엇인지, E4M3와 E5M2가 어떻게 작동하는지, 스케일링·하드웨어 지원·혼합 정밀도가 AI 학습과 추론을 어떻게 향상하는지 알아보세요.
FP8 또는 8비트 부동 소수점은 각 값을 8비트에 저장하는 저정밀 수치 형식입니다. AI 시스템은 호환되는 하드웨어에서 메모리 트래픽을 줄이고 행렬 곱셈, 합성곱 및 기타 비용이 큰 연산을 가속하기 위해 FP8을 사용합니다. FP16 또는 FP32와 비교하면 서로 다른 값을 더 적게 표현하므로, 성공적인 FP8 워크플로는 모델 품질을 유지하기 위해 빠른 저정밀 연산과 스케일링 및 선택적인 고정밀 연산을 결합합니다.
FP8의 숫자 표현 방식#
부동 소수점 값은 부호, 범위를 제어하는 지수, 세부 정보를 제어하는 가수로 구성됩니다. FP8은 일반적으로 PyTorch 부동 소수점 데이터 형식에 문서화된 다음 두 형식으로 사용됩니다.
- E4M3: 부호 비트 1개, 지수 비트 4개, 가수 비트 3개로 구성됩니다. 수치 세부 정보가 더 많지만 범위는 더 좁습니다.
- E5M2: 부호 비트 1개, 지수 비트 5개, 가수 비트 2개로 구성됩니다. 더 넓은 범위를 지원하지만 값을 더 공격적으로 반올림합니다.
E4M3은 가중치와 활성화에 적합한 경우가 많으며, E5M2는 값의 범위가 큰 그래디언트를 더 잘 처리할 수 있습니다. AMD 저정밀 부동 소수점 문서에 나와 있듯이 정확한 변형은 플랫폼마다 다르므로 FP8 모델이 모든 가속기와 런타임 간에 자동으로 이식 가능한 것은 아닙니다.
8비트로는 텐서의 원래 범위와 세부 정보를 모두 표현할 수 없으므로, 프레임워크는 일반적으로 변환 전에 값에 스케일링 계수를 곱합니다. NVIDIA의 FP8 스케일링 입문서에서는 이전에 관찰된 최대값으로부터 이후 스케일을 도출하는 지연 스케일링과 같은 전략을 설명합니다. 스케일링을 사용하면 모든 연산을 고정밀로 실행하지 않고도 오버플로, 언더플로 및 포화를 제한할 수 있습니다.
FP8과 관련 형식 비교#
FP8은 일반적인 AI 데이터 타입 중 중간 지점에 해당합니다.
- FP16 또는 반정밀도: 두 배 많은 비트를 사용하므로 수치 세부 정보가 더 많고 일반적으로 학습이 더 간단합니다. FP8은 저장 공간과 대역폭을 더 줄일 수 있지만 더 세심한 스케일링이 필요합니다.
- BF16: 넓은 지수 범위를 유지하면서 FP16보다 소수부 세부 정보는 적게 제공합니다. FP8 학습에서 더 높은 정밀도의 보완 형식으로 자주 사용됩니다.
- INT8: 부동 소수점 값이 아닌 정수를 표현합니다. INT8 모델 양자화는 일반적으로 스케일을 사용하여 실수 값을 고정된 정수 수준에 매핑하는 반면, FP8은 지수를 유지하여 자연스럽게 비균일한 간격을 제공합니다.
- FP4: 4비트만 사용하여 더 높은 압축률을 제공할 수 있지만, 범위와 세분성이 극도로 제한되어 일반적으로 정확도 보존이 더 어렵습니다.
FP8은 모든 텐서에 사용하는 데이터 타입이라기보다 혼합 정밀도 워크플로의 일부로 사용되는 경우가 많습니다. 누산, 정규화, 옵티마이저 상태 또는 민감한 레이어는 BF16, FP16 또는 FP32로 유지될 수 있습니다. 또한 수치 정밀도는 정밀도 평가 지표와 다릅니다. 정밀도 평가 지표는 모델의 양성 예측 중 올바른 예측이 몇 개인지를 측정합니다.
실제 적용 사례#
두 가지 실용적인 애플리케이션을 통해 FP8이 중요한 이유를 확인할 수 있습니다.
-
대규모 모델 학습: Transformer 학습은 대규모 행렬 곱셈을 반복적으로 수행합니다. FP8을 지원하는 프레임워크는 안정성을 위해 더 높은 정밀도가 필요한 부분은 유지하면서 적합한 가중치와 활성화를 FP8으로 변환할 수 있습니다. 이를 통해 대역폭 요구량을 줄이고 학습 처리량을 높일 수 있습니다. TorchAO 양자화 학습 워크플로에는 최대 속도와 이상치 처리 성능 간의 균형을 조정하는 텐서 단위 및 행 단위 스케일링 선택지가 포함되어 있습니다.
-
고처리량 비전 추론: 데이터 센터에서는 수백 개의 소매, 교통 또는 제조 비디오 스트림에서 객체 감지를 실행할 수 있습니다. FP8 지원 커널은 적합한 모델 레이어에서 사용하는 시간과 메모리를 줄여 추론 지연 시간을 낮추고 동시에 처리할 수 있는 스트림 용량을 늘릴 수 있습니다. TensorRT 양자화 타입 가이드에서는 명시적인 양자화 및 역양자화 연산으로 FP8 실행을 설명하는 방법을 소개합니다.
수치적 위험과 하드웨어 지원#
스케일링이 적절하지 않으면 큰 값이 포화되고 작은 값이 0으로 반올림될 수 있습니다. 하나의 스케일이 전체 텐서에 적용될 때 이상치가 특히 문제가 됩니다. 이러한 영향은 신뢰도 점수를 변경하거나 학습을 불안정하게 만들거나 감지 정확도를 낮출 수 있으므로, 개발자는 변환된 모델을 더 높은 정밀도의 기준 모델과 비교하여 검증해야 합니다.
네이티브 하드웨어 지원도 똑같이 중요합니다. NVIDIA Hopper 아키텍처는 FP8 Tensor Core 가속을 도입한 반면, 이전 세대인 NVIDIA A100 GPU는 FP16, BF16 및 INT8을 지원하지만 네이티브 FP8 연산은 지원하지 않습니다. 따라서 배포 정밀도를 선택하기 전에 TensorRT 하드웨어 지원 매트릭스를 확인해야 합니다.
실무에서 FP8 사용하기#
이 간단한 PyTorch 예제에서는 E4M3 변환과 FP8 값을 FP32로 복원할 때 발생하는 반올림 오차를 보여 줍니다.
import torch
values = torch.tensor([0.1, 1.0, 3.14, 100.0], dtype=torch.float32)
# Convert to E4M3 FP8, then restore the values for comparison.
fp8_values = values.to(torch.float8_e4m3fn)
restored = fp8_values.to(torch.float32)
absolute_error = (restored - values).abs()
print(torch.stack((values, restored, absolute_error), dim=1))문서화된 Ultralytics TensorRT 내보내기 워크플로는 한 인수로 실행하는 FP8 내보내기 대신 Ultralytics YOLO에 FP16 및 보정된 INT8 옵션을 제공합니다. 따라서 FP8 배포에는 호환되는 다운스트림 변환 툴체인이 필요합니다. 어떤 정밀도를 선택하든 프로덕션 배포 전에 대상 GPU에서 Ultralytics 벤치마크 모드를 사용하여 지연 시간, 처리량, 메모리 사용량 및 작업 정확도를 비교해야 합니다.






