发布时间:2026/9/3 7:10:00
大模型推理引擎 vLLM(28):custom_all_reduce 单机/跨节点原理(IPC、Fabric、HSA) 目录1 为什么有custom_all_reduce2 节点内的Custom AllReduce2.1 节点内的Custom AllReduce大体原理2.2 IPCHIP IPC3 跨节点的Custom AllReduce3.1 跨节点的Custom AllReduce大体原理3.2 FabricHSA RPC Fabric4 那么IPC和跨机的Fabric通信区别在哪里4.1 共同流程IPC 和 Fabric 都一样4.2 区别4.3 IPC 模式其实就是用了HIP API实现了共享显存的原理1. 分配显存2. 导出句柄64 字节3. 交换句柄控制面4. 对端打开句柄5. 限制4.4 Fabric 模式其实就是用了hsa的api实现了共享显存1. 分配显存2. 导出句柄256 字节3. 交换句柄控制面4. 对端 attach 句柄5. 能力4.5 区别对比表格4.6 IPC 那套 API 属于谁4.7 Fabric 那套 API 属于谁5 什么是HSAHSA 是什么HSA Runtime 是什么和 HIP 是什么关系abstract:heterogeneous 英/ ˌhetərəˈdʒiːniəs / 有很多种类组成的化不均一的多相的数不纯一的参差的, 这里是异构的意思fabric 英/ ˈfæbrɪk / 布料织物构造结构汽车的车身飞机的机身 这里是Fabric 在此指超节点 GPU 互联结构跨节点 CAR 通过 HSA RPC Fabric API 完成显存导出与映射而不是普通以太网/IB 发包。一句话概括Custom AllReduce 的快路径都是通过共享/映射 GPU 显存完成通信——节点内靠 HIP或 CUDAIPC 句柄跨节点超节点靠 HSA Fabric 句柄差别主要在用什么 API 导出和打开显存句柄。HSA Heterogeneous System Architecture异构系统架构1 为什么有custom_all_reduceCustom AllReduce 是 vLLM 为 Tensor Parallel 场景实现的一条专用 AllReduce 快路径。在满足条件时它不经过 PyNccl/RCCL 这类通用集体通信而是通过 vLLM 自研的 GPU 核函数vllm._custom_ops配合 GPU 显存 IPC/P2P 直连来完成求和条件不满足时会自动回退到 NCCL/RCCL。具体代码路径在 vllm/distributed/device_communicators/custom_all_reduce.py2 节点内的Custom AllReduce2.1 节点内的Custom AllReduce大体原理控制面用torch.distributednon-NCCL 的cpu_group一般是 Gloo交换 IPC handle数据面用 vLLM 自研 C 扩展vllm._custom_ops通过 CUDA IPC / HIP IPC 让同机 GPU 直接访问彼此显存计算自定义 all-reduce kernel 在 GPU 上直接做 reduce关键代码def create_shared_buffer(...): pointer, handle ops.allocate_shared_buffer_and_handle(size_in_bytes) ... dist.all_gather_object(handles, handle, groupgroup) # 控制面交换 handle ... pointers.append(ops.open_mem_handle(h)) # 数据面打开对端显存以及真正执行 reduceops.all_reduce(self._ptr, inp, out, 0, 0) # 自定义 kernel不是 torch2.2 IPCHIP IPC你的 GPU 显存 ──transport── 别的 GPU 能直接读到这块显存 ── kernel 做 reduce项目说明全称Inter-Process CommunicationGPU 显存句柄共享范围同一台物理机同一 OS、同一 shared-memory namespace原理本机 GPU A 导出显存 handle64 字节GPU B 用open_mem_handle打开直接访问 A 的显存谁在用vLLM 原版、aiter 同节点模式限制跨物理机不行——两台服务器之间没法用 IPCIPC 确实是「进程间通信」你没理解错。IPC Inter-Process Communication进程间通信。在 CAR 这里它特指的是 GPU 显存的 IPCHIP IPC / CUDA IPC不是泛指 socket、MPI 那种通用进程通信进程 AGPU0 导出显存 handle↓进程 BGPU1 打开 handle直接访问 GPU0 的显存所以名字上是进程间通信实现上是 GPU 显存句柄共享 直连访问范围上同一台物理机同一 OS、同一 shared-memory namespace3 跨节点的Custom AllReduce3.1 跨节点的Custom AllReduce大体原理aiter 在同样思路上做了超节点扩展数据面多了一条 Fabric 路径transport数据面适用场景ipcHIP IPC和 vLLM 类似同节点fabricHSA RPC / Fabric 显存共享跨节点超节点auto同节点 IPC跨节点 Fabric自动选择aiter 初始化时会选 transportif self.requested_transport ipc: if not same_node: return # 跨节点不能用 IPC self.transport ipc elif self.requested_transport auto: self.transport ipc if same_node else fabric else: self.transport fabric # 强制超节点 Fabric3.2 FabricHSA RPC Fabric项目说明范围跨物理机超节点多台服务器通过专用互联原理用hsa_ext_rpc_memory_create/attach/detach做跨节点显存导出和映射handle 大小256 字节IPC 是 64 字节谁在用aiter 超节点模式前提编译时AITER_ENABLE_SUPERNODE_AR1运行时AITER_AR_TRANSPORTfabricFabric 也是「共享显存」思路只是跨了物理机可以这么理解Fabric 把「导出显存 → 对端 attach → 直接访问」这套模型从单机扩展到了跨节点。aiter 文档里写得很直白层次做什么跨节点内存导出/映射hsa_ext_rpc_memory_create/attach/detach实际 AllReducekernel 直接访问 Fabric 映射后的地址4 那么IPC和跨机的Fabric通信区别在哪里4.1 共同流程IPC 和 Fabric 都一样1. 每个 rank 在本机 GPU 上分配一块显存2. 每个 rank 把这块显存「导出」成一个 handle句柄3. 通过控制面把 handle 发给所有 rankTCPStore / torch.distributed4. 每个 rank 用对端 handle「打开/attach」得到本进程里可访问的指针5. kernel 直接通过这些指针 读/写 远端显存完成 all-reduce4.2 区别其实本质区别就在于怎么把本机 GPU 显存「导出」成句柄以及别的 rank 怎么「打开/attach」这个句柄拿到可访问的地址。其实往下看就能知道它们两者相当于用了不同的api去实现了共享显存4.3 IPC 模式其实就是用了HIP API实现了共享显存的原理1. 分配显存hipMalloc / hipExtMallocWithFlags(...) // 本机 GPU 显存2. 导出句柄64 字节hipIpcGetMemHandle(handle, gpu_ptr)得到hipIpcMemHandle_t64 字节描述「这块本机 GPU 显存」。vLLM 里对应custom_all_reduce.cuLines 167-174// Create IPC memhandle for the allocated buffer.cudaIpcGetMemHandle((cudaIpcMemHandle_t*)handle.data_ptr(), buffer);3. 交换句柄控制面dist.all_gather_object(handles, handle, groupgroup) # vLLM# 或 aiter 用 TCPStore pickle 交换4. 对端打开句柄hipIpcOpenMemHandle(mapped_ptr, peer_handle, hipIpcMemLazyEnablePeerAccess)在本进程地址空间里映射到同一台机器上另一块 GPU 的显存。5. 限制必须同一物理机同一 OS、同一 shared-memory namespace依赖 GPU P2P / XGMI跨物理机时hipIpcOpenMemHandle无效4.4 Fabric 模式其实就是用了hsa的api实现了共享显存1. 分配显存hipExtMallocWithFlags(..., hipDeviceMallocUncached) // 或 finegrained要求这块显存可被 Fabric 导出。2. 导出句柄256 字节hsa_ext_rpc_memory_create(gpu_ptr, size, fabric_handle)得到hsa_ext_rpc_memory_t256 字节不是 HIP IPC handle。aiter 源码custom_all_reduce.cu Lines 404-425void get_meta_buffer_handle(..., transport) { if (transport IPC) hipIpcGetMemHandle(...); // 64 字节 else hsa_ext_rpc_memory_create(...); // 256 字节 }3. 交换句柄控制面和 IPC 同一套机制aiter 的_gather_ipc_meta走 TCPStore只是 handle 更大、内容不同。4. 对端 attach 句柄hsa_ext_rpc_memory_attach(fabric_handle, 1, fabric_agent, mapped_ptr)通过 HSA RPC Fabric agent把远端物理机 GPU 显存映射到本机可访问地址。aiter C 里custom_all_reduce.cuh Lines 2623-2646char* open_peer_handle(const void* handle) { if (transport IPC) return open_ipc_handle(handle); // hipIpcOpenMemHandle // Fabric: hsa_ext_rpc_memory_attach(fabric_handle, 1, fabric_agent_, mapped_ptr); return mapped_ptr; }5. 能力可跨物理机超节点专用互联需要编译AITER_ENABLE_SUPERNODE_AR1需要链libhsa-runtime644.5 区别对比表格步骤IPCFabric分配显存hipMalloc/ uncacheduncached / finegrained导出 APIhipIpcGetMemHandlehsa_ext_rpc_memory_create句柄类型hipIpcMemHandle_t64Bhsa_ext_rpc_memory_t256B句柄交换TCPStore / all_gather一样打开 APIhipIpcOpenMemHandlehsa_ext_rpc_memory_attach映射结果同机另一 GPU 显存地址跨机远端 GPU 显存地址范围单机多机超节点4.6 IPC 那套 API 属于谁属于 HIPROCm 运行时不是 aiter 自己的 API。API所属库hipMalloc/hipExtMallocWithFlagsHIP Runtimelibamdhip64hipIpcGetMemHandleHIP IPC API仍在 HIP/ROCm 里hipIpcOpenMemHandleHIP IPC API在 NVIDIA 上vLLM 用的是同一思路的 CUDA Runtime APIcudaMalloccudaIpcGetMemHandlecudaIpcOpenMemHandle4.7 Fabric 那套 API 属于谁不属于 aiter属于 HSA Runtimelibhsa-runtime64 的超节点扩展 API。API所属库hsa_ext_rpc_memory_createHSA RPC Fabric 扩展hsa_ext_rpc_memory_attachHSA RPC Fabric 扩展hsa_ext_rpc_memory_detachHSA RPC Fabric 扩展hsa_iterate_agents等标准 HSA Runtimeaiter 文档写得很清楚跨节点内存导出/映射用的是hsa_ext_rpc_memory_create/attach/detach并且.so会链接libhsa-runtime64。所以 Fabric API 是 AMD超节点平台HSA Fabric 互联 提供的不是 aiter 发明的。5 什么是HSAHSA 是什么HSA Heterogeneous System Architecture异构系统架构最初由 AMD 等推动的一套规范目标是让 CPU 和 GPU以及其它加速器在同一套系统模型下协同工作包括统一的「设备/agent」抽象统一的内存与访问模型设备发现、队列、同步等运行时能力可以把它看成比 HIP 更底层的一整套「异构计算平台规范 运行时基础设施」。HSA Runtime 是什么HSA Runtime 是 HSA 规范的具体实现库在 Linux 上通常是libhsa-runtime64.so它提供的是运行时 API例如能力典型 API发现设备hsa_iterate_agents枚举 CPU、GPU 等 agent内存管理各类 HSA 内存分配/映射 API队列与同步提交任务、信号量等超节点扩展hsa_ext_rpc_memory_create/attach/detachFabric 跨节点显存你们 aiter Fabric 模式里用的hsa_ext_rpc_memory_*就是 HSA Runtime 提供的扩展 API不是 aiter 自己定义的。和 HIP 是什么关系在 AMD/海光 ROCm 生态里可以粗略看成两层你写 kernel、跑算子↓HIP ← 类似 CUDA日常开发主要用这个↓HSA Runtime ← 更底层管 agent、部分内存/互联能力↓驱动 / 硬件HIPHSA Runtime角色GPU 编程接口写 kernel、malloc 显存异构系统运行时设备模型、底层互联类比CUDA比 CUDA Driver 更「系统级」的一层开发者经常直接写多数时候不直接写库/驱动会调在你们场景IPC 用hipIpcGetMemHandleFabric 用hsa_ext_rpc_memory_*所以IPC走 HIP 自己的同机显存句柄机制Fabric跨机时 HIP IPC 不够要借助 HSA Runtime 的 Fabric/RPC 内存扩展

