vllm.models.glm5next.common.attention
¶
Classes:
-
Glm5NextIndexerCache–Indexer K cache that stores kpool-compressed entries.
-
Glm5NextTailCache–Paged circular buffer for the kpool indexer's in-progress (tail) pool.
Glm5NextIndexerCache
¶
Bases: DeepseekV32IndexerCache
Indexer K cache that stores kpool-compressed entries.
Setting tokens_per_state = index_kpool on the KV cache spec makes vLLM's
indexer metadata builder emit pool-granular slot_mapping /
seq_lens / cu_seq_lens / page_table for free, and shrinks the
cache allocation store one state per index_kpool tokens. The pool
content (softmax-weighted sum vs keep-every-Nth) is computed by the
kpool compress kernel inside the indexer op — the cache only provides the
addressing, which is identical for both schemes.
The indexer shares one block with the co-located MLA (a single
MLAAttentionSpec / block_table), so block_size is the model-wide
cache_config.block_size. DeepGEMM's paged-MQA kernel takes 32- or
64-state pages (only 64 on SM120), which Glm5NextIndexerBackend
declares as its kernel block sizes.
Source code in vllm/models/glm5next/common/attention.py
Glm5NextTailCache
¶
Bases: DeepseekV32IndexerCache
Paged circular buffer for the kpool indexer's in-progress (tail) pool.
Holds the trailing incomplete pool's raw K + gate score: one block of
ring slots per request, overwritten in place by pos % ring
as decode/spec-decode advances. Prefill seeds it (instead of discarding the
tail raw K+gate); the connector transfers it across PD; decode reads it to
compress the boundary pool correctly. CircularBufferSpec provides the
no-prune, 1-block/req allocation that lets the in-progress pool survive
across steps and across transfer.
Stores raw bf16 K (head_dim) as the "K" half of each block and the
bf16 gate score (head_dim) as the "V" half -- not the fp8-compressed
entry, which lives in Glm5NextIndexerCache.