MicroArchitectures
H.Ueda
Programmer
ブログ
ik_llama.cpp 解読 ― 量子化推論カーネルを NEON で逐行する本を出しました
3 行で
- llama.cpp の高性能フォーク ik_llama.cpp の「本家との差分」だけを、ソースコードで逐行解読した技術書 『ik_llama.cpp 解読 ― 量子化LLM推論カーネルを NEON で逐行する』 を出しました。
- 背骨は一つ——「量子化のドット積ループはほぼ共通、型ごとに変わるのは重みの入手方法(load 層)だけ」。float / LUT / trellis の 3 類型を地図にして読みます。
- 第1〜2章は自社サイトで無料公開、続きは Kindle(Kindle Unlimited 対象)。
「速い」を、コードの言葉に翻訳する
llama.cpp は動かせる。その高性能フォーク ik_llama.cpp を入れると、同じマシン・同じ量子化モデルでも推論が速くなります。ベンチを取れば数字は出る。けれど「その数字を作っているコードはどれで、何をしているのか」を指し示せるかは別の話です。
私はできませんでした。だから、読みました。この本は、そのギャップを埋めるために書いた解読の記録です。
ik の独自性は、実装上ほぼ一点に集約されます。
CPU の重い演算(行列積・FlashAttention・MoE)を、標準 ggml の汎用ループから
ggml/src/iqk/の最適化カーネルへ差し替える。
各演算の冒頭で ik は iqk カーネルを試し、対応していればそちらで計算する。本書はこの「差し替えられた側」だけに潜ります。素の llama.cpp の推論パイプライン全体は姉妹本 『llama.cpp 詳解 ― 推論エンジンの内部を読む』 で扱ったので、本書はそれを前提に、ik 固有の差分に集中します。解析対象はコミット 3f40e73c に固定し、コード参照はすべて path:line 表記です。
本書の背骨:変わるのは load 層だけ
量子化カーネルは種類が多く、最初は全体像が掴めません。しかし読み解くと、構造はほぼ共通していることが見えてきます。掛けて足すドット積ループ自体は型によらずほぼ同じで、型ごとに変わるのは「重みをどう手に入れるか」——load 層だけです。
| load 層 | 代表型 | 重みの入手方法 |
|---|---|---|
| float | — | 値をそのまま読む |
| LUT 量子化 | IQ4_K | 表(ルックアップテーブル)を 1 命令で引く |
| trellis | IQ4_KT | 値をその場で生成する |
この 3 類型を軸に据えると、個々のカーネルは「load 層が違うだけの、同じ骨格の変奏」として読めます。ik のバージョンが上がっても、この背骨——量子化された重みをどう掛けて足すか——はそう簡単には変わりません。別の量子化型や別の最適化カーネルに出会ったときの、読み解く足場になります。
「動いている」ことを確かめてから読む
抽象論から入らず、まず観測から始めます。本書は 3 層の読み方で進みます。
- 観測(第I部) —
-ngl 0で計算を CPU 側に寄せ、eval-callback で計算グラフを覗いて、iqk カーネルが実際に発火しているのを計測で確かめる。 - 骨格(第II部) — 標準 ggml のどこで iqk に割り込むのか、ディスパッチの分岐点を地図化する。
- 逐行(第III部) — float / LUT / trellis の各カーネルを、NEON(ARM SIMD)命令のレベルまで 1 行ずつ精読する。
そのうえで第IV部では FlashAttention / FlashMLA、MoE の融合カーネル、量子化器との往復まで視野を広げます。
目次(全 4 部・全 14 章+付録)
第I部 観測
- 第1章 本書の対象読者とゴール
- 第2章 ビルドと最初の観測
- 第3章 -ngl 0 と eval-callback で iqk 発火を捕まえる
第II部 骨格 - 第4章 モジュールマップ:ggml から iqk への分岐 - 第5章 推論を縦断する:end-to-end トレース
第III部 ik 固有カーネル逐行 - 第6章 ブロックレイアウト3軸 - 第7章 GEMM ディスパッチャ:型→カーネル選択と decode/prefill 戦略 - 第8章 load層① float NEON カーネル - 第9章 load層② LUT 量子化 IQ4_K - 第10章 load層③ trellis IQ4_KT - 第11章 実機ベンチ:3類型のトレードオフ
第IV部 さらなる最適化 - 第12章 FlashAttention / FlashMLA カーネル - 第13章 MoE の融合カーネル - 第14章 量子化器との往復
付録 - 付録A 上流 llama.cpp との diff - 付録B x86 経路(AVX2 / AVX512)
こんな人に向いています
- llama.cpp / ik_llama.cpp は動かせるが、なぜ速いのかは説明できない人
- 量子化された重みが CPU 上でどう計算されるのかを、仕組みから知りたい人
- SIMD や量子化カーネルの低レイヤを、ドキュメントではなくソースそのものから読みたい C++ の読める人
前提は 2 つだけです。姉妹本『llama.cpp 詳解』を読了していること(素の推論パイプラインはそちらで解説)と、C++ が読めること。量子化・SIMD・LLM 推論そのものの前提知識は要求しません。必要な概念はソースを読むのに必要な範囲でその都度積み上げます。
なお筆者は機械学習の専門家ではなく、組込みと Web を専門としてきた技術者です。推論システムの内部構造への関心からソースを読み進めた立場で書いています。記述は可能なかぎり裏を取りましたが、厳密な挙動は元のソースにあたることをおすすめします。
読んでみる
第1章・第2章は自社サイトで無料公開しています。まずはビルドして iqk を発火させるところまで、手を動かして読んでみてください。
- 📖 無料で読む(第1・2章):https://microarchitectures.jp/books/ik-llama-cpp-deep-dive/
- 🛒 Kindle 版(Kindle Unlimited 対象):https://www.amazon.co.jp/dp/B0H6XJD5LG
ik_llama.cpp 解読 ― 量子化LLM推論カーネルを NEON で逐行する 著者:艶雨(アデウ)/ 全4部・全14章+付録A・B 姉妹本:『llama.cpp 詳解 ― 推論エンジンの内部を読む』