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?

LLM量子化 Day 19: チェックポイント機能

Last updated at Posted at 2025-12-18

科学と神々株式会社アドベントカレンダー 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フレームワークを活用したユーザーフレンドリーなコマンドラインインターフェースの設計について解説します。


「備えあれば憂いなし」——チェックポイント機能は、この格言をソフトウェアで実現したものです。大規模処理では、中断に備えることが当たり前の設計となります。

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?