符号、指数部、仮数部
IEEE 754 浮動小数点形式
すべての浮動小数点数は 3 つのフィールドを保存します:
- 符号ビット (1 ビット): 正または負
- 指数 (E ビット): 倍率スケール、2 の整数乗
- 仮数 (M ビット): 小数点以下の精度、1.0 ~ ~2.0 の間の数
総ビット数 = 1 + E + M。値はおよそ (-1)^sign (1 + mantissa) 2^(exponent - bias) に等しい。
トレーニングにおいて重要な2つの特性:
ダイナミックレンジ = 2^(2^E) (およそ)。指数ビットの増加により、オーバーフローせずにより小さくより大きな数を表現可能。
精度 = 2^M 個の異なる値(2のべき乗ごと)。マンティサのビット数が多いほど、連続する2のべき乗間の表現が細かくなります。
3つのフォーマット
| フォーマット | 総ビット数 | 符号 | 指数 | マンティサ | 動的範囲 | 精度 |
|---|---|---|---|---|---|---|
| FP32 | 32 | 1 | 8 | 23 | ~10^-38 から ~10^38 | ~7桁 |
| FP16 | 16 | 1 | 5 | 10 | ~10^-5 to ~10^5 | ~3 digits |
| FP8 E4M3 | 8 | 1 | 4 | 3 | ~2^-9 to ~448 | ~2 digits |
FP8 E4M3 は「4 指数ビット、3 仮数ビット」を意味します。代替の FP8 E5M2 は精度を範囲と交換します。ANDREA の実験では E4M3 を使用します。なぜなら、トランスフォーマーの活性化は狭い大きさの帯域に留まり、追加の精度が追加の範囲より優位になるからです。
パラメータあたりのバイト数
なぜ低精度が高速に動作するのか
メモリ帯域幅がトレーニング速度を支配する
現代の GPU は計算よりもメモリを待つ時間の方が多い。RTX 4090 は 1008 GB/s のメモリ帯域幅と 165 TFLOPS の FP16 計算性能を持つ。典型的な層は VRAM から重みを読み込み、アクティベーションを乗算し、結果を書き戻す。帯域幅が、計算ではなく、スループットを決定する。
精度を半分にするとパラメータあたりのバイト数が半分になるため、同じ重みを読み込むのにメモリ帯域幅の半分しか使わない。スループットはほぼ 2 倍になる。
テンソルコア:ハードウェアアクセラレーション付き行列乗算
RTX 4090には、FP16またはFP8で直接行列乗算を計算する専用のテンソルコアユニットが搭載されています。1回のテンソルコア演算で小さなブロック(例: 16x16)を1サイクルで乗算し、スカラーFP32乗算よりも劇的に高速です。
ANDREA-120Mからの実証数値:
| 精度 | ステップ/分 | 備考 |
|---|---|---|
| FP32 | ~3 | ベースライン;テンソルコア加速なし |
| FP16 | ~6 | cuBLAS テンソルコア; 2倍の速度向上 |
| FP8 E4M3 | ~6 | テンソルコア; FP16 と同等 |
FP8 はこのワークロードで FP16 のスループットを上回らなかった。計算スループットがボトルネックでなくなったためで、メモリ帯域幅と起動オーバーヘッドが制約となった。ANDREA-120M v3 は、FP16 cuBLAS で 6 steps/min で出荷され、スループットを失わずに快適な安全マージンを確保している。
FP8 での NaN リスク
FP8 E4M3 は ~2^-9 から ~448 までの数を表現する。その範囲外のアクティベーションやグラディエントは NaN(not a number)にオーバーフローするか、ゼロにアンダーフローする。1つの NaN が下流のすべての計算を汚染する:NaN を含む行列乗算はすべて NaN を返す;すべて NaN のグラディエントは AdamW の状態を破損;NaN の m & v を持つ AdamW は NaN の更新を出力;重みが NaN になり;トレーニング全体が死ぬ。
ANDREAのFP8実験では、損失スケーリング、スケジュールされた精度切り替え、またはフォールバックパスを必要とする断続的なNaNクリフが発生しました。FP16の動的範囲(~10^-5 から ~10^5)は十分に広く、複雑なスケーリングトリックなしでNaNイベントをまれに抑えられます。
新しいラン用の精度選択
1枚の4090に120Mを収める
イントロレッスンからの6-8倍の乗数
grow_a_language_model_introから思い出すと、トレーニングメモリは生の重み数のおよそ6-8倍で、次のものを考慮しています:
- 重み (1x)
- Adamの第一モーメント m (1x)
- Adamの第二モーメント v (1x)
- グラディエントバッファ (1x)
- アクティベーション & 一時変数 (~2-4x、バッチとコンテキストに依存)
ANDREA-120M を FP16 で、batch_size=8、context=1024 で:
| コンポーネント | FP16 サイズ |
|---|---|
| 重み | 240 MB |
| m (第1モーメント) | 240 MB |
| v (第2モーメント) | 240 MB |
| 勾配 | 240 MB |
| 活性化 | ~2-4 GB (バッチ, コンテキスト) |
| 合計 | ~3.5 GB |
RTX 4090 は 24 GB VRAM を搭載。ANDREA-120M は FP16 で ~14% を使用。より大きなバッチサイズや長いコンテキストウィンドウに十分な余裕あり。ANDREA-12M は合計で 1.4 GB のみ使用。
混合精度が使用される場所
ANDREA はすべてを一つの精度で保持しません。混合精度トレーニングでは以下を保存します:
- マスター重み: FP32 (トレーニングの安定性を保持)
- フォワード & バックワード計算: FP16 (テンソルコアを使用)
- AdamW オプティマイザ状態: FP32 (m & v は長尾更新のために精度が必要)
- グラディエントバッファ: FP16 (計算側)
最終的なメモリ予算は両方を混ぜたものです。ANDREAの実際のフットプリントは、純粋なFP16(720 MB optimizer state)と純粋なFP32(1.44 GB optimizer state)の間にあり、m と v がFP32のままなのでFP32に近いです。
ANDREA-480Mのための予算の規模決め
実践での精度
関連活動
精度に関連する3つの兄弟活動:
- Activity 1: Intro / VRAM budget. 精度はメモリ予算の算術の各項を乗算します。6-8倍の目安ルールは無次元です;bytes-per-paramで次元を与えます。
- アクティビティ 10: AdamW. オプティマイザの状態(m & v)は、フォワード/バックワード計算が FP16 で実行されていても、通常 FP32 のままです。理由:オプティマイザにとっては、長尾の累積器精度が実行速度よりも重要です。
- アクティビティ 12: グラディエントクリッピング. クリッピングは、オプティマイザの状態更新前にグラディエントの大きさを制限します。FP16 フォワード/バックワードと FP32 オプティマイザの場合、クリッピングは精度が変化する境界およびオーバーフローリスクが集中する場所で発生します。
精度は無料のつまみです:変更すると、モデルが高速に訓練され、メモリ使用量が少なくなります。コストは数値的な注意:NaN 処理、損失スケーリング、混合精度の規律です。ANDREA-120M v3 はその成果を示しています:120M パラメータが、FP16 によりすべてが半分になったため、コンシューマハードウェアで 23 日で訓練されました。