news 2026/9/8 16:06:53

大模型推理引擎vLLM(36):消除vLLM025中gloo:all_reduce导致的DeepEP低延迟30ms大空泡

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
大模型推理引擎vLLM(36):消除vLLM025中gloo:all_reduce导致的DeepEP低延迟30ms大空泡

目录

1 介绍

2 空泡现象和原因分析

2.1 空泡表现

2.2 空泡可能原因1

2.3 空泡根本原因

2.3.1 这个gloo:allreduce的由来,为什么存在

2.3.2 修改方法

2.4 Gloo

2.4.1 什么是Gloo

2.4.2 vLLM 为什么用它

3 修改后验证

4 总结


1 介绍

测试某个模型性能时候,发现低延迟有个大空泡,记录下解决过程。

2 空泡现象和原因分析

2.1 空泡表现

首先搭建环境复现空泡问题,复现后现象如下

2.2 空泡可能原因1

按照以往的经验,我以为这次可能是因为这有个H2D的memcpy, 然后算子下发晚了,所以导致了空泡,

我还分析了下

_get_num_sampled_and_rejected_kernel → _post_update_kernel → Memcpy DtoD → 【空泡】 → Memcpy HtoD(很长) → … 同时另一条 stream 上还有 Memcpy DtoH

然后这里就是把304 305行那里直接改掉,因为这里都是pinned memory,GPU是可以直接访问的,不需要拷贝,改成

self.temperature = temperature self.seeds = seeds

然后我就想去测试下,但是我花时间又看了下这个prof文件,有了意外发现

2.3 空泡根本原因

我发现最根源的原因应该这个gloo,Worker 热路径线程卡在 CPU 侧 gloo allreduce 上等其它 DP,这段时间走不下去,后续 CUDA kernel 迟迟 enqueue不上,GPU 就空等,表现为空泡。
空泡长短主要来自 各 rank 到达时间差(straggler),不是 gloo 传那几个 int 有多慢。

2.3.1 这个gloo:allreduce的由来,为什么存在

这个gloo:allreduce就来自这个地方,vllm的每个dp用这个通信干两件事,

DP>1 时,上游担心各 rank 本步不一致,例如:

Rank真实 tokens本地倾向

DP0

13

pad→16,FULL CG

DP1

16

正好 16,FULL CG

DP2

少量/空

更小 bucket 或 NONE

后面还有 EP/DeepEP 等跨 rank 行为时,CG mode 不同、有效 batch 规模不同,存在对不齐甚至死等的风险。

于是 vLLM 在sync_cudagraph_and_dp_paddingvllm/v1/worker/gpu/dp_utils.py)里做协商:

  1. 每个 rank 往 CPU 小张量写入:num_tokenscg_modeuniform_token_count

  2. 在 DP 的cpu_groupall_reduce

  3. 约定:

    • token 取全局 max,再统一dispatch

    • cg_mode 取 min(有人 eager → 全员 eager);

    • uniform 不一致则清空。

2.3.2 修改方法

修改方法就是把这个同步删掉,现在: 各 DP 不再看别人,只对本机真实num_tokens做本地dispatch

这里需要展开说明一下「本地选 bucket」的含义。所谓 bucket,是指 vLLM 在 CUDAGraph 模式下预先捕捉好的若干固定 batch 尺寸档位,例如 4、8、16 等。每个档位对应一组已经编译好的 CUDA Graph,运行时只能从这些档位里选一个来执行,不能随意使用任意 batch 大小。

在原来的全局同步逻辑下,每个 DP rank 都要先通过 gloo allreduce 拿到全局最大的 num_tokens,上游希望各 DP 的 CG mode 和本步有效 batch 规模一致,避免后续跨 rank 路径(含 EP 相关逻辑)因步调不一致出问题。;但代价是每个 rank 都要等最慢的那个到达,空泡就这样被放大了。

删掉同步之后,每个 DP 只根据本机真实的 num_tokens 就近选一个 bucket。比如本机真实 tokens 是 3,就选 4 这个档位;真实 tokens 是 13,就选 16 这个档位。这样每个 rank 的 batch 规模可能不一样,DeepEP-LL 路径不依赖这层跨 DP 的 CG padding 协商,因此可以安全跳过;普通 DP / 其它 all2all 后端则不宜贸然删除。,空泡也就随之消失。

需要特别注意的是,这个改动只适用于 DeepEP-LL 场景。如果是在普通 DP 场景下贸然删掉同步,各 rank 的 CG mode 和 batch 规模不一致,很可能导致跨 rank 通信对不齐甚至死等,反而引入更严重的问题。

2.4 Gloo

