科学と神々株式会社アドベントカレンダー 2025
LLM量子化 Day 19: チェックポイント機能
「途中で止まってもやり直し」からの解放
大規模モデルの量子化は、数時間かかることがあります。70Bモデルの量子化中に停電が起きたら?Ctrl+Cを押してしまったら?すべてを最初からやり直すのは、精神的にも時間的にも大きな負担です。
チェックポイント機能は、この問題を解決します。「中断しても、最後に完了したレイヤーから再開できる」——これがチェックポイントの本質です。
なぜレイヤー単位なのか
LLMは多数のレイヤー(層)で構成されています:
Llama 2 7B: 32レイヤー
Llama 2 13B: 40レイヤー
Llama 2 70B: 80レイヤー
各レイヤーは独立して量子化できます。だから、「レイヤー15まで完了」という状態を保存しておけば、レイヤー16から再開できます。
量子化進行状況:
Layer 0 [████████████████████] 完了
Layer 1 [████████████████████] 完了
...
Layer 14 [████████████████████] 完了
Layer 15 [████████████████████] 完了
Layer 16 [██████████ ] ← 中断
...
Layer 31 [ ] 未処理
中断後に再開すると、Layer 16から続行できます。
チェックポイントの仕組み
チェックポイントは、以下の情報を保存します:
1. メタデータ(checkpoint_metadata.json)
{
"total_layers": 32,
"completed_layers": 15,
"config_snapshot": {
"target_format": "gguf",
"quantization_level": "Q4_K_M",
"output_dir": "./output"
},
"started_at": "2024-12-19T10:00:00",
"last_updated": "2024-12-19T10:45:30"
}
2. レイヤー状態ファイル(layer_N.pkl)
各レイヤーの量子化結果を個別に保存します。
.checkpoint/gguf-Q4_K_M/
├── checkpoint_metadata.json
├── layer_0.pkl
├── layer_1.pkl
├── ...
└── layer_14.pkl
設定の互換性チェック
再開時に重要なのが、「同じ設定で再開しているか」のチェックです。
中断時: GGUF Q4_K_M で量子化中
再開時: GGUF Q5_K_M で再開を試みる → エラー!
異なる設定で再開しようとすると、結果が破損する可能性があります。チェックポイントシステムは、設定の互換性を自動的に検証します:
検証項目:
├── target_format: GGUF/AWQ/GPTQ が一致するか
├── quantization_level: Q4_K_M 等が一致するか
└── その他の重要な設定パラメータ
不一致がある場合は、明確なエラーメッセージで知らせます。
チェックポイントのライフサイクル
1. 量子化開始
└── checkpoint.initialize(total_layers, config)
2. 各レイヤー処理後
└── checkpoint.save_layer(layer_index, layer_state)
3. 量子化完了
└── checkpoint.cleanup() # チェックポイント削除
4. 中断発生(異常終了)
└── チェックポイントファイルは残る
5. 再開
└── Checkpoint.can_resume(checkpoint_dir) → True
└── Checkpoint.from_resume(checkpoint_dir, config)
└── completed_layers から再開
再開可能かどうかの判定
# 概念的なコード
def can_resume(checkpoint_dir):
# メタデータファイルが存在するか
if not (checkpoint_dir / "checkpoint_metadata.json").exists():
return False
# メタデータが読み込めるか
try:
metadata = load_json(checkpoint_dir / "checkpoint_metadata.json")
except:
return False
# 少なくとも1レイヤー完了しているか
return metadata.get("completed_layers", 0) > 0
CLI での動作
ユーザーは特別な操作なしにチェックポイント機能を利用できます:
通常の量子化
$ llm-quantize quantize model gguf -q Q4_K_M
Starting quantization...
Layer 1/32: [████████████████████] 100%
Layer 2/32: [████████████████████] 100%
...
Layer 15/32: [██████████ ] 50%
^C # Ctrl+C で中断
再開
$ llm-quantize quantize model gguf -q Q4_K_M
Resuming from checkpoint: 15 layers completed
Layer 16/32: [████████████████████] 100%
...
Layer 32/32: [████████████████████] 100%
Quantization complete!
Checkpoint cleaned up.
同じコマンドを再実行するだけで、自動的に再開します。
チェックポイントディレクトリの管理
デフォルトでは .checkpoint/ ディレクトリに保存されます:
.checkpoint/
├── gguf-Q4_K_M/ # GGUF Q4_K_M の量子化
│ ├── checkpoint_metadata.json
│ └── layer_*.pkl
├── awq-4bit/ # AWQ 4bit の量子化
│ ├── checkpoint_metadata.json
│ └── layer_*.pkl
└── gptq-4bit/ # GPTQ 4bit の量子化
├── checkpoint_metadata.json
└── layer_*.pkl
異なる形式や量子化レベルは、別々のディレクトリで管理されます。
失敗時のクリーンアップ
チェックポイントは成功時には自動削除されますが、失敗時には残ります:
成功時:
├── 量子化完了
└── チェックポイント自動削除
失敗時(メモリ不足など):
├── 量子化中断
└── チェックポイント残存 → 後で再開可能
不要になったチェックポイントは手動で削除できます:
rm -rf .checkpoint/
Tips: チェックポイントを活かすコツ
1. 十分なディスク容量を確保
チェックポイントファイルは、元モデルサイズの数%程度です。大きなモデルでも数GB程度ですが、ディスク容量には余裕を持たせてください。
2. 長時間処理は画面を離れても大丈夫
# バックグラウンドで実行
nohup llm-quantize quantize model gguf -q Q4_K_M > quantize.log 2>&1 &
# ログを確認
tail -f quantize.log
中断しても再開できるので、安心して長時間処理を実行できます。
3. 設定は変えない
# 中断した処理
llm-quantize quantize model gguf -q Q4_K_M
# 再開時も同じ設定で
llm-quantize quantize model gguf -q Q4_K_M # OK
# 設定を変えると再開できない
llm-quantize quantize model gguf -q Q5_K_M # エラー
4. 複数の量子化を並行実行
# 別々のチェックポイントディレクトリが使われる
llm-quantize quantize model gguf -q Q4_K_M &
llm-quantize quantize model awq -q 4bit &
wait
次回予告
Day 20では「CLI設計」として、Clickフレームワークを活用したユーザーフレンドリーなコマンドラインインターフェースの設計について解説します。
「備えあれば憂いなし」——チェックポイント機能は、この格言をソフトウェアで実現したものです。大規模処理では、中断に備えることが当たり前の設計となります。