相关新闻

2026/9/1 22:55:34

终极Wand增强工具:3种简单方案永久解锁游戏修改体验

终极Wand增强工具:3种简单方案永久解锁游戏修改体验 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer WandEnhancer是一款专注于本地客户…

2026/9/3 7:07:32

MATLAB中Preisach模型建模与压电陶瓷迟滞补偿实战指南

简介:本资源是一份面向压电材料研究者、智能结构工程师及高年级本科生的Preisach模型MATLAB实现工具,聚焦解决压电陶瓷非线性迟滞行为建模与仿真难题。压缩包仅含1个核心文件——preisach.m脚本(659B),为轻量级但功能完…

2026/9/3 7:07:32

MATLAB通信链路仿真:π/4-QPSK调制、LDPC编码与FFT频偏同步

简介:本资源是一套面向通信工程专业本科生与研究生的MATLAB数字通信系统仿真完整实现,聚焦于pi/4-QPSK调制解调、LDPC编译码及基于FFT的频偏估计与同步技术,解决实际信道中载波频偏导致解调性能恶化的核心问题。压缩包共14个文件(…

2026/9/3 7:07:32

Java+Oracle医院系统数据库设计:从ER图到事务处理的综合实践

简介:本资源是面向高校数据库课程学习者与Java初学者的Oracle数据库课程设计实践项目,聚焦医院信息管理系统的完整数据建模与应用开发。项目提供从ER图到关系模型(含配套PNG图)、SQL建表与初始化脚本、Java后端业务逻辑&#xff0…

2026/9/3 7:07:32

ktransformers框架:LLM高效推理与微调实战指南

1. ktransformers 框架概述与核心价值 在大型语言模型(LLM)快速发展的今天,推理性能和微调效率成为开发者面临的关键挑战。ktransformers 作为 kvcache-ai 团队推出的开源框架,专门针对 LLM 的高效推理和微调场景进行了深度优化。…

2026/9/3 7:02:31

电赛电磁炮实战:从开关电源设计到PCB布局的完整硬件方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/1 16:02:17

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/2 9:00:32

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/2 8:41:06

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/3 0:02:06

零基础装 OpenClaw 小龙虾 AI:Windows 一键部署教程与避坑要点

Windows 部署 OpenClaw 完整教程|本地 AI 智能体 5 分钟落地,环境配置一次搞定 版本说明:Windows 3.1.0 / Mac 2.7.9 写在前面 近两年开源 AI 领域有一款被称作「数字员工」的工具持续走热,它就是 OpenClaw,圈内人更习…

2026/9/3 0:02:06

Hermes Agent 本地部署新方案:Windows 整合包减少依赖报错

Windows 本地部署 Hermes 太麻烦?这版一键包 5 分钟快速跑通 很多人想体验 Hermes Agent,但真正开始部署时,往往会卡在环境配置这一步。 需要安装各类依赖、调试运行环境、处理路径问题,还容易遇到命令行报错、系统拦截、文件缺…

2026/9/3 0:02:06

实测 OpenClaw 一键包,5 分钟完成本地自动化环境搭建

OpenClaw 本地 AI 自动化工具部署指南|使用一键包规避环境配置难题 痛点:部署 AI 自动化工具常常要处理 Python、Node.js 各类依赖,版本冲突、环境配置耗费大量时间,OpenClaw 提供一键安装包,降低部署门槛。 适配系统&…

2026/9/2 1:15:22

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/2 1:15:22

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/2 1:15:20

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…