한 줄 정의

FP16은 숫자를 16비트로 저장하고 계산하는 반정밀도 부동소수점 형식이야. NVIDIA의 혼합 정밀도 문서는 이 형식을 부호 1비트, 지수 5비트, fraction 10비트로 설명하고, PyTorch dtype 표torch.float16 또는 torch.half를 S-E-M 1-5-10 형식으로 적어.

여기서 지수는 값의 범위를, fraction은 유효숫자의 촘촘함을 주로 맡아. FP16은 FP32보다 저장 공간과 데이터 이동량을 줄일 수 있지만, 표현할 수 있는 값 범위가 짧아져. 그래서 모델의 가중치, 활성값, 어텐션 계산을 가볍게 만들 때 쓰되, 모든 연산을 FP16으로 밀어 넣는 선택지는 아니야.

어떻게 작동하나

FP16을 쓰면 같은 텐서를 FP32로 저장할 때보다 바이트 수가 절반으로 줄어. 예를 들어 32비트 값 1개가 4바이트라면, 16비트 값 1개는 2바이트야. 이 차이는 추론 서버에서 GPU 메모리, 캐시, 메모리 대역폭을 덜 쓰는 방향으로 이어질 수 있어.

성능 이득은 하드웨어와 연산 모양에 따라 달라져. NVIDIA 문서는 V100 Tensor Core에서 float16 행렬 곱과 컨볼루션이 float32 대비 최대 8배 빠를 수 있다고 설명하지만, 이건 Tensor Core가 잘 타는 연산과 모양일 때의 이야기야. 같은 문서에서 FP16 행렬 곱은 M, N, K 차원이 8의 배수일 때 Tensor Core 조건을 만족한다고 적어. 차원이나 커널이 맞지 않으면 FP16으로 저장해도 기대한 만큼 빨라지지 않을 수 있어.

프레임워크는 보통 혼합 정밀도 방식으로 다뤄. PyTorch AMP 문서matmul, linear, conv 같은 연산은 낮은 정밀도로 돌릴 수 있고, softmax, sum, layer_norm처럼 수치 안정성이 더 민감한 연산은 float32 쪽으로 남길 수 있음을 보여줘. 그래서 실무에서는 무작정 .half()로 전부 바꾸기보다 autocast와 gradient scaling 같은 장치를 함께 검토해.

왜 중요한가

FP16이 자주 나오는 이유는 모델 품질보다 운영 비용 쪽이 먼저 보이기 때문이야. 같은 모델이라도 가중치와 중간 텐서를 16비트로 다루면 더 큰 배치, 더 긴 문맥, 더 많은 동시 요청을 실험할 여지가 생겨. 특히 어텐션과 행렬 곱이 많은 LLM 추론에서는 숫자 형식 하나가 처리량과 지연 시간에 직접 영향을 줘.

다만 FP16은 “모델을 작게 만드는 모든 기술”을 뜻하지 않아. Distillation은 큰 모델의 행동을 작은 모델이 배우게 하는 학습 기법이고, 양자화INT8·INT4처럼 더 낮은 비트 표현으로 바꾸는 배포 기법이야. FP16은 그 사이에서 부동소수점 형식을 유지하면서 FP32보다 가볍게 계산하려는 선택지에 가까워.

실제 모델 카드도 그래서 따로 봐야 해. OpenAI의 Privacy Filter 발표는 공개 모델을 1.5B 전체 파라미터, 50M 활성 파라미터, 128,000토큰 컨텍스트로 소개해. 하지만 Hugging Face 모델 카드는 tensor type을 F32와 BF16으로 표시해. 작고 빠르게 돌릴 수 있다는 설명만 보고 FP16이라고 추측하면 바로 헷갈려.

BF16·FP8·양자화와 비교

BF16도 16비트지만 비트 배분이 달라. FP16은 1-5-10 구조라 BF16보다 fraction이 길고, BF16은 1-8-7 구조라 FP32와 같은 8비트 지수 폭을 유지해. 그래서 FP16은 값의 촘촘함을 조금 더 챙기는 대신 범위가 짧고, BF16은 범위를 넓게 유지하는 대신 유효숫자가 더 거칠어져.

FP8은 더 공격적으로 줄이는 8비트 부동소수점 계열이야. FP16보다 메모리와 대역폭을 더 아낄 수 있지만, 하드웨어 지원과 스케일링 정책을 더 세게 타. 즉 FP16, BF16, FP8은 모두 정밀도 선택지지만 “몇 비트인가”만 보면 부족하고, 지수와 fraction을 어떻게 나눴는지까지 같이 봐야 해.

양자화와도 경계가 달라. FP16은 여전히 부동소수점 형식이고, INT8·INT4 양자화는 값 범위를 정수 격자와 스케일 값으로 다시 매핑해. Hugging FacePrivacy Filter 예시처럼 같은 모델 카드 안에서도 기본 tensor type은 F32·BF16으로 표시되고, 브라우저 실행 예시는 q4 같은 양자화 설정을 따로 쓸 수 있어. 정밀도와 양자화는 같이 등장하지만 같은 칸에 넣으면 안 돼.

주의해서 볼 점

FP16의 약점은 값 범위야. NVIDIA 문서는 FP16의 최대 정규값을 65,504로 제시하고, 최소 정규값은 약 6.10e-5, 최소 denormal은 약 5.96e-8이라고 설명해. 학습에서는 작은 gradient가 0으로 사라지는 underflow가 생길 수 있어서 loss scaling이나 FP32 master weight를 같이 쓰는 경우가 많아.

추론에서도 확인할 항목은 네 가지야.

  • Hugging Face 모델 카드나 배포 문서에서 tensor type이 FP16인지, BF16인지, F32인지 봐.
  • 런타임이 해당 정밀도를 빠른 커널로 처리하는지 확인해.
  • 같은 평가셋에서 품질 회귀가 없는지 비교해.
  • softmax나 정규화처럼 민감한 연산을 FP32로 남기는지 확인해.

정리하면 FP16은 “작게 저장하면 무조건 빨라진다”가 아니라, 숫자 형식·하드웨어·연산 모양·평가셋이 같이 맞아야 이득이 나는 선택이야. 그 조건을 확인하지 않으면 메모리는 줄었는데 품질이 흔들리거나, 속도는 거의 그대로인 결과도 충분히 나와.