【比較】量子化・蒸留・プルーニングの違い¶
概要¶
大きな LLM を「軽く・速く・安く」して使えるようにする工夫は、まとめて モデル圧縮(model compression) と呼ばれます。代表格が 量子化(quantization)・蒸留(knowledge distillation)・プルーニング(pruning:枝刈り) の 3 つです。どれも「モデルを小さくする」ように見えますが、効かせている仕組みがまったく違います。
ざっくり整理すると、量子化は重み・活性の数値表現の精度を落とす(FP32 → FP16 / INT8 / INT4 など)、蒸留は大きな教師モデルの出力を真似るように小さな生徒モデルを学習し直す、プルーニングは重要度の低い重みや構造を削る(多くは削った後に再学習で精度を戻す)手法です。3 つはレイヤーが異なるため排他ではなく組み合わせられますが、精度・サイズ・遅延・対応ハードウェアのトレードオフが違うので、目的を取り違えると「INT4 にしたのに速くならない」「蒸留したら別物の挙動になった」といった的外れな最適化につながります。
例えるなら:分厚い専門書を持ち運ぶ工夫¶
- 量子化 … 同じ本文を、紙を薄くし文字を少し粗く印刷して軽くする。中身(語っていること)は同じだが、細部の表現精度がわずかに落ちる。
- 蒸留 … その専門書を読み込んだ達人が、内容を要約した薄い入門書を書き下ろす。元の本そのものではなく、振る舞いを真似た“別の小さい本”。
- プルーニング … 本の中で滅多に参照しないページ・章を抜き、抜いた後に残りを読み直して辻褄を整える(再学習)。
詳細比較¶
| 比較軸 | 量子化(quantization) | 蒸留(knowledge distillation) | プルーニング(pruning) |
|---|---|---|---|
| 仕組みの本質 | 重み・活性の数値精度を下げる(FP32→FP16/INT8/INT4) | 大きな教師の出力を真似る小さな生徒を学習 | 重要度の低い重み・構造を削除する |
| モデル構造 | 構造は不変(数値型だけ変わる) | 別の小さいモデル(生徒)を新たに用意 | 接続/チャネルが減る(疎化 or 物理的縮小) |
| 学習の要否 | PTQ は学習不要/QAT は学習必要 | 生徒の学習が必須(教師の出力を目標に) | 削った後に再学習(fine-tune)で精度回復が定石 |
| 主な代表手法 | PTQ(動的/静的), QAT, bitsandbytes, GPTQ | Hinton ら 2015(soft target・温度 T) | unstructured(個別重み)/ structured(チャネル単位) |
| 主に削減するもの | 1 パラメータあたりのビット数(メモリ・帯域) | パラメータ総数(生徒を小型化して新規構築) | パラメータ数・演算数(疎化 or 構造削減) |
| 精度への影響 | 低精度ほど劣化リスク。QAT で誤差に適応可 | 教師に近づくが上限は教師と生徒容量に依存 | 削りすぎると劣化、再学習で回復を図る |
| ハードウェア依存 | INT8/INT4 高速化は対応 HW・カーネル前提 | 推論時は通常の小型モデルとして動く | unstructured は密行列のまま=実機高速化しにくい |
| 元モデルとの関係 | 同一モデルの低精度版 | 教師を真似た“別モデル” | 元モデルから一部を取り除いた縮小版 |
3 つはレイヤーが違うため併用可能(例:蒸留で小型化 → 量子化で低精度化 → さらにプルーニング)。順序と再評価をセットで設計する。
よくある誤解¶
- 誤解1:「量子化・蒸留・プルーニングは結局どれも同じ“モデルを小さくする”処理」 — 同じ目的(軽量化)でも仕組みが別物です。量子化は Hugging Face の定義どおり「重みを低精度で保持してメモリ要件を下げる(FP32→FP16/INT8/INT4)」、蒸留は Hinton ら(2015)の「アンサンブル/大モデルの知識を、扱いやすい単一の小モデルに圧縮する」、プルーニングは Han ら(2015)の「重要でない接続を削り、残りを再学習して精度を取り戻す」。混同すると「精度が落ちた原因」を切り分けられなくなります。
- 誤解2:「ビット数を下げれば(INT4 にすれば)必ずその分だけ速くなる」 — 必ずではありません。量子化の主目的はまずメモリ削減で、整数演算による高速化は対応ハードウェア・カーネルがあって初めて効きます。Hugging Face Optimum も省エネは「理論上」と注記し、小規模モデルでは脱量子化(dequantize)のオーバーヘッドで逆に遅く・非効率になり得ると説明しています。「ビットを下げた=必ず高速」と短絡できません。
- 誤解3:「蒸留すれば教師モデルと同じ性能の小型版が手に入る」 — 同一にはなりません。蒸留は教師の出力(ソフトターゲット)を真似るよう生徒を訓練するもので、得られるのは“教師を模倣した別モデル”。性能は生徒の容量と学習設定に依存し、教師と完全一致はしません(Hinton らの主眼も「展開しやすい単一モデルへの圧縮」であって等価変換ではない)。
- 誤解4:「プルーニングすればモデルファイルは必ず物理的に小さく・速くなる」 — 種類によります。PyTorch の枝刈りチュートリアルが示すとおり、非構造化(unstructured)プルーニングは重みをマスクで 0 にするだけで形状は変わらず、密行列のままだと実機の速度・サイズはそのまま、ということが起こります。実機の高速化には構造化(structured:チャネル/ユニットごと削除)プルーニングや疎行列対応が必要です。
実務での選び分け¶
- VRAM に載らない/メモリ・帯域がボトルネック → まず量子化。PTQ(bitsandbytes/GPTQ など)を試し、精度が許容外なら QAT を検討。INT8/INT4 の高速化は対応ハードウェアが前提。
- そもそも別アーキの小型モデルを新規に用意したい/自前タスクに特化させたい → 蒸留。大きな教師から小さな生徒を学習。推論側は普通の小型モデルとして軽い。
- 冗長な重み・構造を削って演算量を下げたい → プルーニング。実機高速化を狙うなら構造化プルーニング+削除後の再学習をセットで。
- 切り分け(速くならない時) → 「メモリは減ったが速度が出ない=量子化の HW/カーネル不一致 or 非構造化プルーニング」「精度が大きく落ちた=低精度化のしすぎ or 削りすぎ/再学習不足」「挙動が元と違う=蒸留で生徒が教師を完全模倣していない」と原因をレイヤーで分ける。
- 併用 → 「蒸留で小型化 → 量子化で低精度化 →(必要なら)構造化プルーニング」の順が一例。各段で必ず評価セットを通し、劣化が出た段を特定する。
ひとことまとめ¶
量子化は「数値の精度を落とす(同じモデルの低精度版・主目的はメモリ削減)」、蒸留は「教師を真似た小さい生徒を学習する(別モデル)」、プルーニングは「重要度の低い重み/構造を削って再学習する(縮小版)」。仕組みが違うので排他ではなく併用可能ですが、精度・速度・ハードウェア依存のトレードオフが異なる――これが選び分けの軸です。
出典・参考¶
- Hinton, Vinyals, Dean「Distilling the Knowledge in a Neural Network」(2015)(アンサンブル/大モデルの知識を展開しやすい単一の小モデルに圧縮する=知識蒸留の原典): https://arxiv.org/abs/1503.02531
- Han, Pool, Tran, Dally「Learning both Weights and Connections for Efficient Neural Networks」(2015)(重要でない接続を削り、残りの重みを再学習して精度を回復する=学習・枝刈り・再学習の 3 段プルーニング): https://arxiv.org/abs/1506.02626
- Hugging Face Optimum「Quantization」(量子化=重み・活性を低精度データ型で表現しメモリ・計算コストを下げる。PTQ の動的/静的と QAT の違い、省エネは「理論上」): https://huggingface.co/docs/optimum/en/concept_guides/quantization
- Hugging Face Transformers「Quantization overview」(量子化=重みを低精度で保持しメモリ要件を下げる。fp32→fp16/bf16、さらに int8/int4。bitsandbytes・GPTQ など): https://huggingface.co/docs/transformers/main/en/quantization/overview
- PyTorch Tutorials「Pruning Tutorial」(非構造化=個別接続を 0 化、構造化=チャネル等をまとめて削除。マスクで疎化する仕組み): https://docs.pytorch.org/tutorials/intermediate/pruning_tutorial.html