用語集 · コンピューティング
bfloat16
別名:bfloat16、bf16、brain floating point、mixed precision、AMX、autocast、混合精度、ブレインフロート
通常の32ビットの数と同じ範囲を表せる一方、有効数字は約3桁しかない16ビットの数値形式です。そのぶん計算がずっと速くなります。
コンピューターは実数を、符号、指数(大きさ)、仮数(有効数字)の組で保存します(浮動小数点を参照)。通常の32ビット形式は指数に8ビット、仮数に23ビットを使い、有効数字は約7桁です。
bfloat16(「brain float」、Google Brain 由来)は同じ8ビットの指数を保ちつつ、仮数は7ビットしかありません。有効数字は約3桁です。
指数が同じなので、bfloat16 は32ビットの浮動小数点数が表せる数なら、ごく小さな数から巨大な数まで何でも保持できます。ただ精度が落ちるだけです。これはニューラルネットワークにとって重要です。重みや信号は広い範囲にわたりますが、数桁を超える精度が必要になることはまれなので、ネットワークの大きな行列積を bfloat16 で行っても学習への影響はわずかです。ビット数が半分ならメモリの転送量も半分になり、専用ユニットを持つプロセッサー(NVIDIA の Tensor コア、Intel の AMX、AMD の AVX-512 BF16 命令)は1秒あたり数倍の掛け算をこなします。
よくある使い方は混合精度です。行列積は bfloat16 で行い、重み、損失の合計、更新は丸め誤差が積み重なる32ビットのまま保ちます。
このプロジェクトでは
2人のファイターと視覚では、96 vCPU の EC2 マシン上の学習器がネットワークの計算を bfloat16 で行いました(--bf16 オプション。損失は32ビットのまま)。AMD EPYC の12スレッドで、更新だけで 0.88 s かかっていたのが 0.48 s になり、学習の1イテレーションは 1.74 s から 1.43 s になりました。数値がわずかに変わるうえ、この方法で学習した方策が同じようによく学ぶかはまだ確認できていないため、記事ではこれを別の、印をつけたオプションとして報告しています。