vLLM--如何创建物理块
物理块的核心本质
物理块不是物理上独立的显存碎片,而是在一块连续显存上,通过张量 reshape 操作划分出的逻辑单元。
- 整个过程没有任何数据拷贝或移动
- 只是改变了 GPU 对同一块显存的 "解释方式"
- 所有物理块在物理内存上仍然是连续的
物理块创建 4 步流程
- 计算每层显存大小:根据可用 KV 显存,算出每个注意力层需要的连续显存总量
- 申请连续大张量:为每个层申请一个一维连续张量(保证内存连续性)
- 逻辑切分物理块:将一维张量 reshape 为
[num_blocks, 2, num_kv_heads, block_size, head_size]形状 - 注册到 BlockPool:为每个块创建元数据对象,加入空闲块链表统一管理
核心计算公式
单个物理块大小 = 2 × block_size × num_kv_heads × head_size × dtype_bytes 每个层块数 = 总可用KV显存 ÷ 单个物理块大小 ÷ 模型层数 每个层总显存 = 每个层块数 × 单个物理块大小- 乘以 2:同时存储 K 和 V 两个矩阵
- dtype_bytes:FP16=2,INT8=1,INT4=0.5
