Re Reference AI

技術

INT8とは

数値を8ビットの整数で表現する、量子化でよく用いられる数値形式

数値精度量子化

ひとことで言うと

数値を8ビットの整数で表す形式。AIモデルを軽くする際によく使われる。

概要

INT8とは、数値を-128〜127(符号付き)等、8ビットの整数で表現する数値形式。 32ビットや16ビットの浮動小数点数と比べてデータサイズが4分の1〜2分の1になり、対応するハードウェア上では整数演算による高速化も期待できるため、モデルの量子化でよく使われる目標精度の1つ。 学習後量子化(PTQ)等の手法を用いて、モデルの重みや活性化値をFP32・FP16からINT8へ変換することで、推論のメモリ使用量と計算コストを削減する。 量子化による誤差の影響を抑えるため、実際にキャリブレーション用のデータをモデルへ流して各層の値の分布を調べたうえで、変換時のスケーリング係数を最適化する手法が併用されることも多い。

背景

モデルサイズと推論コストの増大に対し、数値表現のビット数をさらに削減したいという要求から、浮動小数点よりシンプルな整数形式であるINT8が量子化の主要な選択肢として広く使われるようになった。

歴史

2022年: DettmersらがLLM向けの8-bit行列乗算手法LLM.int8()を発表し、大規模言語モデルでも性能劣化を抑えつつINT8精度を活用できることを示した。 以降、LLMの量子化における代表的な目標精度の1つとして広く利用されている。

アーキテクチャ

浮動小数点の値を一定の範囲に収まるようスケーリングし、整数値へ丸め込むことでINT8表現に変換する。 推論時には、スケール値を用いて整数演算の結果を元の数値スケールへ近似的に復元しながら計算する。

コード例

BitsAndBytesConfigによる8bit読み込み(概念例)

from transformers import AutoModelForCausalLM, BitsAndBytesConfig

quant_config = BitsAndBytesConfig(load_in_8bit=True)
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.1-8B-Instruct",
    quantization_config=quant_config,
    device_map="auto",
)

利点

  • FP32・FP16と比べさらにメモリ使用量を削減でき、対応ハードウェアでは演算も高速化できる
  • 多くの推論エンジン・ハードウェアが標準的にサポートしており、実装のノウハウが蓄積されている
  • bitsandbytes等のライブラリを通じて、比較的手軽にLLMへ適用できる

欠点

  • 表現できる数値の粒度が粗く、FP16等と比べ精度低下が大きくなりやすい
  • モデルや層によっては、そのままINT8化すると性能が大きく劣化しやすく、工夫を要する
  • 量子化・逆量子化の処理がオーバーヘッドとなり、ハードウェアによっては期待した高速化を得られない場合がある

比較

  • FP16FP16は浮動小数点形式であり、INT8はより単純な整数形式でさらに軽量だが精度の低下が大きくなりやすい
  • INT4INT8よりさらにビット数を減らした形式がINT4で、圧縮率は高いが精度の確保がより難しくなる
  • 量子化INT8は、量子化における代表的な目標精度の1つ

関連用語

FP16INT4量子化

よくある質問

INT8化すると精度はどれくらい落ちる?

モデルやタスク、量子化手法によって異なるが、キャリブレーション等の手法を用いれば、多くのケースで性能低下はごくわずかに抑えられるとされる。

INT8はどんなツールで利用できる?

TensorRTONNX Runtime等の推論エンジンや、Hugging Face TransformersとbitsandbytesのようなPythonライブラリの組み合わせで利用できる。

参考文献

関連Zenn記事