MicroArchitectures
H.Ueda
Programmer
ik_llama.cpp 解読 ― 量子化LLM推論カーネルを NEON で逐行する
上田博三 / 2026年7月
【本家 llama.cpp との「差分」だけを逐行で読む、量子化推論カーネルの解読ノート】
「llama.cpp は動かせる。ik_llama.cpp はもっと速いらしい。でも、その"もっと"が何をしているのかは説明できない」──そんなあなたのための一冊です。
本書は、llama.cpp の高性能フォーク ik_llama.cpp を対象に、「本家 llama.cpp との差分、すなわち ik 固有の工夫」だけに絞ってソースコードを読み解く技術書です。ik の独自性は、CPU の重い演算(行列積・FlashAttention・MoE)を ggml/src/iqk/ の最適化カーネルに差し替える点に集約されます。本書はこの「差し替えられた側」に深く潜り、量子化された重みが ARM の NEON 命令でどう掛けられ、足されるのかを、1 行ずつ追いかけます。
なお本書は、姉妹本『llama.cpp 詳解 ― 推論エンジンの内部を読む』の続編です。素の llama.cpp の推論パイプライン全体は姉妹本で解説しているため、本書は先に姉妹本を読んでいることを前提とし、あくまで ik_llama.cpp の「差分」に集中します。
■ 本書で手に入るもの ・「量子化の型が違っても、掛けて足すドット積ループはほぼ共通。型ごとに変わるのは重みの入手方法(load 層)だけ」という視点で、ik のカーネル群を一望できるようになります ・float は値をそのまま読み、LUT 量子化は表を 1 命令で引き、trellis は値をその場で生成する──この 3 類型の違いを、コードの構造として説明できるようになります ・iqk カーネルが「いつ・どこで」標準 ggml から呼び出されるのか、その分岐点を追えるようになります ・ビルドと計測で「最適化カーネルが本当に発火しているか」を、自分の手で確かめられるようになります
■ 扱う範囲 ・iqk カーネルの発火観測(ビルド/-ngl 0/eval callback による確認) ・標準 ggml から iqk への割り込み(ディスパッチの分岐点) ・量子化ブロックのメモリレイアウトと _R4 row-interleaved パッキング ・GEMM ディスパッチと、float/LUT(iq4_k)/trellis(iq4_kt)の各カーネル逐行 ・NEON(ARM SIMD)による内積の実装 ・FlashAttention・fused MoE・量子化器のラウンドトリップ ・付録:上流 llama.cpp との diff / x86(AVX2・AVX512)経路
■ 本書の進め方(3層読解) ① まず動いていることを見る:ビルドと計測で iqk カーネルの発火を確かめます(第I部 観測) ② どこで割り込むかを俯瞰する:ggml から iqk への分岐を地図にします(第II部 骨格) ③ 核心を 1 行ずつ読む:load 層 3 類型を軸に、カーネルを逐行で精読します(第III部) ④ 対象バージョンを固定する:解説対象はコミット 3f40e73c にピン留めし、コードの場所は path:line で示します
■ こんな方におすすめ ・llama.cpp / ik_llama.cpp を動かせるが、なぜ速いのかは説明できない方 ・量子化された重みが CPU 上でどう計算されるのか、仕組みから知りたい方 ・SIMD や量子化カーネルの低レイヤを、ドキュメントではなくソースそのものから理解したい C++ の読める方
■ 必要な前提知識 姉妹本『llama.cpp 詳解 ― 推論エンジンの内部を読む』を読了していること(素の llama.cpp の推論パイプラインはそちらで解説)。加えて、C++ の基本文法(関数・構造体・ポインタ・テンプレートが読めるレベル)。量子化や SIMD、LLM 推論そのものの前提知識は要求しません。必要な概念は、ソースを読むのに必要な範囲でその都度積み上げます。筆者自身は機械学習の専門家ではなく、推論システムの内部構造への関心からソースを読み進めた立場です。記述の正しさは可能なかぎり確かめていますが、保証するものではありません。
全 4 部・全 14 章に加え、付録として「上流 llama.cpp との diff」「x86(AVX2・AVX512)経路」を収録。ik_llama.cpp のバージョンが上がっても、「量子化された重みをどう掛けて足すか」という核心のループは大きくは変わりません。本書が示す load 層 3 類型(float/LUT/trellis)という地図は、別の量子化型や別の最適化カーネルに出会っても、読み解く足場になります。
目次
- 1 第1章 本書の対象読者とゴール 無料
- 2 第2章 ビルドと最初の観測 無料
- 3 第3章 `-ngl 0` と eval-callback で iqk 発火を捕まえる 有料
- 4 第4章 モジュールマップ:ggml から iqk への分岐 有料
- 5 第5章 推論を縦断する:end-to-end トレース 有料
- 6 第6章 ブロックレイアウト3軸 有料
- 7 第7章 GEMM ディスパッチャ:型→カーネル選択と decode/prefill 戦略 有料
- 8 第8章 load層① float NEON カーネル 有料
- 9 第9章 load層② LUT 量子化 IQ4_K 有料
- 10 第10章 load層③ trellis IQ4_KT 有料
- 11 第11章 実機ベンチ:3類型のトレードオフ 有料
- 12 第12章 FlashAttention / FlashMLA カーネル 有料
- 13 第13章 MoE の融合カーネル 有料
- 14 第14章 量子化器との往復 有料
- 15 付録A 上流 llama.cpp との diff 有料
- 16 付録B x86 経路(AVX2 / AVX512) 有料