bfloat16 を使用してモデルのパフォーマンスを向上させる

デフォルトでは、TPU は bfloat16 値で行列乗算演算を実行し、IEEE float32 値で累積を実行します。精度を落とした浮動小数点数を使用すると、精度を失わずに収束までの時間を短縮できます。

bfloat16float32 のダイナミック レンジは同等です。ただし、bfloat16 はメモリ容量の半分を使用します。bfloat16 のパフォーマンスの詳細については、ディープ ラーニング トレーニングのための BFLOAT16 の研究をご覧ください。

bfloat16 を明示的に使用する

TPU での自動形式変換により、数値の精度について考慮する必要がなくなりますが、値を明示的に bfloat16 にキャストすることで、パフォーマンスを向上させることができます。値が明示的に bfloat16 にキャストされる理由は 2 つあります。

  1. 値を bfloat16 形式で格納するとオンチップ メモリを節約できるため、Cloud TPU でより大きなモデルのトレーニングや、より大きなバッチサイズの使用が可能になります。

  2. 一部の演算にはメモリ帯域幅の制限があります。つまり、メモリからデータを読み込むのにかかる時間が、計算の実行に費やす全体的な速度を低下させる可能性があります。これらの演算のオペランドと出力を bfloat16 形式で格納すると、転送する必要があるデータ量が減るため、全体的な速度が向上します。

開始するには、Cloud TPU リファレンス モデルのいずれかについて経験を積むことをおすすめします。その後、プロファイリング ツールのガイドトラブルシューティング ガイドに記載された詳細な技術情報を使用して、機械学習モデルを独自に作成し、最適化することができます。

形式変換の詳細

float32 から bfloat16 への形式変換は、XLA コンパイラによって自動的に挿入されます。TPU で変換する場合の丸めスキームは、最も近い偶数に丸めてinf にオーバーフローすることです。また、Cloud TPU の bfloat16 は非正規化をサポートしていないため、変換中にすべての非正規化がゼロにフラッシュされます。NaNinf などの特殊な値は変換で保持されます。

bfloat16 から float32 への形式変換も、XLA コンパイラによって自動的に挿入されます。float32bfloat16 のすべての値を正確に表すことができるため、変換すると、仮数ビットに 16 のゼロがパディングされます。変換では特殊な値が保持されます。

Cloud TPU でトレーニングされたモデルから取得したチェックポイントは、大規模な手動変換なしで、他のハードウェア プラットフォームにデプロイできます(CPU や GPU での推論や微調整など)。