0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

学習の 8-bit optimizer と 推論の INT8 量子化— BushidoMythos で実測

0
Last updated at Posted at 2026-06-07

「量子化」と一括りにされがちだが、学習時と推論時でやっていることは別物。
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つの道具。混同せず、圧縮対象とフェーズで使い分けるのが、少リソースで効かせるコツだった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?