Re Reference AI

技術

FP16とは

半精度浮動小数点 / half precision

16ビットで数値を表現する浮動小数点フォーマット。学習・推論の高速化とメモリ削減に使われる

数値精度量子化

ひとことで言うと

数値を16ビットで表す形式。AIの計算を速く、軽くするために使われる。

概要

FP16(半精度浮動小数点, half precision)とは、数値を16ビットで表現する浮動小数点フォーマット。 従来標準的に使われてきた32ビットのFP32と比べてメモリ使用量が半分で済み、対応するハードウェア上では演算も高速化できる。 表現できる数値の範囲や精度はFP32より狭まるが、深層学習の学習・推論の多くの場面では実用上十分な精度を保てることが分かっており、学習時にFP32とFP16を組み合わせる混合精度学習(Mixed Precision Training)や、推論時のモデル軽量化に広く使われている。 指数部と仮数部のビット配分をFP16と変えることで表現範囲をFP32に近づけたBF16(bfloat16)という派生形式もあり、学習の安定性を優先する場面ではBF16が選ばれることも多い。

背景

深層学習の計算は大量の行列演算を伴い、数値精度をFP32からFP16へ下げることで計算量とメモリ使用量を削減できれば、学習・推論の速度向上とコスト削減につながる。 GPUメーカー各社がFP16演算に特化した演算ユニット(Tensor Core等)を搭載するようになったことも、FP16の普及を後押しした。

歴史

2017年: BaiduとNVIDIAの研究者が混合精度学習(Mixed Precision Training)を提案する論文を発表し、FP16を用いた学習でも実用的な精度を維持できることを示した。 以降、GPUのTensor Core等FP16演算に特化したハードウェアの普及とともに、学習・推論双方での利用が広まった。

アーキテクチャ

符号1ビット・指数部5ビット・仮数部10ビットで数値を表現する。 FP32と比べ表現できる数値の範囲や精度は狭いが、勾配等一部の値でのみFP32を併用する等の工夫(混合精度学習)により、学習の安定性を保ちながら高速化を図る手法が確立されている。

コード例

PyTorchでの混合精度学習(概念例)

import torch

with torch.autocast(device_type="cuda", dtype=torch.float16):
    output = model(input_tensor)
    loss = loss_fn(output, target)

利点

  • FP32と比べメモリ使用量が半分で済み、より大きなモデル・バッチサイズを扱いやすくなる
  • 対応するGPU上では、演算速度を大きく向上できる
  • 多くの深層学習フレームワークが標準機能として混合精度学習をサポートしている

欠点

  • 表現できる数値の範囲が狭く、極端に大きい・小さい値を扱う際にオーバーフローや精度低下を招きやすい
  • 一部のモデル・タスクでは、FP16のみでの学習が不安定になる場合があり、追加の工夫を要する
  • INT8等の整数形式と比べると、メモリ削減効果は限定的

比較

  • INT8FP16は浮動小数点形式であり、INT8はより単純な整数形式でさらに軽量だが精度の低下が大きくなりやすい
  • 量子化FP16への変換は、量子化の中でも比較的精度低下が小さい代表的な手法の1つ
  • TensorRTTensorRT等の推論エンジンは、FP16への変換を最適化手法の1つとして組み込んでいる

関連用語

INT8INT4量子化TensorRT

よくある質問

FP16とBF16の違いは?

FP16は仮数部が10ビットで精度が高いが表現範囲が狭い。 BF16(bfloat16)はFP32と同じ8ビットの指数部を持ち表現範囲は広いが仮数部が7ビットとやや精度が低い。 学習の安定性を重視する場面ではBF16が好まれることも多い。

推論時にもFP16は使われる?

使われる。 学習後のモデルをFP16へ変換して推論することで、精度低下を抑えつつメモリ使用量と計算コストを削減する手法は、TensorRT等の推論エンジンでも標準的に利用されている。

参考文献

関連Zenn記事