21. AIの数字の秘密!FP32からINT4まで、データ型を完全解説

スポンサーリンク

21. AIの数字の秘密!FP32からINT4まで、データ型を完全解説

AI、特にChatGPTのような大規模言語モデル(LLM)を動かすとき、実は裏側でとても重要な選択が行われているんです。それが「データ型」という概念なんですね!

「データ型って何?」と思われるかもしれません。簡単に言うと、AIが扱う数字をどんな形式で保存するかという話なんです。これが実は、モデルの速度、メモリの使い方、そして性能まで、すべてに影響するんですよ。

今回は、FP32、FP16、BF16、INT8、INT4といった暗号みたいな名前の裏に隠された意味を、できるだけわかりやすく解説していきます!最後まで読むと、AIエンジニアが何を考えて形式を選んでいるのか、その裏側がわかるようになりますよ。

なぜデータ型が重要なの?

まず基本から考えてみましょう。ChatGPTのような大規模な言語モデルって、何でできていると思いますか?実は、ものすごい数の「数字」の集まりなんです。

小さめのモデルでも10億個、大きいものだと700億個もの数字(パラメータ)で構成されているんです!そして、その一つ一つの数字には「形式」があります。32ビットで保存するのか、16ビットなのか、それとももっと小さい4ビットなのか。

このシンプルな選択が、実はすべてを変えるんです。

  • どれだけGPUのメモリが必要か
  • モデルがどれくらいの速度で動くか
  • どれだけ正確に計算できるか

これらすべてが、データ型の選択で決まります。それでは、一つずつ見ていきましょう!

浮動小数点数って何?

まず、訓練やファインチューニング(モデルの調整作業)で使われる「浮動小数点型」から説明しますね。

浮動小数点数は、小数を表現するための方法です。理科で習った「科学的記数法」を思い出してください。例えば、314という数を「3.14 × 10²」と表現しますよね?これと同じ仕組みなんです。

コンピュータの浮動小数点数は、3つの部分から成り立っています:

  1. 符号ビット:正の数か負の数かを表す
  2. 指数部:数がどれくらい大きいか小さいかを決める(範囲をコントロール)
  3. 仮数部:実際の数字の桁(精度をコントロール)

ここで大事なのは、すべての浮動小数点形式が「範囲」と「精度」のトレードオフをしているということです。大きな数を扱えるようにすると精度が落ち、精度を上げると扱える範囲が狭くなる。このバランスが形式ごとに違うんですね。

FP32(Float32)— 最も正確だけど重い

FP32は「32ビット浮動小数点数」の略で、ディープラーニングの伝統的な標準形式です。各数字を32ビット(4バイト)で保存します。

構成はこうです:
– 符号ビット:1ビット
– 指数部:8ビット
– 仮数部:23ビット

これによって何が得られるかというと:
範囲:±3.4 × 10³⁸(とてつもなく広い!)
精度:約7~8桁の小数

FP32は最も安定していて、計算エラーが起こりにくいんです。だから小さいモデルや研究実験では今でも使われています。

でも大きな問題があります。メモリをものすごく使うんです!

例えば、70億パラメータのモデルをFP32で保存すると、重みだけで28GBのメモリが必要になります。そこに訓練に必要な他のデータ(勾配やオプティマイザの状態など)を加えると、簡単に50GB以上になってしまいます。これは普通のGPUには収まらないんですね。

だから、FP32は最も安全な選択肢ではあるものの、現代のワークフローでは単独で使われることはほとんどありません。

FP16(Float16)— 半分のサイズ、でも問題も

FP16はビット数を半分にカットした形式です。合計16ビット(2バイト)で数字を表現します。

構成:
– 指数部:5ビット
– 仮数部:10ビット
– 範囲:±65,504(FP32よりずっと小さい!)
– 精度:約3~4桁の小数

即座のメリットは?メモリが半分になります!70億パラメータのモデルなら、28GBではなく14GBで済むんです。

しかも、現代のGPUには専用ハードウェア(NVIDIAのTensor Coreなど)があって、FP16演算に最適化されています。つまり、FP32より高速に計算できるんです。

でも、FP16には大きな問題があります。範囲がとても狭いんです。

訓練中、勾配(モデルを改善するための計算値)は簡単に65,504を超えたり、逆に小さくなりすぎたりします。これをオーバーフローやアンダーフローと呼びます。こうなると、訓練が不安定になったり、完全に壊れてしまうことがあるんです。

これを避けるために「損失スケーリング」という技術を使います。簡単に言うと、計算前に数字を大きくして、後で元に戻すという方法です。でもこれは複雑さを増やしてしまいます。

FP16は推論(すでに訓練されたモデルを使う場面)や混合精度訓練には優れていますが、純粋な訓練ワークフローには、もっと良い選択肢があります。

BF16(BFloat16)— 現代の最強標準!

BF16は、まさにディープラーニングのために設計された形式です。Googleが開発しました。

FP16と同じく16ビットを使いますが、配分の仕方が違います:

  • 指数部:8ビット(FP32と同じ!)
  • 仮数部:7ビット
  • 範囲:±3.4 × 10³⁸(FP32と同じ)
  • 精度:約2~3桁の小数

ここがポイントです!BF16は精度を犠牲にして、FP32の範囲を維持しているんです。

指数部にFP32と同じ8ビットを与えることで、BF16は同じ巨大な数値範囲を表現できます。つまり、訓練中でも勾配がオーバーフローやアンダーフローしにくいということです。損失スケーリングも不要なんです!

「精度が低いなら問題じゃないの?」と思うかもしれませんね。でも実は、ニューラルネットワークはそこまで高い精度を必要としないんです。小さな丸め誤差には強いんですよ。必要なのは「安定性」で、BF16はそれを提供してくれます。

BF16は現在、現代のLLMのデフォルト訓練形式になっています。対応ハードウェアも増えています:

  • GoogleのTPU(発明された場所)
  • NVIDIA GPU(A100、H100)
  • AMDのMI250アクセラレータ

今日、大きなモデルを訓練したりファインチューニングしたりしている場合、ほぼ確実にBF16を使っているはずです!

整数型:INT8とINT4の世界

さて、ここからは推論(訓練済みモデルを実際に使う段階)で活躍する「整数型」を見ていきましょう。

モデルがすでに訓練されていれば、それを実行するのに常に完全な浮動小数点精度が必要というわけではありません。整数表現を使えば、重みをコンパクトに保存して、少しの精度トレードオフでより速く実行できるんです。

INT8 — 効率的で信頼性が高い

INT8は各数字を8ビット整数として保存します。指数部も仮数部もなく、ただの整数です。

符号付きINT8は-128から+127までの整数を表現できます。符号なしなら0から255までです。

「えっ、でも0.00341みたいな小数はどうするの?」と思いますよね。そこで登場するのが量子化という技術です。

量子化は、連続した浮動小数点値をこの限定された整数範囲にマッピングして、推論中に再スケールする処理です。詳しくは次のレッスンで学びますが、これによってメモリを大幅に削減できるんです!

INT4 — 究極の圧縮

INT4はさらに極端です。1つの数値にわずか4ビットしか使いません!

4ビット符号付き整数は-8から+7までの値しか表現できません。符号なしでも0から15までです。

「こんな狭い範囲で大丈夫なの?」と心配になりますよね。でも、慎重な量子化技術を使えば、まだ使える結果が得られるんです。

INT4は特にQLoRA(Quantized Low-Rank Adaptation)という技術で人気があります。これは、ベースモデルを4ビットに圧縮しながら、訓練可能な部分はより高い精度で保持することで、普通のGPU上でも大規模モデルのファインチューニングを可能にする画期的な技術なんです!

NF4 — ニューラルネットワーク専用の4ビット

標準のINT4は、16個の離散値を範囲全体に均等に配置します。でも、ニューラルネットワークの重みは均等に分布していません。実は、ゼロの周辺に集まっていて、正規分布(ガウス分布)のような形になっているんです。

NF4(NormalFloat-4)は、この特性を利用した特殊な4ビット形式です。ほとんどの表現可能な値をゼロ付近(ニューラルネットワークの重みが多い場所)に配置して、極端な部分には少なく配置します。

これによって、均一な4ビット量子化よりもはるかに優れたモデル品質を保てるんです!

主な特徴:
– INT4と同じ4ビットを使用
– 値は不均等に配置(ゼロ付近で高い解像度)
– 事前訓練済みモデルの重み量子化に特化

NF4は、先ほど触れたQLoRAでベースモデルの重みを保存するために使われる形式です。次のレッスンで、量子化とダブル量子化がこれを使って大規模モデルを効率的に圧縮する方法を実際に見ていきます!

メモリ要件 — 実際どれくらい必要?

データ型を理解したところで、本当に重要な質問をしましょう。「モデルは実際にどれだけのメモリを必要とするの?」

計算式はシンプルです:

メモリ(バイト単位)= パラメータ数 × パラメータあたりのバイト数

具体例で見てみましょう。70億パラメータのモデルの場合:

  • FP32:7B × 4バイト = 28GB
  • BF16:7B × 2バイト = 14GB
  • INT8:7B × 1バイト = 7GB
  • INT4:7B × 0.5バイト = 3.5GB

すごい差ですよね!FP32からINT4に変えるだけで、メモリ使用量が8分の1になるんです。

ただし、これは重みを保存するためだけのメモリです。訓練中には、さらに次のものが必要になります:

  • 勾配(重みと同じサイズ)
  • オプティマイザ状態(Adamの場合、重みサイズの2倍になることも)
  • 活性化(バッチサイズとシーケンス長に依存)

そのため、訓練時のメモリは簡単にモデルサイズの3~4倍以上になります。だから、効率的なデータ型選択がとても重要なんですね!

まとめ:データ型選択のチートシート

データ型は、GPUコストからモデルの安定性まで、すべてを左右する静かなエンジニアリング決定です。

簡単にまとめるとこうなります:

訓練・ファインチューニング時:
BF16が現代の標準。安定性とメモリ効率のバランスが最高
FP32は小さいモデルや最大精度が必要な研究実験で使用
FP16は混合精度訓練で活用(ただし損失スケーリングが必要)

推論時:
INT8は効率的で品質も保てる人気の選択肢
INT4/NF4は極限の圧縮が必要な場合(QLoRAなど)
BF16/FP16も推論で広く使われている

これらの精度形式を理解することで、精度、安定性、効率性の間の適切なバランスを選択できるようになります。そして、次のレッスンで取り上げる量子化のような圧縮技術の準備が整いました!

AIの世界では、こうした細かい選択の積み重ねが、最終的に「動くか動かないか」「速いか遅いか」「高いか安いか」を決めるんです。データ型は地味に見えますが、実はとても重要な要素なんですね!

コメント

タイトルとURLをコピーしました