https://arxiv.org/abs/1905.12322
A Study of BFLOAT16 for Deep Learning Training
This paper presents the first comprehensive empirical study demonstrating the efficacy of the Brain Floating Point (BFLOAT16) half-precision format for Deep Learning training across image classification, speech recognition, language modeling, generative ne
arxiv.org
딥러닝 연산에 꼭 필요한 부동소수점
일단 논문 내용을 훑기 전에 기본 개념에 대해서 정리할 필요가 있어서 기초적인 내용은 정리하겠습니다.
부동소수점이란?
소수점을 유동적으로 이동시켜서 숫자를 표현하는 방식 작은 수부터 매우 큰 수까지 표현할 수 있는 컴퓨터의 표현 숫자 방식
부동소수점의 기본 개념
컴퓨터는 정수를 쉽게 표현할 수 있지만, 소수점이 포함 된 실수(예를 들어서 : 3.145192000000.....)를 정확하게 표현하는 데 어려움이 있음
- 정수 표현 방식(예: 8비트, 16비트, 32비트)은 소수점이 없고, 값의 범위가 제한 됨
- 그렇지만 실수는 범위가 훨씬 넓어야 하고, 특히 과학적 계산이나 딥러닝의 연산에서는 작은 값과 큰 값이 함께 사용되기에 정수만으로 사용하기에는 한계가 있음.
해결책 → 부동소수점 방식은 가수 + 지수 형태로 숫자를 표현하여, 소수점의 위치를 동적으로 조정할 수 있음.
위 방식은 물리학에서 사용하는 과학적 표기법과 유사함
예 : 10진수 과학적 표기법
- 123,000 → 1.23 x 10⁵
- 0.0000456 → 4.56 × 10⁻⁵
상기 값들을 부동소수점 방식으로 변환하면:
- IEEE 754 표준(32비트) 기준으로 1.23 × 10⁵을 저장하는 방식
- 부호 비트(Sign Bit): 0 (양수)
- 지수(Exponent): ⁵ (보정된 형태로 저장)
- 가수(Mantissa): 1.23
번외, 지수와 가수란?
1. 가수 : 숫자의 중요한 부분 (정확도를 담당)
2. 지수 : 숫자의 크기를 조정하는 부분 (소수점 위치를 담당)
쉽게 비유하자면
- 가수(Mantissa)는 숫자의 "몸통"
- 지수(Exponent)는 숫자의 "크기를 조정하는 방법"
위 2가지를 합쳐서 숫자를 표현하는거라고 생각하면 쉽습니다
가수 + 지수의 원리 (과학적 표기법 예제)
예제 1: 450,000
👉 450,000을 "가수 + 지수" 형태로 바꿔보면?
👉 4.5 × 10⁵
- 여기서 4.5가 가수
- 여기서 10⁵에서 5가 지수
- 이 뜻은 "4.5라는 숫자를 10을 다섯 번 곱해서 키워라!"
예제 2: 0.00032
👉 0.00032를 "가수 + 지수" 형태로 바꿔보면?
👉 3.2 × 10⁻⁴
- 여기서 3.2가 가수
- 여기서 10⁻⁴에서 -4가 지수
- 이 뜻은 "3.2라는 숫자를 10을 네 번 나눠서 작게 만들어라!"
즉, 부동소수점은 숫자를 "가수 × 10^지수" 형태로 저장하는 방식
그렇지만, 컴퓨터에서는 10진수가 아니라 2진수를 씀(진짜 원리)
컴퓨터는 숫자를 10이 아니라 2를 사용해서 표현
즉, "가수 × 2^지수" 형태로 저장합니다.
예제 3: 10진수 5를 부동소수점으로 저장하는 방법 (FP32)
- 10진수 5를 2진수로 변환
- 5 = 101₂ (2진수)
- 과학적 표기법으로 변환
- 1.01 × 2² (지수를 조정해서 소수점이 맨 앞에 오게 만듦)
- 여기서 1.01이 가수
- 여기서 2가 지수
즉, 컴퓨터는 "1.01 × 2²" 이런 형태로 숫자를 저장하는 것!
가수 + 지수가 왜 필요한가?
만약 부동소수점이 없고, 정수만 있다면?
- 0.000000000123 같은 작은 숫자를 표현할 수 없음
- 450,000,000,000 같은 큰 숫자를 표현하려면 엄청나게 큰 메모리 공간이 필요
📌 부동소수점은 숫자의 "몸통(가수)"만 기억하고, "크기(지수)"를 조정해서 큰 수도, 작은 수도 쉽게 저장할 수 있도록 만든 방법
IEEE 754 부동소수점 표준 (FP32, FP16, BFLOAT16 등)
부동소수점의 가장 대표적인 표준은 IEEE 754 표준으로, 컴퓨터에서 널리 사용됩니다.
이 표준은 숫자를 부호, 지수, 가수의 3가지 부분으로 표현합니다.
| 부동소수점 방식 | 총 비트 수 | 부호 비트 | 지수 비트 | 가수 비트 | 표현 가능한 값 범위 |
| FP32 | 32bit | 1bit | 8bit | 23bit | 약 ±3.4 × 10³⁸ |
| FP16 | 16bit | 1bit | 5bit | 10bit | 약 ±6.55 × 10⁴ |
| BFLOAT16 | 16bit | 1bit | 8bit | 7bit | s약 ±3.38 × 10³⁸ |
상기 표를 보며 정리할 내용
FP16과 BFLOAT16 차이점
- FP16: 가수 부분이 10비트로 더 정밀하지만, 지수가 5비트라 표현 가능한 숫자 범위가 작음.
- BFLOAT16: FP32와 동일한 8비트 지수를 유지하여 더 넓은 범위를 표현할 수 있지만, 가수가 7비트라 FP16보다 정밀도가 낮음.
- 즉, BFLOAT16은 FP16보다 연산 속도가 빠르면서도 FP32 수준의 숫자 범위를 유지할 수 있어 딥러닝에 적합함

