0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

128K の文書は、読ませ直さずに使い回せるのか

0
Last updated at Posted at 2026-10-05

はじめに

前回の結論は、「128K は動くが、読み込みに 21〜24 分かかる」でした。

ただ、これは初回の話です。同じ文書に何度も質問するなら、2 回目以降は読み込み済みの状態を使い回せるはずです。llama-server にはそのための仕組みがいくつもあります。

オプション 既定 役割
--cache-prompt 有効 前回と先頭が一致する部分を再計算しない
--ctx-checkpoints 32 途中の状態を保存しておく数
--cache-ram 8192 MiB 使い終わった状態を RAM に置いておく
--cache-reuse 0 KV をずらして、途中から一致する塊も使い回す
--slot-save-path 無効 状態をディスクに保存・復元する

ただし、このモデルには癖があります。前回わかったとおり、SSM とフルアテンションのハイブリッド構成です。

SSM の状態は、読んだトークンを積み重ねた「今の状態」がひとつあるだけです。KV キャッシュのように「100 トークン目まで戻す」ことができません。そのため、普通のモデルと同じようには使い回せないかもしれません。

使い回せるなら、どういう条件で使い回せるのか。 測りました。

測り方

判定は体感ではなく、サーバが返す **timings.prompt_n(実際に処理し直したトークン数)**で行います。「速くなった気がする」ではなく、「何トークン読み直したか」を見ます。

文書は、このシリーズの作業記録を連結したものです。まず 32K で 6 通りを試して仕組みを見極め、そのあと 128K で確認しました。

# 試したこと
E1 同じプロンプトをもう一度送る
E2 同じ文書に、別の質問を送る
E3 文書の途中(50% の位置)に 1 行差し込んで送る
E4 別の文書を挟んでから、元の文書に戻る
E5 ディスクに保存し、サーバを再起動してから復元する

32K の結果

# 試したこと 処理し直し 取り込み
— 初回 32,155 159.4 秒
E1 同じプロンプトを再送 4 0.7 秒
E2 同じ文書・別の質問 515 4.7 秒
E3 文書の途中を書き換え 32,170(全部) 160.7 秒
E4 別の文書を挟んで戻る 4 0.7 秒
E5 ディスクから復元 32,154(全部) 156.0 秒

質問を変えるだけなら 4.7 秒。 初回の 34 分の 1 です。別の文書を挟んでも、RAM に残っていて 0.7 秒で戻れました。

一方で、途中を 1 行書き換えると全部読み直し、ディスクから復元しても全部読み直しでした。

なぜこうなるのか: 戻れる場所が 2 か所しかない

詳細ログ(-lv 4)を出すと、理由がそのまま書いてありました。

created context checkpoint 1 of 32 (n_tokens = 31466, size = 124.990 MiB)
created context checkpoint 2 of 32 (n_tokens = 31978, size = 126.002 MiB)

チェックポイント(SSM の状態の保存)は、プロンプト末尾の 2 か所にだけ作られます。末尾の 512 トークン手前と、4 トークン手前です。8K、16K、24K と読み進める途中では作られていません。

チェックポイントはプロンプト末尾の512手前と4手前の2か所だけ。同じプロンプトの再送は4手前に戻って4トークンだけ処理、別の質問は512手前に戻って515トークンだけ処理。文書の途中を書き換えると戻れる場所が無く全部処理、ディスクから復元するとチェックポイントが保存されていないので全部処理

これで 4 つの結果がすべて説明できます。

  • 同じプロンプト: 4 手前に戻り、4 トークンだけ処理する
  • 別の質問: 512 手前に戻り、文書の末尾 500 トークン弱と質問を処理する
  • 途中の書き換え: 書き換えより手前に戻れる場所が無いので、最初から処理する
  • ディスクから復元: 次の節で説明します

KV キャッシュだけなら、どの位置にでも戻れます。戻れないのは SSM の状態のほうで、保存しておいた地点にしか戻れないわけです。

ディスクからの復元は、KV しか戻らない

保存(0.68 GiB、3.6 秒)も復元(0.3 秒)も成功していました。サーバは復元した内容が完全に一致していることまで認識しています。

selected slot by LCP similarity, f_sim_best = 1.000 (> 0.100 thold), f_keep = 1.000

それでも読み直した理由は、サーバ自身が出していました。

forcing full prompt re-processing due to lack of cache data
(likely due to SWA or hybrid/recurrent memory, ...)

保存ファイルに入るのは KV だけで、チェックポイントは入りません。質問を変えなくても、応答の生成に 4 トークン戻る必要があります。その 4 トークンを戻せないので、最初から読み直すことになります。

念のため、同じ質問をそのまま送る場合も試しました。こちらも全部読み直しでした。

処理し直し
復元 → 同じ質問 31,982(全部)
復元 → 別の質問 31,981(全部)

