Upgrade to Pro — share decks privately, control downloads, hide ads and more …

llama.cppのバックエンドggmlを読もう

Avatar for dasoran dasoran
May 17, 2025
44

 llama.cppのバックエンドggmlを読もう

VRCLT #18 で発表したスライドです

Avatar for dasoran

dasoran

May 17, 2025
Tweet

Transcript

  1. 自己紹介 - ソフトウェアエンジニア - 仕事はAWSやったり人工衛星つくったり - 最近はMLにハマっている - Local LLM

    しようとしてebayでEPYCを買うも 2か月届かず.... - VRChatは2019年からゆるゆるやってます
  2. ggmlとは - llama.cppの計算バックエンド - OllamaやLM Studioで使用されている - 事実上のLocal LLMにおけるデファクト実装 -

    (おそらく) PyTorchとかより早い - 関連としてGGUFフォーマットがある - Ollamaとかでモデルを動かす際のフォーマット 作者の頭文字+mlでggml
  3. ggmlを探る いきなりコードを読むのはハードルが高い - Introduction to ggml - https://huggingface.co/blog/introduction-to-ggml - ggml

    の概要とggmlを使って簡単な計算をする記事 - Understanding how LLM inference works with llama.cpp - https://www.omrimallis.com/posts/understanding-how-llm-inference-works-with-llama-cpp/ - llama.cpp/ggml がなぜ早いのかを解説した記事 この辺を読むと、簡単な動かし方や概要がわかる
  4. ggmlを読んでみる - 前提としてほぼC/C++で書かれています - 利用する際の基本的な処理の流れは以下の通り - バックエンドを初期化 - contextの初期化 -

    contextへメタデータの設定 - contextへバックエンドバッファを割り当てる - バックエンドへデータをコピー - 計算グラフを作成、contextへ設定 - 計算 - 結果をバックエンドから取り出す
  5. ディレクトリ構成 - … - examples/ - includes/ - src/ -

    ggml-xxx/ - … - … - exapmles: - ggmlを使ったサンプルがある - コードを読む際の読み始める部分の参考に使える - 今回は examples/simple/simple-backend.cpp を参 考にした - includes: - 一般的なincludesディレクトリ - ggmlは実装がコンパクトなので、 includesを一通り眺 めると全体像が把握できる - src: - 直下にggml-xxx/という実行環境ごとのコードがある - 他はsrc直下にすべて実装がある
  6. includes を眺める - ggml-alloc.h - ggml-backend.h - ggml-blas.h - ggml-cann.h

    - ggml-cpp.h - ggml-cpu.h - ggml-cuda.h - ggml-kompute.h - ggml-metal.h - ggml-opencl.h - ggml-opt.h - ggml-rpc.h - ggml-sycl.h - ggml-vulkan.h - ggml.h - gguf.h
  7. includes を眺める - ggml-alloc.h - ggml-backend.h - ggml-blas.h - ggml-cann.h

    - ggml-cpp.h - ggml-cpu.h - ggml-cuda.h - ggml-kompute.h - ggml-metal.h - ggml-opencl.h - ggml-opt.h - ggml-rpc.h - ggml-sycl.h - ggml-vulkan.h - ggml.h - gguf.h - 実は大部分は実行環境ごとの内容 - 読む上では6つのheaderファイルを見れば概ね大丈夫 - さらに以下は部分的な内容 - ggml-alloc.h: graphやtensorの領域確保 - ggml-backend.h: 実行環境関係 - ggml-cpp.h: スマートポインタがちょっと書いてある - ggml-opt.h: 学習関係 - gguf.h: モデルファイル - 大部分はggml.hのみにまとまっている コンパクト!読めそう!
  8. src を覗く - ggml-xxx/ - … - ggml-alloc.c - ggml-backend*.cpp

    - ggml-quants.c - ggml-threading.cpp - ggml.c - gguf.cpp headerファイルを 除いた一覧 - ggml-xxx/ は実行環境ごとの実装 - ggml-cpu とか、1つ参照するとよさそう - quantsは量子化、ggufはファイル周り、threadingは実質6行 - とりあえず読むなら - ggml-alloc.c - ggml-backend*.cpp - ggml.c - この辺と適当な実行環境のコードを参照すればよさそう コンパクト!読めそう!
  9. ど真ん中っぽいggml.cを見る - よく見ると処理が //////…//// で区切ら れている - 9つのセクションに分かれている - 定数定義

    - printとかのutil - contextの処理(initとか) - contextにぶら下がるobject/tensor処理 - 計算 - graph処理 - 計算実行時のオプション - 量子化 - スレッド処理 - 1787-5121行目の3334行は計算 - addとか 仕組み周りは3000行ちょっと!
  10. 参考資料: オブジェクトの構造 ctx ggml_init(param) ggml_object ggml_object ggml_object objects_begin objects_end buffer

    buffer buffer ggml_backend_alloc_ctx_tensors(ctx, backend) ggml_backend_tensor_set(tensor, …) on backend