量子化(Quantization)とは?AIモデルを軽量化する技術と手法を解説

数十GBの巨大AIモデルをスマートフォンで動かす鍵が「量子化」です。パラメータの精度を少し落とすだけでモデルが数分の一に軽くなる仕組みと、代表的な手法を解説します。

LLMの量子化とは?モデルを軽量化してローカルで動かす技術

AI初心者

AIを知りたい

先生、LLMをパソコンで動かしたいんですが、メモリが足りないみたいです。「量子化」をすると小さくなると聞いたのですが、どういう技術ですか?

AIエンジニア

AIエンジニア

量子化は、モデルの重み(パラメータ)の精度を下げることで、モデルのサイズとメモリ使用量を大幅に削減する技術だよ。例えば、通常のモデルは16ビットの浮動小数点数で重みを保持しているけど、これを4ビットの整数に変換すると、サイズが約1/4になるんだ。

AI初心者

AIを知りたい

精度を下げてしまうと、AIの性能は落ちないんですか?

AIエンジニア

AIエンジニア

実は、適切な量子化を行えば、性能の低下はごくわずかなんだ。例えば4ビット量子化(Q4_K_M)の場合、元のモデルの97〜99%程度の性能を維持しつつ、メモリ使用量を1/4に削減できる。これにより、70億パラメータのモデルがRTX 3060(12GB VRAM)でも動くようになるよ。

量子化とは。

人工知能に関わる言葉である「量子化(Quantization)」について説明します。AIモデルの重みパラメータを高精度(FP16/FP32)から低精度(INT8/INT4)に変換することで、モデルサイズとメモリ使用量を大幅に削減する技術です。推論速度の向上と省メモリ化により、ローカル環境やエッジデバイスでのLLM実行を可能にします。

量子化とは

量子化(Quantization)は、AIモデルの重み(パラメータ)を高精度の数値表現から低精度の数値表現に変換する技術です。通常、LLMの重みはFP16(16ビット浮動小数点数)またはFP32(32ビット)で保持されていますが、量子化によってINT8(8ビット整数)やINT4(4ビット整数)に変換します。

例えば、70億パラメータのLLM(Llama 3 8B)の場合、FP16では約16GBのメモリが必要ですが、4ビット量子化を適用すると約5GBまで削減できます。これにより、一般的なゲーミングPC(RTX 3060/12GB VRAM)でも大規模なLLMを実行可能になります。

量子化の種類

量子化手法 精度 サイズ削減率 性能維持 ツール
FP16(基準) 16ビット浮動小数点 基準 100% –
INT8 8ビット整数 約50% 99%+ bitsandbytes
GPTQ(4bit) 4ビット整数 約75% 97-99% AutoGPTQ
GGUF(Q4_K_M) 4ビット混合精度 約75% 97-99% llama.cpp
AWQ(4bit) 4ビット(活性化考慮) 約75% 98-99% AutoAWQ
GGUF(Q2_K) 2ビット混合精度 約87% 90-95% llama.cpp

GGUF形式とllama.cpp

GGUF(GPT-Generated Unified Format)は、llama.cppプロジェクトで使用される量子化モデルのファイル形式です。CPU+GPU のハイブリッド推論に対応しており、GPUのVRAMが不足している場合でもCPUのRAMを活用してモデルを実行できます。

GGUFの量子化レベルは「Q4_K_M」のような名前で表現されます。Qの後の数字がビット数、K_MはK-quant方式のMediumサイズを意味します。Q4_K_M(4ビット)が最もバランスが良く、推奨される設定です。Q5_K_Mはやや高品質、Q3_K_MやQ2_Kはより小さいが品質は低下します。

GPTQ・AWQ・bitsandbytes

GPTQは、GPU上での推論に特化した量子化手法です。重みの量子化誤差を最小化するよう最適化されており、vLLMやtext-generation-inferenceなどの推論サーバーで広く使われています。

AWQ(Activation-Aware Weight Quantization)は、重みの重要度を活性化(Activation)の分布から推定し、重要な重みはより高い精度を維持する手法です。GPTQよりもさらに高品質な量子化が可能です。

bitsandbytesは、HuggingFaceのtransformersライブラリと統合された量子化ライブラリで、QLoRAでの学習時にも使用されます。4ビットおよび8ビットの量子化に対応しています。

量子化モデルの選び方

利用環境 推奨量子化 理由
RTX 4090(24GB) GPTQ 4bit / GGUF Q5_K_M 高品質、十分なVRAM
RTX 3060(12GB) GGUF Q4_K_M バランス良好
8GB VRAM以下 GGUF Q3_K_M / Q2_K メモリ節約優先
CPU only(16GB RAM) GGUF Q4_K_M(小モデル) CPUでも動作可能
スマートフォン INT4 + 小規模モデル エッジデバイス向け

まとめ

量子化は、大規模AIモデルを限られたハードウェアで実行可能にする重要な技術です。4ビット量子化であれば元のモデルの97〜99%の性能を維持しながら、メモリ使用量を約1/4に削減できます。GGUF、GPTQ、AWQなど複数の手法があり、利用環境と目的に応じて最適な手法を選択することが重要です。

関連記事

PyTorchの動的量子化でモデルサイズを比較するコード

量子化はモデルの重みをFP32からINT8に変換し、ファイルサイズとメモリ使用量を大幅に削減する技術です。PyTorchの動的量子化を実際に試し、サイズ変化を確認しましょう。


import torch
import torch.nn as nn
import os

# シンプルなモデルを定義
class SimpleModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(512, 256)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(256, 128)
        self.fc3 = nn.Linear(128, 10)

    def forward(self, x):
        return self.fc3(self.relu(self.fc2(self.relu(self.fc1(x)))))

model = SimpleModel()
model.eval()

# 元のモデルを保存してサイズ確認
torch.save(model.state_dict(), "model_fp32.pth")
fp32_size = os.path.getsize("model_fp32.pth") / 1024  # KB

# 動的量子化を適用(Linear層をINT8に変換)
quantized_model = torch.quantization.quantize_dynamic(
    model, {nn.Linear}, dtype=torch.qint8
)

# 量子化モデルを保存してサイズ確認
torch.save(quantized_model.state_dict(), "model_int8.pth")
int8_size = os.path.getsize("model_int8.pth") / 1024  # KB

print(f"FP32モデル: {fp32_size:.1f} KB")
print(f"INT8モデル: {int8_size:.1f} KB")
print(f"圧縮率: {int8_size / fp32_size:.1%}")
print(f"サイズ削減: {(1 - int8_size / fp32_size):.1%}")

# 推論精度の比較
dummy = torch.randn(1, 512)
out_fp32 = model(dummy)
out_int8 = quantized_model(dummy)
print(f"出力差の最大値: {(out_fp32 - out_int8).abs().max().item():.6f}")

動的量子化を適用するとLinear層の重みがFP32(4バイト)からINT8(1バイト)に変換され、モデルサイズはおよそ75%削減されます。上の例では出力差は0.01未満に収まることが多く、分類タスクではほぼ精度劣化なしで軽量化できます。