2.4.1 什么是Gloo

  • 集合通信库(allreduce / broadcast / barrier 等),不是和 TCP 同级的“网络协议名”;

  • 主要服务CPU / 主机侧小消息;

  • 传输常见走主机网卡(以太网 TCP 等;部分环境也可走 IB);

  • NCCL/RCCL在 PyTorch 里是平级 backend

    • GPU 大 tensor → NCCL/RCCL;

    • CPU 元数据 / 控制面 → Gloo。

2.4.2 vLLM 为什么用它

并行组通常拆两套:

  • device_group:GPU 数据面;

  • cpu_group:CPU 控制面,backend 为 gloo。

sync_cudagraph_and_dp_padding里:

group = get_dp_group().cpu_group tensor = torch.zeros(3, dp_size, dtype=torch.int32, device="cpu") dist.all_reduce(tensor, group=group)

所以 Profiler 里事件名是gloo:all_reduce

重要纠正:

空泡的根因不是“Gloo 传得慢”(就几十字节)。 根因是每步强制全 DP 同步,把各 rank 到达时间的抖动,放大成全体 GPU idle。

3 修改后验证

4 总结

  1. 现象:DP+EP decode 出现 GPU 空泡,与gloo:all_reduce对齐,多 rank 右边界齐 → straggler 等待。

  2. CUDAGraph:固定 shape,本地要把 batch pad 到已捕捉 size(我们最大捕捉 16)。

  3. 上游 sync:担心各 DP 的 CG mode / pad 规模不一致,每步用 DPcpu_group(gloo)allreduce 几个 int,统一成 global max tokens + min mode。

  4. 空泡成因:同步点数据量极小,但每步 barrier 把到达抖动放大成全员 GPU idle。

  5. Gloo:CPU 侧集合通信库,管控制面;NCCL/RCCL/DeepEP 管数据面。

  6. 修复:DeepEP-LL 下跳过 CG padding 的跨 DP sync,只保留本地 dispatch;用 HCU 插件 monkey-patch,不改基线。

  7. 验证:gloo 热事件消失、轨变密;精度用 standard MTP 回归。

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

网站分析工具怎么选?3大类15款工具全盘点

网站分析工具怎么选?答案不是看榜单,而是按“业务阶段 → 核心诉求 → 预算 → 工具组合”四步走。市面上的工具大致分成三类:免费基础监测款、SEO与竞品洞察款、企业级AI Agent平台。它们各自解决不同规模与预算下的问题,核心目标…

作者头像 李华
网站建设 2026/9/8 16:03:40

C++实现一笔画游戏:欧拉路径算法与图形渲染

1. 项目概述:C实现一笔画游戏的核心思路一笔画游戏是一种经典的逻辑益智游戏,玩家需要在不重复经过任何线条的前提下,用一笔连续画出整个图形。这个看似简单的游戏背后蕴含着欧拉路径的数学原理,而用C实现它则涉及图形渲染、算法设…

作者头像 李华
网站建设 2026/9/8 16:03:33

Docker容器化实战:从环境冲突到镜像、容器与MySQL/Redis编排

前阵子有朋友找我排查环境问题:一台上线不久的服务器上,MySQL 8.0 一启动,Redis 服务就开始丢连接,再仔细看,Java 服务依赖的某个系统库版本也被一连串升级动作搞坏了。他说明明装的时候每一步都照着文档来&#xff0c…

作者头像 李华
网站建设 2026/9/8 16:01:58

Spring Security 6过滤器链与认证授权实战:从迁移到配置避坑指南

接手过几个 Spring Security 项目之后,我最大的感受是:大部分开发不是被 API 难住的,而是被“链路”和“默认行为”绕晕的。你只是加了一个spring-boot-starter-security依赖,就发现所有请求都变了脸色,静态资源访问不…

作者头像 李华
网站建设 2026/9/8 16:01:55

Linux网络编程-TCP并发服务器

单循环服务器:只能处理一个客户端任务的服务器。 并发服务器:可以同时处理多个客户端任务的服务器(一对多)。 UDP服务端:具备并发性能 TCP服务端:建立连接,单循环服务器。 TCP并发服务器构建方式…

作者头像 李华
网站建设 2026/9/8 16:00:52

2026苏州代理记账公司深度解析:靠谱优质机构服务对比与选择指南

苏州中小微企业财税服务市场观察记账报税是企业经营中的基础刚需,对初创企业和中小微机构来说尤其如此。苏州市场主体数量众多,制造业、服务业、科技类企业发展活跃,每年新增大量创业公司,受人员成本和专业能力限制,多…

作者头像 李华