実行プログラムと拡張機能

SGLang HiCache:GPU・CPU・ストレージにKVを分散して再利用する

SGLangでローカルLLMサーバーを起動し繰り返し入力を高速化する

SGLangはモデルを実行し、API1で受け取った質問に回答を生成するLLM2サーバーです。同じ指示や文書を再度入力したときは、前に計算した状態をキャッシュから再利用して最初の応答までの待ち時間を短縮できます。まず接続を確認し、HiCacheでGPU3メモリ(L1)、ホストメモリ(L2)、対応ストレージ(L3)にキャッシュを分けて保存する方法を見ていきます。

同じリポジトリを繰り返し説明するコード支援では、システム指示や前のコードが毎回同じ場合があります。HiCacheは共通入力を処理したKV状態をGPUメモリ外にも保持して再利用できます。新しいコード・文書の初回要求と追加質問を分けて比較します。

実行条件と要点
  • L1はGPUメモリ、L2はホストメモリ、L3は接続されたstorage backendです。
  • SGLang 0.5.13以降のUnifiedTree経路はSWA・Mamba hybrid cacheを扱いますが、構成ごとの対応確認が必要です。
  • 同じprefix・新規文書・eviction後の復元を分け、TTFTとIOを記録します。

Spark・PC・Macでは導入経路が異なる

一般的なNVIDIAサーバーのSGLangではLinux・CUDA4・PyTorch5・互換GPUカーネル6を合わせる必要があります。既存Python環境へ上書きせず別環境を用意し、版を記録します。DGX SparkにはARM64 CPU7とBlackwell GPU対応ビルドが必要で、x86用イメージをそのまま流用しません。

MacではSGLANG_USE_MLX=1を使うMLX8の実行経路を別途用意し、MLX形式のモデルと対応機能を確認します。画像・動画用のDiffusionにはMPSを使う別の経路があります。手順を選ぶ際はテキストLLM用かDiffusion用かを区別します。

小型モデルでサーバーとAPI接続を先に確認

追加高速化の前にQwen2.5-0.5B-Instructが質問へ応答するか確認します。コンテキスト上限4096・同時要求1件は接続確認条件であり最高速度設定ではありません。初回モデル取得時間はサーバー準備・推論応答と分けて記録します。

サーバーでモデル準備が終わってからcurlで短い質問を送ります。127.0.0.1はこのコンピューター内のloopbackアドレスで、アプリにはOpenAI互換endpoint http://127.0.0.1:30000/v1を指定できます。応答は接続の基準であり大型モデルの品質・速度は別途確認します。

NVIDIA CUDAサーバーを起動
python3 -m sglang.launch_server \
  --model-path Qwen/Qwen2.5-0.5B-Instruct \
  --host 127.0.0.1 --port 30000 \
  --context-length 4096 --max-running-requests 1
NVIDIA機器に合うSGLangを導入した後の接続確認例です。
ローカルサーバーへ短い質問を送る
curl --fail-with-body http://127.0.0.1:30000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"Qwen/Qwen2.5-0.5B-Instruct","messages":[{"role":"user","content":"Explain what a local AI server does in two sentences."}],"max_tokens":64,"temperature":0}'
サーバーと要求のモデル名を揃えます。公開例なので個人文書は必要ありません。
高速化設定なしで小型モデルのサーバー応答を確かめる概念図
応答する最小構成から確認します。

Radix cacheとHiCacheは共通prefixを再利用

最初のコード要求ではシステム指示とコードを読みKV cache9を作ります。同じ会話でテスト結果だけを加え、前の内容が一致すればRadix cacheが共通prefix状態を再利用できます。コードや指示が変わるほど一致prefixは短くなり、新しい文書には新規prefill10が必要です。

HiCacheは計算済みの状態をGPU外のホストメモリやストレージにも保存します。GPUの余裕が減っても、再利用する状態を別の階層に残せます。モデルの重みは実行する場所で使い、キャッシュには処理済み入力の計算結果を保存します。

