はじめに
こんにちは、株式会社ルーデルのデータサイエンス部でAIエンジニアをしている Yuto Moriです。
LLMをローカルPCやモバイル端末で動かすとき、最初にぶつかる制約は多くの場合「メモリ」だと思います。
たとえば、数十億〜数百億パラメータ規模のモデルをそのまま読み込もうとすると、重みだけで数GB〜数十GBのメモリを消費します。
この問題に対して使われる代表的な技術が量子化です。
量子化は、モデルの重みを高精度な数値表現 (FP16/BF16) から、低ビット表現 (INT8やINT4) に変換する技術です。単にパラメータ数を減らすのではなく、ニューラルネットワーク内部の数値表現そのものを粗く近似します。
最近Googleは、Gemma 4に対して Quantization-Aware Training、QAT を適用したモデルを公開しました。
簡単に言えば、学習されたモデルを量子化するのではなく、量子化されることを前提に追加学習されたモデルです。
この記事では、LLM量子化の基本から、PTQの限界、QATの考え方、そしてGoogle Gemma 4 QATの特徴までを整理し、最後にGemma 4 QATをローカルで動かす簡単なハンズオンを紹介します。
1. なぜLLM量子化が必要か
LLMの推論で大きな問題になるのは、主に以下の3つです。
- モデルの重みが大きい
- 推論時のメモリ帯域がボトルネックになりやすい
- 長文ではKV cache (KeyとValueを再利用するために保存しておく推論時メモリ) も大きくなる
数値表現とメモリサイズの関係を整理しておきます。
コンピュータ上では、数値はbit列として保存されます。1 byteは8 bitなので、1つのパラメータを何bitで表すかによって、モデル全体の重みサイズが決まります。
| 数値表現 | bit数 | byte数 |
|---|---|---|
| FP32 | 32bit | 4byte |
| FP16 | 16bit | 2byte |
| BF16 | 16bit | 2byte |
| INT8 | 8bit | 1byte |
| INT4 | 4bit | 0.5byte |
FP32/FP16/BF16は浮動小数点なので、符号部・指数部・仮数部を使って実数を表現します。一方、INT8やINT4は整数表現です。そのため、LLMの重みをINT8/INT4で扱う場合は、FP16/BF16の値をそのまま保存するのではなく、scaleなどを使って低ビット整数に近似します。
次に、モデルの重みについて考えます。
7Bパラメータのモデルを例にすると、重みだけでもおおよそ以下のメモリが必要です。
| 数値表現 | 1パラメータあたり | 7Bモデルの重みサイズ |
|---|---|---|
| FP32 | 4 byte | 約28GB |
| FP16/BF16 | 2 byte | 約14GB |
| INT8 | 1 byte | 約7GB |
| INT4 | 0.5 byte | 約3.5GB |
実際にはscaleなどの補助情報も必要なので、この通りに完全に小さくなるわけではありません。それでも、FP16からINT4にできれば、重みサイズは理論上およそ4分の1になります。
これは単に保存容量が小さくなるだけではありません。
LLMの推論では、巨大な重み行列を何度もメモリから読み出します。特にbatch sizeが小さいローカル推論では、GPUやCPUの演算能力よりも、メモリ帯域がボトルネックになることがあります。重みを低ビット化できれば、読み出すデータ量が減り、推論速度の改善につながる可能性があります。
市販のGPUでLocal LLMを動かそうとすると、だいたいメモリが乗らなくて断念することが多いです。量子化技術によってモデルサイズが減少し、想定よりも高精度なモデルを動作させることができるようになりました。
2. 量子化の基本
量子化とは、モデル内の連続的な数値を、より少ないビット数で表現できる離散値に近似することです。
たとえば、もとの重みがFP16で以下のような値を持っていたとします。
[0.0132, -0.4871, 0.2217, 1.9324, ...]
これをINT8やINT4の整数値に変換します。
INT8ならおおむね256段階、INT4なら16段階で値を表現します。当然、元の値を完全には表現できません。そこで、scaleやzero-pointを使って、元の実数値を整数の範囲に写像します。
典型的には、以下のような変換を考えます。
q = round(x / scale)
x_hat = scale * q
ここで、x は元の値、q は量子化後の整数値、x_hat は量子化された値を再び実数空間に戻した近似値です。
量子化後のモデルは、ざっくり言えば次のような形になります。
量子化前:
W_fp16
量子化後:
W_int4 + scale
重要なのは、量子化は不可逆な近似だということです。元のFP16の値をINT4に丸めると、情報の一部は失われます。そのため、量子化後のモデルは元のモデルとまったく同じ振る舞いにはなりません。
量子化にはいくつかの粒度があります。
| 方式 | 内容 |
|---|---|
| per-tensor quantization | テンソル全体で1つのscaleを使う |
| per-channel quantization | チャネルごとにscaleを使う |
| group-wise quantization | 一定数の重みごとにscaleを使う |
| per-token quantization | token単位でactivationのscaleを決める |
こちらの記事でそれぞれの量子化の方法が解説されています。
https://apxml.com/courses/practical-llm-quantization/chapter-1-foundations-model-quantization/quantization-granularity
3. PTQの限界とQATの考え方
量子化には大きく分けて、PTQ と QAT があります。
PTQは Post-Training Quantization の略です。名前の通り、学習済みモデルを後から量子化する方法です。
学習済みモデル
↓
後処理で量子化
↓
INT8 / INT4モデル
PTQの利点は、追加学習が不要で手軽なことです。モデルを一から再学習する必要がなく、既存のFP16/BF16モデルを後処理で圧縮できます。
しかし、ビット数が下がるほどPTQは難しくなります。INT8では精度劣化が小さくても、INT4、INT3、INT2のように低ビットになるほど、量子化誤差は大きくなります。特にLLMでは、activationの外れ値やlogitsの微妙な差が出力トークンの選択に影響するため、単純な丸めでは品質が落ちやすくなります。
そこで出てくるのが QAT、Quantization-Aware Training です。
QATは、量子化を学習中または追加学習中にシミュレートする方法です。
通常の学習では、forward passでFP16/BF16の重みをそのまま使います。
通常の学習:
forward: W_fp16で計算
backward: W_fp16を更新
一方、QATでは、forward passでfake quantizationを入れます。
QAT:
forward: fake_quantize(W_fp16)で計算
backward: W_fp16を更新
fake quantizationとは、実際には低ビット整数に完全変換するのではなく、「量子化されたらどう見えるか」をforward中に模擬する処理です。丸めによる誤差をforward passで発生させ、その誤差込みでlossを計算します。
つまり、この量子化で発生する誤差を含めた状態で学習するということです。
PTQとQATの違いを整理すると、以下のようになります。
| 観点 | PTQ | QAT |
|---|---|---|
| タイミング | 学習後 | 学習中または追加学習中 |
| 追加学習 | 基本なし | あり |
| 目的 | 既存の重みをうまく丸める | 量子化されても壊れにくい重みに調整する |
| 長所 | 手軽・低コスト | 低ビットでも品質を保ちやすい |
| 短所 | 低ビットで劣化しやすい | 学習コストがかかる |
4. Google Gemma QATは何が新しいか
GoogleはGemma 3の時点で、QATを適用したモデルを公開していました。
Gemma 3 QATでは、Q4_0量子化形式を前提に、量子化後も品質が落ちにくいように追加学習されたcheckpointが提供されました。Googleの説明では、非量子化checkpointの出力確率をtargetとして使い、約5,000 stepsのQATを行っています。
これは、単に正解ラベルに合わせるfine-tuningというより、元の高精度モデルの出力分布に近づける蒸留寄りのQATと捉えると理解しやすいです。
イメージとしては、以下のような構造です。
Teacher:
BF16の元モデル
Student:
量子化を模擬したQATモデル
同じ入力を入れる
↓
Studentの出力分布がTeacherに近づくように追加学習
↓
量子化後も元モデルに近い振る舞いを保つ
そして、Gemma 4 QATではこの流れがさらに実用寄りに拡張されています。
Gemma 4 QATでは、主に次のような形式が提供されています。
- unquantized QAT checkpoint
- GGUF Q4_0
- vLLM向けのcompressed tensors
- モバイル向けに最適化された形式
5. Gemma 4の簡単なハンズオン:LM Studioで動かす
最後に、Gemma 4 QATをローカルで動かしてみます。
ここでは、GUIで扱いやすい LM Studio を使います。LM StudioはローカルLLMをPC上で実行できるデスクトップアプリで、Hugging Face上のGGUFモデルを直接検索・ダウンロードして実行できます。
今回使うモデルは、Gemma 4 QATのGGUF版です。
google/gemma-4-12B-it-qat-q4_0-gguf
または、LM Studio Communityで公開されている以下のモデルも使えます。
lmstudio-community/gemma-4-12B-it-QAT-GGUF
LM Studio Community版は、GoogleのQAT済みGemma 4をもとに、LM Studioチームがllama.cppでGGUF化したモデルです。Hugging Faceのmodel cardでは、12B params、Q4_0、ファイルサイズ約6.98GBと記載されています。
5.1 LM Studioをインストールする
まず、LM Studioをインストールします。
公式サイトからOSに合った版をダウンロードします。
https://lmstudio.ai/
LM Studioは、ローカル環境でLLMを動かすためのGUIアプリです。モデルの検索、ダウンロード、ロード、チャット、ローカルAPIサーバー化まで一通りGUIで扱えます。
5.2 Gemma 4 QAT GGUFを検索する
LM Studioを起動したら、Models Search画面を開きます。
検索欄に、以下のいずれかを入力します。
google/gemma-4-12B-it-qat-q4_0-gguf
または、
lmstudio-community/gemma-4-12B-it-QAT-GGUF
5.3 モデルをロードする
ダウンロードが完了したら、Chat画面またはModel Loaderからモデルを選択してロードします。
LM Studioでは、モデルロード時に以下のようなパラメータを調整できます。
| 項目 | 意味 |
|---|---|
| Context Length | 一度に扱う文脈長 |
| GPU Offload | どの程度GPUに載せるか |
| Temperature | 出力のランダム性 |
| Top-p | samplingの候補範囲 |
最初はデフォルト設定で構いません。メモリ不足になる場合は、Context Lengthを下げる、GPU Offloadを調整する、より小さいモデルを使う、といった対応をします。
5.4 試すプロンプト
ではこの記事で紹介したLLM量子化について聞いてみましょう!
日本語説明:
LLMの量子化とQATの違いを、深層学習の基礎を知っている人向けに説明してください。
出力速度も想像よりも早く、精度もいい感じです。難易度が比較的簡単なタスクであれば、十分だと思います。
まとめ
LLM量子化は、単にモデルファイルを小さくする技術ではありません。
重み、activation、KV cacheなどの数値表現を低ビット化し、ローカルPC、モバイル端末、エッジデバイスでLLMを扱いやすくするための技術です。
PTQは、学習済みモデルを後から量子化する手法です。手軽で実用的ですが、INT4以下の低ビット化では品質劣化が問題になりやすくなります。
一方、QATは量子化を学習中にシミュレートし、量子化されても壊れにくいモデルに再調整する手法です。
今後、LLMをローカルやモバイルで動かす流れが強まるほど、量子化はますます重要になります。
特に「Claude Fable 5」のように、開発企業がモデルを管理するクローズドなLLMは、企業の判断によって突然サービスの提供が停止されるリスクがあります。その点、オープンウェイトのLLMであれば、一度公開されたモデルをローカル環境にダウンロードしておくことで、基本的には半永久的に使用し続けることができます。
Reference
▼新卒エンジニア研修のご紹介
レアゾン・ホールディングスでは、2025年新卒エンジニア研修にて「個のスキル」と「チーム開発力」の両立を重視した育成に取り組みました。 実際の研修の様子や、若手エンジニアの成長ストーリーは以下の記事で詳しくご紹介していますので、ぜひご覧ください!
▼採用情報
レアゾン・ホールディングスは、「世界一の企業へ」というビジョンを掲げ、「新しい"当たり前"を作り続ける」というミッションを推進しています。 現在、エンジニア採用を積極的に行っておりますので、ご興味をお持ちいただけましたら、ぜひ下記リンクからご応募ください。

