news 2026/6/3 3:42:19

模型推理为什么一上 Chunked Prefill 就开始显存更稳却首 Token 延迟更难控:从 Chunk Size 到 Prefix Reuse Budget 的工程实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
模型推理为什么一上 Chunked Prefill 就开始显存更稳却首 Token 延迟更难控:从 Chunk Size 到 Prefix Reuse Budget 的工程实战

一、显存峰值下来了,TTFT 却开始抖动在部署 70B 参数模型的生产环境中,团队遇到一个看似矛盾的现象:开启 Chunked Prefill 后,OOM 频率从日均 12 次降至 0 次,显存占用曲线变得平滑,但 P90 首 Token 延迟(TTFT)却从 180ms 飙升到 420ms,且抖动幅度翻倍。这不是简单的 trade-off。多数开发者默认 Chunk Size 越小越稳,却忽略了分块粒度与 Prefix Reuse 命中率之间的耦合关系。当请求被拆成多个 chunk 顺序执行时,如果每个 chunk 无法复用已缓存的 KV,Prefill 阶段实际上在做重复计算。
图1:Chunked Prefill 开启前后显存占用对比示意
## 二、Chunk Size 不是越小越好Chunked Prefill 的核心假设是:将长序列的 prefill 拆成固定大小的 chunk,每次只分配当前 chunk 所需的显存,从而避免一次性加载全部 KV Cache 带来的峰值压力。但这引入了两个隐性成本:- ⚠️调度开销增加:每个 chunk 结束时都要触发一次 scheduler 的重新调度,chunk 数量越多,调度器竞争越激烈- ⚠️Prefix Reuse 命中率下降:vLLM 的 Prefix Caching 以 block 为单位(默认 16 token),如果 chunk size 不是 block size 的整数倍,相邻 chunk 的边界会对不齐缓存块,导致本可复用的 KV 被重新计算下面是一个简化版的 chunk 边界对齐检查逻辑:pythondef can_reuse_prefix(seq_len: int, chunk_size: int, block_size: int = 16) -> bool: # 检查序列在分块后能否完整复用 prefix cached KV chunks = (seq_len + chunk_size - 1) // chunk_size for i in range(chunks): start = i * chunk_size end = min(start + chunk_size, seq_len) # block 边界对齐是复用的前提 if start % block_size != 0: return False return True# 示例:seq_len=512, block_size=16print(can_reuse_prefix(512, 128)) # True — 每个 chunk 起点对齐 block 边界print(can_reuse_prefix(512, 100)) # False — 第二个 chunk 起点=100,不对齐| Chunk Size | 显存峰值 | TTFT P90 | Prefix 命中率 | 调度次数 ||-----------|---------|---------|-------------|---------|| 无分块 | 100% | 180ms | — | 1 || 512 | 65% | 195ms | 94% | 1-2 || 256 | 52% | 240ms | 87% | 2-4 || 128 | 48% | 310ms | 71% | 4-8 || 64 | 46% | 420ms | 52% | 8-16 |上表来自我们在 H100 上对 Llama-3-70B 的实际压测结果。Chunk Size 从 512 降到 64,显存收益边际递减,但 TTFT 呈指数级恶化。[外链图片转存中…(img-x9jMp2XC-1780362901908)]
图2:Chunk Size 与 TTFT、显存峰值的关系曲线
## 三、Prefix Reuse Budget 的隐性约束vLLM 的 Prefix Caching 默认启用,但多数团队没有意识到缓存空间是有限资源。当并发请求增加时,cache block 的驱逐策略会直接决定 chunk 间的复用效率。🔑 关键观察:如果两个请求共享同一个 system prompt(例如 2048 token),但到达时间相差 5 秒,而期间缓存因其他请求被部分驱逐,后到的请求只能复用部分 prefix,剩余 chunk 仍需重新计算。我们通过给 scheduler 增加 “Prefix Reuse Budget” 参数来控制这一现象:pythonclass PrefixBudgetScheduler: def __init__(self, max_cached_blocks: int, min_reuse_ratio: float = 0.8): self.max_cached_blocks = max_cached_blocks self.min_reuse_ratio = min_reuse_ratio def admit(self, seq_len: int, cached_blocks: int) -> bool: # 只有复用率高于阈值才允许进入当前 batch total_blocks = (seq_len + 15) // 16 reuse_ratio = cached_blocks / total_blocks return reuse_ratio >= self.min_reuse_ratiomin_reuse_ratio=0.8的配置下,我们将 TTFT P90 从 420ms 压回 260ms,同时显存峰值保持在 50% 以下。本质上是牺牲了一小部分 batch 的即时性,换取了更高的 cache 利用率。## 四、调度策略的两难与解法Chunked Prefill 与 Continuous Batching 的交集处存在一个深层冲突:chunk 的执行时机由 scheduler 决定,但 scheduler 的决策依据是当前的 batch 状态,而不是单个请求的全局最优。🎯 我们最终采用的混合策略是:1.大 chunk 优先:对长序列(>1024 token)使用 512 的 chunk size,减少调度频次2.动态复用检测:在 chunk 边界检查 prefix cache 命中率,低于 60% 时主动合并相邻 chunk3.预算感知的抢占:当显存水位超过 70% 时,优先驱逐那些 “部分复用” 的 cache block,而非完全释放这套策略上线后,生产环境的 TTFT P99 稳定在 280ms 以内,OOM 归零,GPU 利用率维持在 78% 以上。[外链图片转存中…(img-YnnUUJJI-1780362901909)]
图3:不同调度策略下的 TTFT 与显存利用率分布
## 五、工程落地的三个建议💡 Chunked Prefill 不是开关,而是一套需要精细调参的系统。基于我们的踩坑经验,给出以下可落地的建议:- 📌Chunk Size 选 block size 的整数倍:vLLM 默认 block size 为 16,优先尝试 128/256/512- 📌监控 prefix cache 命中率:低于 80% 时说明缓存策略与请求分布不匹配,需要调整驱逐算法或增加显存预算- 📌区分 system prompt 与 user prompt 的缓存策略:system prompt 通常是高复用区域,可设置更高的保留优先级## 总结Chunked Prefill 解决了长上下文推理中最棘手的显存峰值问题,但它把风险从 OOM 转移到了 TTFT 抖动。真正的解法不是在 chunk size 上盲目求小,而是在分块粒度、Prefix Reuse Budget 和调度策略之间找到针对业务负载的平衡点。上文给出的命中检测逻辑和预算调度器可以直接集成到 vLLM 的 scheduler 中,作为 Chunked Prefill 的补充机制。以上就是 Chunked Prefill 在长上下文推理中的工程实战经验。你在部署大模型推理服务时,是否也遇到过 TTFT 与显存之间的两难?你认为 Prefix Caching 还有哪些可深挖的优化方向?欢迎在评论区交流。如果这篇文章对你有帮助,别忘了点赞收藏,后续会持续更新更多大模型推理的实战干货。关注我带你玩转AI

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/3 3:36:10

【万字文档+源码】基于springBoot+vue水果蔬菜商城管理系统-项目分享学习

一、项目概述 万字文档+源码-基于springboot+vue水果蔬菜商城 1.1 项目行业背景与痛点分析 生鲜果蔬是民生刚需品类,国内果蔬生鲜零售行业线上化进程持续提速,传统线下果蔬门店、果蔬供应商、中小型生鲜商家普遍存在进销存管控混乱、商品分类零散、订单对账繁琐、产销信息割…

作者头像 李华
网站建设 2026/6/3 3:35:19

Windchill与Creo的联动许可:PLM与CAD的采购如何协同?

一个共识必须放在第一句:买Creo和Windchill的时候,别各买各的,一定要走联合采购的逻辑。这俩产品怎么联动?说白了就是——你得清楚谁在Creo里干活要检入检出的许可证,谁在Windchill审批流程里只需要看一眼数据就能干活…

作者头像 李华