同じコード質問の反復入力と新しい文書入力を比較する概念図
cache効果が異なるため新規入力と反復入力を分けて比較します。

GPU・ホストメモリ・ストレージ階層を区別

HiCacheのL1はGPUメモリ、L2はhost memory、L3はファイルまたは外部storage backendです。GPUに残る状態は速く再利用できますが、容量が必要になるとhost tierへ退避される場合があります。L3にファイルがあっても後続要求でprefix keyとモデル条件が一致して初めて再利用できます。

CPU tierは保存容量を増やしますがhost帯域と転送が加わります。ファイルbackendはNVMe11 read・ページキャッシュ・index管理を要求経路に加えます。終了後にファイルが残ることと即時cache hitは異なります。

SGLang 0.5.20はUnifiedTreeのSWA・Mamba hybrid HiCache対応を紹介し、そのhybrid経路の既定接続変更は0.5.13に記録されています。全モデル・機器・storage backendの組み合わせが互換という意味ではないため、architecture対応を確認します。

host cacheから始め実行状態を確認

以下はNVIDIA CUDA上のSGLang 0.5.20とopenai/gpt-oss-20bを使う接続基準です。GPUメモリが足りるか公式モデルカードと対応資料で先に確認します。コンテキスト8192・同時要求1件は接続確認値です。--enable-hierarchical-cacheと--hicache-ratio 2を設定してもデータ容量2倍を保証しないため、起動ログで実際のpoolを確認します。

サーバー起動後は/healthと同じモデルIDのchat completionを確認します。初回応答とcold状態を別に記録し、モデル読み込み・cache pool・CUDA初期化ログを見ます。この要求は速度測定ではないため、file tierや同時要求を一度に追加しません。

ホストキャッシュの起動前に、前の基準サーバーをCtrl+Cで止めます。両例は30000ポートを使います。新しいモデルとキャッシュプールの準備後、別ターミナルで下の状態確認と質問を送ってください。

NVIDIA CUDA host cacheサーバーを起動
python -m sglang.launch_server --model-path openai/gpt-oss-20b --host 127.0.0.1 --port 30000 --context-length 8192 --max-running-requests 1 --enable-hierarchical-cache --hicache-ratio 2 --hicache-io-backend kernel --hicache-mem-layout page_first
SGLang 0.5.20 NVIDIA CUDA例です。導入ビルドのオプションとモデル対応を確認します。
準備状態と同じモデルへの短い質問を確認
curl -sS http://127.0.0.1:30000/health
curl -sS http://127.0.0.1:30000/v1/chat/completions -H 'Content-Type: application/json' -d '{"model":"openai/gpt-oss-20b","messages":[{"role":"user","content":"Review this Python function for empty-list input and suggest a minimal fix: def first_item(items): return items[0]"}],"temperature":0,"max_tokens":96,"stream":false}'
準備完了後にloopbackで接続します。機能確認であり速度測定ではありません。
動作した版と実行条件を記録し次の変更前の基準として保管する作業台
正常動作した版と条件をロールバック基準として残します。

同じprefix・新規文書・eviction後の復元を分けて記録

最初の関数要求後、同じ会話にテストログ1行だけ追加して質問します。cache統計でhit token12や再利用prefixを確認し、別関数・別ログの新規入力条件と比較します。入力長で計算量が変わるため、異なる要求の完了時間だけを比べません。

file tierの試験では別NVMeパスを使い、SGLang file backendが実際に接続されたか確認します。SGLANG_HICACHE_FILE_BACKEND_STORAGE_DIRはキャッシュファイルの場所を指定し、モデル取得先やOS swapではありません。

cold と warm のリクエストを分けて試します。GPU メモリから退避したエントリの復元後と、eviction 後の再リクエストも記録してください。

NVMe read、ページキャッシュ、cache key の一致を確認します。hit 統計を確認してから、storage tier の状態が再利用されたと判断してください。