このモデルでは、ディスクへの保存はまったく役に立ちません。

128K で確かめる

仕組みが分かったので、128K では E1・E2・E4 だけを測りました。途中の書き換えと、ディスクからの復元は、32K と同じ理由で全部読み直しになるのが確定しています。

128Kの文書で、初回の読み込みは17.6分。同じ文書への別の質問は10.7秒、同じプロンプトの再送は1.8秒、別の文書を挟んで戻っても2.1秒で、同じ縮尺だと線にしか見えない

# 試したこと 処理し直し 取り込み
— 初回 130,179 1,053.5 秒(17.6 分)
E1 同じプロンプトを再送 4 1.8 秒
E2 同じ文書・別の質問 515 10.7 秒
E4 別の 128K 文書(初回 15.6 分)を挟んで戻る 4 2.1 秒

128K でも、質問を変えるだけなら 10.7 秒。初回のおよそ 100 分の 1 です。32K(4.7 秒)より遅いのは、読み直す 515 トークンが深い位置にあり、1 トークンごとに 13 万トークン分を参照するからです。

E4 も効きました。128K ぶんの状態(KV 約 2.8 GiB + チェックポイント 2 個)がRAM キャッシュ(上限 8 GiB)に収まり、別の 128K 文書を読ませたあとでも 2.1 秒で戻れました。

初回の読み込み時間が、また動いた

今回の初回は 17.6 分でした。前回測った 2 回(21.5 分、24.2 分)より明らかに速い。割り込みもスリープも起きていないことは確認しています。直前まで PC が 10 時間スタンバイしていたので、冷えていたのかもしれません。

3 回測って 17.6〜24.2 分。同じ設定でも 4 割近い幅があります。前回の記事は「21〜24 分」と書いていたので、追記しておきました。

ついでに見つかった、以前の記事の誤り

サーバの起動ログに、こんな行が出ていました。

srv    load_model: cache_reuse is not supported by multimodal, it will be disabled

serve.ps1 に入れている --cache-reuse 256 が、最初から無効でした。このモデルは画像も扱えるマルチモーダル版で、画像用の mmproj を読み込んでいるためです。

では mmproj を外せば使えるのか。外して起動すると、理由が変わって同じく無効になりました。

srv    load_model: cache_reuse is not supported by this context, it will be disabled

--cache-reuse は KV をずらして、途中から一致する塊を使い回す仕組みです。ずらせない SSM の状態とは両立しません。このモデルでは構造的に使えないわけです。

困るのは、第2回でこう書いていたことです。

--cache-reuse が効いている証拠

cache_n  : 425    ← キャッシュから再利用したトークンprompt_n : 21     ← 実際に計算したトークン

再利用は実際に起きていました。ただしそれは、既定で有効な --cache-prompt によるものです。先頭が一致する部分を再計算しない、という基本の仕組みでした。

現象は本物で、効果を別の設定のものと取り違えていました。「設定を入れた → 速くなった → その設定のおかげ」と結びつけて、その設定が本当に有効になっているかを確かめていませんでした。

第2回の記事には訂正を追記しました。serve.ps1 の --cache-reuse は、別のモデルでは効く可能性があり害も無いので、コメントを直したうえで残しています。

どう使えばいいか

使い方 2 回目以降
同じ文書に質問を重ねる 速い(数秒)
別の文書と行き来する 速い(RAM に残っている間は)
文書を書き換えて読ませ直す 全部読み直し
サーバを再起動する 全部読み直し(ディスク保存も効かない)

まとめると、文書は末尾に足していく、質問は最後に置く、サーバは止めない。この 3 つを守れば、読み込みの待ち時間は初回だけで済みます。

一方で、llm の設定には気をつける点があります。CLI の回で、12 時間使わなければモデルをメモリから降ろす設定(--sleep-idle-seconds 43200)を入れました。降ろしたあとの挙動は測っていませんが、キャッシュも一緒に消えると考えるのが自然です。長い文書を扱う日は、この設定を意識しておく必要があります。

まとめ

  • 質問を変えるだけなら数秒。 同じ文書への 2 回目以降は、ほぼ待たずに済む
  • 途中を書き換えると、全部読み直し。 戻れる場所(チェックポイント)が末尾の 2 か所にしかない
  • ディスクへの保存は役に立たない。 KV は戻るが、SSM の状態は戻らない
  • 理由はどれもハイブリッド構成。SSM の状態は、保存しておいた地点にしか戻れない
  • 第2回の「--cache-reuse が効いている」は誤り。効いていたのは既定の --cache-prompt だった

前回の「21〜24 分」は、初回だけ払えば済む待ち時間でした。ただし、それは文書を書き換えず、サーバを止めないことが前提です。

この記事は tk3.biz のブログ からの転載です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?