見出し画像

結局 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

https://www.omrimallis.com/posts/understanding-how-llm-inference-works-with-llama-cpp/

この「GGML = PyTorch」のざっくりとしたイメージが llama.cpp 理解に役立つ

① llama.cpp の始まり

llama.cpp の 説明文:

Port of Facebook's LLaMA model in C/C++

https://github.com/ggerganov/llama.cpp

から分かる通り、llama.cpp は Python で書かれた LLaMA を GGML(C/C++)で「書き直す」プロジェクトとして始まった(ref)。
Port of … の「Port」すなわちポーティングは「別の言語で書き直す」ことを表す。

・ラッパー:ライブラリの機能を同じ言語でラッピング
・バインディング:ライブラリの機能を別の言語でラッピング
ポーティング:ライブラリを別の言語で書き換え

https://qiita.com/kawamou/items/05028c1a871d42119473

PyTorch で書かれた LLaMA を GGML(C/C++)で書き直すため、オリジナル実装では未対応の機能、例えば Mac の GPU 対応(Metal)や CPU の最適化が可能となる。

Apple の M1/M2/M3 シリーズの CPU (ARM64 arch) の SIMD 演算命令(NEON) や、Intek x86 の SIMD 演算命令 (AVX/AVX2) も最適化実装しており、CPU 上で高速に実行するための様々な工夫が折り込まれています。

https://zenn.dev/turing_motors/articles/f5f19f875bd8ba

コチラに llama.cpp の初期段階に書かれた実装があるが、イメージとして:

  • オリジナル実装の重みを GGML のファイルフォーマットに変換

  • 重みを割り当てるモデルを GGML ライブラリで実装

斜め読みした感じ、ざっくりと上記のような構成になっている様子。
GGML を使って様々な LLaMA アーキテクチャのポーティングが実装されていった。

② GGUF の登場

GGUF は GGML ライブラリにおけるモデルの出力ファイル形式である(.pth 等がイメージとして近い)。
当初はライブラリ名と同じ GGML がファイル形式の名称だったが、GGML ライブラリの進化に合わせ 2023 年 8 月に生まれたのが GGUF。
ファイルフォーマットとしての表現力が向上した他 LLaMA 以外のモデルもサポート可能に。

これにより、Llama以外の言語モデル(falcon, rwkv, bloom, etc.)がllama.cppでサポートできるようになる。サポートするモデルは段階的に増える予定

https://note.com/bakushu/n/nbe8d2813c76b

③ 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).

https://github.com/rustformers/llm/blob/main/crates/ggml/README.md

余談:llama.cpp の実装に踏み込む

GGML で llama.cpp がどのように実装されているか、コード詳細は下記のブログに詳しい。

この記事が気に入ったらサポートをしてみませんか?