ファイル層はホストキャッシュの設定を変えて再起動する試験です。Ctrl+Cで止め、キャッシュ位置を指定して下のコマンドを実行します。再起動後の最初のリクエストと同じ入力の繰り返しを別々に記録すると再利用を比較できます。

NVMe file tierを追加
mkdir -p /mnt/nvme/sglang-hicache
export SGLANG_HICACHE_FILE_BACKEND_STORAGE_DIR=/mnt/nvme/sglang-hicache
python -m sglang.launch_server --model-path openai/gpt-oss-20b --host 127.0.0.1 --port 30000 --context-length 8192 --max-running-requests 1 --enable-hierarchical-cache --hicache-ratio 2 --hicache-io-backend kernel --hicache-mem-layout page_first --hicache-storage-backend file
書き込み可能なNVMeディレクトリに置き換えます。OS swapとは別のSGLang backend経路です。

hybrid attentionのSWA・Mamba状態も確認

GPT-OSSのようにsliding-window attention13を含むモデルは全トークン状態を一様に再利用しません。FULL attention prefixが残っていてもwindowに必要な状態が不足すればそのままhitできない場合があります。SGLang UnifiedTreeはhybrid要素を管理し、0.5.20はSWA・Mamba hybrid HiCacheを説明しますが全モデル・backendで共通対応ではありません。

新prefix・同じprefix・eviction後の再要求を分け、コンテキスト長・cache hit・TTFT14・完了時間・host RAM15・NVMe IOを記録します。GPUに残るwarm cacheとL3から再読込した要求も分けます。

HiCacheはMTP・NGRAMとは別機能

MTP16は次トークン候補を提案する生成高速化、NGRAM17 speculative decoding18は過去トークンから候補を探す生成経路です。PLE19 offload20は大きな埋め込み表をRAM・SSD21に置く保存・読み込み方式です。HiCacheは共通prefixの計算状態を保持・再利用するため、これらの設定を一括で扱いません。

SGLangのMTP speculative設定にはモデルに合うalgorithm・depth・widthが必要です。資料ではNEXTNをEAGLEの別名として使いますが、全Qwen・Gemma・GLMファイルが同じコマンドに対応する意味ではありません。版とモデル対応を確認し機能を一つずつ有効にします。

Radix cacheの入力再利用とMTP・NGRAMの候補検証は別の段階です。2回目のリクエストが速かっただけではどちらが働いたか分からないため、統計と応答区間を機能ごとに分けて比較してください。

利用版の公式対応資料を記録

SGLang 0.5.13・0.5.20のリリースとHiCache設計資料で導入・対応条件を確認します。再現時はモデルID・SGLang版・GPU・backendも記録します。

用語の注釈

  1. API — 別のコードからプログラムの機能を呼び出すための決められたインターフェースです。

    本文に戻る
  2. 大規模言語モデル — 大量のテキストデータから言語パターンを学び、文脈に沿ったテキストを処理・生成するモデルです。

    本文に戻る
  3. GPU — 多くの計算を並列に処理するプロセッサーです。AIモデルの実行ではモデル計算を担います。

    本文に戻る
  4. CUDA — NVIDIA GPUで汎用計算を行うソフトウェア基盤です。

    本文に戻る
  5. PyTorch — AIモデルを作成・実行するソフトウェアフレームワークです。モデルと合わせて、対応するPyTorchの版やハードウェアも確認します。

    本文に戻る
  6. GPUカーネル — GPU上で並列実行され、行列積や正規化などの処理を行うコードです。

    本文に戻る
  7. CPU — OSや一般的なプログラム命令を実行する中央処理装置です。AIでは前処理やデータ転送などの汎用処理も担います。

    本文に戻る
  8. MLX — Appleが開発する機械学習フレームワークで、Apple SiliconのCPUとGPUが共有するメモリを使ってモデルを実行します。

    本文に戻る
  9. KVキャッシュ — 過去トークンのAttention用キー・バリューを保存し、後続トークン生成で再利用するメモリです。容量はコンテキスト長やバッチサイズで変わります。

    本文に戻る
  10. プリフィル — LLMが入力プロンプトを読み、各トークンの内部表現を計算する段階です。プロンプトが長いほど処理するトークンが増えます。

    本文に戻る
  11. NVMe — SSDがPCI Express経由で通信する際に使うストレージ用プロトコルです。

    本文に戻る
  12. トークン — モデルが入力や出力を分けて処理する単位です。

    本文に戻る
  13. Attention — 入力トークン間の関連度を計算し、各位置の情報を現在の表現に反映するニューラルネットワーク演算です。

    本文に戻る
  14. 最初のトークンまでの時間 — リクエスト送信から最初の出力トークンが届くまでの時間です。

    本文に戻る
  15. システムRAM — プログラムの実行中にデータを一時保存するシステムメモリです。

    本文に戻る
  16. MTP — 複数の将来トークンを一度に予測する学習目標、またはそれを行うモデル構成です。投機的デコーディングでは、その予測を候補トークンとして提案できます。

    本文に戻る
  17. n-gram — 連続するn個のトークンまたは項目からなる列です。文脈検索や投機的生成に使われるほか、一部モデルでは埋め込みテーブルの項目にもなります。

    本文に戻る
  18. 投機的デコーディング — ドラフトモデル、MTPヘッド、反復文脈の検索が出力候補を先に作り、メインモデルが検証して確定する生成手法です。

    本文に戻る
  19. PLE埋め込みテーブル — Per-Layer Embeddingの略で、モデルの特定の層に埋め込み情報を加える構造です。Qwen Flash-Next系はn-gramテーブルを使い、対応する実行環境ではRAMやSSDへオフロードできます。

    本文に戻る
  20. オフロード — 容量が足りないとき、モデルデータの一部をGPUメモリからシステムRAMやストレージへ移して処理する方法です。データ転送が追加されます。

    本文に戻る
  21. SSD — フラッシュメモリを使うデータ保存装置です。電源を切ってもデータが保持されます。

    本文に戻る

よくある質問

この記事で最初に確認すべきことは何ですか?
SGLangはモデルを実行し、APIで受け取った質問に回答を生成するLLMサーバーです。同じ指示や文書を再度入力したときは、前に計算した状態をキャッシュから再利用して最初の応答までの待ち時間を短縮できます。まず接続を確認し、HiCacheでGPUメモリ(L1)、ホストメモリ(L2)、対応ストレージ(L3)にキャッシュを分けて保存する方法を見ていきます。
必要なメモリはどのくらいですか?
HiCacheは計算済みの状態をGPU外のホストメモリやストレージにも保存します。GPUの余裕が減っても、再利用する状態を別の階層に残せます。モデルの重みは実行する場所で使い、キャッシュには処理済み入力の計算結果を保存します。
条件と出典はどこで確認できますか?
以下はNVIDIA CUDA上のSGLang 0.5.20とopenai/gpt-oss-20bを使う接続基準です。GPUメモリが足りるか公式モデルカードと対応資料で先に確認します。コンテキスト8192・同時要求1件は接続確認値です。--enable-hierarchical-cacheと--hicache-ratio 2を設定してもデータ容量2倍を保証しないため、起動ログで実際のpoolを確認します。
変更履歴

サイトの説明を変更した記録です。インストール済みのエンジンやモデルのバージョンを自動で確認した結果ではありません。

  1. SGLangのキャッシュ・モデル別オプションの案内を追加

    ローカルサーバーへの接続例と、プリフィル・デコードの各段階でメモリを調整する手順を追加しました。繰り返し入力のキャッシュ効果を分け、NGRAMの候補検索とPLEテーブルのRAM・SSDへの配置を別の機能として説明しました。