(ch02-build-first-observation)= # 第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 でビルドします。本書では、次の構成でビルドしたものを使います。 ```sh 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 の最適化パスが有効です。 ```text Using optimized iqk matrix multiplications Enabling IQK Flash Attention kernels ``` 重要なのは、この確認を最初にやっておくことです。もしこれらの行が出ていなければ、以降の章で読むカーネルは実際には動いていないことになります。「コードは読めるのに、手元では動いていない」というずれを避けるために、ここで一度だけ目で確かめておきます。 ## 2.4 最初の推論:ground truth を得る 実行ファイルがそろったら、小さなモデルで推論を一度動かしてみます。本書では Qwen3-0.6B というモデルを使います。0.6B(約6億パラメータ)という小ささなので、CPU だけでも軽く動き、観測の題材にちょうどよいサイズです。 ```sh ./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 カーネルに渡されているのか」を実際に覗いてみます。