Skip to content

vllm.v1.kv_offload.backends.cpu

CPUBackend

Bases: Backend

Source code in vllm/v1/kv_offload/backends/cpu.py
class CPUBackend(Backend):

    def __init__(self, block_size: int, num_blocks: int):
        super().__init__(block_size=block_size,
                         medium=CPULoadStoreSpec.medium())

        self.num_blocks: int = num_blocks
        self.num_allocated_blocks: int = 0
        self.allocated_blocks_free_list: list[int] = []

    def get_num_free_blocks(self):
        return (len(self.allocated_blocks_free_list) + self.num_blocks -
                self.num_allocated_blocks)

    def allocate_blocks(self,
                        block_hashes: list[BlockHash]) -> list[BlockStatus]:
        num_fresh_blocks = min(len(block_hashes),
                               self.num_blocks - self.num_allocated_blocks)
        num_reused_blocks = len(block_hashes) - num_fresh_blocks
        assert len(self.allocated_blocks_free_list) >= num_reused_blocks

        # allocate fresh blocks
        blocks: list[BlockStatus] = []
        for _ in range(num_fresh_blocks):
            blocks.append(CPUBlockStatus(self.num_allocated_blocks))
            self.num_allocated_blocks += 1

        # allocate reused blocks
        for _ in range(num_reused_blocks):
            block_id = self.allocated_blocks_free_list.pop()
            blocks.append(CPUBlockStatus(block_id))

        return blocks

    def free(self, block: BlockStatus):
        assert isinstance(block, CPUBlockStatus)
        self.allocated_blocks_free_list.append(block.block_id)

    def get_load_store_spec(self, block_hashes: Iterable[BlockHash],
                            blocks: Iterable[BlockStatus]) -> LoadStoreSpec:
        return CPULoadStoreSpec([block.block_id for block in blocks])

allocated_blocks_free_list instance-attribute

allocated_blocks_free_list: list[int] = []

num_allocated_blocks instance-attribute

num_allocated_blocks: int = 0

num_blocks instance-attribute

num_blocks: int = num_blocks

__init__

__init__(block_size: int, num_blocks: int)
Source code in vllm/v1/kv_offload/backends/cpu.py
def __init__(self, block_size: int, num_blocks: int):
    super().__init__(block_size=block_size,
                     medium=CPULoadStoreSpec.medium())

    self.num_blocks: int = num_blocks
    self.num_allocated_blocks: int = 0
    self.allocated_blocks_free_list: list[int] = []

allocate_blocks

allocate_blocks(
    block_hashes: list[BlockHash],
) -> list[BlockStatus]
Source code in vllm/v1/kv_offload/backends/cpu.py
def allocate_blocks(self,
                    block_hashes: list[BlockHash]) -> list[BlockStatus]:
    num_fresh_blocks = min(len(block_hashes),
                           self.num_blocks - self.num_allocated_blocks)
    num_reused_blocks = len(block_hashes) - num_fresh_blocks
    assert len(self.allocated_blocks_free_list) >= num_reused_blocks

    # allocate fresh blocks
    blocks: list[BlockStatus] = []
    for _ in range(num_fresh_blocks):
        blocks.append(CPUBlockStatus(self.num_allocated_blocks))
        self.num_allocated_blocks += 1

    # allocate reused blocks
    for _ in range(num_reused_blocks):
        block_id = self.allocated_blocks_free_list.pop()
        blocks.append(CPUBlockStatus(block_id))

    return blocks

free

free(block: BlockStatus)
Source code in vllm/v1/kv_offload/backends/cpu.py
def free(self, block: BlockStatus):
    assert isinstance(block, CPUBlockStatus)
    self.allocated_blocks_free_list.append(block.block_id)

get_load_store_spec

get_load_store_spec(
    block_hashes: Iterable[BlockHash],
    blocks: Iterable[BlockStatus],
) -> LoadStoreSpec
Source code in vllm/v1/kv_offload/backends/cpu.py
def get_load_store_spec(self, block_hashes: Iterable[BlockHash],
                        blocks: Iterable[BlockStatus]) -> LoadStoreSpec:
    return CPULoadStoreSpec([block.block_id for block in blocks])

get_num_free_blocks

get_num_free_blocks()
Source code in vllm/v1/kv_offload/backends/cpu.py
def get_num_free_blocks(self):
    return (len(self.allocated_blocks_free_list) + self.num_blocks -
            self.num_allocated_blocks)

CPUBlockStatus

Bases: BlockStatus

Source code in vllm/v1/kv_offload/backends/cpu.py
class CPUBlockStatus(BlockStatus):
    _fields_ = BlockStatus._fields_ + [("block_id", ctypes.c_int64)
                                       ]  # type: ignore

    def __init__(self, block_id: int):
        super().__init__()
        self.block_id = block_id

_fields_ class-attribute instance-attribute

_fields_ = _fields_ + [('block_id', c_int64)]

block_id instance-attribute

block_id = block_id

__init__

__init__(block_id: int)
Source code in vllm/v1/kv_offload/backends/cpu.py
def __init__(self, block_id: int):
    super().__init__()
    self.block_id = block_id