pub struct PagedKvStore { /* private fields */ }Expand description
The other half of PagedAttention that KvBlockPool/KvCache::with_pool
deliberately don’t implement (see this module’s doc comment): real,
shared physical block storage that many sequences’ block tables can
address into, instead of each KvCache still owning its own private,
contiguous Vec. KvBlockPool only ever bounds a count of blocks
each cache may grow to; PagedKvStore is the actual backing memory,
and a sequence’s PagedKvCache holds a block table (an ordered list
of block IDs into this shared store) instead of owning K/V data
directly. This is what makes non-contiguous-block reads during
attention (causal_gqa_attention_paged, in attention.rs) possible
at all – causal_gqa_attention’s existing contiguous-slice read
pattern has no way to express “position 37 lives in block 12, cached
out of order relative to block 5.”
Implementations§
Source§impl PagedKvStore
impl PagedKvStore
pub fn new( block_size: usize, total_blocks: usize, n_kv_heads: usize, head_dim: usize, ) -> Self
pub fn block_size(&self) -> usize
pub fn free_block_count(&self) -> usize
pub fn n_kv_heads(&self) -> usize
pub fn head_dim(&self) -> usize
Sourcepub fn k_row(&self, id: usize, offset: usize) -> &[f32]
pub fn k_row(&self, id: usize, offset: usize) -> &[f32]
One position’s K (or V) row within block id at offset (0-based
within the block) – [n_kv_heads * head_dim] long. Used by
causal_gqa_attention_paged to read attention inputs directly out
of shared physical storage via a block table, and by
PagedKvCache::push to write a new position into it.
pub fn v_row(&self, id: usize, offset: usize) -> &[f32]
Auto Trait Implementations§
impl Freeze for PagedKvStore
impl RefUnwindSafe for PagedKvStore
impl Send for PagedKvStore
impl Sync for PagedKvStore
impl Unpin for PagedKvStore
impl UnsafeUnpin for PagedKvStore
impl UnwindSafe for PagedKvStore
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more