6. 量子化技術と推論最適化
量子化(Quantization)とは何か
深層学習モデルのパラメータ(重み)は、通常 16 ビット浮動小数点(FP16 または BF16)や 32 ビット浮動小数点(FP32)で表現されています。 例えば、70 億パラメータ(7B)のモデルを FP16 で読み込むと、重みだけで $7 \times 10^9 \times 2\text{バイト} \approx 14\text{GB}$ のメモリが必要になります。これに KV キャッシュや処理用ワークスペースを加えると、16GB 以上のメモリが必須となります。
「量子化(Quantization)」とは、重みの数値をより少ないビット数(例えば 8 ビット、4 ビット、あるいは 2 ビット)の整数で近似表現する圧縮技術です。 量子化を行うことで、必要なメモリ容量を $\frac{1}{2}$ から $\frac{1}{4}$ 以下に削減し、一般的な 8GB や 16GB の RAM を持つ PC でもモデルを丸ごとロードできるようになります。
メモリ帯域幅の壁(Memory Bandwidth Bound)
LLM が 1 トークンを生成するとき、モデル全体のすべての重み行列をメモリからプロセッサ(CPU や GPU のコア)へと 1 回読み出す必要があります。 計算自体の演算量よりも、メモリからデータを読み出す転送速度(メモリ帯域幅: Memory Bandwidth)がボトルネックとなる現象を「メモリ帯域幅制限(Memory Bound)」と呼びます。
量子化によって重みのデータサイズが半分になれば、メモリから読み出す転送データ量も半分になります。 その結果、量子化はメモリ消費を抑えるだけでなく、CPU や統合メモリにおけるトークン生成速度(秒間トークン数: tokens/sec)を大幅に向上させる という強力な副次的効果をもたらします。
8bit量子化と4bit量子化の原理
最も基本的な均等量子化(Uniform Quantization)では、浮動小数点の値の範囲 $[-\max, \max]$ を、小さな整数値(int8 なら $-128 \sim 127$、int4 なら $-8 \sim 7$)にマッピングします。
変換式は基本的に以下の通りです:
$$ q = \text{round}\left(\frac{x}{s}\right) $$
ここで $x$ は元の浮動小数点値、$s$ はスケーリング係数(scale)、$q$ は量子化された整数値です。 計算を行う直前に、整数 $q$ にスケール $s$ を掛けて逆量子化(De-quantization)し、浮動小数点に戻して行列積を計算します。 ブロック単位(例えば 32 個の重みごと)に局所的なスケール係数を保持する「ブロック量子化」を用いることで、極端な外れ値による精度劣化を最小限に抑えます。
k-quants(Q4_K_Mなど)による精度向上手法
llama.cpp では、単純な均等量子化を超えて、より高度な「k-quants」と呼ばれる量子化方式が開発されました。
モデルのファイル名で見かける Q4_K_M や Q5_K_S といった記号は、この方式を表しています。
- 重要度に応じた不均一なビット配分:
Transformer のすべての層が同じ重要度を持つわけではありません。アテンションの Key/Value 射影層や、出力に近いレイヤーは精度に大きく影響し、中間の一部の FFN 層は多少粗くても耐性があります。
Q4_K_M(Medium)では、重要なテンソルには 5 ビットや 6 ビットを割り当て、影響の少ないテンソルに 4 ビットを割り当てることで、全体の平均サイズを 4.5 ビット程度に抑えつつ、FP16 と肉薄する回答精度を実現します。
| 量子化タイプ | 平均ビット数 | 7Bモデル容量 | 精度劣化の目安 | 特徴とおすすめ用途 |
|---|---|---|---|---|
| FP16 | 16.0 bit | 約 14 GB | なし (基準) | 元モデルの完全な精度 |
| Q8_0 | 8.5 bit | 約 7.7 GB | 極小 (ほぼ認知不能) | リソースに余裕がある場合の最高品質 |
| Q5_K_M | 5.5 bit | 約 5.1 GB | 非常に軽微 | 精度とサイズの好バランス |
| Q4_K_M | 4.5 bit | 約 4.4 GB | 軽微 | 最も推奨される標準設定 |
| Q3_K_M | 3.5 bit | 約 3.5 GB | 体感できる劣化あり | メモリ制約が非常に厳しい場合 |
| Q2_K | 2.5 bit | 約 2.7 GB | 大幅な劣化あり | 極限の実験用 |
CPU/GPUハイブリッド推論とレイヤーオフロード
llama.cpp のもう一つの強力な武器は、柔軟な「レイヤーオフロード(GPU Offloading)」です。 モデルのレイヤー(層)は順番に積み重なっています。例えば 32 層あるモデルにおいて、GPU の VRAM が 4GB しかなくモデル全体(4.4GB)が収まらない場合、GPU を完全に諦める必要はありません。
llama.cpp では、最初の 20 層だけを GPU の VRAM に配置(オフロード)し、残りの 12 層をメインメモリ(RAM)と CPU で処理する、といったハイブリッド推論が可能です。 GPU で処理できる層が増えるほど全体の処理速度が劇的に高速化するため、手持ちのハードウェアの能力を限界まで使い切ることができます。 次章では、実際に llama.cpp をセットアップして動かす実践手順を解説します。