跳到主要内容

maas学习

MAAS 学习

Prefill 和 Decode 分离架构 使用 TurboRPC 通信

graph TB
A[客户端请求] --> B[负载均衡器]
B --> C[Prefill GPU集群]
C -->|KVCache传输| D[消息队列]
D --> E[Decode GPU集群]
E --> F[流式输出]

KVCache传输

@startuml
top to bottom direction

rectangle "客户端请求" as client
rectangle "负载均衡器" as lb
rectangle "Prefill GPU集群" as prefill
rectangle "消息队列" as mq
rectangle "Decode GPU集群" as decode
rectangle "流式输出" as output

client -> lb
lb -> prefill
prefill -> mq : KVCache传输
mq -> decode
decode -> output
@enduml
graph TD
A[用户输入Prompt] --> B[HTTP API接收请求]
B --> C{预处理阶段}
C -->|拆分Token| D[Prefill Request启动]

subgraph Prefill阶段
D --> E[全量计算自注意力]
E --> F[构建初始KVCache]
F --> G[分配显存块]
end

G --> H{流式响应初始化}
H --> I[SSE/WebSocket通道建立]

subgraph Decode阶段
I --> J[生成第一个Token]
J --> K[更新KVCache]
K --> L[预测下一个Token]
L --> M{是否继续生成?}
M -->|是| J
M -->|否| N[释放显存资源]
end

J --> O[实时流式输出Token]
O --> P[客户端逐词渲染]
N --> Q[关闭连接]
技术描述适用范围硬件依赖延迟编程复杂度
Unified Memory使用统一内存技术,减少显存复制,提升数据传输效率。CPU-GPU 异构系统,GPU 与其他设备(如网卡)NVIDIA Pascal+ 等微秒级
RDMA(如 GPUDirect)使用显存直连技术,减少数据传输延迟,提升性能。GPU 与其他设备(如网卡)特定 InfiniBand/NIC 硬件纳秒级
mmap 文件映射使用文件映射技术,提升数据访问效率,降低延迟。CPU 访问文件/设备内存无特殊要求毫秒级
属性Prefill RequestDecode Request
触发时机处理用户输入的初始Prompt(如问题或上下文)生成回复的每个Token(自回归逐词生成)
计算目标全量计算Prompt的注意力并构建KVCache仅计算最新Token的注意力,复用KVCache
数据依赖独立处理完整输入序列依赖前序生成的Token和缓存的KVCache
执行次数每个对话仅执行1次每个生成Token执行1次(循环N次,N为输出长度)
对比维度Prefill RequestDecode Request
触发条件用户输入首个Prompt时触发生成每个输出Token时循环触发
核心任务1. 全量计算自注意力
2. 初始化KVCache
1. 增量计算自注意力
2. 动态更新KVCache
计算强度高(O(n²)复杂度, n=输入长度)低(O(1)复杂度)
内存占用高(需存储完整KVCache)增量增长(每次追加新Token的KVCache)
硬件需求大显存GPU集群高吞吐低延迟GPU

https://github.com/efeslab/Nanoflow

在高GPU利用率场景下,由KV缓存管理 、批次构建 和完成请求筛选 组成的CPU操作开销,在推理总耗时中占据显著比例(> 10%)。为此,NanoFlow采用了如下图所示的异步控制流 机制:

在任何迭代周期i中,NanoFlow会执行以下优化:

  • 预决策与资源预分配
    • 在当前迭代i结束前,提前完成下一轮迭代(i+1)的:
    • 批次策略决策 (动态批处理大小调整)
    • KV缓存条目分配 (显存空间管理)
  • 非阻塞式迭代执行
    • 直接启动迭代i+1,无需等待 迭代i生成的序列结束(EOS)标记检测
  • 延迟回收机制
    • 在迭代i+2阶段统一回收迭代i中已完成的请求资源