<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Cost-Optimization on ROBOCO</title>
    <link>https://roboco.io/ja/tags/cost-optimization/</link>
    <description>Recent content in Cost-Optimization on ROBOCO</description>
    <generator>Hugo</generator>
    <language>ja</language>
    <lastBuildDate>Wed, 28 Oct 2026 10:00:00 +0900</lastBuildDate>
    <atom:link href="https://roboco.io/ja/tags/cost-optimization/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>LLMキャッシュはどう動くのか：AnthropicのS-1報告書から読み解くAIインフラの効率化</title>
      <link>https://roboco.io/ja/posts/how-llm-caching-works/</link>
      <pubDate>Wed, 28 Oct 2026 10:00:00 +0900</pubDate>
      <guid>https://roboco.io/ja/posts/how-llm-caching-works/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;AnthropicはS-1で、一定のモデル性能を提供するために必要な推論計算を減らすとともに、本番環境での計算資源の利用効率も改善してきたと説明しています。– 「Compute Efficiency」の要約&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://roboco.io/posts/images/Dohyun.png&#34;&gt;&lt;figcaption&gt;&#xA;      &lt;h4&gt;チョン・ドヒョン - ROBOCO首席コンサルタント&lt;/h4&gt;&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;LLMインフラは、同じ性能の処理に必要な計算を減らし、確保した資源をより有効に使う方向へ進化しています。AnthropicのS-1にある推論効率の説明は、この流れを示す根拠の一つです。&lt;/li&gt;&#xA;&lt;li&gt;プロンプトキャッシュは、同一の入力の先頭部分を処理して作ったKVキャッシュを再利用します。長い文書の再計算を減らしますが、新しい質問の処理と回答の生成は引き続き必要です。&lt;/li&gt;&#xA;&lt;li&gt;大規模インフラでは、共通の計算をメモリブロックとして共有し、キャッシュの場所と負荷を考慮してリクエストを分散します。GPUメモリの外にもキャッシュを保存するシステムがあります。&lt;/li&gt;&#xA;&lt;li&gt;キャッシュ効率を高めるには、誰の計算を誰と共有できるかを先に決める必要があります。ユーザーごとの分離は再利用の範囲を狭めることがあり、GPUの外でも同じ権限境界を維持しなければなりません。&lt;/li&gt;&#xA;&lt;li&gt;効果は再利用の頻度、メモリの余裕、転送コストによって変わります。再処理する入力トークンの減少率を、総コストの削減率と解釈してはいけません。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;同じ製品マニュアルを持って、相談員を訪ねる場面を想像してみてください。初日は最初から読む必要があります。翌日、別の質問をしたのに、相談員がまたマニュアルを最初から読み直したらどうでしょうか。質問に答える時間より、同じ資料を繰り返し読む時間のほうが長くなるかもしれません。&lt;/p&gt;&#xA;&lt;p&gt;LLMサービスでも似たことが起こります。質問と一緒に、製品文書、ツールの使い方、会話履歴を送るためです。画面に見えるのは新しい質問の1行だけでも、サーバーに送られる入力には、以前送った内容が長く付いています。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;LLMインフラの効率化には、この繰り返し作業を見つけて減らすことも含まれます。&lt;/strong&gt; GPUの増設と並行して、実行済みの計算を再利用する技術も進歩しています。その中心にキャッシュがあります。&lt;/p&gt;&#xA;&lt;p&gt;2026年10月26日に公開されたAnthropicの新規株式公開に向けた登録届出書、S-1は、この変化を確認できる根拠の一つです。本記事ではS-1の説明を出発点に、大規模インフラでキャッシュがどう動くかを7枚の図で説明します。&lt;/p&gt;&#xA;&lt;p&gt;ここで運用者が直面する重要な問いがあります。&lt;strong&gt;キャッシュ効率を高めながら、複数ユーザーのコンテキストを互いに分離できるのでしょうか？&lt;/strong&gt; 保存領域を増やす設計とともに、誰に再利用を許可するかも考える必要があります。&lt;/p&gt;&#xA;&lt;p&gt;以下の図は、vLLM・SGLang・LMCacheの公開技術を使って一般的な原理を説明します。Anthropicの実際の内部構成を示すものではありません。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-s-1が示す変化同じ資源でより多くの処理を行う&#34;&gt;1. S-1が示す変化：同じ資源でより多くの処理を行う&lt;/h2&gt;&#xA;&lt;p&gt;S-1は、推論に必要な計算を減らす研究と、確保した計算資源をより効率的に使う運用改善を説明しています。別のプラットフォーム機能の説明では、長いプロンプトにキャッシュを適用すると、同じリクエストをキャッシュなしで処理する場合に比べて、コストを最大約97%、レイテンシを約60%削減できるとしています。&lt;sup id=&#34;fnref1:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;ここで読み取るべき流れは、&lt;strong&gt;モデルを提供する方法も改善し続けている&lt;/strong&gt;という点です。ただし、この数値は長いプロンプトに対する条件付きの効果です。Anthropic全体のインフラ運用費が同じ割合で減ったことや、その改善のすべてがキャッシュによることを意味しません。&lt;/p&gt;&#xA;&lt;p&gt;では、キャッシュはこの流れにどう貢献するのでしょうか。理解するには、LLMが回答を作る過程を二つに分けると分かりやすくなります。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-回答する前にまず入力を読む必要がある&#34;&gt;2. 回答する前に、まず入力を読む必要がある&lt;/h2&gt;&#xA;&lt;p&gt;一般的な生成LLMの推論には、大きく二つの段階があります。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;プリフィル（prefill）&lt;/strong&gt;：入力文を処理し、回答の生成時に参照する内部状態を計算します。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;デコーディング（decoding）&lt;/strong&gt;：その状態を参照しながら、回答をトークン単位で生成します。トークンは、モデルがテキストを扱う小さな単位です。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;最初の段階は資料を読んで作業を準備する過程、次の段階は資料を見ながら回答を書き進める過程と考えると分かりやすいでしょう。&lt;/p&gt;&#xA;&lt;p&gt;モデルはこの過程で、アテンションに使うキー（key）と値（value）という数値配列を作ります。これを保存したものが&lt;strong&gt;KVキャッシュ&lt;/strong&gt;です。同じリクエストの中では、次の回答トークンを作るたびに、それ以前のトークンのキーと値を再計算せずに済むようにします。&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;この再利用をリクエスト間に広げることもできます。同じモデルと互換性のある実行条件で、新しいリクエストが以前と同じ入力から始まる場合、先頭部分のKVキャッシュを取得して続きから処理します。これをプロンプトキャッシュ、またはプレフィックスキャッシュと呼びます。&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://roboco.io/posts/images/llm-cache/01-read-and-reuse.svg&#34; alt=&#34;最初のリクエストは文書を処理してKVキャッシュを作り、後続のリクエストはそれを再利用します。どちらも質問の処理と回答の生成は必要です。&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;図1．キャッシュは長い共通文書の再計算を減らします。新しい質問の処理と回答の生成は残ります。&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;相談員のたとえに戻ると、KVキャッシュは、読んだ内容を次の計算ですぐ参照できるように準備した作業資料に近いものです。ただし、人が読む要約文ではありません。モデル計算に使う数値配列であり、モデル自体を再学習させるものでもありません。&lt;/p&gt;&#xA;&lt;p&gt;したがって、前回と似た回答を取り出す仕組みとは動作が異なります。同じ文書を再利用しても、今回の質問に対する回答は新しく生成します。&lt;/p&gt;&#xA;&lt;h2 id=&#34;3-同じ文書でもその前に何があるかが重要&#34;&gt;3. 同じ文書でも、その前に何があるかが重要&lt;/h2&gt;&#xA;&lt;p&gt;二人の顧客が同じ製品マニュアルについて質問するとします。一人は機能を、もう一人は外部システムとの連携方法を尋ねます。質問が違っても、マニュアルまでの入力が同じなら、共通の計算を再利用する機会が生まれます。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://roboco.io/posts/images/llm-cache/02-shared-prefix.svg&#34; alt=&#34;同一の指示と製品文書を共有した後、質問AとBに分岐する構造です。先頭に毎回異なる時刻を入れると、その後の共通文書の計算も変わります。&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;図2．プレフィックスは入力の先頭部分です。共通の経路を進み、質問が異なる地点からそれぞれ計算します。&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;なぜ文書の内容が同じだけでは足りないのでしょうか。一般的な自己回帰型トランスフォーマーでは、一つのトークンの内部状態は先行するトークンの影響を受けます。文書の前に別の指示があると、同じ文書も別の文脈で処理されます。そのため、先頭からどこまで一致するかが重要になります。&lt;sup id=&#34;fnref1:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;例えば、リクエストの先頭に毎回異なる時刻やセッションIDを入れると、その後に同じマニュアルがあっても以前の計算をそのまま使いにくくなります。共通の指示と文書を先に置き、新しい質問を後に付けると、共通経路が長くなります。&lt;/p&gt;&#xA;&lt;p&gt;エージェントも同じ原理です。ツール定義、作業指示、以前の会話を維持し、新しい実行結果だけを後に追加すると、再利用できる部分が増えます。会話履歴を要約に置き換えたり、共通の指示を修正したりすると、変更した地点以降は新しい計算が必要になることがあります。&lt;/p&gt;&#xA;&lt;p&gt;これが、単に文章を短くすることとは異なる最適化である理由です。長い入力でも、大部分が安定して繰り返されるなら、再利用できる計算は多くなります。&lt;/p&gt;&#xA;&lt;h2 id=&#34;4-多くのリクエストに備えキャッシュをブロックに分ける&#34;&gt;4. 多くのリクエストに備え、キャッシュをブロックに分ける&lt;/h2&gt;&#xA;&lt;p&gt;ユーザーが増えると、マニュアル1部を再利用するだけでは十分ではありません。多くの会話が同時に進み、それぞれ長さも異なります。KVキャッシュを置くメモリの管理が重要になります。&lt;/p&gt;&#xA;&lt;p&gt;一つの方法は、キャッシュを小さな&lt;strong&gt;ブロック&lt;/strong&gt;に分けることです。本全体を人ごとにコピーする代わりに、共通して読むページのまとまりを一緒に参照すると考えられます。PagedAttentionは、KVキャッシュをブロックとして管理し、メモリの無駄を減らす方法を示しました。&lt;sup id=&#34;fnref1:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://roboco.io/posts/images/llm-cache/03-block-sharing.svg&#34; alt=&#34;リクエストAとBが同じ二つのKVブロックを参照します。使用終了後も再利用候補として残し、領域が必要になれば入れ替えることができます。&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;図3．共通の計算は1部を一緒に参照し、リクエストごとに異なる部分は別に管理します。vLLMのブロック管理を簡略化した図です。&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;共通ブロックを探すには識別情報も必要です。vLLMは、ブロックのトークンに加えて、前のブロックのハッシュなどを識別に使います。ハッシュは内容を探すための識別値と考えればよいでしょう。先頭部分まで識別に結び付けるため、同じ単語があるという理由だけで、別の文脈の計算を混ぜることはありません。&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;メモリには限りがあるので、すべてのキャッシュを永遠に保存することはできません。まだリクエストが使っているブロックと、使用が終わり再利用を待っているブロックを区別する必要があります。領域が不足すると、後者から入れ替え対象を選びます。&lt;sup id=&#34;fnref1:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;よく使われる共通資料を残せば、次のリクエストの再計算を減らせます。まれにしか再利用されない資料を長く保持すると、新しいリクエストが使える領域が減ります。キャッシュ管理は結局、&lt;strong&gt;将来の再利用機会と現在のメモリ需要を調整する作業&lt;/strong&gt;です。&lt;/p&gt;&#xA;&lt;h2 id=&#34;5-サーバーが増えるとどこへ送るかも重要になる&#34;&gt;5. サーバーが増えると、どこへ送るかも重要になる&lt;/h2&gt;&#xA;&lt;p&gt;推論サーバーが複数台あるとします。サーバーAには製品マニュアルのキャッシュがあり、Bにはありません。同じ質問でも、送信先によって再計算の量が変わります。&lt;/p&gt;&#xA;&lt;p&gt;リクエスト数を単純に均等配分するだけでは、既存のキャッシュを活用できないことがあります。そこで&lt;strong&gt;キャッシュを考慮したルーティング&lt;/strong&gt;が登場します。ルーティングとは、受信したリクエストを処理するサーバーに送ることです。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://roboco.io/posts/images/llm-cache/04-cache-aware-routing.svg&#34; alt=&#34;ルーターはキャッシュと負荷を併せて確認します。サーバーAには文書キャッシュがあり、Bにはないため、再利用の利点と待ち時間を比較する必要があります。&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;図4．クラスタのどこかにキャッシュがあるだけでは十分ではありません。リクエストがその計算結果を利用できる必要があります。&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;本をすでに読んだ相談員に次の質問を送るのと似ています。ただし、その相談員の前に大勢が並んでいるなら、別の相談員が新しく読むほうが早く終わることもあります。&lt;/p&gt;&#xA;&lt;p&gt;そのためルーターは、誰が先頭部分を再利用できるかと、どのくらい待つかを併せて判断する必要があります。公開サービングプロジェクトのSGLangのモデルゲートウェイも、キャッシュと負荷を考慮するポリシーを提供しています。&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;図のサーバー1台は、実際には複数GPUが協働する推論単位かもしれません。重要なのは物理的な機器の台数より、キャッシュの場所です。転送や共有の仕組みがあれば結果を取得できますが、そうした構成がなければ、受信したサーバーで再計算する必要があります。&lt;/p&gt;&#xA;&lt;p&gt;この段階でキャッシュは、単一サーバーのメモリ機能を超えた&lt;strong&gt;クラスタ全体のリクエスト配置問題&lt;/strong&gt;になります。&lt;/p&gt;&#xA;&lt;h2 id=&#34;6-高価な作業台には今必要な資料を置く&#34;&gt;6. 高価な作業台には、今必要な資料を置く&lt;/h2&gt;&#xA;&lt;p&gt;GPUメモリは高速ですが、広さが限られた作業台です。読んだ資料をすべて積み上げると、次の作業を始める場所がなくなります。&lt;/p&gt;&#xA;&lt;p&gt;そこで、一部のシステムはKVキャッシュをGPUの外へ移して保存します。すぐ使う資料はGPUに、それほど急がない資料はCPUメモリやストレージに置く方法です。LMCacheは、CPUメモリ、ローカルストレージ、リモートストレージを利用するKVキャッシュ階層を提供します。&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
