この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 3298|答える: 0

倍精度(FP64)、単精度(P32、TF32)、半精度(FP16、BF16)

[リンクをコピー]
2025年3月10日 14:22:34に投稿 | | | |
大規模モデルの訓練や推論にはしばしば精度の概念が含まれており、種類は多様で、同じ精度レベルで異なるフォーマットに分けられています。 さらに、実用的な状況では多精度および混合精度の概念もあります。

共通精度

浮動小数点精度:倍精度(FP64)、単精度(FP32、TF32)、半精度(FP16、BF16)、8ビット精度(FP8)、4ビット精度(FP4、NF4)
定量精度:INT8、INT4(INT3/INT5/INT6とも呼ばれる)

浮動小数点数は、符号ビット、指数ビット、マンティッサビットの3つの部分から成ります。 指数ビットが大きいほど、表現可能な数値の範囲も広がります。 仮数が大きいほど、数字の精度は高くなります。



表は次のようにまとめています

形式シンボルビット指数ビット総桁数
FP641115264
FP32182332
TF32181019
BF1618716
FP16151016
FP8 E4M31438
FP8 E5M21528
FP41214


FP32:32ビット浮動小数点数、1データあたり4バイト
TF32:19ビットの浮動小数点数で、各データは2バイトです
FP16:16ビット浮動小数点数、1データあたり2バイト
BF16:16ビット浮動小数点数で、各データは2バイトです。
int8:8ビット整数で、各データは1バイト分を扱います
int4:4ビット整数、各データが0.5バイト

なぜそんなに精密なのか

コストと精度の問題です。 高精度は確実に正確ですが、計算コストやストレージコストも高くなります。 精度が低いと計算精度は低下しますが、計算効率と性能の向上は可能です。 そのため、さまざまな精度で状況に応じて最適なものを選ぶことができます。
倍精度は単精度式よりも正確ですが、容量が2倍になり、計算に時間がかかります。

なぜ大規模モデルは定量化される必要があるのでしょうか?

1. メモリ使用量の削減
大型モデルでは、重みやアクティベーション値を表現するために、通常32ビット浮動小数点数(FP32)または16ビット浮動小数点数(FP16)を使用します。 量子化により、これらの高精度値を低精度の表現(例:8ビット整数、INT8)に変換でき、モデルの記憶容量を大幅に削減できます。 これは、モバイルデバイスや組み込みシステムなど、リソース制約のあるデバイスへの展開において重要です。

2. 推論速度を加速させる
量子化されたモデルはハードウェア上でより効率的に動作します。 多くの現代のハードウェア(GPU、TPU、NPUなど)は、低精度計算のための特殊な最適化サポートを備えており、より高速な量子化演算を可能にします。 さらに、低精度計算はビット演算が少なく、計算の複雑さを減らし推論を高速化します。

3. 消費電力の削減
量子化モデルは計算資源の必要性を減らすだけでなく、消費電力も削減します。 これは特にスマートフォンやIoTデバイスなどのバッテリー駆動デバイスで重要であり、消費電力が少ないためバッテリー寿命が長くなります。

4. 簡単に展開できるエッジデバイス
多くの大規模モデルは当初クラウド上で訓練・展開されていましたが、エッジコンピューティングの発展に伴い、ますます多くのアプリケーションシナリオでエッジデバイスへのモデル展開が必要とされています。 エッジデバイスの計算能力やストレージ資源が限られているため、量子化はこれらのモデルをより効率的にエッジデバイス上で動作させるのに役立ちます。

5. 帯域幅要件の削減
分散推論やモデル更新の過程で、量子化はモデル転送に必要な帯域幅を削減できます。 これは、遠隔地のIoTデバイスなど、ネットワーク帯域幅が限られている環境で有用です。

6. モデルのパフォーマンスを維持する
量子化は精度の低下を伴いますが、モデルの元々の性能は、混合精度量子化、訓練後の量子化、定量的知覚訓練などの適切な量子化手法によって大部分維持可能です。 したがって、実用的には性能と効率のバランスを取ることが可能となります。

メモリ参照

種類10億のパラメータごとにメモリを占有する必要があります
float324G
FP16/BF162G
int81G
int40.5G


FP64(ダブルプレシジョン)

64ビット浮動小数点は、通常IEEE 754で定義された二重精度の二進関数形式で、以下の通りです。

1桁記号
11桁インデックス
小数点以下52位



範囲:~2.23e-308 ... ~1.80e308 で、15-17の十進精度で十分。

使い:

