fp4の話(4ビット浮動小数点数)

うちではまだ手に入れられてませんが、GeForce RTX5090が発売されました。

GeForce RTX 5090 グラフィックスカード | NVIDIA

まぁ、個人で買うのもPCのパーツと呼ぶのもそろそろ違和感があるスケールになってます。RTX4090でもコスト・重量・消費電力と実機見て正直笑いました。

 

上記リンク先にもある通り結構なモンスタースペックで、レイトレーシングで318TFLOPS、AIで3352AI TOPSとなっています。普通の浮動小数点数では単精度で105TFLOPSと言われています。

TOPSと言う単位はTFLOPSからFLが抜けていますので浮動小数点演算ではないというか最近の低精度化の問題ですね。INT4(4ビット整数)の場合が多いようですが、NVIDIAはfp4を採用しているというのが本題です。

Microsoftが言うCopilot+対応では40TOPSが基準と言われていますがこちらはINT4らしいです。

 

少し昔話をしますと卓上電子計算機(いわゆる電卓)が出た頃4ビットの計算機でした。私が最初に触ったPCがMSXなので8ビットの計算機になります。整数演算がメインで小数点数を扱うのは大変でした。世の中は今64ビットの計算機が主流で数値は64ビットの浮動小数点数が主流と言っていいでしょう。

倍精度浮動小数点数 - Wikipedia

符号部1ビット、指数部が11ビット、仮数部が52ビットのIEEE754で規定された形式である。

IEEE 754 - Wikipedia

 

で、fp4が4ビット浮動小数点数です。

4ビットですから符号部1ビット、指数部が2ビット、仮数部が1ビットとかいうことになります。E2M1と表現します。(fp8ならE4M3とE5M2の実装があるようです。)

 

こういった表現に詳細な説明がありました。こちらは指数部が2ビット、仮数部が2ビットです。負の数が扱えていない、0を表現していないなどの問題点がありますが基本が分かりやすく説明されています。

4 ビット Float を自作したら、浮動小数点数の精度を理解できた #コンピューターサイエンス - Qiita

 

じゃ、E2M1はどうなるのか公式非公式の資料に当たってみました。

https://www.opencompute.org/documents/ocp-microscaling-formats-mx-v1-0-spec-final-pdf

Understanding Floating-Point Numbers

How do Nvidia Blackwell GPUs train AI models with 4-bit math?

[2310.16836] LLM-FP4: 4-Bit Floating-Point Quantized Transformers

幾つかは公式発表と異なる部分もあります。

NVIDIAによるとNaNやInfの表現はできないそうなので一番上のOCPの実装が近い気がします。符号部を除く3ビットで以下のようなものでしょう。

[0.0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0]

INT4(signed)と比べてみましょう。

[0, 1, 2, 3, 4, 5, 6, 7]

5と7が消えて0.5と1.5が入ったわけですね。0付近での表現精度が上がっています。

実際は公開されていないようですが、AI特化ということでINTの使われ方と同様に0~1に正規化されているかもしれませんし、単に2分の1か4分の1されているだけかもしれません。

この辺り加算器は変更ないですからオプションとなっている可能性もありますね。

 

加算器・乗算器についても16種同士の掛け合わせなので全部で256通りしかないので実装も演算と言うレベルでもないかもしれません。

少なくともNVIDIAは4ビットではFLOPS表記しなかったということです。

64ビットで連続数気分だった人でもさすがに恐ろしい低精度です。実際に実機で早く遊んでみたいものですね。