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?

科学と神々株式会社アドベントカレンダー 2025

LLM量子化 Day 10: GGUFQuantizerの仕組み

量子化処理の舞台裏

llm-quantize quantize model gguf -q Q4_K_M

このコマンドを実行すると、何が起きているのでしょうか?今日は、GGUFQuantizerの内部処理フローを追いかけてみましょう。

処理の全体像

GGUF量子化は、大きく5つのステップで進みます:

1. 準備フェーズ
   └── 設定の検証、チェックポイントの準備

2. モデル読み込み
   └── HuggingFace形式のモデルをメモリに展開

3. 変換フェーズ
   └── FP16 → GGUF形式への変換

4. 量子化フェーズ
   └── 指定されたビット数への量子化

5. 完了処理
   └── ファイル保存、メタデータ記録、クリーンアップ

ステップ1: 準備フェーズ

量子化を始める前に、いくつかの準備が必要です。

設定の検証

指定された量子化レベルが有効かどうかを確認します。Q4_K_Mは有効ですが、Q4_K_X(存在しない)は無効です。

# 概念的なコード
supported_levels = ["Q2_K", "Q3_K_M", "Q4_K_M", ...]
if config.quantization_level not in supported_levels:
    raise ValueError(f"サポートされていないレベル: {config.quantization_level}")

チェックポイントの準備

大規模モデルの量子化は時間がかかります。途中で中断しても再開できるよう、チェックポイントを準備します。

# チェックポイントディレクトリの作成
checkpoint_dir = ".checkpoint/gguf-Q4_K_M"
checkpoint_dir.mkdir(parents=True, exist_ok=True)

# 状態を記録
checkpoint.initialize(total_layers=32, config=config)

ステップ2: モデル読み込み

HuggingFace形式のモデルを読み込みます。

HuggingFace Hubからの場合

# meta-llama/Llama-2-7b-hf のようなIDを指定
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    torch_dtype=torch.float16,  # メモリ節約のためFP16で読み込み
    token=hf_token,  # 認証が必要な場合
)

ローカルディレクトリからの場合

# ./my-model のようなパスを指定
model = AutoModelForCausalLM.from_pretrained(
    "./my-model",
    torch_dtype=torch.float16,
)

この時点で、モデルの重みはメモリ上にFP16形式で展開されています。7Bモデルなら約14GBを消費します。

ステップ3-4: 変換と量子化

ここが核心部分です。HuggingFace形式からGGUF形式への変換と量子化を行います。

変換戦略の選択

llm-quantizeは、利用可能なツールに応じて最適な変換方法を選びます:

llama.cppツールが利用可能?
├── Yes → llama.cppを使った高品質な変換
│         ├── 公式ツールなので品質が保証される
│         ├── k-quantが完全にサポートされる
│         └── 多くのモデルでテスト済み
│
└── No → フォールバック変換
          ├── ggufライブラリを使用
          └── 基本的な変換のみ

llama.cppを使った変換(推奨)

llama.cppが利用可能な場合、2段階で変換が行われます:

Stage 1: HuggingFace → FP16 GGUF
   model.safetensors → model-fp16.gguf

Stage 2: FP16 GGUF → 量子化GGUF
   model-fp16.gguf → model-Q4_K_M.gguf

なぜ2段階なのでしょうか?

1段階目(FP16 GGUF作成)では、モデルの構造をGGUF形式に変換します。この時点ではまだ量子化されていません。

2段階目(量子化)では、llama-quantizeコマンドを使って実際の量子化を行います。k-quantの複雑な混合精度処理は、このステップで実行されます。

出力サイズの推定

量子化前に、出力ファイルのサイズを推定できます:

def estimate_output_size(self):
    # 量子化レベルからビット数を取得
    bits_per_weight = 4  # Q4_K_Mの場合

    # 元のサイズ(FP16 = 16ビット = 2バイト/パラメータ)
    original_size = parameter_count * 2

    # 量子化後のサイズ
    quantized_size = original_size * (bits_per_weight / 16)

    # メタデータのオーバーヘッド(約10%)
    estimated_size = quantized_size * 1.1

    return estimated_size

7Bモデルの場合:

元サイズ: 7,000,000,000 × 2 = 14GB
量子化後: 14GB × (4/16) = 3.5GB
オーバーヘッド込み: 3.5GB × 1.1 ≈ 3.85GB

実際の出力: 約4GB(予測と一致)

ステップ5: 完了処理

量子化が完了したら、後処理を行います。

結果の集計

# 処理時間の計測
duration = time.time() - start_time

# ファイルサイズの取得
file_size = Path(output_path).stat().st_size

# 圧縮率の計算
compression_ratio = file_size / original_size

チェックポイントのクリーンアップ

正常に完了した場合、チェックポイントファイルは不要になるので削除します。

if self.checkpoint:
    self.checkpoint.cleanup()

結果オブジェクトの作成

return QuantizedModel(
    output_path="/path/to/model-Q4_K_M.gguf",
    format="gguf",
    quantization_level="Q4_K_M",
    file_size=4_000_000_000,  # 約4GB
    compression_ratio=0.28,    # 72%削減
    duration_seconds=1800,     # 30分
    source_model_path="meta-llama/Llama-2-7b-hf",
)

エラーハンドリング

量子化中には様々なエラーが発生する可能性があります:

メモリ不足

7Bモデルの量子化には、最低16GB程度のRAMが必要です。足りない場合はエラーになります。

対処法:
- より小さいモデルを選ぶ
- 他のアプリケーションを終了する
- スワップを増やす(非推奨、非常に遅い)

ディスク容量不足

量子化中は一時ファイルが作成されるため、出力サイズの2〜3倍の空き容量が必要です。

外部ツールエラー

llama.cppツールが見つからない、またはエラーを返した場合、適切なエラーメッセージを表示します。

Tips: 量子化を成功させるコツ

十分なリソースを確保

7Bモデル: RAM 16GB以上、ディスク 15GB以上
13Bモデル: RAM 32GB以上、ディスク 30GB以上

進捗を確認する

llm-quantizeは進捗バーを表示します。長時間かかる処理でも、進捗が動いていれば正常です。

中断時の対処

Ctrl+Cで中断しても、チェックポイントが保存されていれば再開できます:

# 同じコマンドを再実行すると、中断したところから再開
llm-quantize quantize model gguf -q Q4_K_M
# "Resuming from checkpoint: 15 layers completed"

トラブルシューティング

量子化が失敗する場合、以下を確認してください:

  1. llama.cppがインストールされているか
  2. 十分なRAMがあるか
  3. ディスク空き容量があるか
  4. モデルがGGUF変換に対応しているか

次回予告

Day 11では「llama.cppとの連携」について解説します。外部ツールを呼び出す設計判断と、フォールバック戦略について学びます。


量子化は「待ち」の作業です。7Bモデルで30分、70Bモデルで数時間かかることもあります。コーヒーを淹れて、のんびり待ちましょう。

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?