부동소수점의 장점과 단점
✅ 장점
- 소수점 위치를 유동적으로 조정 가능 → 넓은 숫자 범위 표현 가능
- 작은 숫자(예: 0.0000001)와 큰 숫자(예: 10⁶)를 같은 형식으로 저장 가능
- 딥러닝, 물리 시뮬레이션, 금융 모델링 등 다양한 분야에서 활용
❌ 단점
- 정확도가 제한됨 → 부동소수점 연산에서 오차가 발생할 수 있음.
- 연산 속도가 정수 연산보다 느림 → 딥러닝에서는 FP16/BFLOAT16으로 연산 최적화 필요
Mixed Precision (혼합 정밀도)
혼합 정밀도란? FP32와 FP16 또는 BFLOAT16을 함께 사용하여 연산 성능을 최적화 하는 기술입니다.
즉, 딥러닝 모델을 학습할 때 일부 연산은 높은 정밀도(FP32)로, 다른 연산은 낮은 정밀도 (FP16/BF16)로 수행하여 속도와 메모리 효율성을 높이는 방법
Mixed Precision이 필요할까?
- FP32로만 연산하기엔 메모리 과부하 가능성이 큼
- 학습 속도 저하 등 여러가지로 효율성에 부합하지 않기 때문
FP16/BFLOAT16은 빠르지만, 정밀도가 부족할 수 있음
- 그렇지만 연산속도가 빠른 특징에 비해 정확도가 매우 떨어지는 단점이 있음
- 왜냐? 표현할 수 있는 소수점이 적어질수록 기울기 값이 매우 작아질수록 그 정밀함을 표현해야할 수 있는데 표현하지 못하기에 기울기가 0으로 수렴할 수도 있기 때문에
해결책 : Mixed Precision 사용 ✅
- 중요한 연산(예: 가중치 업데이트)은 FP32로 유지하여 정확성을 보장.
- 덜 중요한 연산(예: 행렬 곱셈, 활성화 함수 등)은 FP16/BF16을 사용하여 속도를 높이고 메모리를 절약.
Mixed Precision을 적용하는 방법
(1) PyTorch에서 AMP (Automatic Mixed Precision) 적용
import torch
scaler = torch.cuda.amp.GradScaler() # Loss Scaling 적용
for data, target in dataloader:
optimizer.zero_grad()
with torch.cuda.amp.autocast(): # FP16 자동 적용
output = model(data)
loss = loss_fn(output, target)
scaler.scale(loss).backward() # Loss Scaling 적용된 역전파
scaler.step(optimizer)
scaler.update()
(2) TensorFlow에서 Mixed Precision 적용
import tensorflow as tf
# 자동 혼합 정밀도 활성화
policy = tf.keras.mixed_precision.Policy('mixed_float16')
tf.keras.mixed_precision.set_global_policy(policy)
# 모델 생성
model = tf.keras.Sequential([...])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
LoRA시 추론전략
보통 Mixed Precision은 풀 파인튜닝 기준으로 활용한다고 하기에 더욱 더 자세하게 정리하자면,
- 훈련(Training): 보통 FP32로 진행하여 안정적인 기울기(Gradient) 계산을 보장.
- 추론(Inference): 연산 속도를 높이고 메모리 사용량을 줄이기 위해 FP16 또는 BFLOAT16 사용.
그렇다면 최근에는 LoRA기법을 통해 부분학습을 하는데, 그럴 땐 어떤 방식으로 훈련 및 인퍼런스를 할까?
| 학습 방식 | 학습 사용시 정밀도 | 추론시 정밀도 |
| Full-Fine-tuned | FP32(or Mixed Precision) | FP16 (or BFLOAT16) |
| LoRA / Q-LoRA | FP16, BFLOAT16, INT8, 4-bit | INT8, 4-bit |
| 양자화 후 학습(QAT, Quantization-Aware Training | FP16, INT8 | INT8, 4-bit |
결론: LoRA에서는 FP16/BF16이 표준!
- LoRA는 원래 FP16/BF16을 활용하여 메모리 사용을 줄이고 연산 효율성을 높이는 방식.
- FP16은 속도는 빠르지만 표현 범위가 좁고, BF16은 더 넓은 표현 범위를 가져 학습 안정성이 높음.
- NVIDIA A100, H100 같은 최신 GPU는 BF16 연산을 최적화했기 때문에 BF16이 점점 더 많이 쓰이는 추세!
이번 논문은 대략적인 요약 내용만 정리해서 훑어놓겠습니다.
📌 논문 요약 ("A Study of BFLOAT16 for Deep Learning Training")
1. 키워드
- BFLOAT16, Mixed Precision, Deep Learning, FP32, FP16, TensorFlow, Caffe2, IntelCaffe, Quantization
2. 논문의 주제
- 이 논문은 BFLOAT16이 딥러닝 훈련에서 FP32(32비트 부동소수점)과 동일한 성능을 제공하면서도 더 효율적인지를 실험적으로 분석하는 연구임.
- 특히, 이미지 분류, 음성 인식, 자연어 처리, 생성 모델, 추천 시스템 등 다양한 분야에서 BFLOAT16의 성능을 검증함.
3. 연구 목적 및 필요성
💡 왜 이 연구가 필요한가?
- 딥러닝 훈련에서 FP32는 너무 많은 메모리를 사용하고 연산이 느림.
- FP16은 표현 범위가 좁아(지수 비트 부족) 학습 안정성이 떨어지는 문제가 있음.
- BFLOAT16은 FP32와 동일한 지수 비트(8비트)를 가지면서도, 연산 속도와 메모리 절약 효과가 FP16과 유사하여 딥러닝에 적합할 가능성이 있음.
- 따라서, BFLOAT16이 딥러닝에서 FP32를 대체할 수 있는지 실험적으로 검증하는 것이 연구의 핵심 목표.
4. 사용된 이론 및 개념
💡 이 논문이 다루는 주요 개념
- BFLOAT16 (Brain Floating Point 16-bit)
- FP32와 동일한 **지수(Exponent) 비트(8비트)**를 유지하여 넓은 표현 범위를 가짐.
- 가수(Mantissa)는 7비트로 줄어 FP16보다 정밀도는 낮지만, 연산 속도가 빠름.
- Mixed Precision Training
- FP32와 FP16/BF16을 조합하여 속도와 정확도를 최적화하는 학습 방법.
- Loss Scaling
- FP16/BF16을 사용할 때 작은 기울기가 0이 되는 문제(Underflow)를 해결하기 위한 기법.
- Quantization (양자화)
- 모델의 연산을 효율적으로 만들기 위해 가중치 및 활성화 값을 FP16/BF16으로 변환하는 기법.
5. 연구 방법론 (사용된 모델, 분석 방법)
💡 어떤 모델과 방법을 사용했는가?
- 여러 딥러닝 모델을 FP32 vs. BFLOAT16으로 학습하고 성능을 비교함.
- 사용된 모델들
- 이미지 분류: AlexNet, ResNet-50
- 음성 인식: DeepSpeech2
- 자연어 처리 (NLP): GNMT (Google Neural Machine Translation)
- 생성 모델: DC-GAN, SR-GAN
- 추천 시스템: Deep & Cross Network, DNN Recommendation System
- 실험 환경
- TensorFlow, Caffe2, IntelCaffe에서 BFLOAT16 연산을 에뮬레이션하여 실험 진행
- Quantlib 라이브러리를 사용하여 FP32 → BFLOAT16 변환
📌 비교 대상
- BFLOAT16 vs. FP32 (학습 속도, 정확도 비교)
- FP16 vs. BFLOAT16 (표현 범위 차이)
6. 실험 결과
💡 BFLOAT16은 실제로 FP32를 대체할 수 있는가?
✅ 1) 이미지 분류 (CNN - AlexNet, ResNet-50)
- FP32와 동일한 정확도 달성 (AlexNet: 57.2%, ResNet-50: 74.7%)
- 학습 속도는 FP32 대비 2배 이상 빠름
✅ 2) 음성 인식 (DeepSpeech2) 및 기계 번역 (GNMT)
- BLEU Score (번역 정확도) 비교 결과 BFLOAT16이 FP32와 동등한 성능
- 학습 안정성도 유지됨
✅ 3) 생성 모델 (DC-GAN, SR-GAN)
- 이미지 품질 평가(Inception Score, SSIM)에서도 BFLOAT16과 FP32 차이가 거의 없음
- GAN 학습에서도 안정적인 성능 유지
✅ 4) 추천 시스템 (Deep & Cross Network, DNN Recommendation System)
- Log Loss 비교 결과 BFLOAT16과 FP32가 거의 동일
📌 결론적으로, BFLOAT16을 사용해도 FP32와 동일한 성능을 유지하면서 속도와 메모리 효율성이 개선됨
7. 결론 및 시사점
✅ BFLOAT16은 FP32를 대체할 수 있다!
- FP32와 동등한 성능을 제공하면서도 속도가 빠르고, 메모리 사용량이 절반으로 줄어듦.
- 특히, FP16보다 안정적인 학습이 가능하여 FP16을 대체할 가능성이 높음.
- 따라서, 딥러닝 훈련에서 FP32 대신 BFLOAT16을 사용하면 학습 효율성이 크게 향상될 것.
8. 한계점 및 향후 연구 방향
❌ 한계점
- 현재 실험은 에뮬레이션 환경에서 진행되었으며, 실제 BFLOAT16 하드웨어(A100, H100)에서 추가 검증 필요.
- 특정 네트워크(예: Transformer 계열)에서 추가 실험 필요.
🔍 향후 연구 방향
- BFLOAT16을 활용한 대형 모델 학습(GPT-3, LLaMA 등) 연구
- 양자화(Quantization)와 결합하여 더욱 메모리 효율적인 학습 기법 연구