「量子化」と一括りにされがちだが、学習時と推論時でやっていることは別物。
BushidoMythosの小型 LLM で両方を実測し、何がどれだけ得かを整理した。
研究用コードの実験ログ。投資助言ではありません。ローカル/Colab での部分評価・n=1 のため絶対値は本番と異なるが、方向性はかなり明確。
TL;DR
- 学習トラック=8-bit optimizer:オプティマイザ状態(Adam の m,v)を圧縮 → ほぼ無損失でピークメモリ −600MB(−19%)。
- 推論トラック=INT8 量子化:モデル重みを圧縮 → サイズ −36%。ただし品質劣化はモデル依存(汎用モデルで +数%、金融特化モデルでは +31〜47% と大きい)。
- 圧縮対象もフェーズも違うので、分けて検討・分けて検証するのが安全。
まず:何が違うのか
| 8-bit optimizer | INT8/INT4 量子化 | |
|---|---|---|
| 圧縮対象 | オプティマイザ状態(m, v) | モデル重み |
| フェーズ | 学習 | 推論(または QLoRA) |
| 品質リスク | ほぼ無し | 小〜中(要検証) |
| 検証軸 | 学習 loss が一致するか | 推論 PPL の劣化幅 |
| 代表実装 | bitsandbytes AdamW8bit
|
quantize_dynamic / bitsandbytes / GPTQ / AWQ |
学習時は Adam のオプティマイザ状態(fp32 で 8 byte/param)が大きな固定費になる(活性化が最大になる設定もある)。推論時は 重みが支配的。叩く場所が違う。
トラックA:学習 — 8-bit optimizer
背景
Adam は各パラメータに m(1次)と v(2次)を fp32 で持つので 8 byte/param。重みより重い。ここを block-wise に 8-bit 量子化(bitsandbytes は Dettmers らの「8-bit Optimizers」系の実装)すると ~2 byte/param に。重みは触らない。
実測(98.6M モデル, 50 step, A100, fp32)
| final loss | peak メモリ | 時間 | |
|---|---|---|---|
| fp32 AdamW | 11.2494 | 3236 MB | 15.5s |
| 8-bit AdamW | 11.2470 | 2636 MB | 14.0s |
- ほぼ無損失:全 step の loss 最大差 = 0.00379。
- ピークメモリ −600MB(−19%)。理論オプティマイザ状態 fp32 789MB → 8-bit 197MB(−592MB)とほぼ一致 → 主因はオプティマイザ状態由来と見てよい。
- 時間は今回僅かに高速だが、短時間実験なので誤差の範囲(環境・kernel・サイズ依存)。
効果のスケール
削減は params に比例: 520M で ~3.1GB、1B で ~6GB。bf16/gradient checkpointing で重み・活性化を削るほど、相対的にオプティマイザ状態の比率が上がり 8-bit の価値が増す(今回の比較は fp32 なので一般論として)。
トラックB:推論 — INT8 量子化
背景
推論では学習用の状態は不要で、重みを小さくしたい。PyTorch の dynamic quantization は nn.Linear を INT8 化(較正不要・CPU・追加依存なし)。
実測(98.6M モデル, CPU, 部分評価)— 2つのチェックポイントで
| checkpoint | サイズ | WikiText↓(汎用) | finance↓(ドメイン) |
|---|---|---|---|
| phase1(汎用)fp32 | 395 MB | 61.50 | 1761.13 |
| phase1 INT8 | 254 MB | 65.41(+6.3%) | 1807.23(+2.6%) |
| phase5(金融特化)fp32 | 395 MB | 338.94 | 43.56 |
| phase5 INT8 | 254 MB | 444.29(+31.1%) | 63.85(+46.6%) |
- サイズはどちらも −141MB(−36%)。
- だが品質劣化はモデルに強く依存した。汎用 phase1 では +2.6〜6.3% と軽微に見えたが、金融特化 phase5 では +31〜47% と大きく劣化。
- なぜ phase1 は小さく見えたか:phase1 の finance PPL は 1761(金融未学習=元々ダメ)。量子化ノイズが絶対値で同程度でも、巨大な PPL に対しては比率が小さく出る。phase5 は finance PPL 43.56(良い)なので、同じノイズが +46.6% に。
- 教訓:量子化の劣化は「実際にデプロイするモデル」で測れ。汎用/未学習モデルでの「ほぼ無損失」は誤解を招く。小さい(98.6M)fine-tune 済みモデルは INT8 dynamic に敏感(冗長性が少ない)。
-
36% 止まりの理由:
nn.Embedding(入力埋め込み ~154MB)は dynamic quant 対象外で fp32 のまま。Linear 115 層だけ INT8。 - 注:「サイズ」は量子化後モデルの
state_dictをシリアライズしたサイズで、配布形式(GGUF / GPTQ / AWQ)のファイルサイズとは一致しない。
参考 fine-tune 済みモデルで精度が悪化する関連論文
-
Post-SFT quantization は suboptimal になりやすい
RoSTE 論文は、通常の流れである「SFT後にPTQする」方法は、fine-tuning と quantization の相互作用を使えず性能が落ちやすい、と述べています。これは phase5 で大きく劣化した結果とかなり近いです。
出典: RoSTE: Quantization-Aware Supervised Fine-Tuning -
downstream task ごとに量子化劣化はかなり変わる
405Bまでの instruction-tuned LLM 量子化評価では、量子化劣化は手法・モデルサイズ・bit幅・タスクで大きく変わり、特に instruction following や hallucination detection など一部タスクは例外的に弱いと報告されています。
出典: A Comprehensive Evaluation of Quantized Instruction-Tuned LLMs -
量子化は重要特徴/outlierに弱い
LLM.int8() は、少数の outlier feature がモデル性能に非常に重要で、そこを普通にINT8化すると性能が壊れるため、outlierだけ16-bitで扱う mixed precision を提案しています。あなたの phase5 では、金融特化で重要になった特徴・専門家・lm_head周辺が INT8 dynamic quantization のノイズに敏感になった可能性があります。
出典: LLM.int8() NeurIPS 2022 -
calibration data / 評価データで結果が大きく変わる
calibration data が pruning/quantization 後の downstream performance に大きく影響するという研究があります。PyTorch dynamic quantization は calibration不要ですが、逆に言うと金融ドメインに合わせた補正がないため、phase5の専門能力を守れなかったとも解釈できます。
出典: How Does Calibration Data Affect PTQ? -
学習が進むほど量子化に弱くなる場合がある
ICLR 2026 の “Training Dynamics Impact Post-Training Quantization Robustness” は、学習が進み、特にLR decay後に validation loss は下がる一方で quantization error が大きくなる現象を報告しています。あなたの phase1→phase5 も「性能が良くなった checkpoint ほど量子化誤差が目立つ」という意味で近いです。
出典: Training Dynamics Impact Post-Training Quantization Robustness
なぜ「分ける」のが安全か(設計判断)
最初に混同せず2トラックに分離した。理由:
- 独立にテスト可能(8-bit opt は学習 loss、INT8 は推論 PPL で検証)
- 互いに干渉しない(片方を入れても他方は不変)
-
フラグで opt-in・既定 off → 回帰なし(
--optim8bit/ 量子化スクリプト別建て)
使い分け
| 目的 | 使うもの |
|---|---|
| 自前モデルを大きく学習したい(同じ GPU で) |
8-bit optimizer(--optim8bit) |
| 学習済みモデルを軽くデプロイ/配布したい | INT8 量子化(CPU は dynamic、GPU は bitsandbytes/GPTQ/AWQ) |
| 大規模モデルを少リソースで適応 | QLoRA(4bit 重み + LoRA、両方使う) |
正直な注意点
- 8-bit optimizer:削減はオプティマイザ状態のみ(活性化が支配的なら効果限定 → gradient checkpointing 併用)。bitsandbytes/CUDA 依存。resume は同じ設定で(不一致なら momentum リセット)。
- INT8 量子化:埋め込みは未量子化(さらに削るなら埋め込み量子化や INT4)。dynamic quant は CPU 専用。GPU 推論は別方式。品質は要検証(今回は +数%)。
- いずれも部分評価・小モデル・n=1の数値。方向性はかなり明確だが、絶対値は本番と異なる。
まとめ
| 8-bit optimizer(学習) | INT8 量子化(推論) | |
|---|---|---|
| 効果 | ピークメモリ −600MB(−19%) | サイズ −36% |
| 品質 | ほぼ無損失(loss 差 0.004) | モデル依存:汎用 +数% / 特化 +31〜47% |
| スケール | params 比例(1B で ~6GB) | 埋め込み未対応で 36% 止まり |
| 適用 | 学習を大きく | 推論を軽く |
「量子化」は一つの技ではなく、学習用と推論用の2つの道具。混同せず、圧縮対象とフェーズで使い分けるのが、少リソースで効かせるコツだった。