ローカル推論では、モデル単体よりコンテキスト・バッチ・量子化・並行がユニファイドメモリ上で束になります。設定を対照し、帯域と容量を計測で縛るのが本稿の狙いです。

RAG 併用時は索引とチャットの RAM が衝突しやすいので、チャンク・埋め込み・ベクトルクォータの記事とセットで読むと安全です。ホームで概要を、購入ページで専用ノードを比較できます。

つまずきやすい点 1. ディスク上の GGUF サイズは実行時常駐と一致せず、KV と並行で膨らむ。2. バッチ拡大は膝を越えると圧縮やスパイクで逆効果。3. ビルド・テンプレ版がずれると再現性が崩れる。

ハードウェア境界

M4 クラスは ユニファイドメモリ で GPU/CPU/NE が同一プールを共有します。コンテキスト、KV、バッチは 一本の予算。重みと KV は毎ステップ流れるため、帯域と持続デコードがボトルネックになりやすく、ピーク TFLOPS だけでは読めません。圧力が上がるときは量子化一段下げ、num_ctx 短縮、並行削減の順が現実的です。

短いベンチより 数分〜十分のソーク でファン・温度・スワップを見る方が、長時間バッチ前提には信頼できます。

GGUF と量子化の選び方

GGUF は llama.cpp の交換形式で Ollama も利用します。実務では Q4_K_MQ5_K_M が品質と容量の妥協点になりやすく、IQ 系はメモリ節約と評価セット必須のトレードです。MoE はルーティングでスパイクが出るため、版・量子化・テンプレを起動行に残します。

# 例(パスは環境に合わせる) ./llama-cli -m ./models/model.Q4_K_M.gguf -c 8192 -b 512 -ngl 99

並行処理とバッチサイズ

llama.cpp: -c-b(や -ub)、-ngl で明示。コンテキスト固定のままバッチを振り、許容 RSS 内の最大を残す。Ollama: Modelfilenum_ctxnum_batch、並行は OLLAMA_NUM_PARALLEL 等。スロットは KV 予算の乗算と見て、バーストはクライアントキューで吸収します。

ベースライン五手順

  1. コンテキストと並行の 上限をクライアントで固定
  2. GGUF・量子化・テンプレ・版 をマニフェスト化。
  3. バッチスイープ で p95 プレフィル最良値を記録。
  4. ソーク でピーク RSS・スワップ・熱をログ化。
  5. 圧力継続時の フォールバック(短コンテキスト/低量子化)を決める。
観点 llama.cpp Ollama M4 メモ
コンテキスト -c--ctx-size PARAMETER num_ctx KV は概ね線形増。ファイル容量だけ見ない
バッチ -b--batch-size num_batch 膝まで上げ、超過はスパイク優勢
GPU -ngl で Metal 層 自動+ num_gpu 部分オフロードでボトルネック移動。tok/s で見る
並行 複数プロセスは常駐分離 OLLAMA_NUM_PARALLEL+キュー セッション≒KV 予算の乗算
帯域代理 tok/s・メモリ圧・ビルド差 同左(リリース依存大) 空きメモリがあるのに遅い→帯域/バッチ疑い

本番前チェックリスト

  • マニフェスト(量子化・ハッシュ・テンプレ・版)
  • コールド→初回→並行ソークのメモリ曲線
  • ステージ別 num_ctx とプロンプトキャップ
  • 採用 -bnum_batch と p95 のセット記録
  • ログパスとローテーション共有

安定性に関する FAQ

途中で遅くなる? 熱・圧縮・索引バックグラウンドが重なることが多い。並行と文脈を下げてソーク再現。

更新後だけ遅い? ランタイムとモデルパスをピン留めし、必要ならミラー。

大バッチは最強? いいえ。膝以降はメモリが勝つ。長プロンプトは分割・要約。

Metal オフ? デバッグ以外非推奨。CPU 数値は容量見積に使わない。

共有運用? 無秩序な積み上げよりキューか別ノード。

まとめ: 文脈・バッチ・量子化・並行は連動つまみ。定常計測と版固定で運用可能にし、索引とチャットは負荷を分離する。