딥러닝, 논문 리뷰

[딥러닝] A Study of BFLOAT16 for Deep Learning Training - 부동소수점

cheorish 2025. 2. 26. 14:14

 

 

 

 

 

 

 

 

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)

  1. 10진수 5를 2진수로 변환
    • 5 = 101₂ (2진수)
  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으로 학습하고 성능을 비교함.
  • 사용된 모델들
    1. 이미지 분류: AlexNet, ResNet-50
    2. 음성 인식: DeepSpeech2
    3. 자연어 처리 (NLP): GNMT (Google Neural Machine Translation)
    4. 생성 모델: DC-GAN, SR-GAN
    5. 추천 시스템: 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)와 결합하여 더욱 메모리 효율적인 학습 기법 연구