본문 바로가기
기술 이야기

Mixed Precision - BF16의 특징과 장단점

by 넌 꿈이 뭐야? 2023. 5. 23.

안녕하세요, 오늘은 딥러닝에서 최근 활용되고 있는 BF16(bfloat16, Brain floating point)에 대해서 설명하도록 하겠습니다. 그리고 언제 뭘 쓰면 좋을지 비교해보고 PyTorch에서는 이걸 어떻게 쓰면 되는지 간단하게 소개하겠습니다.

BF16이란?

이미 Mixed Precision을 아시는 분들 (굳이 몰라도 컴퓨터 과학을 배웠다면 모두가 아실)은 FP16에 대해 알고 계실 것 같습니다. FP16은 기존 32-bit로 표현하던 숫자들을 16-bit로 변환해서 데이터의 사이즈를 줄이는 방법입니다. 해당 내용은 포스팅1 또는 포스팅2 (둘 다 제가 쓴 글입니다)에 잘 설명되어 있으니 참고하시면 되겠습니다.

 

성공적으로 잘 줄였는데 또 뭐가 필요할까요? 문제는 역시 줄어든 bit수 만큼 수의 범위가 줄어들었다는 것입니다. 그래서 제안된 것이 BF16입니다.

아래는 FP16, FP32, 그리고 BF16을 표현한 그림입니다 (출처: 위키피디아)

위에서부터 순서대로 FP16, FP32, BF16

BF16은 자릿수를 대표하는 지수항(exponent)에 할당한 bit가 FP32와 동일한 8개입니다. 따라서 더 넓은 범위의 수를 표현할 수 있습니다. 대신 수의 정밀도는 떨어지겠죠.

정리하자면

  • 수의 표현 범위를 FP32와 동등한 수준으로 만듦 (최대값: 65536 → 약 \(2^{128}\))
  • 수의 표현 정밀도가 떨어짐

BF16의 장단점

물론 수의 범위를 넓혔다는 장점이 있지만 결국 같은 bit수를 가지고 장난을 쳤기 때문에 단점 또한 존재합니다.

  • 장점
    • 넓은 수의 표현 범위
  • 단점
    • 표현 정밀도가 떨어지기 때문에 예를 들어 0에 가까운 수가 모조리 0으로 표현될 수 있음
      (이 단점은 단지 숫자가 0이 되는 것보다도 계산을 하다보면 어떤 수를 0으로 나누는 상황이 생길 가능성을 높여서 문제입니다)

BF16 vs FP16 활용 상황

결국은 장단점을 잘 고려해서 사용해야 한다는 결론에 도달합니다... 그럼 어떤 상황에서 뭘 쓰면 좋을까요? 제 생각을 말해보면

  • Normalize를 하지 않는 경우가 많다면 BF16이 좋다고 생각합니다
    • 왜냐하면 Normalize를 하지 않을 때 상대적으로 수의 절댓값이 커지기 때문에 수의 표현 범위를 넓히는 게 에러를 줄이기 좋은 것 같습니다
  • Layer의 파라미터가 많을 수록 BF16이 좋다고 생각합니다
    • nn.Linear(10, 10)보다 nn.Linear(10000, 10000)에서 한 번에 많은 수를 곱하고 더하기 때문에 수의 절댓값이 커질 가능성이 높습니다. 따라서 nn.Linear(1000000, 1000000) 뭐 이런 연산이 들어가면 FP16이 더 좋습니다
    • 그런 이유에서 Convolution을 쓰는 경우에는 FP16이 더 좋은 것 같습니다

FP16 vs BF16 - 언제 쓰면 좋을까?

요즘 Transformer 기반의 모델이 대부분이라 BF16도 좋은 선택이 될 것 같습니다. 아무쪼록 선택해서 잘 쓰시면 되겠습니다

BF16 in PyTorch

그럼 이걸 PyTorch에서는 어떻게 쓰면 될까요? 아주 간단합니다.

PyTorch Docs를 보면 각 데이터 형식 소개란에 Bfloat16이 나와 있으며, torch.Tensor.bfloat16에 .to(torch.bfloat16) 이라고 소개되어 있습니다.

>>> a = torch.Tensor(1) # tensor([9.1837e-41])
>>> a.dtype # torch.float32

>>> b = a.to(torch.bfloat16)
>>> b # tensor([9.1835e-41], dtype=torch.bfloat16)

모델도 똑같이 쓰시면 됩니다.

반응형

댓글