量子化は、LLMの重みを低精度(FP16→INT4/INT8等)に変換することでメモリ使用量と推論速度を大幅に改善する技術であり、LLMのローカル実行やエッジ展開の鍵となります。本記事では、GPTQ・AWQ・GGUF・BitNetといった主要な量子化手法の違いを数式とコードで解説し、精度・速度・メモリのトレードオフを踏まえたユースケース別の推奨設定を提示します。

量子化とは何か――「精度を落として速度を上げる」技術

量子化(Quantization)とは、ニューラルネットワークの重みや活性値を高精度フォーマット(FP32、FP16、BF16)から低精度フォーマット(INT8、INT4、さらには1.58ビット)に変換する技術です。LLMにとって量子化が特に重要な理由は、現代のLLMが計算ボトルネックではなくメモリ帯域ボトルネックで動いているからです。メモリ転送が律速する状況では、重みのビット数を半分にすれば、ほぼそのまま推論スループットが倍になります。

最も基本的な線形量子化は次式で定義されます。$x$は元の浮動小数点値、$q$は量子化後の整数値、$s$はスケール、$z$はゼロポイントです。

$$q = \mathrm{round}\left(\frac{x}{s}\right) + z, \quad \hat{x} = s \cdot (q – z)$$

【Memory Usage by Precision (Llama 7B weights only)】

FP16 (16bit): [================]  ~14 GB
INT8 (8bit):  [========]           ~7 GB
INT4 (4bit):  [====]               ~3.5 GB
BitNet(1.58): [==]                 ~1.5 GB

※ Activations and KV cache not included
※ Actual footprint depends on quantization scheme (group size, zero points)

量子化の効果は単なるメモリ削減にとどまりません。コンシューマGPU(RTX 4090の24GB)でLlama 70BをINT4で動かす、CPUだけでLlama 13Bを動かす、といった「これまで不可能だった推論」を可能にする民主化技術でもあります。

Post-Training Quantization(PTQ)手法の比較

GPTQ

Frantar et al. (2023)「GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers」は、Optimal Brain Surgeonに基づく層単位の量子化手法で、重み行列をグループ(通常128次元)に分割し、ヘッセ行列の情報を用いて量子化誤差を最小化します。校正データを少量与えるだけで高精度な量子化が可能で、広く使われる定番手法の一つです。

AWQ(Activation-aware Weight Quantization)

Lin et al. (2023) のAWQは、活性化値(activations)の大きさに基づいて各チャンネルの重要度を評価し、重要チャンネルを保護するようスケーリングを行う手法です。GPTQと比較して、4ビット量子化時の精度保持性が高く、vLLMなど本番推論エンジンとの統合も進んでいるため、API提供やオンプレ展開で人気です。

GGUF(llama.cpp形式)

GGUFはllama.cppプロジェクトが採用するモデルフォーマットで、Q2_K〜Q8_0まで細かいビット幅バリエーションを持ちます。CPU/GPU混合推論に対応し、メモリの一部をVRAMに、残りをRAMにオフロードする柔軟性があります。コンシューマ環境(MacBookやRTX 4090)でのLLM実行の事実上の標準です。Q4_K_MやQ5_K_Mがバランスに優れると広く認識されています。

SqueezeLLM / SpQR

SqueezeLLMやSpQRは、量子化時に「外れ値(outliers)」を個別に扱うことで、極低ビット(3ビット以下)量子化でも精度劣化を抑える手法です。通常の量子化は外れ値に大きく引っ張られて全体の精度が下がりますが、外れ値を特別扱いすることで残りの値の表現精度を上げられます。

手法ビット幅対応フレームワーク精度(PPL劣化)速度メモリ効率CPU対応
GPTQ3〜8bitAutoGPTQ、vLLM小(+0.1〜0.5)
AWQ4bit中心AutoAWQ、vLLM、TGI極小
GGUF (Q4_K_M)4〜5bitllama.cpp、Ollama非常に高
SqueezeLLM3bit独自中(外れ値対応)非常に高
bnb NF44bitbitsandbytes、HF小〜中×

Quantization-Aware Training(QAT)と1-bit LLM

PTQが学習済みモデルを事後的に量子化するのに対し、QAT(Quantization-Aware Training)は学習中に量子化を考慮した勾配計算を行い、量子化後の精度を最適化します。PTQで劣化が目立つ極低ビット領域ではQATが有効です。

近年の話題作はBitNet b1.58(Ma et al., 2024)です。重みを$\{-1, 0, 1\}$の三値に制限することで、情報量は1.58ビット($\log_2 3$)となり、浮動小数点乗算を加減算だけに置き換えられます。学習時の三値量子化は次式で表されます。

$$W_{\pm 1, 0} = \mathrm{RoundClip}\left(\frac{W}{\gamma + \epsilon}, -1, 1\right), \quad \gamma = \frac{1}{nm}\sum |W_{ij}|$$

BitNet b1.58は同規模のFP16モデルと同等以上のタスク性能を達成しつつ、推論時のエネルギーを劇的に削減できると報告されています。ハードウェア側の対応が進めば、LLMの次の10倍効率化の主役になる可能性があります。

