量子化(quantization)とは
本来の「量子化」は、アナログ量(実数)を、有限個のデジタル量に丸めること。
コンピュータはデジタル量しか扱えないので実質的に量子化済みのデータしか扱えないが、
AI・機械学習関連の文脈では、特に数値の精度を落として軽量化・高速化することが「量子化」と呼ばれる。
FP8 Quantization(FP8量子化)も用例としてはある。
通常のソフトウェアでは、エンジニアがゼロ除算やオーバーフローなどで「計算が破綻しないように丁寧に正規化」する処理を入れるのが常識である。
ディープラーニングでは数値の正規化などについてもAIに任される範囲が広いため、AIモデルは離散化誤差などにも強くなる方向に進化している。
その為、このような雑な計算をさせても実用的な精度が出る。
bitsandbytes量子化(NF4など)
誘導 → bitsandbytes
llama.cpp由来の量子化
GGUF形式でQ5_K_M等と書いてあるのはこちら。
本来浮動小数点数であるAIモデルの重みを低精度の固定小数点数として表現できるように丸め、
(浮動小数点数の計算より速い)整数演算ユニットで計算できるようにする技術。
llama.cppに由来するため、詳細はllama.cpp量子化ツールのREADMEを参照。
https://github.com/ggml-org/llama.cpp/blob/master/tools/quantize/README.md
なお、llama.cppはもともと大規模言語モデルLlamaのフロントエンドとして開発されたからそういう名前になっているだけで、
llama.cppの開発者はLlamaを開発したMeta(Facebook)とは直接的な関係はない。
llama.cppは現在LLM全般を対象とするツールスイートになっている。
K量子化(K-quants)、I量子化(I-quants)
K量子化は計算コストを抑えながら精度を上げる手法。
ブロックごとの浮動小数点数へのスケール適用を一段で行わず、
さらに細かいブロックに分けて子ブロック別に整数値のスケールを持たせるようにしたもの。
末尾にS/M/Lとあるものはさらに、重要なブロックのビット幅を少し広くして精度を上げるようにしている。
Sが圧縮率重視(低精度)でLは精度重視(圧縮率は低い)だが、基準精度が同じであれば相対的に差異は小さい。
I量子化はK量子化よりさらに詳細な分析を行ってAIモデルを区切ってビット幅を調整するが、その分オーバーヘッドも大きい。VRAM効率最優先の方式。
Q5以上はK量子化で十分な精度がある*1ため恩恵が少ないので、IQ5以上は少なくともllama.cppには実装されていない。
またimatrix(重要度行列/Importance Matrix)という補助データが別に配布されていることもあるが、推論時には不要。
Q8量子化とfp8との違い
実際のモデルでは使ってみないと優劣がつかない。
速度
ハードウェア構成によって明確に差がつく。
GPUがハードウェアレベルでfp8をサポートしている場合はfp8のほうが高速で、
それ以外の環境ではQ8のほうが高速になる。
fp8をネイティブでサポートしているのはGeForceであればRTX 4000番台以降。
Q8量子化は整数演算ユニットで計算できるため、ハードウェアへの依存度は低く途中の計算は速い。
ただし浮動小数点数への変換が入り、常に一定のオーバーヘッドがある。
また、一般に整数演算のほうが速いというだけでそれ以上のハードウェアによるサポートは無い。
計算時間においてメモリ転送コストが支配的な現代GPUでは、
fp8とQ8のモデル部分のVRAM消費量は同じだが、
Q8は変換処理が複雑なソフトウェア処理になるため余計なメモリアクセスが発生する。
このためfp8がハードウェアレベルでサポートされている環境ではQ8は不利になりやすい。
精度
Q8では、レンジはモデルごとにカスタマイズされるが、レンジ内のステップはその1/255で一定。
fp8は浮動小数点数なのでダイナミックレンジが広い。
微小な数はステップが細かく、巨大な数はステップが広くなる。
画像や音声は離散的ではなく高周波にも重要な情報が含まれている為、浮動小数点数のほうが向いているとされるが、
AIモデルは離散化誤差に強く、またDiTのようなTransformerでは浅層で元のデータの物理的な構造が破壊される為、
結論としてはモデル次第になる。