Skip to content

Does kthena fully support LMCache as a PD disaggregation connector? #1502

Description

@0xjasoncao

Please provide an in-depth description of the question you have:

I'm trying to run disaggregated prefill (PD) with vLLM + LMCache as the KV connector, routed by kthena-router. After tracing both codebases
against the LMCache official PD example (examples/disagg_prefill/disagg_proxy_server.py @ v0.4.4), I'm not sure kthena currently provides
what the LMCache LMCacheConnectorV1 path actually requires. Opening this to ask the community: does kthena fully support LMCache as a PD
connector, and if not, what's the intended path?

What LMCache requires (per its official example)

In LMCache's official PD example, an external proxy (disagg_proxy_server.py) does two things kthena doesn't appear to do:

  1. Injects transfer_spec (a.k.a. disagg_spec) into the prefill request body — this is how the prefill side learns which decode node to send
    KV to. It's mandatory: without it, the producer won't transfer KV (and on older LMCache it outright crashes). The proxy picks a decode
    node and adds to the prefill request:
 disagg_spec = {
      "req_id": req_id,
      "receiver_host": decode_client.host,        
      "receiver_init_port": decode_client.init_port, 
      "receiver_alloc_port": decode_client.alloc_port,
  }

     req_data["kv_transfer_params"] = {
      "ret_first_tok": True,
      "disagg_spec": disagg_spec,
  }
  1. Receives a completion notification from prefill and gates the decode request until KV transfer finishes. This part is optional as of
    LMCache v0.4.4 (pd_skip_proxy_notification), but the disagg_spec injection in (1) is not optional.

What kthena currently does

Looking at pkg/kthena-router/connectors/, the LMCache-relevant path seems to be the simple HTTPConnector (http.go), whose Proxy just
forwards req_data to prefill then to decode sequentially — it does not inject disagg_spec. The NIXLConnector (nixl.go) injects a different,
vLLM-native shape (do_remote_decode / remote_block_ids / remote_host / remote_port, see types.go:20-26), which LMCache's
LMCacheConnectorV1 does not consume.

What do you think about this question?:

So when a PD workload uses --kv-transfer-config '{"kv_connector":"LMCacheConnectorV1",...}', the fields kthena injects don't match what
LMCache reads. The prefill node never receives disagg_spec, so KV is never transferred to the decode node.

Questions for the community

  1. Is full LMCache (LMCacheConnectorV1) PD support a goal of kthena-router? If yes, is there a connector (existing or planned) that injects
    the LMCache disagg_spec shape above and does decode-node selection?

Environment:

  • Kthena version: v1.0.0
  • Kubernetes version: v1.35
  • Others:

Metadata

Metadata

Assignees

Labels

questionFurther information is requested

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions