DeepEP中的对称堆、rocSHMEM、RDMA buffer相关问题整理
目录1 代码与环境变量2 什么是rocshmem2.1 对称堆Symmetric Heap2.2 rocSHMEM 是什么2.3 具体怎么通信的编辑3 什么是RDMA3.1 什么是RDMA3.2 RDMA buffer的问题4 vllm实际项目启动命令的三个问题4.1 问题1700报错难道这里是每次处理700个token然后显存不够了吗4.2设置成5G不报错了可是我们的num_rdma_bytes不还是500MB吗还没变为什么就不报错了4.3 4G heap 里除了 RDMA 还有谁用abstract:symmetric 英/ sɪˈmetrɪk / 对称的symmetric heap 对称堆rocSHMEMROCm OpenSHMEM是 AMD 在 ROCm 生态里提供的GPU 集群通信库RDMA buffer1 代码与环境变量在vllm015/vllm/distributed/device_communicators/all2all.py中有下面的几行代码然后我们起vllm中起服务一般会加像这种环境变量export ROCSHMEM_HEAP_SIZE4000000000下面针对这些整理自己的几个问题和疑问2 什么是rocshmem2.1 对称堆Symmetric HeaprocSHMEM 在 GPU 显存 上维护一块对称堆每个 rank每个 GPU都有一份大小由ROCSHMEM_HEAP_SIZE控制默认 1 GBDeepEP 的num_rdma_bytes就是从这块堆里 划出来 做 RDMA buffer 的文档里写得很明确heap is on the GPU memory。2.2 rocSHMEM 是什么rocSHMEMROCm OpenSHMEM是 AMD 在 ROCm 生态里提供的 GPU 集群通信库接口风格类似 OpenSHMEM可以把它理解成AMD 平台上的 NVSHMEM 对标物都是给 GPU 直接做跨卡/跨节点通信 用的而不是传统的「CPU 发网络请求、再拷到 GPU」。传统分布式通信MPI 等一般是GPU 算完 → 拷到 CPU → CPU 发网络 → 对端 CPU 收 → 再拷到 GPUrocSHMEM 的目标是GPU kernel 里直接 put/get 远端 GPU 内存RDMA / IPC这样 MoE 的 dispatch/combine 可以在 GPU 上更高效地做 all-to-allDeepEP 跨节点通信用到的就是它。2.3 具体怎么通信的3 什么是RDMA3.1 什么是RDMA3.2 RDMA buffer的问题DMA 通信需要一块 固定、对齐、可远程直接访问 的 GPU 内存用来打包待发数据把要发给其他 rank 的 token hidden states 写入 buffer接收远程数据其他节点的 GPU 通过 RDMA 直接写进你的 bufferCombine 阶段复用作为收发数据的 workspaceDeepEP 在初始化时一次性分配避免每次 forward 都 malloc/freeRDMA 注册内存开销很大。大小要覆盖「最坏情况」下 dispatch/combine 的数据量否则会 OOM 或通信失败。DeepEP 的Buffer里有两块通信内存Buffer参数用途NVLink buffernum_nvl_bytes同节点内 GPU 间通信NVLink / CUDA IPCRDMA buffernum_rdma_bytes跨节点通信InfiniBand / RoCE RDMA低延迟模式也会用你 patch 里的num_rdma_bytes int(1e9/2)就是给 跨节点 RDMA 通信 预分配的 staging 区大小。4 vllm实际项目启动命令的三个问题我还有个疑问就是之前我们的代码中这个num_rdma_bytes就是一个G然后我们的export ROCSHMEM_HEAP_SIZE4000000000就是4G然后我的vllm启动命令如果用--max-num-seqs 700 \--max-num-batched-tokens 700 \就会报错然后我设置成5g就不报错了那么我有两个问题这里设置成700报错难道这里是每次处理700个token然后显存不够了吗设置成5G不报错了可是我们的num_rdma_bytes不还是500MB吗还没变为什么就不报错了还有我们的这个heapsize是4G那么除了这个num_rdma_bytes的500MB其他的都被谁用了4.1 问题1700报错难道这里是每次处理700个token然后显存不够了吗4.2 设置成5G不报错了可是我们的num_rdma_bytes不还是500MB吗还没变为什么就不报错了这个500MB是高吞吐的低延迟的不是500MBLL 模式下num_rdma_bytes不是固定 1G/500MB是动态算的可能 4G5G 是抬 heap 上限不是 num_rdma_bytes 没变。4.3 4G heap 里除了 RDMA 还有谁用