已开启
[Question|问题咨询]: vllm #2
lileizheng创建于  5月12日
lileizheng成员
5月12日 创建

Welcome to ask questions and discuss with other members.

问题描述

【概念】为什么不同前缀的 block 不能共享缓存
【讲解】
关键点:block 存储的不是 token_ids,而是 KV cache!
KV cache 依赖完整上下文:

  • Key = W_k × hidden_state
  • hidden_state = 聚合前面所有 token 的信息
    【图解】
    请求A: [今,天,天] → [气,很,好] → [我,们,出]
    ↓
    KV_cache_A = f([今,天,天] + [气,很,好])
    请求B: [昨,天,天] → [气,不,好] → [我,们,出]
    ↓
    KV_cache_B = f([昨,天,天] + [气,不,好])
    虽然 token_ids 都是 我,们,出,但:
  • KV_cache_A ≠ KV_cache_B
  • 因为上下文不同!
    【错误共享的后果】
    如果请求B 复用了 KV_cache_A:
    请求B 用了基于 [今,天,天,气,很,好] 的 KV cache
    ↓
    Attention 计算时混入了错误的历史信息
    ↓
    生成结果语义错误
    【比喻】
    像两个人回答"我们要去哪?":
  • A:"今天天气很好,我们出去玩吧" → "我们要去公园"
  • B:"昨天天气不好,我们出去玩吧" → "我们要去博物馆"
    同样的"我们出去玩吧",但后续回复完全不同!block 缓存的是"后续回复的倾向",不能混用。

【总结】所以pageattention存储block的时候一定要前缀一样才能共享缓存

likedislike
Llileizheng成员
5月12日 修改了issue 的描述
lileizheng成员
5月16日 评论:

【概念】numel() 的含义
【讲解】
numel() = number of elements = 元素数量
torch.tensor([]).numel() # 0 (空张量)
torch.tensor([1, 2, 3]).numel() # 3 (3个元素)
torch.zeros(4, 5).numel() # 20 (4×5=20个元素)

likedislike
lileizheng成员
5月20日 评论: