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へ適用できる
欠点
比較
関連用語
よくある質問
INT8化すると精度はどれくらい落ちる?
モデルやタスク、量子化手法によって異なるが、キャリブレーション等の手法を用いれば、多くのケースで性能低下はごくわずかに抑えられるとされる。
INT8はどんなツールで利用できる?
TensorRT・ONNX Runtime等の推論エンジンや、Hugging Face TransformersとbitsandbytesのようなPythonライブラリの組み合わせで利用できる。