llama.cppとは

llama.cppは2023年3月にGeorgi Gerganovがリリースしたオープンソースプロジェクトです。当初はMeta社のLLaMAモデルをCPUで動かすことを目的に開発されましたが、現在はLlama 3・Mistral・Phi・Qwen・Gemmaなど主要なLLMのほとんどに対応しています。

最大の特徴は「CUDAなしでLLMを推論できる」点です。MacのApple Silicon(M1/M2/M3/M4)・WindowsのCPU、さらにはRaspberry Piでも動作します。GPUがあればCUDAやMetal(macOS)で高速化も可能ですが、CPU単体での動作が最低限の要件です。

なぜC++で書かれているか

PythonではなくC++を選んだ理由は速度とポータビリティです。

PyTorchなどPythonベースのフレームワークはCUDAに最適化されており、CPU推論に使うと実行オーバーヘッドが大きくなります。C++で直接メモリ操作と演算を制御することで、SIMD命令(AVX2・AVX-512・NEON)を活用した高速な行列演算が可能になります。

SIMD(Single Instruction Multiple Data)とは、1つの命令で複数のデータを同時に演算するCPU機能です。AVX2対応CPUなら256ビット幅で一度に8つのfloat32を処理できます。llama.cppはSIMD命令をハードコードして、CPU上での行列積を最大限高速化しています。

ggmlテンソルライブラリ

llama.cppの核心はggml(Georgi Gerganov Machine Learning)というテンソルライブラリです。PyTorchの代替として1から作られており、テンソルの演算・量子化・メモリ管理を扱います。

ggmlの特徴として、グラフ構造で演算をあらかじめ記述してから実行する「遅延評価」的な設計があります。演算グラフを事前に最適化できるため、推論時のオーバーヘッドを抑えられます。

量子化がCPUを助ける理由

CPU推論で量子化が特に重要なのは、帯域幅(メモリとCPUの間のデータ転送速度)がボトルネックになるからです。

LLMの推論は演算よりもメモリ読み込みがボトルネックになりがちです。GPUは広い帯域幅を持ちますが、CPUのメモリ帯域は狭く、float16(2バイト)のモデルを読み込むだけで時間がかかります。4ビット量子化にするとデータ量が1/4になり、メモリ帯域のボトルネックが緩和されてトークン生成速度が上がります。

Q4量子化の7BモデルならM1 Macで毎秒30〜50トークン程度の速度が出ることがあります。会話用途では十分な速度です。

サーバーモードとAPIの活用

llama.cppはCLIとして使う以外に、OpenAI互換のREST APIサーバーとして起動することもできます。

./llama-server -m model.gguf --port 8080

これで http://localhost:8080/v1/chat/completions エンドポイントがOpenAI API互換で使えるようになります。既存のOpenAI SDKをそのまま向き先だけ変えてローカルLLMに切り替えられる点が便利です。

OllamaやLM Studioとの関係

OllamaとLM Studioはどちらもllama.cppをバックエンドとして使っているラッパーアプリです。

OllamaはCLI/APIサーバーとして動作し、モデルのダウンロード・管理・実行を ollama run モデル名 という形で一元化してくれます。技術者向けの使い勝手で、プログラムからの利用や自動化に向いています。

LM StudioはGUIアプリケーションで、HuggingFaceからGGUFモデルを検索・ダウンロードしてチャット画面で使えます。非エンジニアでもローカルLLMを試せる手軽さが特徴です。

どちらも根底ではllama.cppの量子化推論エンジンが動いており、GGUFフォーマットのモデルを使います。

Apple Siliconとの相性

llama.cppはApple SiliconのMetal APIに対応しており、GPU(Unified Memory)を活用した高速推論が可能です。Apple Siliconの特徴であるCPU・GPUが同じメモリ空間を共有する「ユニファイドメモリ」アーキテクチャにより、GPUへのデータ転送オーバーヘッドがなく、Macはローカルに動かす環境として特に相性が良いです。

M3 Max(128GB)のようなメモリが大きなMacでは70Bモデルも動作します。

まとめ

llama.cppはC++とSIMD最適化・量子化を組み合わせて、GPUなしでLLMを現実的な速度で動かすことを可能にしたプロジェクトです。OllamaやLM Studioのようなユーザーフレンドリーなツールの多くがバックエンドとして採用しており、ローカルLLMエコシステムのインフラ的な存在になっています。