tk3.biz
ブログ一覧に戻る Back to Blog

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

AIローカルLLMQwenllama.cpp測定

はじめに

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

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

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

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

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

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

測り方

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

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

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

32K の結果

#試したこと処理し直し取り込み
—初回32,155159.4 秒
E1同じプロンプトを再送40.7 秒
E2同じ文書・別の質問5154.7 秒
E3文書の途中を書き換え32,170(全部)160.7 秒
E4別の文書を挟んで戻る40.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,1791,053.5 秒(17.6 分)
E1同じプロンプトを再送41.8 秒
E2同じ文書・別の質問51510.7 秒
E4別の 128K 文書(初回 15.6 分)を挟んで戻る42.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 分」は、初回だけ払えば済む待ち時間でした。 ただし、それは文書を書き換えず、サーバを止めないことが前提です。

関連記事 Related Posts

128K の文書の奥まで、ちゃんと読めているのか 128K の文書の奥まで、ちゃんと読めているのか

ローカルLLMに128Kトークンの文書を読ませ、20か所に仕込んだ事実を拾えるか測りました。深さによる取りこぼしは無く、文書に無いことは「記載なし」と答えました。唯一の誤りは、先頭2文字が同じ別の番号との取り違えで、片方の名前を変えると消えました。 ローカルLLMに128Kトークンの文書を読ませ、20か所に仕込んだ事実を拾えるか測りました。深さによる取りこぼしは無く、文書に無いことは「記載なし」と答えました。唯一の誤りは、先頭2文字が同じ別の番号との取り違えで、片方の名前を変えると消えました。

使っていない画像機能を外したら、メモリは1GiB減り、速度は変わらなかった 使っていない画像機能を外したら、メモリは1GiB減り、速度は変わらなかった

ローカルLLMのサーバが、テキストしか使わないのに画像用のmmprojを毎回読み込んでいました。外すと速くなるかを、前回まとめたチェックリストに沿って測りました。1回目は計測中のずれが大きく速度について何も言えず、裏で別のAIセッションが動いていたと分かったので、止めて測り直しました。メモリは1GiB減り、速度は3%未満の差で変わりませんでした。既定は外すことにしました。 ローカルLLMのサーバが、テキストしか使わないのに画像用のmmprojを毎回読み込んでいました。外すと速くなるかを、前回まとめたチェックリストに沿って測りました。1回目は計測中のずれが大きく速度について何も言えず、裏で別のAIセッションが動いていたと分かったので、止めて測り直しました。メモリは1GiB減り、速度は3%未満の差で変わりませんでした。既定は外すことにしました。

コンテキストを 128K まで伸ばしたら、壁はメモリではなく待ち時間だった コンテキストを 128K まで伸ばしたら、壁はメモリではなく待ち時間だった

ローカルLLMのコンテキストを32Kから128Kまで伸ばして測りました。予想していたメモリ不足は起きず、理由はモデルの構造にありました。代わりに見えた壁はプロンプトの取り込み時間で、128Kを読ませるだけで21〜24分かかります。途中で自分の自動起動に計測を汚された話も含みます。 ローカルLLMのコンテキストを32Kから128Kまで伸ばして測りました。予想していたメモリ不足は起きず、理由はモデルの構造にありました。代わりに見えた壁はプロンプトの取り込み時間で、128Kを読ませるだけで21〜24分かかります。途中で自分の自動起動に計測を汚された話も含みます。