この形式は高精度が求められる科学的計算に使用されます。
通常はディープラーニング計算には使われていません。
ソフトウェアサポート:
ほとんどのC/C++システムにおけるダブル型を表します。
TensorFlow(例:tf.float64)やPyTorch(例:torch.float64またはtorch.double)でサポートされています。
ハードウェアサポート:
通常はx86 CPUでサポートされています。
ほとんどのGPU、特にゲーミング用GPU、特にRTXシリーズはFP64性能に大きく制限されています(通常はFP32の1/32性能で、1/2にとどまります)。
最近の制限のないFP64対応GPUには、Tesla P40/P4およびQuadro GP100のGP100/100/102/104、Tesla V100/Quadro GV100/Titan VのGV100、そして最近発表されたA100のGA100(興味深いことに新しいAmpereアーキテクチャは第3世代)があり、FP64対応のTensor Coresと比較されます 新たにIEEE準拠のFP64処理が搭載され、V100のFP64性能の2.5倍を実現します。

FP32(フルアキュレート)

このフォーマットは長らくディープラーニングの主力となってきました。 別のIEEE 754フォーマットである単精度浮動小数点は以下の通りです:

1桁記号
8桁インデックス
小数点以下23位
理想的には、訓練と推論の両方がFP32で行われるべきですが、FP32はFP16/BF16の2倍の速度が遅いため、実際には混合精度法がよく用いられます。FP32の重みを正確な「マスターウェイト」として、FP16/BF16の重みを前進・後方伝播計算に用いて訓練速度を向上させ、最後にFP32のソブリン重みは勾配更新フェーズでFP16/BF16勾配で更新されます。

トレーニング中、主権重量は常にFP32です。 実際には、半精度の重みは推論時にFP32とほぼ同等の精度を提供することが多いです。なぜなら、正確なFP32重みはモデル勾配が更新される場合にのみ必要だからです。 つまり、推論時に半精度の重みを使えば、GPUメモリの半分だけで同じ結果が得られます。



射程:~1.18e-38 ... ~3.40e38、精度は6〜9の有効小数点。

使い:

長い間、標準的なニューラルネットワークコンピューティングのタイプです。 ニューラルネットワークにおける重み、活性化、その他の値は長い間FP32にデフォルトで定着しています。
多くの科学的計算、特に反復計算では精度が不足し、誤差が蓄積します。
ソフトウェアサポート:
ほとんどのC/C++システムにおけるfloat型を表します。
TensorFlow(例:tf.float32)やPyTorch(例:torch.float32またはtorch.float)でサポートされています。
ハードウェアサポート:
通常はx86 CPUでサポートされています。
通常はNVIDIA/AMDのGPUでサポートされています。

FP16(半精度)

同様に、IEEE 754標準フォーマットである半精度浮動小数点フォーマットは以下の通りです:

1桁記号
5桁のインデックス
小数点以下10位
FP16の数値はFP32よりもはるかに短い数値範囲を持っています。 したがって、FP16は非常に大きな数を表す場合にオーバーフロー、非常に小さい数を表す場合にはアンダーフローのリスクがあります。 例えば、10k × 10kの場合、最終結果は100Mであるべきですが、FP16はFP16が表せる最大数が64kであるため、FP16はこれを表現できません。 そのため、ニューラルネットワークの計算ではNaN(数値ではありません)が使われます。計算は層状かつバッチ順に行われるため、NaNが現れるとそれまでの計算はすべて消去されます。 一般的には損失スケーリングでこれを緩和できますが、この方法は必ずしも効果があるわけではありません。



範囲:~5.96e−8(6.10e−5)... 65504、4桁の有効小数の精度で。

使い:

ディープラーニングはFP32よりもFP16を使う傾向があります。なぜなら、ニューラルネットワークでは精度の低い計算があまり重要でないからです。 高精度は何の効果もなく、同時に遅くなり、メモリを多く消費し通信も遅くなります。
通常は混合精密トレーニング(TensorFlow/PyTorch)を用いてトレーニングに使用できます。
推論を高速化するためのトレーニング後の量子化に使用できます(TensorFlow Lite)。 トレーニング後量子化に使われる他の形式には、INT8(8ビット整数)、INT4(4ビット)、さらにはINT1(2進数)などがあります。
ソフトウェアサポート:
現在C/C++標準には含まれていません(ただしショートフロート提案があります)。 一部のC/C++システムは__fp16型をサポートしています。 それ以外は、特別なライブラリと組み合わせて使用可能です。
TensorFlow(例:tf.float16)やPyTorch(例:torch.float16またはtorch.half)でサポートされています。
ハードウェアサポート:
x86 CPUは(ユニークなタイプとして)サポートされていません。
古いゲーミングGPUのサポートは低く(FP64は32/1の性能、詳細はGPUの投稿を参照)、 現在、NVIDIA RTXシリーズなどの最新のGPUで十分にサポートされています。

BFLOAT16(ハーフプレシジョン)

Googleが最初に開発したもう一つの16ビットフォーマットは「Brain Floating Point Format」(略して「bfloat16」)と呼ばれています。 名前はGoogle Brainに由来します。

元のIEEE FP16はディープラーニング用途を想定して設計されておらず、ダイナミックレンジが狭すぎました。 BFLOAT16はこの問題を解決し、FP32と同じダイナミックレンジを提供します。

したがって、BFLOAT16は次のようになります:

