第2章 ビルドと最初の観測
この章では、コードを読み始める前に、まず ik_llama.cpp を自分の手でビルドします。そして、ik の高速カーネル(iqk)が確かに有効になっていることを確認し、推論を一度だけ動かして「正解(ground truth)」を手元に用意します。
本書は「観測してから読む」という順序を大切にします。いきなりソースを開くのではなく、まず動くものを目の前に置く。そうすると、後で読むコードが「いま動いているこの処理のことだ」と実感をもってつながります。
2.1 まず、何を確かめたいのか
最初に、この章のゴールを整理します。やりたいことは3つです。
ik_llama.cpp をビルドして、実行ファイルをそろえる。
ビルド時のログから、iqk カーネルが有効になっていることを確認する。
小さなモデルで推論を1回動かし、出力を記録しておく。
3つめの「出力を記録する」が、地味ですが大切です。あとの章で、同じモデルを別の方法で動かしたり、計算の途中を覗いたりします。そのときに「正しく動いているときの出力」を知っていれば、結果がおかしくなったときにすぐ気づけます。これが ground truth、つまり比較の基準になります。
なお、本書の動作確認はすべて macOS・arm64(Apple Silicon)で行っています。この環境では、CPU 側のカーネルは NEON という SIMD 命令で動きます。別の環境でも考え方は同じですが、確認できるカーネルの種類は変わります。
2.2 ビルドする
ik_llama.cpp は CMake でビルドします。本書では、次の構成でビルドしたものを使います。
cmake -B build -DGGML_NATIVE=ON -DLLAMA_CURL=OFF
cmake --build build -j
オプションの意味を、役割から先に説明します。-DGGML_NATIVE=ON は、ビルドする CPU に合わせた SIMD 命令(ここでは NEON)を有効にする指定です。ik の速さは SIMD カーネルが前提なので、ここは ON にします。-DLLAMA_CURL=OFF は、モデルを URL から自動ダウンロードする機能を切るだけの指定で、本書の趣旨には影響しません。
ビルドが終わると、build/bin/ の下に実行ファイルがそろいます。本書で使うのは、このあと紹介するいくつかのコマンドです。
2.3 iqk が有効かを確認する
ビルドそのものが通っても、ik の高速カーネルが有効になっているとは限りません。そこで、CMake の設定(configure)時のログを確認します。次のような行が出ていれば、ik の最適化パスが有効です。
Using optimized iqk matrix multiplications
Enabling IQK Flash Attention kernels
重要なのは、この確認を最初にやっておくことです。もしこれらの行が出ていなければ、以降の章で読むカーネルは実際には動いていないことになります。「コードは読めるのに、手元では動いていない」というずれを避けるために、ここで一度だけ目で確かめておきます。
2.4 最初の推論:ground truth を得る
実行ファイルがそろったら、小さなモデルで推論を一度動かしてみます。本書では Qwen3-0.6B というモデルを使います。0.6B(約6億パラメータ)という小ささなので、CPU だけでも軽く動き、観測の題材にちょうどよいサイズです。
./build/bin/llama-cli -m models/Qwen3-0.6B-f16.gguf -p "Hello, " -n 64
-m でモデルファイルを、-p で書き出しの先頭(プロンプト)を、-n で生成するトークン数を指定しています。実行すると、プロンプトに続くテキストが生成されます。
ここで生成された出力を、メモに残しておいてください。内容そのものより、「このモデルとこの設定なら、だいたいこういう出力になる」という感覚が大切です。これが、あとで観測結果を見比べるときの基準になります。
ひとつ補足します。macOS では、何も指定しないと計算が GPU(Metal)に回ることがあります。CPU 側の iqk カーネルを観測したいときは、計算を CPU に固定する必要があります。その方法は次章で扱うので、ここではまず「動いて、出力が得られた」ことを確認できれば十分です。
2.5 本書で使うツール
build/bin/ には、本書で繰り返し使うコマンドがそろっています。役割だけ先に並べておきます。詳細は使う章で改めて説明します。
llama-cli… 推論を対話的・バッチ的に実行する。ground truth の取得に使う。llama-bench… スループット(速度)を測る。第11章で使う。llama-eval-callback… 演算(op)ごとにテンソルの中身をダンプする。どのカーネルが動いたかを観測するのに使う。llama-quantize… モデルを別の量子化型に変換する。第11章で使う。
いまは、これらが「観測のための道具箱」だと見えていれば十分です。
2.6 この章のまとめ
この章では、ik_llama.cpp をビルドし、最初の観測を行いました。ここで押さえたいのは、次の3点です。
-DGGML_NATIVE=ONでビルドし、configure ログで iqk の有効化を確認する。小さなモデルで推論を一度動かし、出力を ground truth として記録しておく。
本書は「観測してから読む」順序で進める。道具箱(
llama-cliほか)も用意できた。
次の章では、計算を CPU に固定したうえで、llama-eval-callback を使って「いま、どの演算が iqk カーネルに渡されているのか」を実際に覗いてみます。