1
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 8: llama.cppとGGUF形式の世界

ローカルLLM革命の立役者

2023年3月、一人の開発者Georgi Gerganovが公開したプロジェクトが、LLMの世界を大きく変えました。それが「llama.cpp」です。

それまで、大規模言語モデルを動かすには高価なGPUと複雑なPythonの環境構築が必要でした。しかしllama.cppは、純粋なC++だけでLLMを動かすことを可能にしました。

MacBookやWindowsのノートPC、さらにはRaspberry Piでさえも、このツールを使えばLLMを動かせるようになったのです。

llama.cppの設計思想

llama.cppが成功した理由は、明確な設計思想にあります:

1. 依存関係の最小化

多くのAIプロジェクトは、PyTorch、CUDA、cuDNN、Python環境など、複雑な依存関係を持ちます。llama.cppは、標準C++だけで動作することを目指しました。

従来のLLM実行環境:
Python → PyTorch → CUDA → cuDNN → GPU Driver

llama.cpp:
C++ → (オプション: CUDA/Metal)

2. 量子化を前提とした設計

llama.cppは最初から「量子化されたモデルを動かす」ことを目的として設計されています。メモリ効率と推論速度の両方を最適化した実装になっています。

3. ハードウェア最適化

Apple SiliconのMetal、NVIDIAのCUDA、AMD、さらにはARM CPUまで、様々なハードウェアに最適化されています。

GGUFの誕生

llama.cppの初期は「GGML」という形式を使っていました。しかし、いくつかの問題がありました:

  • モデルごとに異なるファイル構成
  • バージョン間の互換性の問題
  • メタデータの管理が困難

これらの問題を解決するために生まれたのが「GGUF(GPT-Generated Unified Format)」です。

GGUFの特徴

  1. 自己記述的: モデルの情報がすべてファイル内に含まれる
  2. 前方互換性: 古いバージョンのファイルも読める
  3. 拡張可能: 新しいメタデータを追加しても既存ツールで読める

GGUFファイルの構造を理解する

GGUFファイルは、整理された本棚のような構造をしています:

GGUFファイル
├── ヘッダー(本棚の目録)
│   ├── マジックバイト "GGUF"  → これがGGUFファイルである証
│   ├── バージョン番号         → ファイル形式のバージョン
│   ├── テンソル数            → 重みの数
│   └── メタデータ数          → 付加情報の数
│
├── メタデータ(本の背表紙情報)
│   ├── モデル名
│   ├── アーキテクチャ
│   ├── 隠れ層のサイズ
│   ├── 注意ヘッドの数
│   ├── トークナイザー情報
│   └── ...その他多数
│
└── テンソルデータ(本の中身)
    ├── 埋め込み層の重み
    ├── Attention層の重み
    ├── FFN層の重み
    └── 出力層の重み

この構造の優れた点は、すべてが1つのファイルに収まることです。

従来のHuggingFace形式では、config.jsontokenizer.jsonmodel.safetensorsなど複数のファイルが必要でした。GGUFなら1つのファイルをコピーするだけで、モデルを移動できます。

なぜGGUFが選ばれるのか

ローカル推論に最適

GGUFは、ローカルPCでの推論を念頭に設計されています:

  • メモリマップによる効率的なファイル読み込み
  • 必要な部分だけをメモリに載せる遅延読み込み
  • CPU、GPU、Apple Siliconすべてで動作

シンプルな配布

# GGUFモデルの配布は簡単
1. ファイルをダウンロード
2. llama.cppに渡す
3. 動く

# 従来の方法
1. Pythonをインストール
2. PyTorchをインストール
3. transformersをインストール
4. モデルをダウンロード
5. 設定ファイルを確認
6. 動く(かもしれない)

GGUFが適さないケース

万能に見えるGGUFですが、以下のケースでは他の形式を検討すべきです:

ファインチューニングを予定している場合

GGUFは推論専用の形式です。量子化されたモデルを追加学習することはできません。学習を予定しているなら、元のFP16/BF16形式を保持しておきましょう。

GPUサーバーでの高スループット推論

大量のリクエストを処理するサーバー環境では、AWQやGPTQの方がvLLMとの組み合わせで高いスループットを実現できることがあります。

llama.cppエコシステム

llama.cppを中心に、豊富なツールが揃っています:

コアツール

  • llama-cli: コマンドラインで対話的に使用
  • llama-server: OpenAI互換のAPIサーバー
  • llama-quantize: 量子化ツール

言語バインディング

  • llama-cpp-python: Pythonから利用
  • llama.cpp-rs: Rustから利用
  • LLamaSharp: C#/.NETから利用

アプリケーション

  • Ollama: llama.cppベースの使いやすいLLMランナー
  • LM Studio: GUIでモデルを管理・実行
  • Jan: オープンソースのChatGPT代替

Tips: 初めてのGGUF

ダウンロードのコツ

HuggingFace上のGGUFモデルは、通常ファイル名に量子化レベルが含まれています:

llama-2-7b-Q4_K_M.gguf    ← 4ビットk-quant Medium
llama-2-7b-Q8_0.gguf      ← 8ビット

迷ったらQ4_K_Mを選んでください。サイズと品質のバランスが良好です。

ファイルサイズの目安

7Bモデル:
├── FP16: 約14GB
├── Q8_0: 約7.5GB
├── Q4_K_M: 約4GB
└── Q2_K: 約2.5GB

13Bモデル:
├── FP16: 約26GB
├── Q8_0: 約14GB
├── Q4_K_M: 約7.5GB
└── Q2_K: 約5GB

動作確認

GGUFファイルが正しいか確認するには、先頭4バイトを見ます:

xxd -l 4 model.gguf
# 正しい出力: 00000000: 4747 5546  GGUF

「GGUF」という文字列が見えれば、正しいGGUFファイルです。

次回予告

Day 9では「GGUF量子化レベルの選び方」について解説します。Q4_K_M、Q5_K_M、Q8_0など、謎めいた名前の意味と、自分のユースケースに合った選び方を学びます。


llama.cppとGGUFは、「高性能なAIは高価なハードウェアでしか動かない」という常識を覆しました。今や、誰もが手元のPCでLLMを動かせる時代です。

1
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
1
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?