1桁記号
8桁インデックス
小数点以下7位



bfloat16形式はIEEE 754 FP32に短縮されており、IEEE 754 FP32との高速変換が可能です。 bfloat16形式に変換すると、指数関数的なビットは保持されますが、マンチッサフィールドは切断によって削減できます。



範囲:~1.18e-38 ... ~3.40e38、3桁の有効小数点。
使い:

今ではFP16に代わるもののようです。 FP16はしばしば損失スケーリングなどの特殊な処理を必要としますが、BF16はディープニューラルネットワークの訓練や実行においてほぼ直接的にFP32の代替となります。
ソフトウェアサポート:
C/C++標準には含まれていません。 特別なライブラリと組み合わせて使えます。
TensorFlow(例:tf.bfloat16)/PyTorch(例:torch.bfloat16)でサポートされています。

TF32

TensorFloat-32、またはTF32は、NVIDIA A100 GPUの新しい数学モードです。

半精度(FP16)演算と同じ10ビット尾数を用いることで、TF32はAIワークロードの精度要件を満たす十分な余裕があることが証明されています。 またTF32はFP32と同じ8ビットインデックスを使用しているため、同じ数値範囲をサポートできます。

技術的には19ビットフォーマットです。 「BFLOAT19」のような拡張精度BFLOAT16や、FP32のような精度低下型と考えてください。

つまり、TF32には以下のようなものがあります:

1桁記号
8桁インデックス
小数点以下10位
TF32の利点は、FP32と同じフォーマットであることです。 TF32で内積を計算する際、入力オペランドの仮数は23ビットから10ビットに丸められます。 丸子オペランドは正確に乗算され、通常のFP32で累積されます。

TF32テンソルコアはFP32入力で動作し、コード変更なしでFP32で結果を生成します。 非マトリックス操作は引き続きFP32を使用しています。 これにより、深層学習フレームワークやHPCにおいてFP32の入出力データを高速化する簡単な方法が提供されます。

範囲:~1.18e-38 ... ~3.40e38、精度は4桁の有効位。
使い:

TF32の素晴らしい点の一つは、コンパイラのサポートはCUDAコンパイラ内部の最も深いレベルでのみ必要だということです。 残りのコードはFP32を精度は劣りますが、ダイナミックレンジは同じです。 TF32を使うのは主にライブラリに呼び出して正常に動作しているか確認するためです。 TF32の存在により、テンソルコアの高速さをあまり手間なく活かし、素早いプラグインが可能です。
FP16やBFLOAT16のようなフォーマットはビット配置が異なるため、より多くの調整が必要です。 しかし、これらのフォーマットを使うとメモリ帯域幅が減少し、より高速な実行が可能になります。
比較のために、A100のピーク性能は以下の通りです:

テンソルコアなしのFP32:19.5 TFLOPS
TF32テンソルコア:156 TFLOPS(FP32の代わりにTF32を使うと速度を上げやすい)
FP16/BF16テンソルコア:312 TFLOPS(したがって、FP16/BF16への合理的な切り替えはより多くの速度向上をもたらすが、コストは高くなる)。
ソフトウェアサポート:
C/C++標準には含まれていません。
CUDA 11が支援されています。
ハードウェアサポート:
GPU:NVIDIA A100が最初にサポートされるモデルです

FP8

H100 GPUによって導入され、より大きな行列乗算と畳み込みを可能にしますが、精度は低下します。

H8がサポートするFP100のデータ型は、実際にはニューラルネットワークトレーニングの異なる部分に使用できる2つの異なるデータ型です。

E4M3 - 1つのシンボルビット、4つの指数ビット、3つの小数点から成ります。 最大+/-448とnanを保存できます。
E5M2 - 符号ビット1ビット、指数ビット5ビット、小数点以下2桁で構成されています。 最大+/-57344、+/-inf、nanの値を保存できます。 ダイナミックレンジが上がることのトレードオフとして、保存される値は精度が低下します。



浮動小数点データ型の構造。 表示されているすべての値(FP16、BF16、FP8 E4M3、FP8 E5M2)は、0.3952の値に最も近い表現です。

どちらのタイプもニューラルネットワークのトレーニング中に使用できます。 一般的に、前方起動や重みはより高い精度を必要とするため、前方パス時にはE4M3データ型を使用するのが最適です。 しかし、逆伝播ではネットワークを流れる勾配は一般的に精度の損失に弱いものの、より高いダイナミックレンジが必要です。 したがって、E5M2データ形式で保存するのが最善です。 H100 TensorCoreはこれらのタイプの任意の組み合わせを入力としてサポートし、各テンソルを好みの精度で保存できます。

参考:

ハイパーリンクのログインが見えます。
ハイパーリンクのログインが見えます。




先の:ネットワーク - メインルートとサブルートのデバイスは相互接続されています
次に:[AI] (10) LLM大規模モデル推論 GPUメモリ、VRAM推定
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com