bfloat16으로 모델 성능 개선

기본적으로 TPU는 bfloat16 값을 사용해서 행렬 곱셈 연산을 수행하고 IEEE float32 값을 사용해서 합산합니다. 정밀도가 감소된 부동 소수점 숫자를 사용하면 정확도를 손실하지 않으면서 수렴 시간을 줄일 수 있습니다.

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

bfloat16 명시적으로 사용

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

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

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

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

형식 변환 세부정보

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

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

Cloud TPU에서 학습된 모델에서 얻은 체크포인트는 광범위한 수동 변환 없이 다른 하드웨어 플랫폼(예: 추론 또는 CPU 또는 GPU의 미세 조정)에 배포될 수 있습니다.