ARTICLE · 人工智能
预填充-解码分离:拆分 LLM 推理何时划算
一语总结解释了将 LLM 推理拆分为预填充和解码两个阶段为何能提升服务效率。
文章拆解了 LLM 推理的两个阶段:预填充(prefill)会对所有提示词 token 执行大规模矩阵乘法,使 GPU 算力饱和;解码(decode)则逐 token 生成输出,不断读取 KV 缓存,使内存带宽饱和,同时让计算单元闲置。由于这两类负载对资源的需求截然相反,如果让它们共享同一 GPU 资源池,调度器就必须在两者之间穿插执行,进而损害任一阶段的性能。将预填充和解码拆分到不同硬件上,可以让各自以最优利用率运行,从而提升服务负载的吞吐量并降低延迟。
- 预填充是计算密集型,解码是内存带宽密集型。
预填充执行大规模批量矩阵乘法,充分利用 GPU 的浮点运算单元;而解码以单个 token 为粒度进行流式处理,大部分时间都在从高带宽内存中读取 KV 缓存,计算单元则处于空闲状态。
- 在同一 GPU 上交错执行预填充和解码会损害性能。
当两个阶段共享 GPU 资源池时,调度器必须在计算密集型与内存密集型任务之间切换,产生低效现象,导致提示词处理或 token 生成变慢。
- 将两个阶段分离后,各自可以运行在与自身瓶颈相匹配的硬件上。
将预填充运行在面向计算优化的加速器上,将解码运行在面向内存优化的设备上,可以消除资源争用,提升整体服务吞吐量并降低延迟。
预填充-解码分离:拆分 LLM 推理何时划算
文章拆解了 LLM 推理的两个阶段:预填充(prefill)会对所有提示词 token 执行大规模矩阵乘法,使 GPU 算力饱和;解码(decode)则逐 token 生成输出,不断读取 KV 缓存,使内存带宽饱和,同时让计算单元闲置。由于这两类负载对资源的需求截然相反,如果让它们共享同一 GPU 资源池,调度器就必须在两者之间穿插执行,进而损害任一阶段的性能。将预填充和解码拆分到不同硬件上,可以让各自以最优利用率运行,从而提升服务负载的吞吐量并降低延迟。
文章金句
"预填充——读取提示词并生成第一个 token 的阶段——会对每个提示词 token 同时执行一组大型矩阵乘法,使 GPU 的浮点运算单元达到饱和。
"解码——逐个生成第一个 token 之后每个 token 的阶段——在每个步骤中为每个序列只处理一个 token,并且大部分时间都在从高带宽内存中重新读取 KV 缓存。它使内存带宽饱和,而浮点运算单元基本处于空闲状态。
"这可不是同一类负载换了一顶帽子,它们是不同的负载。
"当两者运行在同一个 GPU 资源池中时,调度器不得不在它们之间交错执行,而每一次交错决策都会损害某一边的性能。