From d696f86e7bdf23a6a4c212fee3522a589a460b24 Mon Sep 17 00:00:00 2001 From: Chen Zhang Date: Tue, 26 Aug 2025 13:19:05 -0700 Subject: [PATCH] [doc] Hybrid KV Cache Manager design doc (#22688) Signed-off-by: Chen Zhang Signed-off-by: Harry Mellor <19981378+hmellor@users.noreply.github.com> Co-authored-by: Harry Mellor <19981378+hmellor@users.noreply.github.com> --- .../basic_grouping_example.png | Bin 0 -> 24096 bytes .../hybrid_kv_cache_manager/full_attn.png | Bin 0 -> 4120 bytes .../hybrid_kv_cache_manager/memory_layout.png | Bin 0 -> 63113 bytes .../hybrid_kv_cache_manager/overview.png | Bin 0 -> 39501 bytes .../hybrid_kv_cache_manager/sw_attn.png | Bin 0 -> 4560 bytes docs/design/hybrid_kv_cache_manager.md | 245 ++++++++++++++++++ 6 files changed, 245 insertions(+) create mode 100644 docs/assets/design/hybrid_kv_cache_manager/basic_grouping_example.png create mode 100644 docs/assets/design/hybrid_kv_cache_manager/full_attn.png create mode 100644 docs/assets/design/hybrid_kv_cache_manager/memory_layout.png create mode 100644 docs/assets/design/hybrid_kv_cache_manager/overview.png create mode 100644 docs/assets/design/hybrid_kv_cache_manager/sw_attn.png create mode 100644 docs/design/hybrid_kv_cache_manager.md diff --git a/docs/assets/design/hybrid_kv_cache_manager/basic_grouping_example.png b/docs/assets/design/hybrid_kv_cache_manager/basic_grouping_example.png new file mode 100644 index 0000000000000000000000000000000000000000..185f61e6a3edeefb7f3c2bc5bcb942af3408da0e GIT binary patch literal 24096 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 literal 0 HcmV?d00001 diff --git a/docs/assets/design/hybrid_kv_cache_manager/full_attn.png b/docs/assets/design/hybrid_kv_cache_manager/full_attn.png new file mode 100644 index 0000000000000000000000000000000000000000..30eade5c7051cc050ffd0ccae797fd083d4389b0 GIT binary patch literal 4120 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 F{tJ^y_ig|H literal 0 HcmV?d00001 diff --git a/docs/assets/design/hybrid_kv_cache_manager/memory_layout.png b/docs/assets/design/hybrid_kv_cache_manager/memory_layout.png new file mode 100644 index 0000000000000000000000000000000000000000..bcffc27a716497b2b280be176b4f40e520dadda0 GIT binary patch literal 63113 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

`9Qq``9CCq~Jh^#c>IYNx-PIy?# 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 Dia)7I&|G83iikgf9pxFG z=q7V)`0aPozNi9jdmGX6d^Q>PM;BIesUy+QU2|4bZ?s$=_pvw*V(fR5nez?m)ENg z#HQz9cBPESc^SkaFV6svp_KDemsM6~@)svUbse0=(}2z2%M8Kz{5@tO{5@;4`?0cZ z37~0qi#W_}6EQ#wnZsZI@NjIsPib9Rq^0go6o(wH{5Uz&a19D8|%)F*oSJ zXO{fne%ZqPf_$byK`)9Qisv2sMdYW>%H?6Qco2{mUx7voF(ocT3&J;}W@-tY%cxkdaD1F-)2NoQM_f)y7ze~(;KiT}DS^KAb$JT8j zK&|s%_w2165V+W*-+HDBD0;KuZBn{h&+PJTn&38GV6MPIEKs8!_x05G9@CMm8uu1e zw1@n*kKX61o@rJFuul7 zaq(o^2s=VT*}FGE@cw$iAR*L{pHj7n&2nCPsrrdO8DO}SjItttni&tw6llt0%LId= zS|hZ=D-mW6kIuK%dqGngz(h!=43VH0HMs-tIv%2IvGe@lD1TA--55&JTa}3vXbY;~ zz{v6poxTUR3NWR-)At~_jc`(b7Zk(Qr(w2k04qmeVl^zvn`w5G6Ac9&4a-Wvszq5R zvYNf~aKiA&ro?>o$IQH!K2Za-kGIG?2!uwyCM+N<+^v4V*g#%(w@_q4I^TCbBmU;- zn4C~|N`(8!h%eI%+n*Vj+z{vx7tfD9EoeEjQPzlXXL4a$GdjHj2~^_2p$8WI$B{I0 zOl0KHe7@ZevgufFdAh!7Bd8HGq)z*w{&vzs#;VAvuU;e*D&!#N;<3G{^~)C3_pRQd zKP;>IV%kUZA-;JoCZPSPL--y=u+P|!%A~$AGePo-GWX6|welspnl3>s#O1_+S8aA?P!v_N!!j&?nXR&Zl4U-?J<6ujx+ zj$SJ=ivmU)L}vingnY%*D=45sA!}C6Cysd*fl>ImALj#g;-iM2^=~A=uNznzcl`wZYR&%R(O1DB4PuDe z;<+0L3T_Y274kX=j0S*<*z*D3;B;FA$lieUCK@@7LYUkDViD3&Gkm1fqzxwBA>?>4 zTP`v?aa5RtN9n60YsrltF_##q{mcZQdV%qEh^~SZw%RILKU>T5Gan(> zy?H{=K~uzT{5Ij$=5^Di$t5>8w*y7!!rw*l?(-#pG6hK#fr+Yj51q*k8+y#$k3FU3 zCkDc`$&MVUJFao`P+n%TGOIwT-2u;H;_ssP5$^hDr_+@Nif#jF&4&gsrc&W z=&&neH$ev1ubJdfMMkgk^;x-3T#U8RnK*lNU4WPlb05*DgAzEF3!(;Te+Y0jkB^m= z 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 literal 0 HcmV?d00001 diff --git a/docs/design/hybrid_kv_cache_manager.md b/docs/design/hybrid_kv_cache_manager.md new file mode 100644 index 0000000000000..8f17b473adc08 --- /dev/null +++ b/docs/design/hybrid_kv_cache_manager.md @@ -0,0 +1,245 @@ +# Hybrid KV Cache Manager + +!!! warning + This document was written based on commit [458e74](https://github.com/vllm-project/vllm/commit/458e74eb907f96069e6d8a4f3c9f457001fef2ea). This feature is still in its early stage and things may change. + +## What is a hybrid model? + +Many recent "hybrid" LLMs combine multiple attention types within one model. For example: + +1. Sliding window attention (sw) + full attention (full): gpt-oss, Gemma 2/3, Ministral, cohere, etc. +2. Mamba + full: Bamba, Jamba, Minimax, etc. +3. Local chunked attention + full: Llama4 + +To serve these models efficiently, our [KVCacheManager][vllm.v1.core.kv_cache_manager.KVCacheManager] must: + +1. Allocate different slots to different layer type, for example: + - Full attention layers: reserve slots for **all** tokens. + - Sliding window layers: reserve slots only for the most recent **`sliding_window_size`** tokens. +2. Support layer-specific prefix-cache rules, for example: + - Full attention: a cache hit prefix requires **all** tokens remain in the KV cache. + - Sliding window: a cache hit prefix only requires the last **`sliding_window_size`** tokens remain in the KV cache. + +## Definitions + +1. **kv hidden size**: The number of bytes to store one token's KV cache for a single layer. +2. **block**: the memory reserved for kv cache are divided into multiple *blocks* with the same *page size* (defined below) +3. **block size**: number of tokens inside a block +4. **page size**: the physical memory size of a block, defined as: + + $$ + \text{num_layers} \times \text{block_size} \times \text{kv_hidden_size} + $$ + + `num_layers` doesn't mean the total number of layers in the model. The exact number depends on the context in this doc. + + !!! note + This is different from `KVCacheSpec.page_size_bytes` in the code, which is defined as: + + $$ + \text{block_size} \times \text{kv_hidden_size} + $$ + +## Allocation + +### High level idea + +We use a single memory pool for all layer types. The memory pool is split into multiple blocks with the same page size. [KVCacheManager][vllm.v1.core.kv_cache_manager.KVCacheManager] allocates different numbers of blocks to different layers according to its attention type. + +The core challenge is ensuring every layer type uses the same **page size**. For full-attention-only models, the page size is straightforward, defined as: + +$$ +\text{page_size} = \text{block_size} \times \text{num_hidden_layers} \times \text{kv_hidden_size} +$$ + +However, in hybrid models, `num_hidden_layers` varies by attention type, which would normally produce mismatched page sizes. The cases below show how we unify them. + +### Case 1: toy model + +Let's start with a toy example: a model has 1 full attention layer and 3 sliding window attention layers. All layers have the same `kv_hidden_size`. + +We let each block to hold `block_size` tokens for one layer, so: + +$$ +\text{page_size} = \text{kv_hidden_size} \times \text{block_size} +$$ + +[KVCacheManager][vllm.v1.core.kv_cache_manager.KVCacheManager] allocates a different number of blocks to each layer. + +This case is only a toy example. For real models, please refer to the following cases. + +### Case 2: same `kv_hidden_size` and a regular pattern + +When the model has more layers, e.g., 20 sliding window attention layers and 10 full attention layers with the same `kv_hidden_size`. Calling the allocator once per layer (30 calls) is OK but becomes inefficient. As a solution, we group the allocation of layers that need the same number of blocks to reduce the number of calls. + +The grouping is feasible because there is usually a beautiful ratio between the number of different types of layers. For example: + +- Gemma-2: 1 sw : 1 full +- Llama 4: 3 local : 1 full + +Our example can be regarded as 2 sw : 1 full. We can allocate blocks as if there are 2 sw and 1 full in the model, and repeat the result by 10 times to generate the `block_ids` for the 30 layers. The page size becomes: + +$$ +10 \times \text{kv_hidden_size} \times \text{block_size} +$$ + +Assume `block_size` 16, sliding window size 32, request length 112, then for the above example model, we need to allocate 11 blocks (0-6 for full, 7-8 for sw group 1, 9-10 for sw group 2). + +![Allocation Result](../assets/design/hybrid_kv_cache_manager/basic_grouping_example.png) + +Here, "/" denotes no block needed (sliding‑window layers don't need slots for early tokens). + +See the formal definition below. The layers are divided into multiple *KV Cache Groups* so that there is: + +1. **Identical attention type inside each group**: Each group only contains layers with the same attention type and thus need the same number of blocks for a given request. This enables layers in the same group share the same block ids without memory waste. +2. **Identical page size across groups**: Because our memory pool only have one page size. + +Our example model is divided into 3 KV cache groups: + +- Group 0: 10 full attention layers (full.0 - full.9) +- Group 1: 10 sliding window attention layers (sw.0 - sw.9) +- Group 2: 10 sliding window attention layers (sw.10 - sw.19) + +Obviously, it satisfies rule 1. For rule 2, all 3 groups have + +$$ +10 \times \text{kv_hidden_size} \times \text{block_size} +$$ + +as their page size. + +### Case 3: same `kv_hidden_size` and no regular pattern + +Unfortunately, not all models have such a beautiful ratio, and approach in Case 2 will produce too many small groups. For example, Gemma-3-27b has 52 sliding window attention layers and 10 full attention layers. With the constraints in case 2, it would be 26 sliding window groups and 5 full attention groups, each contains 2 layers. The allocation is still inefficient. To reduce the number of kv cache groups, we group layers using the smallest layer count among all attention types. For example, min(52, 10)=10 layers per group in Gemma-3-27b. Then the grouping result is: + +- Group 0: 10 full attention layers (full.0 - full.9) +- Group 1: 10 sliding window attention layers (sw.0 - sw.9) +- Group 2: 10 sliding window attention layers (sw.10 - sw.19) +- ... +- Group 6: 10 sliding window attention layers (sw.40 - sw.49) +- Group 7: 2 sliding window attention layers (sw.50 - sw.51) and 8 padding layers + +We will update this algorithm if this heuristic leads to a bad result when a new model comes out (e.g., 20 full + 30 sw, the group size should be 10 instead of 20). + +This case happens in Gemma-3 series models, and models in case 2 but with eagle speculative decoding which introduce one full attention layer. The solution has some memory waste and is not perfect. Please report any cases where padding overhead becomes unacceptable so we can refine the algorithm. + +### Case 4: different `kv_hidden_size` (mainly hybrid mamba models) + +Some architectures (e.g., Bamba, Jamba, Minimax) interleave standard attention layers with Mamba layers, where each Mamba layer's state size per token can be much larger than the attention layers' `kv_hidden_size`. Because we only support a single page size across all groups, we must reconcile these differing hidden sizes. + +The current algorithm is: + +1. Increase the `block_size` of attention layers until + $$ + \text{block_size} \times \text{kv_hidden_size}_{\text{att}} \ge \text{state_size}_{\text{mamba}} + $$ +2. Pad the mamba state per layer to + $$ + \text{block_size} \times \text{kv_hidden_size}_{\text{att}} + $$ +3. Apply the grouping strategy in case 3. + +!!! note + This can lead to more than 400 `block_size` for attention layers, which is too large. Another padding strategy is to increase `block_size` until + + $$ + \text{block_size} \times \text{kv_hidden_size}_{\text{att}} \times \text{num_attn_layers} \ge \text{state_size}_{\text{mamba}} + $$ + + This padding strategy is still a work in progress. + +### Case 5: KV sharing + +KV sharing refers to a layer using the KV cache of another layer, e.g., gemma-3n. +In these models, [KVCacheManager][vllm.v1.core.kv_cache_manager.KVCacheManager] ignores all layers with kv sharing and only allocates KV cache for layers that need kv cache, and some patches are made in model runner to apply the allocation result to kv sharing layers. + +## Prefix caching + +For simplicity, we assume `block_size=1` in this section. + +### High level idea + +The block pool uses a dict similar to `tuple(block_hash, group_id) -> block` to catch the full blocks. That means the same tokens of different groups are cached and evicted independently. + +When a new request comes in, we check the cache hit prefix of each group, and return the intersection of these groups as the cached prefix of the request. See below for the detailed algorithm for checking the cache hit of one group & performing the intersection. + +### Case 0: full attention only models + +For full attention layers, blocks are allocated for all tokens in the request. For details on the underlying design, see [Prefix Caching](prefix_caching.md) + +To find the longest cache hit prefix of a request, we enumerate from left (the first block) to right (the last block), checking whether the block is cached, and exit when cache misses. For example, we will return the first 7 tokens (0-6) as the cache hit prefix in the below example (blue blocks are cached): + +![Prefix Caching of Full Attention](../assets/design/hybrid_kv_cache_manager/full_attn.png) + +### Case 1: sliding window attention only models + +For sliding window attention layers, a naive implementation for memory allocation is to allocate `sliding_window_size` blocks and fill in the blocks in a round-robin way. But this naive implementation is not compatible with prefix caching so we didn't pick this design. In vLLM, we allocate different blocks for different tokens and free blocks that are outside the sliding window. + +For a new request, the cache hit prefix only requires the last `sliding_window_size - 1` tokens being cached. +Let's say `sliding_window_size = 4` and `block_size = 1`, and the request is a 15-token prompt (blue blocks are cached): + +![Prefix Caching of Sliding Window Attention](../assets/design/hybrid_kv_cache_manager/sw_attn.png) + +There are 3 possible cache hit prefixes: + +- cache hit length 5, compute prefill with [2, 3, 4] → [5, 6, …, 14] +- cache hit length 6, compute prefill with [3, 4, 5] → [6, 7, …, 14] +- cache hit length 14, compute prefill with [11, 12, 13] → [14] (most efficient) + +We can check the cache hit from right to left, and early exit when we find a match.This is opposite from full attention, where we check from left to right and early exit when the match fails. One potential cons (compared to full attention) is that we end up iterating over the entire list of tokens when there's no match, which is often a common case. This could potentially cause non-negligible overheads, but fine with full + swa, as discussed below. + +### Case 2: sliding window attention + full attention models + +The first problem is how to find the cache hit prefix. We need to "intersect" the cache hits of global and sliding window attention layers by: + +1. Get the longest cache hit for full attention (scanning from left to right) +2. Get the longest cache hit for sliding window attention that is within that length. Implemented by checking cache hits from right to left starting from the cache hit length of full attention. + +It can be ensured that the resulting cache hit of sliding window attention layers is also a cache hit of full attention layers. This is more efficient than finding all possible prefixes of each group and doing the intersection, because our approach can exit early if there is no cache hit. + +The algorithm applies to models with exactly two attention types full attention + X, where X can be an arbitrary efficient attention algorithm like sliding window, llama 4 local attention, and mamba. It doesn't support models without full attention layers, and models with more than 2 types of attention. This is enough for most hybrid models at the moment of writing this doc. + +The second question is the cache eviction policy. For now, we use one LRU queue for all kv cache groups. The blocks are added to the LRU queue when freed, either because the request is finished or the block is out of the sliding window. + +### Case 3: mamba models + +The prefix caching support of the mamba model is work in progress. Once implemented, models with mamba layer + full attention layer can be supported via the full attention + X algorithm in case 2. + +## Implementation + +### Overview + +![Overview of Hybrid KV Cache Manager](../assets/design/hybrid_kv_cache_manager/overview.png) + +The `KVCacheManager` is organized into 3 layers: + +- **[KVCacheManager][vllm.v1.core.kv_cache_manager.KVCacheManager]**: The interface between the scheduler and kv cache management system. +- **[KVCacheCoordinator][vllm.v1.core.kv_cache_coordinator.KVCacheCoordinator]**: coordinate per-group SingleTypeKVCacheManagers to generate the allocation result of a request. Depending on the model's configuration, one of these coordinators is chosen: + - **[KVCacheCoordinatorNoPrefixCache][vllm.v1.core.kv_cache_coordinator.KVCacheCoordinatorNoPrefixCache]**: Used when prefix caching is disabled. + - **[UnitaryKVCacheCoordinator][vllm.v1.core.kv_cache_coordinator.UnitaryKVCacheCoordinator]**: If only one KV cache group. The prefix caching logic is simplified as no intersection is needed. + - **[HybridKVCacheCoordinator][vllm.v1.core.kv_cache_coordinator.HybridKVCacheCoordinator]**: Handles exactly two KV cache groups (must include one full‑attention group plus one other efficient‑attention group). Other cases are not implemented. You can disable prefix caching to use the KVCacheCoordinatorNoPrefixCache. +- **[SingleTypeKVCacheManager][vllm.v1.core.single_type_kv_cache_manager.SingleTypeKVCacheManager]**: Each instance manages allocation and prefix caching for one KV cache group, implementing the attention‑type–specific logic (e.g., full attention, sliding window, Mamba). + +The blue box in the above figure shows the case with 10 full attention layers and 20 sliding window attention layers, thus: + +- use `HybridKVCacheCoordinator` +- use 1 `FullAttentionManager` and 2 `SlidingWindowManager` for the 3 `KVCacheGroup`s. + +### Memory Layout + +For a model with n `KVCacheGroup`s, each with m layers, we allocate m buffers. Each buffer is shared by n layers, one from each group. + +The following figure is for a model with 10 full attention layers (full.0 - full.9) and 20 sliding window attention layers (sw.0-sw.19). It follows "case 2" in "Allocation" section and is divided into 3 groups: + +- Group 0: 10 full attention layers (full.0 - full.9) +- Group 1: 10 sliding window attention layers (sw.0 - sw.9) +- Group 2: 10 sliding window attention layers (sw.10 - sw.19) + +And for a request, we allocate 11 blocks with `block_id` 0-6 to group 0, 7-8 to group 1, and 9-10 to group 2. + +With such an example, the physical memory is divided into 10 buffers (`KVCacheTensor` 0 - `KVCacheTensor` 9). Each buffer is shared by 3 layers (e.g., `KVCacheTensor` 0 is shared by full.0 from group 0, sw.0 from group 1, and sw.10 from group 2) and is divided into pieces with size `block_size * kv_hidden_size`. The KV cache of these 3 attention layers are saved to different pieces of the buffer based on the allocated `block_ids`: + +![Example Memory Layout](../assets/design/hybrid_kv_cache_manager/memory_layout.png) + +!!! note + One logic "block" is mapped to 10 pieces in the 10 buffers of the physical memory.