DocumentationGetting started

Single-node cache: vLLM and SGLang

Run one independent Cache Manager on the inference host. The engine owns HBM and scheduling; the Manager owns shared DRAM and optional SSD. Standalone caching needs neither etcd nor a peer gRPC listener. Check compatibility and model qualification before enabling a new layout or topology.

Install and start the common manager

Version 0.1.0 is not yet published. Build the complete wheel from the repository root; this example selects Python 3.11 and CUDA 13:

git submodule update --init --recursive third-party/mooncake
./scripts/build-wheel.sh --release

CUDA 13 is the default and only release runtime. Select the newly built wheel in target/wheels explicitly and use its absolute path in the installation commands below. A complete wheel includes the Manager, extension and Mooncake libraries; maturin build alone does not stage all of them. The Manager also needs compatible PyTorch/CUDA 13 and an NVIDIA R580 or newer driver; see runtime requirements. It does not load model weights. Install the same OrbitKV build in client and Manager environments.

After creating an engine environment below, start one Manager from that environment:

orbitkv-cache-manager \
  --addr 127.0.0.1:50055 \
  --http-addr 127.0.0.1:9091 \
  --pool-size 8gb

Use the environment’s absolute bin/orbitkv-cache-manager path if it is not activated. The default bootstrap socket is /tmp/orbitkv-50055.sock. --pool-size controls external pinned memory, not engine HBM.

To add SSD, use a writable path and an explicit capacity:

orbitkv-cache-manager \
  --addr 127.0.0.1:50055 --http-addr 127.0.0.1:9091 --pool-size 8gb \
  --ssd-cache-path /data/orbitkv/cache.bin --ssd-cache-capacity 100gb

The default SSD backend tries cuFile and uses io_uring when unavailable. cuFile is an optional Manager library; it needs no separate service. Native GDS has separate hardware requirements and remains unqualified. The SSD file is truncated on Manager startup; it is not durable across Manager restarts. See GPU storage.

vLLM

Create an environment with the selected official release and your complete wheel:

uv venv .venv/vllm-release --python 3.11
uv pip install --python .venv/vllm-release/bin/python 'vllm==0.31.0' --torch-backend=cu130
uv pip install --python .venv/vllm-release/bin/python /absolute/path/to/the-built-wheel.whl

Start the Manager with .venv/vllm-release/bin/orbitkv-cache-manager. In another terminal, start the dense V1 eager profile:

VLLM_USE_V2_MODEL_RUNNER=0 .venv/vllm-release/bin/vllm serve /path/to/immutable-model \
  --enforce-eager --enable-prefix-caching \
  --kv-transfer-config '{
    "kv_connector": "OrbitKVConnector",
    "kv_role": "kv_both",
    "kv_connector_module_path": "orbitkv.vllm"
  }'

The supported starting profile has one attention cache group. V2, multiple groups and recurrent external recovery are rejected. vLLM uses its native HBM prefix cache first; OrbitKV restores missing compatible blocks and saves newly computed full blocks. For another Manager port, set orbitkv.port in kv_connector_extra_config or ORBITKV_PORT; use orbitkv.bootstrap_socket for an explicit socket. See adapter configuration.

SGLang

Use Python 3.11+ for SGLang 0.5.22. Start with the installed Qwen3-8B dense DRAM/io_uring profile in compatibility. Broader historical 0.5.21 profiles retain their recorded versions.

Use a separate official release environment:

uv venv .venv/sglang-release --python 3.11
uv pip install --python .venv/sglang-release/bin/python 'sglang==0.5.22' --torch-backend=cu130
uv pip install --python .venv/sglang-release/bin/python /absolute/path/to/the-built-wheel.whl

If no Manager is running, start one from this environment. Enable the linker with an explicit eager starting profile:

ORBITKV_SGLANG_ENDPOINT=unix:///tmp/orbitkv-50055.sock \
  .venv/sglang-release/bin/sglang serve \
  --model-path /path/to/immutable-model --page-size 64 \
  --cuda-graph-backend-decode disabled --cuda-graph-backend-prefill disabled \
  --enable-unified-cache-external-linker --radix-cache-backend orbitkv

Both linker flags are required. SGLang owns the radix tree and GPU slots; OrbitKV restores page-aligned state into those slots. Pending reads wait within their budget, then recompute on expiry. Full hybrid recovery requires separate model and lifecycle gates; native model output alone does not qualify external recovery.

Both adapters bind model artifacts, computation and layout to cache identity. Use immutable local artifacts or a full Hub revision. An explicitly verified ORBITKV_MODEL_FINGERPRINT can avoid repeated artifact reads; update it when its covered artifacts change. Static local LoRA has scoped acceptance; dynamic adapter mutation and live weight updates require stopping and restarting the deployment. See state identity.

Check behavior and capacity

curl --fail http://127.0.0.1:9091/health
curl --fail http://127.0.0.1:9091/metrics

Keep the Manager alive, restart the engine, then repeat a multi-block prompt. Check that orbitkv_save_bytes_total rose before the restart and orbitkv_load_bytes_total rose on recovery. Compare output with a cold-control namespace. A same-process repeated prompt may hit only the engine’s HBM.

An accepted host save guarantees its submitted GPU reads completed, not that best-effort asynchronous SSD publication created a replica. Pages remain held through the selected transfer’s completion. On a miss, the engine computes normally. Size DRAM, SSD and query budgets for your workload; metrics and performance methodology describe how to measure them. Leave optional warming, retention and cost-selection experiments disabled for this first deployment.

Deployment variants

The Manager and engine must share a host, UID, socket, iceoryx2 resources and GPU access. Native clients require process visibility for lifecycle checks. Distinct CUDA ordinals are allowed when they resolve the same full GPU UUID. Separate PID namespaces and container deployment need additional qualification; see deployment requirements.

For multiple engines, optional SSD and peers, use deployment recipes. Real-time P/D uses official NIXL/MultiConnector or SGLang disaggregation; Manager peer-cache bytes use TENT. See P/D composition before combining them.