
結局 llama.cpp とは何者なのか?
裏側を知らずとも README 通りにやれば Mac でも LLM 動かせる優れモノだが改めて llama.cpp とは何者なのか。
GGML は C/C++ における PyTorch
llama.cpp を理解する上で、まず GGML を知る必要がある。
GGML は llama.cpp 作者ジョージ・ゲルガノフが作った機械学習ライブラリで C/C++ における PyTorch に対応するライブラリと言って良いはず。C/C++ でモデルを組むことができる。llama.cpp は GGML で書かれている。
a pure C++ implementation of tensors, equivalent to PyTorch or Tensorflow in the Python ecosystem
この「GGML = PyTorch」のざっくりとしたイメージが llama.cpp 理解に役立つ。
① llama.cpp の始まり
llama.cpp の 説明文:
Port of Facebook's LLaMA model in C/C++
から分かる通り、llama.cpp は Python で書かれた LLaMA を GGML(C/C++)で「書き直す」プロジェクトとして始まった(ref)。
Port of … の「Port」すなわちポーティングは「別の言語で書き直す」ことを表す。
・ラッパー:ライブラリの機能を同じ言語でラッピング
・バインディング:ライブラリの機能を別の言語でラッピング
・ポーティング:ライブラリを別の言語で書き換え
PyTorch で書かれた LLaMA を GGML(C/C++)で書き直すため、オリジナル実装では未対応の機能、例えば Mac の GPU 対応(Metal)や CPU の最適化が可能となる。
Apple の M1/M2/M3 シリーズの CPU (ARM64 arch) の SIMD 演算命令(NEON) や、Intek x86 の SIMD 演算命令 (AVX/AVX2) も最適化実装しており、CPU 上で高速に実行するための様々な工夫が折り込まれています。
コチラに llama.cpp の初期段階に書かれた実装があるが、イメージとして:
オリジナル実装の重みを GGML のファイルフォーマットに変換
重みを割り当てるモデルを GGML ライブラリで実装
斜め読みした感じ、ざっくりと上記のような構成になっている様子。
GGML を使って様々な LLaMA アーキテクチャのポーティングが実装されていった。
② GGUF の登場
GGUF は GGML ライブラリにおけるモデルの出力ファイル形式である(.pth 等がイメージとして近い)。
当初はライブラリ名と同じ GGML がファイル形式の名称だったが、GGML ライブラリの進化に合わせ 2023 年 8 月に生まれたのが GGUF。
ファイルフォーマットとしての表現力が向上した他 LLaMA 以外のモデルもサポート可能に。
これにより、Llama以外の言語モデル(falcon, rwkv, bloom, etc.)がllama.cppでサポートできるようになる。サポートするモデルは段階的に増える予定
③ LLM のランタイムとして
(PyTorch が torch.load() でモデルを読み込み実行できるのと似たイメージで)HuggingFace 等にアップされた学習済みモデルを GGUF に変換し 、llama.cpp で読み込み動かすことが可能になった。
GGUF への変換ツール自体も当初から公式が用意している。
つまり(GGUF 化した)LLM のランタイムとしての利用も増えている。
ONNXランタイムみたいな役割。
しかも Mac を始め様々なアーキテクチャ上で動くのでとても良い。
まとめ
ジョージ・ゲルガノフが GGML を作った(ggml.ai)
GGML の応用アプリとして llama.cpp を作った
当初は LLaMA のポーティングに過ぎなかった
様々な LLM を様々なアーキテクチャで動かすプロジェクトに発展した
みたいなのが歴史観だろうか。ジョージ・ゲルガノフすごい。
(調べつつまとめたので詳しい方マサカリお待ちしております)
余談:「GG」とは?
GGML や GGUF のプレフィクス「GG」は作者(ジョージ・ゲルガノフ)のイニシャル。
the "GG" refers to the initials of its originator (Georgi Gerganov).
余談:llama.cpp の実装に踏み込む
GGML で llama.cpp がどのように実装されているか、コード詳細は下記のブログに詳しい。