Prhub

#38139 [Perf] Remove redundant device copies for CPU-only pooling token IDs, 48.9% E2E throughput improvement

原始 PR 作者 yewentao256 合并时间 2026-03-30 02:12 文件变更 8 提交数 5 评论 2 代码增减 +86 / -17

执行摘要

移除 CPU-only pooling token IDs 的冗余设备拷贝,实现 48.9% E2E 吞吐量提升。

根据PR body,原始实现中存在'CPU -> GPU -> CPU'的冗余拷贝两次,导致性能开销。优化后保留CPU端数据,减少不必要的设备间传输,以提升池化操作的效率和整体系统吞吐量。

建议技术管理者关注此PR的性能收益,工程师可精读以学习消除冗余设备拷贝的优化策略,设计决策如移除多余标志值得借鉴,同时需确保相关池化模型测试覆盖。

讨论亮点

review中,noooop质疑是否需要单独的requires_token_ids_cpu标志,建议使用现有requires_token_ids控制,避免过度设计。yewentao256测试后确认移除该标志不影响性能,从而简化了代码结构。结论是保持设计简洁,仅依赖一个标志管理token IDs需求。

实现拆解

实现方案分四个部分:

1) 在vllm/v1/worker/gpu_input_batch.py中新增_make_prompt_token_ids_cpu_tensor方法并修改get_pooling_metadata以使用CPU缓冲区;
2) 在vllm/v1/pool/metadata.py中添加prompt_token_ids_cpu字段和get_prompt_token_ids_cpu方法;
3) 更新池化器实现(如vllm/model_executor/layers/pooler/special.pyvllm/model_executor/models/bert.pyvllm/model_executor/models/gritlm.py)使用CPU端token IDs进行修剪或计算;
4) 在tests/v1/worker/test_gpu_input_batch.py中添加单元测试验证不同场景下的正确性。

文件 模块 状态 重要度
vllm/v1/worker/gpu_input_batch.py worker modified 9.0
vllm/v1/pool/metadata.py pool modified 8.0
vllm/model_executor/layers/pooler/special.py model_executor modified 7.0
tests/v1/worker/test_gpu_input_batch.py test modified 6.0

关键符号

_make_prompt_token_ids_cpu_tensor get_prompt_token_ids_cpu forward

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

是否需要单独的 requires_token_ids_cpu 标志 设计

noooop 建议使用现有 requires_token_ids 控制 CPU 和 GPU token IDs,避免添加新标志以减少复杂性。

结论:移除 requires_token_ids_cpu 标志,测试确认不影响性能,简化了设计。 · 已解决

风险与影响

风险包括:

1) 性能回归,如果CPU缓冲区处理不当可能导致额外开销或数据错误,但基准测试验证了提升;
2) 正确性问题,修改池化逻辑可能引入bug,但新增测试覆盖了requires_token_ids为True和False的场景;
3) 兼容性,影响所有使用token IDs的池化模型(如BERT、GRITLM),需确保向后兼容,PR通过更新相关模型文件已适配。

影响范围:

1) 用户层面,使用pooling嵌入生成的请求将体验显著性能提升(吞吐量增加48.9%,延迟降低),提升用户体验;
2) 系统层面,减少GPU拷贝优化内存带宽使用,降低设备间传输开销;
3) 团队层面,代码更清晰(移除冗余标志),但需注意未来池化模型开发时正确使用CPU端token IDs。

核心路径变更 性能优化依赖正确缓冲区处理

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论