bfloat16 숫자 형식

정밀도가 감소된 부동 소수점 숫자를 사용하는 것이 정확도를 손실하지 않으면서 수렴 시간을 줄이기 위한 일반적인 방법입니다. TPU는 행렬 연산을 수행할 때 bfloat16 숫자 형식을 사용합니다. 행렬 곱셈 연산은 bfloat16 값으로 수행되고 누적은 IEEE float32 값으로 수행됩니다.

bfloat16은 부호 비트 1개, 지수 비트 8개, 가수 비트 7개로 구성된 머신 러닝을 위한 커스텀 16비트 부동 소수점 형식입니다 다음 다이어그램은 3개의 부동 소수점 형식의 내부 구조인 float32: IEEE 단일 정밀도, float16: IEEE 1/2 정밀도, bfloat16을 보여줍니다.

이미지

bfloat16float32의 다이내믹 레인지는 동일합니다. 그러나 bfloat16은 메모리 공간의 절반을 차지합니다. bfloat16 성능에 대한 자세한 내용은 딥 러닝 학습을 위한 BFLOAT16 연구를 참조하세요.

bfloat16 선택

Google 하드웨어팀은 float32에서의 전환 비용을 최소화하면서 딥 러닝 모델의 학습 기능을 정확하게 유지하고 하드웨어 효율을 높이기 위해 Cloud TPU에 대해 bfloat16을 선택했습니다. 하드웨어 배율의 물리적 크기는 가수 너비의 제곱으로 확장됩니다. 가수 비트가 FP16보다 작으면 bfloat16 배율이 일반적인 FP16 배율의 실리콘 크기의 절반이고, float32 배율보다 8배 작습니다.

신경망은 가수 크기보다 지수 크기에 더 민감합니다. 언더플로, 오버플로, NaN의 동작을 동일하게 보장하기 위해 bfloat16의 지수 크기가 float32와 동일합니다. bfloat16은 이상값을 float32와 다르게 처리하고, 0으로 플러시합니다. 일반적으로 손실 확장과 같은 특수 처리가 필요한 float16과 달리 bfloat16은 심층신경망을 학습 및 실행할 때 float32의 삽입형 대체 기능입니다.

혼합 정밀도 학습

심층신경망 내에서 계산 대부분은 정밀도가 낮은 값을 사용하여 동일한 정확도로 태스크를 수행할 수 있습니다. 일부 모델은 낮은 정밀도 값으로 더 높은 정확도에 도달할 수도 있습니다.

Cloud TPU를 프로그래밍할 때 XLA 컴파일러는 값을 float32 또는 bfloat16으로 자동 변환합니다.

형식 변환 세부정보

float32에서 bfloat16으로의 형식 변환은 XLA 컴파일러에 의해 자동으로 삽입됩니다. TPU에서 변환의 반올림 스키마는 가장 가까운 짝수로 반올림되고 inf로 오버플로됩니다. 또한 Cloud TPU의 bfloat16은 하위 기준을 지원하지 않으므로 변환 중에 모든 하위 정규화가 0으로 플러시됩니다. NaN 및 inf와 같은 특수 값은 변환 시 유지됩니다.

또한 bfloat16에서 float32로의 형식 변환도 XLA 컴파일러에 의해 자동으로 삽입됩니다. float32는 bfloat16의 모든 정확한 값을 나타낼 수 있으므로 변환에서는 가수 비트의 0을 16으로 패딩합니다. 변환 시 특수 값은 유지됩니다.

모델 이동성

TPU 하드웨어에서 이러한 값을 bfloat16으로 자동 변환할 수 있으므로 모델의 매개변수 값과 활성화 값은 32비트 형식으로 저장될 수 있습니다. Cloud TPU에서 학습된 모델에서 얻은 체크포인트는 광범위한 수동 변환 없이 다른 하드웨어 플랫폼(예: 추론 또는 CPU 또는 GPU의 미세 조정)에 배포될 수 있습니다.

bfloat16을 사용하여 성능 향상

TPU에서 자동 형식 변환을 사용하면 숫자 정밀도를 생각하지 않아도 되며 값을 bfloat16으로 명시적으로 cast 변환하여 성능을 더욱 향상시킬 수 있습니다. 값을 bfloat16으로 명시적으로 cast 변환하는 두 가지 이유가 있습니다.

  1. 값을 bfloat16 형식으로 저장하면 온칩 메모리가 절약되어 Cloud TPU가 더 큰 모델을 학습시키거나 더 큰 배치 크기를 사용할 수 있습니다.

  2. 일부 작업은 메모리 대역폭에 제한을 받습니다. 즉, 메모리에서 데이터를 로드하는 데 걸리는 시간에 따라 계산 수행에 걸리는 전체 시간이 느려질 수 있습니다. 이러한 작업의 피연산자 및 출력을 bfloat16 형식으로 저장하면 전송되어야 하는 데이터 양이 줄어들어 전반적으로 속도가 향상됩니다.

시작하려면 Cloud TPU에 대해 최적화된 bfloat16 지원 참조 모델 중 하나를 사용해서 실무 경험을 얻는 것이 좋습니다. 그런 후 성능 가이드 프로파일링 도구 가이드문제 해결 가이드에 따라 자체적으로 머신러닝 모델을 만들고 최적화하는 데 도움이 되는 세부적인 기술 정보를 확인합니다.