返回关卡地图
闯关题:0 / 2 XP 0 / 200

Level 22 | 零基础导学关卡

vLLM PagedAttention

先用小例子把必要知识学会,再用 2 道闯关题检查理解,最后回到 notebook 写真正的 PyTorch 作业。

22_vLLM_PagedAttention.ipynb PagedAttentionKV CacheBlock Table
概念输入
闯关检查
Notebook 作业
logical block → block table → physical KV block
Mission 1 TODO 1 / TODO 2

PagedAttention:逻辑连续,物理可以不连续

先补的知识

  • KV Cache 会随序列长度增长。
  • 直接连续分配容易产生显存碎片。
  • PagedAttention 用固定大小 block 管理缓存。

图解原理

像操作系统分页:请求看到的是连续的 token 序列,底层实际由一块块物理页拼起来。

逻辑 token 0-3block 7逻辑 token 4-7block 2

语法热身:向上取整算 block 数

needed = (seq_len + block_size - 1) // block_size
for _ in range(needed):
    block_id = free_blocks.pop(0)
    block_table.append(block_id)

闯关题

seq_len=17,block_size=8,需要多少个 block?

回到 notebook 的作业

这里不直接写答案。你已经拿到足够输入,最后用 notebook 的 TODO 做举一反三。

Mission 2 TODO 3 / TODO 4

Decode 阶段:只有跨入新 block 才分配

先补的知识

  • 自回归 decode 每次只新增 1 个 token。
  • 最后一个 block 没满时可以继续写入。
  • 根据 block_table 才能把物理块拼回逻辑序列。

图解原理

不要每来一个 token 就搬家;只有当前页写满,才申请下一页。

len=8: block 满len=9: 进入新 block此时分配 1 块

语法热身:取模判断边界

req.seq_len += 1
need_new = (req.seq_len % block_size) == 1
if need_new:
    req.block_table.append(free_blocks.pop(0))
blocks = [cache[i] for i in req.block_table]
logical = torch.cat(blocks, dim=0)[:req.seq_len]

闯关题

block_size=4,decode 后 seq_len=9,是否刚进入新 block?

回到 notebook 的作业

这里不直接写答案。你已经拿到足够输入,最后用 notebook 的 TODO 做举一反三。

完成 2 道闯关题后,本关即算完成;作业 checklist 用来辅助你回 notebook 练习。
进度只保存在当前浏览器 localStorage,分享 HTML 不会带走你的记录。
上一关:L21 下一关:L23