半精度
半精度(FP16)がいかにAIを高速計算、メモリ使用量の削減、効率的なモデル展開で加速させるかをご覧ください。
FP16としても知られる半精度は、より一般的な32ビット単精度(FP32)または64ビット倍精度(FP64)フォーマットとは対照的に、16ビットのメモリを使用して数値を表現する浮動小数点数フォーマットです。ディープラーニングの文脈では、半精度を使用することで、モデルのメモリフットプリントと計算要件が大幅に削減される。このトレードオフは、数値範囲と精度の低下という代償を伴う。しかし、最新の技術、特に混合精度トレーニングにより、FP16は、モデルの精度への影響を最小限に抑えながら、より高速なトレーニングと推論を可能にし、効率的な機械学習(ML)の基礎となっている。
ハーフ精度の仕組み
FP32からFP16に切り替えると、モデルの重みとアクティベーションの保存に必要なメモリが半分になる。これにより、より大きなモデル、より大きなバッチサイズ、またはより少ないメモリでGPU上でのトレーニングが可能になります。さらに、NVIDIA Tensor Coreなどの最新のGPUは、32ビット演算よりもはるかに高速に16ビット行列演算を実行するように特別に設計されています。
FP16の主な課題は、数値範囲が限られていることで、トレーニング中に勾配が消失するなどの問題が生じる可能性がある。これに対抗するため、半精度はほとんどの場合、混合精度アプローチを用いて実装される。この戦略では、高速化のためにほとんどの計算をFP16で実行するが、重みの更新や特定の損失関数の計算など重要な処理には戦略的にFP32を使用し、数値的安定性を維持する。PyTorchや TensorFlowのようなディープラーニングフレームワークは、自動的な混合精度学習をビルトインでサポートしている。
応用と実例
主に混合精度技術による半精度が広く使われている:
- モデルトレーニングの高速化: 画像分類や 自然言語処理(NLP)などの大規模なディープラーニングモデルのトレーニングは、混合精度を使用することで大幅に高速化され、トレーニング時間とコストを削減できます。Ultralytics HUBのようなプラットフォームは、クラウドトレーニングセッション中にこれらの最適化を利用することがよくあります。
- 物体検出推論の最適化: Ultralytics YOLO11のようなモデルは、FP16の精度でONNXや TensorRTのようなフォーマットにエクスポートすることができ、より高速なリアルタイム推論が可能です。これは、複数のビデオフィードを分析するセキュリティシステムや、高速生産ラインの品質管理など、高いスループットを必要とするアプリケーションにとって非常に重要です。
- リソースに制約のあるデバイスへの展開:FP16モデルはメモリフットプリントと計算コストが小さいため、NVIDIA JetsonのようなエッジAIプラットフォームや、TensorFlow Liteや AppleのCore MLなどのフレームワークを使用するモバイルデバイスへの展開に適しています。
- 大規模言語モデル(LLM)のトレーニング: GPT-3や他の基礎モデルのようなモデルのサイズが大きいため、モデルをメモリに収め、妥当な時間内に学習を完了するためには、16ビットフォーマットを使用する必要があります。
半精度対他のフォーマット
- Bfloat16(BF16):Bfloat16は、FP16に比べて指数に多くのビットを割り当て、仮数に少ないビットを割り当てる。これにより、FP32と同じダイナミックレンジが得られ、アンダーフローやオーバーフローに強くなるが、その代償として精度が低くなる。グーグルのTPUで多用されている。詳細はGoogle Cloud AI Blogで読むことができる。
- モデルの量子化:どちらもモデルの最適化手法ですが、モデルの量子化は通常、浮動小数点ウェイト(FP32またはFP16)をより低いビットの整数形式(最も一般的なのは8ビット整数(INT8))に変換します。これにより、特にCPUや特定のアクセラレータでは、さらに高速化を図ることができますが、モデル性能の大幅な低下を避けるために、量子化対応トレーニング(QAT)のような、より慎重なキャリブレーションプロセスが必要になることがよくあります。
- 単精度(FP32):ほとんどのディープラーニング・フレームワークのデフォルト・フォーマット。精度が高く、ダイナミックレンジが広いため、学習に適している。しかし、半精度よりも遅く、メモリ消費量も多いため、大規模モデルの展開や最高速度を必要とするアプリケーションには不向きです。様々なモデルの比較で示されているように、これらのフォーマット間のトレードオフは重要な検討事項です。