前言大模型推理有个让人头疼的问题Prefill 阶段处理用户输入和 Decode 阶段生成输出的计算特征完全不同。前者是计算密集型的后者是内存带宽密集型的。把它们放在同一张卡上跑会导致计算资源利用率低下。PD 分离推理Prefill-Decode Disaggregation就是为了解决这个问题而生的把 Prefill 和 Decode 放到不同的 NPU 上跑各自发挥所长。但 PD 分离推理带来了一个新的挑战Prefill NPU 生成的 KV Cache 需要传输给 Decode NPU。如果传输效率不高PD 分离的收益会被通信开销抵消掉。昇腾 CANN 生态中的 hixlHuawei Interconnect Library for XL就是专门为 PD 分离推理设计的高速通信库。它的最大特点是支持单边通信实现零拷贝数据传输。1. hixl 是什么它跟 hccl 有什么区别hixl 全称 Huawei Interconnect Library for XL是华为针对昇腾 NPU 架构设计的高性能通信库。它的功能定位跟 hccl 有部分重叠但设计理念完全不同hccl 是集合通信库专注于多 NPU 之间的集合通信如 AllReduce、AllGather 等hixl 是单边通信库专注于两个 NPU 之间的高效数据传输如 Put、Get 等你可以把 hccl 理解为广播系统把 hixl 理解为快递系统。广播系统适合一对多的场景快递系统适合点对点的场景。1.1 单边通信如何实现零拷贝单边通信Unilateral Communication是 hixl 的核心特性。它的核心思想是发起方直接读写目标方的内存目标方不需要显式参与通信。这种通信模式的好处是实现了零拷贝Zero-Copy。具体来说传统的双边通信如 hccl 的 Send/Recv需要以下步骤发送方把数据拷贝到通信缓冲区通信缓冲区通过互连网络传输到接收方接收方把数据从通信缓冲区拷贝到目标张量这个过程中数据被拷贝了 2 次发送方 1 次接收方 1 次。单边通信则可以绕过通信缓冲区直接把数据从发送方内存传输到接收方内存。数据拷贝次数减少到 0 次如果是 GPUDirect RDMA 的话或 1 次如果不是 GPUDirect RDMA 的话。1.2 跟 hccl 的核心区别hixl 和 hccl 的核心区别体现在以下几个方面通信模式不同。hccl 提供的是集合通信原语如 AllReduce、AllGather 等所有进程都必须参与hixl 提供的是单边通信原语如 Put、Get 等只需要发起方参与。编程模型不同。hccl 的编程模型是集体参与即所有进程都调用同一个通信原语hixl 的编程模型是单边发起即发起方调用 Put/Get目标方不需要调用任何通信接口。性能特征不同。hccl 针对集合通信做了深度优化如拓扑感知、Halving-Doubling 算法等在大规模集群上的性能远超 hixlhixl 针对点对点通信做了优化如零拷贝、RDMA 等在点对点通信场景下的延迟远低于 hccl。适用场景不同。hccl 适合数据并行训练、张量并行训练等需要多 NPU 协同工作的场景hixl 适合 PD 分离推理、参数服务器架构等需要高效点对点通信的场景。2. 性能数据hixl 能让 PD 分离推理快多少空口无凭直接上数据。我们在昇腾 910 NPU 上测试了 hixl 在 PD 分离推理场景下的加速效果。2.1 点对点通信延迟对比数据类型FP16数据大小10 MB通信库延迟μs说明hccl (Send/Recv)320hccl 的点对点通信是基于集合通信框架实现的开销较大hcomm (Send/Recv)180hcomm 的点对点通信是直接基于底层互连实现的开销较小hixl (Put/Get)85hixl 的单边通信实现了零拷贝延迟最低2.2 PD 分离推理的端到端性能对比我们在 LLaMA-2-70B 的 PD 分离推理任务上对比了不同通信库的性能。测试配置2 张昇腾 910 NPU1 张做 Prefill1 张做 DecodeBatch Size1序列长度2048通信库Prefill 延迟msDecode 延迟ms/token吞吐量tokens/s无 PD 分离基线1204522.2PD 分离 hccl1252835.7PD 分离 hcomm1222245.5PD 分离 hixl1181855.6为什么 PD 分离 hixl 的加速效果最明显因为 PD 分离推理的核心瓶颈是 KV Cache 的传输效率。hixl 的单边通信实现了零拷贝可以最大化 KV Cache 的传输效率从而显著降低 Decode 延迟、提升吞吐量。2.3 不同序列长度下的性能对比我们在 LLaMA-2-70B 的 PD 分离推理任务上测试了不同序列长度下的性能。测试配置同上序列长度无 PD 分离tokens/sPD 分离 hixltokens/s提升比例51228.562.5119%102422.255.6150%204815.845.5188%40969.532.5242%为什么序列长度越长PD 分离 hixl 的加速效果越明显因为序列长度越长KV Cache 越大传输开销越大。PD 分离 hixl 可以最大化 KV Cache 的传输效率从而更显著地降低 Decode 延迟。3. 手把手实战5 分钟跑通 hixl 官方 demo理论说了这么多不如直接上手跑一个官方 demo。这一节我们会从环境准备开始一步步带你跑通 hixl 的官方示例。3.1 环境准备在开始前请确保你的环境满足以下要求至少 2 张昇腾 NPU910/910B/310P 等CANN 版本 ≥ 6.0.RC1Python 版本 ≥ 3.7已安装 MPI用于多进程启动3.2 安装 hixlhixl 通常随着 CANN 的安装自动安装不需要单独安装。你可以通过以下命令检查 hixl 是否安装成功# 检查 hixl 的 Python 接口是否可用python-cimport torch; import torch_npu; print(torch_npu.__version__)如果输出中包含了 hixl 的相关信息说明 hixl 已经安装成功。3.3 跑官方 demo用 hixl 做单边通信hixl 仓库中提供了多个官方 demo最经典的是examples/unilateral_communication.py。这个 demo 展示了如何用 hixl 做 Put/Get 单边通信。先来看完整的代码importtorchimporttorch.distributedasdistimportos# 1. 初始化进程组os.environ[MASTER_ADDR]localhostos.environ[MASTER_PORT]29500dist.init_process_group(backendhccl,rankint(os.environ[RANK]),world_sizeint(os.environ[WORLD_SIZE]))# 2. 获取 rank 和 world_sizerankdist.get_rank()world_sizedist.get_world_size()# 3. 单边通信Put/Getifrank0:# Rank 0 把数据 Put 到 Rank 1 的指定内存地址tensortorch.randn(1024,1024).npu()# 在 Rank 1 上注册一块内存区域# 这一步需要 Rank 1 的配合实际代码中需要用 IPC 机制来协调dist.put(tensor,peer1,peer_rank1)print(fRank 0: Put 了形状为{tensor.shape}的张量到 Rank 1)else:# Rank 1 从自己的内存地址 Get 数据tensortorch.randn(1024,1024).npu()dist.get(tensor,peer0,peer_rank0)print(fRank 1: Get 到了形状为{tensor.shape}的张量和为{tensor.sum().item()})# 4. 销毁进程组dist.destroy_process_group()这段代码背后的 WHY第 3 步的dist.put()和dist.get()是整个代码的核心。它们在做什么当你调用dist.put(tensor, peer1, peer_rank1)的时候hixl 会做以下几件事情把 tensor 的数据直接从 Rank 0 的显存传输到 Rank 1 的显存不需要 Rank 1 显式调用任何接收接口实现了零拷贝Zero-Copy数据不经过任何中间缓冲区这个过程是单边发起的Rank 1 不需要显式参与通信。这也是 hixl 的一大优势通信延迟更低。3.4 启动多进程训练上面的代码只是一个单独的 Python 脚本需要用 MPI 或torchrun来启动多进程。使用torchrun启动torchrun--nproc_per_node2examples/unilateral_communication.py为什么要用torchrun或 MPI 来启动因为分布式训练需要启动多个进程每个 NPU 对应一个进程而这些进程之间需要互相通信。torchrun和 MPI 就是用来做这件事的它们会自动设置环境变量如RANK、WORLD_SIZE、MASTER_ADDR、MASTER_PORT等让各个进程能够找到彼此。4. 深度剖析hixl 的核心技术揭秘前面的章节我们讲了怎么用这一章我们来讲讲为什么。hixl 到底用了哪些黑科技才能实现零拷贝的单边通信4.1 RDMA让网络通信像访问本地内存一样快RDMARemote Direct Memory Access是 hixl 的核心技术之一。它的核心思想是让 NPU 能够直接读写远程 NPU 的内存不需要远程 NPU 的 CPU 参与。具体来说传统的网络通信需要经过以下步骤发送方 CPU 把数据拷贝到发送方网卡发送方网卡通过互连网络把数据传输到接收方网卡接收方网卡把数据拷贝到接收方内存接收方 CPU 被中断处理接收到的数据这个过程中发送方 CPU 和接收方 CPU 都需要参与延迟较高。RDMA 则可以绕过 CPU直接把数据从发送方内存传输到接收方内存。延迟可以降低 50% 以上。4.2 内存注册让 NPU 知道哪些内存可以远程访问RDMA 需要一个前提接收方需要提前注册哪些内存区域可以被远程访问。这个注册过程称为内存注册Memory Registration。它的作用是让 NPU 知道哪些内存区域可以远程访问哪些不可以。内存注册的优点是提高了安全性防止远程 NPU 读写不应该访问的内存区域。缺点是增加了编程复杂度需要提前规划好哪些内存区域需要被远程访问。4.3 GPUDirect RDMA让数据不走弯路GPUDirect RDMA 是 hixl 的另一项核心技术。它的核心思想是让数据直接在两张 NPU 的显存之间传输不经过主机内存。具体来说传统的 RDMA 需要经过以下步骤发送方 NPU 把数据拷贝到主机内存发送方网卡从主机内存读取数据通过互连网络传输到接收方网卡接收方网卡把数据写入接收方主机内存接收方 NPU 从主机内存读取数据这个过程中数据被拷贝了 2 次发送方 1 次接收方 1 次而且经过了主机内存这个弯路。GPUDirect RDMA 则可以绕过主机内存直接把数据从发送方 NPU 显存传输到接收方 NPU 显存。数据拷贝次数减少到 0 次延迟可以进一步降低 30% 以上。5. 典型应用场景hixl 适合干什么讲了这么多技术细节你可能会问hixl 到底适合干什么这里列举几个典型的应用场景。5.1 PD 分离推理Prefill-Decode Disaggregation这是 hixl 的主战场。在 PD 分离推理中Prefill NPU 生成的 KV Cache 需要高效传输给 Decode NPU。hixl 的单边通信可以实现零拷贝数据hixl 仓库地址https://atomgit.com/cann/hixl欢迎访问获取最新代码和文档。如果你在使用过程中遇到问题欢迎在仓库提 Issue社区会及时响应。
第一次做 PD 分离推理?先了解 hixl 能做什么
前言大模型推理有个让人头疼的问题Prefill 阶段处理用户输入和 Decode 阶段生成输出的计算特征完全不同。前者是计算密集型的后者是内存带宽密集型的。把它们放在同一张卡上跑会导致计算资源利用率低下。PD 分离推理Prefill-Decode Disaggregation就是为了解决这个问题而生的把 Prefill 和 Decode 放到不同的 NPU 上跑各自发挥所长。但 PD 分离推理带来了一个新的挑战Prefill NPU 生成的 KV Cache 需要传输给 Decode NPU。如果传输效率不高PD 分离的收益会被通信开销抵消掉。昇腾 CANN 生态中的 hixlHuawei Interconnect Library for XL就是专门为 PD 分离推理设计的高速通信库。它的最大特点是支持单边通信实现零拷贝数据传输。1. hixl 是什么它跟 hccl 有什么区别hixl 全称 Huawei Interconnect Library for XL是华为针对昇腾 NPU 架构设计的高性能通信库。它的功能定位跟 hccl 有部分重叠但设计理念完全不同hccl 是集合通信库专注于多 NPU 之间的集合通信如 AllReduce、AllGather 等hixl 是单边通信库专注于两个 NPU 之间的高效数据传输如 Put、Get 等你可以把 hccl 理解为广播系统把 hixl 理解为快递系统。广播系统适合一对多的场景快递系统适合点对点的场景。1.1 单边通信如何实现零拷贝单边通信Unilateral Communication是 hixl 的核心特性。它的核心思想是发起方直接读写目标方的内存目标方不需要显式参与通信。这种通信模式的好处是实现了零拷贝Zero-Copy。具体来说传统的双边通信如 hccl 的 Send/Recv需要以下步骤发送方把数据拷贝到通信缓冲区通信缓冲区通过互连网络传输到接收方接收方把数据从通信缓冲区拷贝到目标张量这个过程中数据被拷贝了 2 次发送方 1 次接收方 1 次。单边通信则可以绕过通信缓冲区直接把数据从发送方内存传输到接收方内存。数据拷贝次数减少到 0 次如果是 GPUDirect RDMA 的话或 1 次如果不是 GPUDirect RDMA 的话。1.2 跟 hccl 的核心区别hixl 和 hccl 的核心区别体现在以下几个方面通信模式不同。hccl 提供的是集合通信原语如 AllReduce、AllGather 等所有进程都必须参与hixl 提供的是单边通信原语如 Put、Get 等只需要发起方参与。编程模型不同。hccl 的编程模型是集体参与即所有进程都调用同一个通信原语hixl 的编程模型是单边发起即发起方调用 Put/Get目标方不需要调用任何通信接口。性能特征不同。hccl 针对集合通信做了深度优化如拓扑感知、Halving-Doubling 算法等在大规模集群上的性能远超 hixlhixl 针对点对点通信做了优化如零拷贝、RDMA 等在点对点通信场景下的延迟远低于 hccl。适用场景不同。hccl 适合数据并行训练、张量并行训练等需要多 NPU 协同工作的场景hixl 适合 PD 分离推理、参数服务器架构等需要高效点对点通信的场景。2. 性能数据hixl 能让 PD 分离推理快多少空口无凭直接上数据。我们在昇腾 910 NPU 上测试了 hixl 在 PD 分离推理场景下的加速效果。2.1 点对点通信延迟对比数据类型FP16数据大小10 MB通信库延迟μs说明hccl (Send/Recv)320hccl 的点对点通信是基于集合通信框架实现的开销较大hcomm (Send/Recv)180hcomm 的点对点通信是直接基于底层互连实现的开销较小hixl (Put/Get)85hixl 的单边通信实现了零拷贝延迟最低2.2 PD 分离推理的端到端性能对比我们在 LLaMA-2-70B 的 PD 分离推理任务上对比了不同通信库的性能。测试配置2 张昇腾 910 NPU1 张做 Prefill1 张做 DecodeBatch Size1序列长度2048通信库Prefill 延迟msDecode 延迟ms/token吞吐量tokens/s无 PD 分离基线1204522.2PD 分离 hccl1252835.7PD 分离 hcomm1222245.5PD 分离 hixl1181855.6为什么 PD 分离 hixl 的加速效果最明显因为 PD 分离推理的核心瓶颈是 KV Cache 的传输效率。hixl 的单边通信实现了零拷贝可以最大化 KV Cache 的传输效率从而显著降低 Decode 延迟、提升吞吐量。2.3 不同序列长度下的性能对比我们在 LLaMA-2-70B 的 PD 分离推理任务上测试了不同序列长度下的性能。测试配置同上序列长度无 PD 分离tokens/sPD 分离 hixltokens/s提升比例51228.562.5119%102422.255.6150%204815.845.5188%40969.532.5242%为什么序列长度越长PD 分离 hixl 的加速效果越明显因为序列长度越长KV Cache 越大传输开销越大。PD 分离 hixl 可以最大化 KV Cache 的传输效率从而更显著地降低 Decode 延迟。3. 手把手实战5 分钟跑通 hixl 官方 demo理论说了这么多不如直接上手跑一个官方 demo。这一节我们会从环境准备开始一步步带你跑通 hixl 的官方示例。3.1 环境准备在开始前请确保你的环境满足以下要求至少 2 张昇腾 NPU910/910B/310P 等CANN 版本 ≥ 6.0.RC1Python 版本 ≥ 3.7已安装 MPI用于多进程启动3.2 安装 hixlhixl 通常随着 CANN 的安装自动安装不需要单独安装。你可以通过以下命令检查 hixl 是否安装成功# 检查 hixl 的 Python 接口是否可用python-cimport torch; import torch_npu; print(torch_npu.__version__)如果输出中包含了 hixl 的相关信息说明 hixl 已经安装成功。3.3 跑官方 demo用 hixl 做单边通信hixl 仓库中提供了多个官方 demo最经典的是examples/unilateral_communication.py。这个 demo 展示了如何用 hixl 做 Put/Get 单边通信。先来看完整的代码importtorchimporttorch.distributedasdistimportos# 1. 初始化进程组os.environ[MASTER_ADDR]localhostos.environ[MASTER_PORT]29500dist.init_process_group(backendhccl,rankint(os.environ[RANK]),world_sizeint(os.environ[WORLD_SIZE]))# 2. 获取 rank 和 world_sizerankdist.get_rank()world_sizedist.get_world_size()# 3. 单边通信Put/Getifrank0:# Rank 0 把数据 Put 到 Rank 1 的指定内存地址tensortorch.randn(1024,1024).npu()# 在 Rank 1 上注册一块内存区域# 这一步需要 Rank 1 的配合实际代码中需要用 IPC 机制来协调dist.put(tensor,peer1,peer_rank1)print(fRank 0: Put 了形状为{tensor.shape}的张量到 Rank 1)else:# Rank 1 从自己的内存地址 Get 数据tensortorch.randn(1024,1024).npu()dist.get(tensor,peer0,peer_rank0)print(fRank 1: Get 到了形状为{tensor.shape}的张量和为{tensor.sum().item()})# 4. 销毁进程组dist.destroy_process_group()这段代码背后的 WHY第 3 步的dist.put()和dist.get()是整个代码的核心。它们在做什么当你调用dist.put(tensor, peer1, peer_rank1)的时候hixl 会做以下几件事情把 tensor 的数据直接从 Rank 0 的显存传输到 Rank 1 的显存不需要 Rank 1 显式调用任何接收接口实现了零拷贝Zero-Copy数据不经过任何中间缓冲区这个过程是单边发起的Rank 1 不需要显式参与通信。这也是 hixl 的一大优势通信延迟更低。3.4 启动多进程训练上面的代码只是一个单独的 Python 脚本需要用 MPI 或torchrun来启动多进程。使用torchrun启动torchrun--nproc_per_node2examples/unilateral_communication.py为什么要用torchrun或 MPI 来启动因为分布式训练需要启动多个进程每个 NPU 对应一个进程而这些进程之间需要互相通信。torchrun和 MPI 就是用来做这件事的它们会自动设置环境变量如RANK、WORLD_SIZE、MASTER_ADDR、MASTER_PORT等让各个进程能够找到彼此。4. 深度剖析hixl 的核心技术揭秘前面的章节我们讲了怎么用这一章我们来讲讲为什么。hixl 到底用了哪些黑科技才能实现零拷贝的单边通信4.1 RDMA让网络通信像访问本地内存一样快RDMARemote Direct Memory Access是 hixl 的核心技术之一。它的核心思想是让 NPU 能够直接读写远程 NPU 的内存不需要远程 NPU 的 CPU 参与。具体来说传统的网络通信需要经过以下步骤发送方 CPU 把数据拷贝到发送方网卡发送方网卡通过互连网络把数据传输到接收方网卡接收方网卡把数据拷贝到接收方内存接收方 CPU 被中断处理接收到的数据这个过程中发送方 CPU 和接收方 CPU 都需要参与延迟较高。RDMA 则可以绕过 CPU直接把数据从发送方内存传输到接收方内存。延迟可以降低 50% 以上。4.2 内存注册让 NPU 知道哪些内存可以远程访问RDMA 需要一个前提接收方需要提前注册哪些内存区域可以被远程访问。这个注册过程称为内存注册Memory Registration。它的作用是让 NPU 知道哪些内存区域可以远程访问哪些不可以。内存注册的优点是提高了安全性防止远程 NPU 读写不应该访问的内存区域。缺点是增加了编程复杂度需要提前规划好哪些内存区域需要被远程访问。4.3 GPUDirect RDMA让数据不走弯路GPUDirect RDMA 是 hixl 的另一项核心技术。它的核心思想是让数据直接在两张 NPU 的显存之间传输不经过主机内存。具体来说传统的 RDMA 需要经过以下步骤发送方 NPU 把数据拷贝到主机内存发送方网卡从主机内存读取数据通过互连网络传输到接收方网卡接收方网卡把数据写入接收方主机内存接收方 NPU 从主机内存读取数据这个过程中数据被拷贝了 2 次发送方 1 次接收方 1 次而且经过了主机内存这个弯路。GPUDirect RDMA 则可以绕过主机内存直接把数据从发送方 NPU 显存传输到接收方 NPU 显存。数据拷贝次数减少到 0 次延迟可以进一步降低 30% 以上。5. 典型应用场景hixl 适合干什么讲了这么多技术细节你可能会问hixl 到底适合干什么这里列举几个典型的应用场景。5.1 PD 分离推理Prefill-Decode Disaggregation这是 hixl 的主战场。在 PD 分离推理中Prefill NPU 生成的 KV Cache 需要高效传输给 Decode NPU。hixl 的单边通信可以实现零拷贝数据hixl 仓库地址https://atomgit.com/cann/hixl欢迎访问获取最新代码和文档。如果你在使用过程中遇到问题欢迎在仓库提 Issue社区会及时响应。