はじめに
bfloat16は、いろいろソフトが出てきているので、まとめてみる。
Bfloat16の適用範囲について
Bfloat16では、学習ができるとの現象論的論文が出ている。すでに、ResNet以外にGAN等複雑な計算を行って、そん色ない結果を出している。
また、Ising modelのモンテカルロでもFP32と比べてそん色ない結果が出ている。
使い方
TensorFlow
tf.cast
コードの例がある。
PyTorch
TPUを使った場合、bfloat16を使える。サンプルコードもある。
AWS inf1
コンパイラで、FP32からBF16に自動変換する。推論だけだから?
フレームワーク等での対処
深層学習ソフトでの数値変換
FP32からBFloat16に変換する際、丸め誤差およびNaNに対する処理が必要との知見が、Googleがメインに開発しているTensorFlowの実装が出ておりそこで説明されている。もともとは、こちらの記事にあったが、ちょっと整理してみた。
まず、NaNの値は、例外を発生しないquiet NaNに変更している。
次に、丸め誤差は、若干複雑なので、表にして示す。
符号 | 指数(8ビット) | 仮数(23ビット) | |||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
S | E | E | E | E | E | E | E | E | F | F | F | F | F | F | L | R | T | T | T | T | T | T | T | T | T | T | T | T | T | T | T |
ここで、FとLの7ビットは、bfloat16の仮数である。そして、Lは最下位のビットである。次に、Rは、丸めるビットである。Tは、それ以下のビットである。ここで、RとTのビットの値によって、Lのビットの繰上か繰下を決める。
L | R | T | 繰上繰下 |
---|---|---|---|
0 | 0 | - | 繰下 |
1 | 0 | - | 繰下 |
0 | 1 | 全て0 | 繰下 |
1 | 1 | - | 繰上 |
0 | 1 | 1がある | 繰上 |
ソフトの実装状況
ツールは、未成熟であり2020年1月現在サポートされつつあるといった感じである。以下にサポートされているソフトを示す。
参考文献
一般
使えている例
- A Study of BFLOAT16 for Deep Learning Training(2019/05)
- Leveraging the bfloat16 Artificial Intelligence Datatype For Higher-Precision Computations(2019/04)
- (ACM SC19)High Performance Monte Carlo Simulation of Ising Model on TPU Clusters(2019/03)
ソフト側対応
一般
深層学習フレームワーク
-
(TensorFlow) Converts a float point to bfloat16, with round-nearest-to-even as rounding method.
-
[XLA][BF16] Add bf16 rounding function.
- 2018年3月に丸めの処理が追加されている。
-
[XLA][BF16] Add bf16 rounding function.
-
(PyTorch)Enable log_softmax and CrossEntropyLoss for bfloat16 (#24457)
- PyTorch 1.3.0からbfloat16によるクロスエントロピー対応が入った。その際丸めも考慮した。コード自体は、2019年4月だが、マージは2019年9月
- (tvm)incubator-tvm/3rdparty/bfloat16/bfloat16.cc TensorFlowのbfloat16.ccが取り込まれている
数値演算ライブラリ
- (Intel oneDNN)Bfloat16 Training
- pytorch/FBGEMM FP32/BF16変換のパッチ等が取り込まれつつある。
ツール
-
Clang 9.0(2019/09) LLVM 9.0(2019/09)
- GCC10からBFLOAT16はサポート(2020年5月ごろ?)
-
(binutils)Add assembler and disassembler support Intel AVX512 BF16:
- x86: Support Intel AVX512 BF16 binutils 2.33.1(2019/10)より
- QEMU version 4.2.0 released(2019/12)
- (Julia)JuliaComputing/BFloat16s.jl
CPU/GPU
Amazon(GPU)(提供済)
AMD(GPU)
ARM(CPU)
- Bfloat16 Processing for Neural Networks(IEEE Xplore: 21 October 2019)
- BFloat16 processing for Neural Networks on Armv8-A(blog)
Google(TPUv2/v3)(提供済み)
- BFloat16: The secret to high performance on Cloud TPUs
- Livestream Day 1: Stage 8 (Google I/O '18)
- (NIPS18)Image Classification at Supercomputer Scale(2018/11) 畳み込み演算はbfloat16を使っている。
- 以下の時点ではBFloat16は、出ていない。評価中だったと思われる。
Intel(CPU/GPU)
- bfloat16 - Hardware Numerics Definition
- Lower Numerical Precision Deep Learning Inference and Training
- GPU側は、Intel oneDNNのコードで見かける。
NVIDIA(GPU)
- Enabled bfloat16 for cuda #27259 パッチ自体はFacebookが出したもの
その他
- 特殊値 IEEE 754が引用できないので仮に引用
- (SIAM)Low Precision Floating-Point Formats: The Wild West of Computer Arithmetic(2019/11)