vllm.v1.kv_cache_interface ¶
Classes:
-
AttentionSpec– -
ChunkedLocalAttentionSpec– -
CrossAttentionSpec–KV cache spec for cross-attention layers in encoder-decoder models.
-
FullAttentionSpec–When hybrid allocator is disabled and the model contains both full
-
HiddenStateCacheSpec–Marker for hidden-state cache layers used by extract_hidden_states.
-
KVCacheConfig–The KV cache configuration of a model.
-
KVCacheGroupSpec–Represents a group of model layers that share the same KV cache block table.
-
KVCacheSpec–A base class for specifying the KV cache format of one layer.
-
KVCacheTensor–A class for specifying how the workers should initialize the KV cache.
-
KVQuantMode–KV cache quantization mode.
-
RSWASpec–KV cache spec for Reference Sliding Window Attention (R-SWA).
-
SinkFullAttentionSpec– -
SlidingWindowMLASpec–Sliding window attention with MLA cache format.
-
SlidingWindowSpec– -
UniformTypeKVCacheSpecs–A KV cache spec for multiple layers with the same type of attention. Here,
Functions:
-
compute_layer_kv_cache_shape_bytes–Return the 4D logical shape
(B, H, N, C)where C is in bytes. -
compute_layout_strides–Byte strides in logical
[L, B, H, N, C]axis order. -
create_kv_cache_views–View a flat int8 buffer as one 4D
[B, H, N, C]view per layer. -
get_kv_quant_mode–Map a
kv_cache_dtypestring to a :class:KVQuantMode. -
group_kernel_blocks–View a kernel-block-granular layer cache with manager blocks as dim 0.
-
is_full_attention_spec–Whether a KV cache group spec is (or wraps) full attention.
-
iter_layer_specs–The per-layer specs a KV cache group spec covers.
-
kv_cache_uses_per_token_head_scales–Return True if kv_cache_dtype needs per-token-head scales.
-
replace_as–dataclasses.replace, but rebuilding spec as target_cls
AttentionSpec dataclass ¶
Bases: KVCacheSpec
Attributes:
-
num_head_slots(int | None) –H of the logical
[B, H, N, C]page when packing diverges from one -
real_page_size_bytes(int) –Alias of
unpadded_page_size_bytes -
state_content_bytes(int | None) –C in bytes when packed; None means dense K/V content.
-
state_content_size_bytes(int) –Bytes per (head slot, stored state) cell of the page.
-
tokens_per_state(int | Fraction) –Tokens covered by one stored state. Ints > 1 compress multiple tokens
Source code in vllm/v1/kv_cache_interface.py
num_head_slots = None class-attribute instance-attribute ¶
H of the logical [B, H, N, C] page when packing diverges from one slot per KV head. None means one slot per KV head. Published by the backend.
real_page_size_bytes property ¶
Alias of unpadded_page_size_bytes TODO(lucas): follow up with TPU backend to see if we can remove this property.
state_content_bytes = None class-attribute instance-attribute ¶
C in bytes when packed; None means dense K/V content.
state_content_size_bytes property ¶
Bytes per (head slot, stored state) cell of the page.
tokens_per_state = 1 class-attribute instance-attribute ¶
Tokens covered by one stored state. Ints > 1 compress multiple tokens into one state (DSv4 sparse MLA); fractions < 1 store multiple states per token (Whisper block pooling: Fraction(1, block_pool_size)).
ChunkedLocalAttentionSpec dataclass ¶
Bases: AttentionSpec
Methods:
-
max_admission_blocks_per_request–Per-request admission cap, in blocks.
Source code in vllm/v1/kv_cache_interface.py
max_admission_blocks_per_request(max_in_flight_tokens, max_model_len) ¶
Per-request admission cap, in blocks.
Single source of truth for both startup pool sizing (max_memory_usage_bytes) and the runtime admission gate, so requests admitted by startup can also be admitted at runtime.
max_in_flight_tokens is the max tokens scheduled but not yet settled (one batch per concurrent step); see VllmConfig.max_in_flight_tokens.
Source code in vllm/v1/kv_cache_interface.py
CrossAttentionSpec dataclass ¶
Bases: AttentionSpec
KV cache spec for cross-attention layers in encoder-decoder models.
Source code in vllm/v1/kv_cache_interface.py
FullAttentionSpec dataclass ¶
Bases: AttentionSpec
When hybrid allocator is disabled and the model contains both full attention layers and sliding window attention layers, sliding window attention are regarded as full attention in KV cache manager (blocks are allocated for all tokens), while computed as sliding window attention in model runner. In this case, we use FullAttentionSpec and record the sliding window size.
Methods:
-
merge–Merge a list of FullAttentionSpec objects into a single
Attributes:
-
non_causal(bool) –Whether the layer attends non-causally (e.g. Prefix LM). Carried on the
-
sliding_window(int | None) –Default to None for not using sliding window attention.
Source code in vllm/v1/kv_cache_interface.py
433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 | |
non_causal = False class-attribute instance-attribute ¶
Whether the layer attends non-causally (e.g. Prefix LM). Carried on the spec so the engine core, which collects specs from all workers before the scheduler is built, can adjust scheduling policy (chunked prefill / prefix caching) regardless of tensor-parallel layout. It does not affect the KV cache layout itself.
sliding_window = None class-attribute instance-attribute ¶
Default to None for not using sliding window attention.
merge(specs) classmethod ¶
Merge a list of FullAttentionSpec objects into a single FullAttentionSpec object.
Source code in vllm/v1/kv_cache_interface.py
HiddenStateCacheSpec dataclass ¶
Bases: MLAAttentionSpec
Marker for hidden-state cache layers used by extract_hidden_states.
Source code in vllm/v1/kv_cache_interface.py
KVCacheConfig dataclass ¶
The KV cache configuration of a model.
Attributes:
-
has_mixed_precision_kv_cache(bool) –Whether attention groups store their KV cache at more than one precision.
-
kv_cache_groups(list[KVCacheGroupSpec]) –The kv cache groups of the model.
-
kv_cache_layout(str | None) –The KV cache layout resolved by the engine core, adopted by all workers.
-
kv_cache_tensors(list[KVCacheTensor]) –How should model runner initialize the KV cache tensors for each layer
-
needs_kv_cache_zeroing(bool) –Whether newly allocated KV cache blocks must be zeroed before use.
-
num_blocks(int) –The number of KV cache blocks
-
prefix_cache_retention_interval(int | None) –Resolved retention policy for local prefix-cache checkpoints.
Source code in vllm/v1/kv_cache_interface.py
has_mixed_precision_kv_cache property ¶
Whether attention groups store their KV cache at more than one precision.
kv_cache_groups instance-attribute ¶
The kv cache groups of the model. For models with only one type of attention, there is only one group that contains all layers. For models with multiple types of attention, there will be multiple groups, see _get_kv_cache_config_uniform_page_size for more details.
kv_cache_layout = None class-attribute instance-attribute ¶
The KV cache layout resolved by the engine core, adopted by all workers.
kv_cache_tensors instance-attribute ¶
How should model runner initialize the KV cache tensors for each layer
needs_kv_cache_zeroing property ¶
Whether newly allocated KV cache blocks must be zeroed before use.
Required for Mamba layers, whose state is read before it is fully written (#35219), and for mixed-precision caches, where a block reused across groups can be reinterpreted under a different precision and decode stale bytes to NaN/Inf. Uniform-precision caches skip zeroing.
num_blocks instance-attribute ¶
The number of KV cache blocks
prefix_cache_retention_interval = None class-attribute instance-attribute ¶
Resolved retention policy for local prefix-cache checkpoints.
KVCacheGroupSpec dataclass ¶
Represents a group of model layers that share the same KV cache block table. These layers are regarded as one layer in the KV cache manager.
Source code in vllm/v1/kv_cache_interface.py
KVCacheSpec dataclass ¶
A base class for specifying the KV cache format of one layer.
Methods:
-
copy_with_new_block_size–Create a new KVCacheSpec from self but replacing the block size.
-
is_uniform_with_collection–Whether this KVCacheSpec is uniform with all specs of all layers.
-
max_memory_usage_bytes–The maximum possible memory usage of this KV cache in bytes.
-
max_num_blocks_per_req–The number of block table entries needed per request, i.e. the row
-
merge–Merge a list of KVCacheSpec objects into a single KVCacheSpec object.
Attributes:
-
page_size_bytes(int) –The size of a page with
block_sizetokens in bytes.
Source code in vllm/v1/kv_cache_interface.py
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 | |
page_size_bytes property ¶
copy_with_new_block_size(block_size) ¶
Create a new KVCacheSpec from self but replacing the block size.
is_uniform_with_collection(kv_cache_specs) ¶
Whether this KVCacheSpec is uniform with all specs of all layers.
Source code in vllm/v1/kv_cache_interface.py
max_memory_usage_bytes(vllm_config) ¶
The maximum possible memory usage of this KV cache in bytes.
Returns:
-
int–The KV cache size in bytes
max_num_blocks_per_req(vllm_config, max_len) ¶
The number of block table entries needed per request, i.e. the row length of the worker-side block table for this cache group.
Parameters:
-
(vllm_config¶VllmConfig) –The vllm config.
-
(max_len¶int) –The maximum sequence length to size for, including the encoder length for encoder-decoder models.
Source code in vllm/v1/kv_cache_interface.py
merge(specs) classmethod ¶
Merge a list of KVCacheSpec objects into a single KVCacheSpec object.
Source code in vllm/v1/kv_cache_interface.py
KVCacheTensor dataclass ¶
A class for specifying how the workers should initialize the KV cache.
Placement of a set of same-shaped layers in the KV cache allocation. Layer layers[l]'s page for block b starts at offset + l * layer_stride + b * block_stride bytes into the backing allocation of size bytes. Layer-outermost layouts give each layer a contiguous region (layer_stride = page * num_blocks, block_stride = page); block-outermost layouts make each block a block of all layers' pages (layer_stride = page, block_stride = the packed block). Tensors whose address ranges overlap alias the same bytes: cache groups overlay each other, which is sound because a block ID is owned by one group at a time.
Source code in vllm/v1/kv_cache_interface.py
KVQuantMode ¶
Bases: IntEnum
KV cache quantization mode.
Used by attention backends and kernels to dispatch quantization logic without string matching on kv_cache_dtype.
Attributes:
-
is_nvfp4(bool) –True for NVFP4 packed quantization mode.
-
is_per_token_head(bool) –True for any per-token-head quantization mode.
-
is_turboquant(bool) –True for any turboquant quantization mode.
Source code in vllm/v1/kv_cache_interface.py
RSWASpec dataclass ¶
Bases: FullAttentionSpec
KV cache spec for Reference Sliding Window Attention (R-SWA).
Prefill (image + text prompt) tokens are always globally visible. Only the last rswa_window generated tokens are kept in the KV cache; gap blocks (between the prefill tail and the current decode window) are evicted during each decode step to bound memory at O(prefix_blocks + window_blocks).
Source code in vllm/v1/kv_cache_interface.py
SinkFullAttentionSpec dataclass ¶
Bases: FullAttentionSpec
Methods:
-
merge–Merge a list of FullAttentionSpec objects into a single
Source code in vllm/v1/kv_cache_interface.py
merge(specs) classmethod ¶
Merge a list of FullAttentionSpec objects into a single FullAttentionSpec object.
Source code in vllm/v1/kv_cache_interface.py
SlidingWindowMLASpec dataclass ¶
Bases: SlidingWindowSpec
Sliding window attention with MLA cache format.
Source code in vllm/v1/kv_cache_interface.py
SlidingWindowSpec dataclass ¶
Bases: AttentionSpec
Methods:
-
max_admission_blocks_per_request–Per-request admission cap, in blocks.
Source code in vllm/v1/kv_cache_interface.py
max_admission_blocks_per_request(max_in_flight_tokens, max_model_len) ¶
Per-request admission cap, in blocks.
Single source of truth for both startup pool sizing (max_memory_usage_bytes) and the runtime admission gate. Per-request real-held blocks plateau at this bound because SlidingWindowManager.remove_skipped_blocks runs from allocate_slots before each chunk's get_num_blocks_to_allocate.
max_in_flight_tokens is the max tokens scheduled but not yet settled (one batch per concurrent step); see VllmConfig.max_in_flight_tokens.
Source code in vllm/v1/kv_cache_interface.py
UniformTypeKVCacheSpecs dataclass ¶
Bases: KVCacheSpec
A KV cache spec for multiple layers with the same type of attention. Here, same types means always need the same number of token slots. For example, sliding window attentions with different window sizes are not the same type and should not be merged into one UniformTypeKVCacheSpecs.
Methods:
-
from_specs–Return a SameTypeKVCacheSpecs object if all layers have the same type
-
is_uniform_type–Whether all layers have the same type of KV cache spec.
Source code in vllm/v1/kv_cache_interface.py
947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 | |
from_specs(kv_cache_specs) classmethod ¶
Return a SameTypeKVCacheSpecs object if all layers have the same type of KV cache spec. Return None if not.
Source code in vllm/v1/kv_cache_interface.py
is_uniform_type(kv_cache_specs) classmethod ¶
Whether all layers have the same type of KV cache spec.
Uses the registry to determine grouping base classes, so custom specs that inherit from FullAttentionSpec are treated as full attention.
Source code in vllm/v1/kv_cache_interface.py
compute_layer_kv_cache_shape_bytes(spec, num_blocks, kernel_block_size=None) ¶
Return the 4D logical shape (B, H, N, C) where C is in bytes.
Source code in vllm/v1/kv_cache_interface.py
compute_layout_strides(spec, num_blocks, num_layers, layout, kernel_block_size=None, fixed_strides=(None,) * 5) ¶
Byte strides in logical [L, B, H, N, C] axis order.
Source code in vllm/v1/kv_cache_interface.py
create_kv_cache_views(raw, spec, num_blocks, layout, kv_cache_tensor, kernel_block_size=None) ¶
View a flat int8 buffer as one 4D [B, H, N, C] view per layer.
Block b of layer l starts at the tensor offset plus its layer and block stride contributions.
Source code in vllm/v1/kv_cache_interface.py
get_kv_quant_mode(kv_cache_dtype) ¶
Map a kv_cache_dtype string to a :class:KVQuantMode.
Source code in vllm/v1/kv_cache_interface.py
group_kernel_blocks(cache, num_blocks) ¶
View a kernel-block-granular layer cache with manager blocks as dim 0.
Kernel block splitting subdivides each manager block into uniformly strided kernel blocks, so grouping is a pure view: (num_blocks * ratio, ...)
Source code in vllm/v1/kv_cache_interface.py
is_full_attention_spec(kv_cache_spec) ¶
Whether a KV cache group spec is (or wraps) full attention.
UniformTypeKVCacheSpecs is not itself a FullAttentionSpec, so a bare isinstance check misses groups that carry the wrapper -- DeepSeek-V4's MLA layers, or any model taking the UniformTypeKVCacheSpecs.from_specs path.
Every layer must be full attention: a group holding a recycling (sliding-window) layer has no stable slot layout, so callers that key data by slot cannot use it.
Source code in vllm/v1/kv_cache_interface.py
iter_layer_specs(kv_cache_spec) ¶
The per-layer specs a KV cache group spec covers.
UniformTypeKVCacheSpecs groups keep one spec per layer; every other spec describes its group on its own. Returns the layer specs either way so callers do not have to special-case the wrapper.
Source code in vllm/v1/kv_cache_interface.py
kv_cache_uses_per_token_head_scales(kv_cache_dtype) ¶
Return True if kv_cache_dtype needs per-token-head scales.
replace_as(spec, target_cls, *, drop=(), **changes) ¶
dataclasses.replace, but rebuilding spec as target_cls e.g. SlidingWindowSpec -> FullAttentionSpec
Every field of spec must exist on target_cls unless named in drop; fields only target_cls has keep their default values.