項目PTQQAT
学習コスト低(校正のみ)高(再学習必要)
精度維持8bit優、4bit良極低ビット領域で有利
実装難易度
対応ビット幅4〜8bit中心1bit〜8bit
適するケース既存モデルの最適化エッジ向け新規学習
from transformers import AutoModelForCausalLM, BitsAndBytesConfig, AutoTokenizer
import torch

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_use_double_quant=True,
)

model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.1-8B",
    quantization_config=bnb_config,
    device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B")
inputs = tokenizer("量子化の効果は", return_tensors="pt").to(model.device)
print(tokenizer.decode(model.generate(**inputs, max_new_tokens=64)[0]))

量子化モデルの評価とベンチマーク

量子化モデルの評価軸は4つあります。Perplexity(言語モデルとしての純粋な性能)、下流タスク精度(MMLU、HumanEval等)、推論速度(tokens/sec)、そしてメモリ使用量です。一般的な経験則として、8ビット量子化ではほぼ劣化なし、4ビット量子化でもPerplexity増加は3〜5%以内、Q4_K_Mなどブロック量子化では2%未満に収まるケースが多いとされています。

注意点として、Perplexityが同程度でも下流タスクでは差が出るケースがあります。特にコーディングや数学のような厳密性が必要なタスクでは、量子化劣化が他より顕著に現れる傾向があります。ベンチマークは実際のユースケースに近いもので行うのが鉄則です。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from datasets import load_dataset

def perplexity(model, tokenizer, text, stride=512):
    enc = tokenizer(text, return_tensors="pt").input_ids.to(model.device)
    nlls = []
    for i in range(0, enc.size(1), stride):
        chunk = enc[:, i:i + stride]
        with torch.no_grad():
            out = model(chunk, labels=chunk)
        nlls.append(out.loss)
    return torch.exp(torch.stack(nlls).mean()).item()

wiki = load_dataset("wikitext", "wikitext-2-raw-v1", split="test")
text = "\n\n".join(wiki["text"])
# compare fp16 and int4 on the same text

実務での量子化活用

ユースケース別の推奨量子化設定は以下が実務的な目安です。

ローカル開発・プロトタイピング:GGUF Q4_K_Mが鉄板です。llama.cpp/Ollamaで即座に動作し、MacBook M1/M2などのApple Silicon環境でも高速です。

本番API提供:AWQ 4ビット+vLLMまたはTGIが最も広く使われる組み合わせです。スループットとレイテンシのバランスに優れ、GPUを効率的に使えます。

エッジデバイス:まずモデル蒸留で小型化し、さらにINT4量子化で圧縮する二段構えが有効です。スマートフォンやIoTデバイスでも2〜7Bモデルが現実的なレイテンシで動作します。

ビジネスへの示唆――量子化で変わるLLMのTCO

量子化はLLMのTCO(総所有コスト)を根本から変えます。Llama 70BをFP16で動かすにはA100 80GB×2が必要ですが、AWQ 4ビットならA100 1枚、あるいはRTX 4090×2の構成でも動作可能です。ハードウェアコストで10倍、電力コストを含めると20倍規模の削減が現実的です。

オンプレミス展開も現実的になりました。社内機密データを扱う業種では、APIにデータを送らずオンプレでLLMを運用する要求が高まっていますが、量子化なしではGPU調達コストがPoCを阻む要因でした。INT4量子化と蒸留の組み合わせにより、中堅企業でも現実的な投資で自社LLM運用が可能です。

DE-STKでは、量子化はLLM導入コスト最適化の第一歩と位置付けています。モデル選定、量子化手法の検討、推論基盤構築までを一貫してご支援します。

まとめ――量子化はLLM民主化の基盤技術

  • 量子化は重みのビット幅を削減することで、メモリと推論速度を改善する基盤技術です
  • GPTQ・AWQ・GGUF・bitsandbytesが主要手法で、用途により使い分けます
  • QATとBitNet b1.58は極低ビット領域での次世代アプローチです
  • 4ビット量子化の精度劣化は数%以内に収まるケースが多く、実務で十分利用可能です
  • 量子化はLLMのTCOを10倍規模で削減し、オンプレ展開やエッジ実行を現実化します

DE-STKでは、量子化を含むLLM推論最適化、自社データ基盤との統合、オンプレ展開までをサポートします。コスト制約下でも高品質なAI活用を実現するためのご相談をお待ちしています。

よくある質問(FAQ)

Q. LLMの量子化とは何ですか?

A. モデルの重みパラメータをFP16などの高精度フォーマットからINT4/INT8などの低精度フォーマットに変換する技術です。メモリ使用量を1/2〜1/4に削減し、推論速度も向上させることができます。

Q. 量子化するとLLMの性能はどのくらい低下しますか?

A. 8bit量子化ではほぼ性能劣化なし、4bit量子化でもPerplexityの増加は数%以内に収まることが多いです。ただし、タスクやモデルにより異なるため、実際のユースケースでの評価が重要です。

Q. GPTQ、AWQ、GGUFはどれを選べばよいですか?

A. GPU環境でAPI提供する場合はAWQ(vLLMとの相性が良い)、CPU/GPU混合環境やローカル実行にはGGUF(llama.cpp/Ollama対応)、研究用途で細かい制御が必要な場合はGPTQが適しています。