UCX: An Open Source Framework for HPC Network APIs and Beyond

发表时间: 2015-07

文章标题:UCX: 一个用于HPC网络API及更高层次的开源框架
作者/机构
Pavel Shamis, Manjunath Gorentla Venkata, M. Graham Lopez, Matthew B. Baker, Oscar Hernandez (橡树岭国家实验室)
Yossi Itigin, Mike Dubman, Gilad Shainer, Richard L. Graham, Liran Liss, Yiftah Shahar (Mellanox Technologies)
Sreeram Potluri, Davide Rossetti, Donald Becker, Duncan Poole, Christopher Lamb (NVIDIA Corporation)
Sameer Kumar, Craig Stunkel (IBM)
George Bosilca, Aurelien Bouteiller (田纳西大学诺克斯维尔分校)


速读

一句话结论 本文提出了一个名为UCX的开源网络API框架,通过解耦底层硬件驱动与上层编程模型,在InfiniBand网络上实现了0.89µs的超低延迟和6138.5 MB/s的峰值带宽,解决了高性能计算领域跨硬件平台的网络编程可移植性难题。

要解决什么问题 在高性能计算领域,系统供应商通常会为其网络硬件提供高度定制化的底层接口,例如Cray的uGNI、IBM的PAMI以及InfiniBand的Verbs。这导致上层编程模型(如MPI、OpenSHMEM)的开发者必须为每种硬件单独定制和优化。这种硬件绑定的现状产生了海量的重复劳动,使得跨越多代硬件架构的软件栈维护极其困难。现有的通用接口(如GASNet、ARMCI)要么仅针对单一编程模型,要么局限于特定硬件。此外,随着下一代Exascale计算架构的到来,系统引入了大规模多线程节点、异构层级内存、计算加速器(如GPU)以及混合编程模型。传统网络栈在处理GPU内存间及与主机间的通信时缺乏高效底层支持。如果不能在底层提供统一且高效的通信接口,同一应用中混合使用的多种编程模型将无法协同调度网络资源,严重限制了现代异构集群的计算潜力。

怎么做的 为绕开硬件接口碎片化卡点,作者没有构建“一刀切”的单一接口,而是设计了分层且模块化的UCX框架。其核心思路是将API、网络协议和底层实现解耦,允许上层根据特定编程模型需求定制功能而不牺牲性能。UCX特别针对异构架构进行了优化,通过支持GPUDirect RDMA等技术减少CPU干预,并为加速器内存设计了独立传输层,支持在高度线程化环境中直接从GPU核心内部发起通信。UCX由三个可独立使用的核心组件构成。底层是服务层UCS,负责屏蔽平台差异,提供原子操作、线程安全等抽象,并内置内存池、分配器钩子等管理工具及常用数据结构。中间层是传输层UCT,以极低软件开销直接访问硬件网络资源。UCT向下对接供应商底层驱动,向上提供设备特定内存管理,并定义了三种核心通信接口:针对小消息原地发布完成的立即操作(short)、针对中等消息通过反弹缓冲区发送的缓冲复制操作(bcopy),以及暴露内存到内存语义的零拷贝操作(zcopy)。上层是协议层UCP,利用UCT实现高级通信协议。UCP包含六类关键接口:初始化接口用于设置网络上下文和通信端点;远程内存访问(RMA)接口提供单边PUT和GET操作,并支持利用现代网卡的散播/收集能力处理非连续数据;原子内存操作(AMO)接口支持在远程内存上执行原子计算;标签匹配接口专门支持MPI规范中的发送-接收语义;主动消息接口允许发送方指定回调函数,由接收进程在数据包到达时触发处理,适用于不预先发布接收指令的编程范式;集合操作接口则涵盖Barrier、归约等组通信功能,并能直接调用交换机等硬件层面的加速能力。

效果如何 实验在两台24核HP服务器上进行,通过Mellanox SX6036交换机和单端口Connect-IB FDR网卡连接。作者重点测试了UCT层在InfiniBand网络上的微基准性能,对比基线为标准的常规Verbs驱动,以及一个代表深度优化的加速Verbs驱动程序原型。量化结果显示UCX性能逼近物理硬件极限。延迟方面,使用加速Verbs驱动时,UCT的1字节short类型PUT操作延迟仅为0.89µs(常规Verbs为0.91µs),1字节GET操作延迟为1.79µs,证明UCT软件封装开销极低。带宽方面,UCT的zcopy零拷贝操作(PUT和GET)均达6138.5 MB/s,跑满了单端口FDR硬件的实际峰值带宽。消息率方面,单核环境下向远端发起多个short或bcopy PUT请求时,结合加速Verbs驱动的UCT达到每秒1400万次操作,是常规Verbs驱动的两倍以上。作者承认目前的局限性在于评估仅集中于UCT层的底层功能,未来的工作需要利用UCP层接口真正实现完整的MPI和OpenSHMEM库,并扩展对混合编程模型和I/O应用的支持。

A1 主要贡献

本文针对高性能计算(HPC)领域中网络编程模型的可移植性与性能挑战,提出了一个名为统一通信X(Unified Communication X, UCX)的开源网络API框架。

A2 方法细节

UCX是一个为现代互连网络设计的API框架,其目标是为实现可移植、可扩展且高效的多种编程模型库和语言建立一套接口。

图1: UCX 架构

为新兴Exascale技术设计。该框架在设计时审慎考虑了新兴的Exascale技术,如大规模并行计算节点、加速器和层级化内存。UCX架构为多线程驱动的高性能通信、异构内存层级内的通信以及包括I/O和数据中心库在内的混合编程模型提供了软件构造。我们没有构建一个“一刀切”的单一接口,而是设计了一个框架,该框架提供了使用不同抽象层次构建各种通信协议所需的组件。这样的设计提供了高度的灵活性,使得为新兴和未来的编程模型实现新的网络协议成为可能。

对加速器的支持。例如,加速器被期望成为Exascale系统设计的关键组成部分。像GPUDirect RDMA 【索引10,NVIDIA GPUDirect RDMA】和GPUDirect Async 【索引11,GPUDIRECT: Integrating the GPU with a Network Interface,2015,GPU Technology Conference】这样的新功能允许基于GPU的工作流以最少的CPU干预来运行,从而让CPU可以处理其他更通用的任务。在通过PCIe和NVLink将GPU连接到节点时产生的层级结构及其带来的性能特性,在设计用于GPU内存通信的运行时需要特别考虑。更具体地说,为了实现在GPU核心内部支持通信的愿景【索引12,TOC-centric Communication: A Case Study with NVSHMEM,2014,OpenSHMEM User Group Meeting】,高性能在高度线程化的环境中至关重要。UCX为加速器内存提供了一个独立的传输层,这使得实现可以根据GPU间通信的设计需求进行定制。

UCX框架的三大组件。UCX框架由三个主要组件构成:UC-Services (UCS)、UC-Transports (UCT)和UC-Protocols (UCP)。这些组件中的每一个都暴露了一个公共API,并且可以作为独立的库使用(如图1所示)。

UCS服务层。UCS是一个服务层,为实现可移植和高效的实用工具提供了必要的功能。该层暴露了以下服务:
* 一个用于访问平台特定功能的抽象(原子操作、线程安全等)。
* 用于高效内存管理的工具(内存池、内存分配器和内存分配器钩子)。
* 常用的数据结构(哈希表、树、列表)。

UCT传输层。UCT是一个传输层,它抽象了各种硬件架构之间的差异,并提供了一个底层API,使得通信协议的实现成为可能。该层的主要目标是以最小的软件开销提供对硬件网络资源的直接和高效访问。为此,UCT依赖于供应商提供的底层驱动程序,如InfiniBand Verbs、Cray的uGNI、libfabrics等。此外,该层还为通信上下文管理(基于线程和应用级别)以及设备特定内存(包括加速器中的内存)的分配和管理提供了构造。在通信API方面,UCT为立即(short)、缓冲复制发送(bcopy)和零拷贝(zcopy)通信操作定义了接口。short操作针对可以原地发布和完成的小消息进行了优化。bcopy操作针对通常通过所谓的“反弹缓冲区”(bouncing-buffer)发送的中等大小消息进行了优化。最后,zcopy操作暴露了零拷贝的内存到内存通信语义。

UCP协议层。UCP通过使用UCT层暴露的底层能力,实现了消息传递(MPI)和PGAS编程模型通常使用的高级协议。UCP负责以下功能:库的初始化、通信传输方式的选择、消息分片和多路通信。目前,该API具有以下几类接口:初始化、远程内存访问(RMA)、原子内存操作(AMO)、主动消息、标签匹配和集合操作。

初始化接口。这个接口子集定义了通信上下文的设置、查询网络能力以及初始化本地通信端点。由UCX上下文表示的上下文是网络传输资源的抽象。通信端点设置接口初始化UCP端点,这是与特定连接相关联的所有必要资源的抽象。通信端点在所有通信操作中作为输入,用以描述通信的源和目的地。

远程内存访问 (RMA) 接口。这个接口子集定义了单边通信操作,如PUT和GET,这对于实现分布式和共享内存编程模型所需的低开销、直接内存访问通信构造至关重要。UCP为通信非连续数据包含了一套独立的接口。包含此功能是为了支持各种编程模型的通信需求,并利用现代网络硬件的散播/收集(scatter/gather)能力。

原子内存操作 (AMO) 接口。这个接口子集为在远程内存上原子地执行操作提供了支持,这是PGAS编程模型(特别是OpenSHMEM)的一类重要操作。

标签匹配接口。该接口支持发送-接收语义的标签匹配,这是MPI规范定义的关键通信语义。

主动消息接口。这是一个功能子集,其中传入的数据包会调用一个由发送方指定的回调函数,以便由接收进程进行处理。例如,双边MPI接口可以很容易地基于这一概念实现【索引13,Open MPI: Goals, Concept, and Design of a Next Generation MPI Implementation,2004,European PVM/MPI Users’ Group Meeting】。然而,这些接口更通用,适用于接收进程不预先发布接收(pre-post receives)但期望直接对传入数据包做出反应的其他编程范式。与RMA和标签匹配接口一样,主动消息接口为不同类型的消息和非连续数据提供了独立的API。

集合操作接口。这个接口子集定义了组通信和同步操作。集合操作包括Barrier、All-to-one、All-to-all和归约操作。在可能的情况下,我们将利用硬件对集合操作的加速,例如InfiniBand交换机的集合操作加速。

A4 实验

实验环境

本评估展示了UCX框架内UCT层的初步功能,重点测试了InfiniBand传输层。

实验结果

实验结果表明,UCX原型实现的性能非常接近底层驱动的性能。

图2: (a) UCT short/bcopy-put 和 bcopy-get 操作的延迟 (b) UCT put 和 get zcopy 操作的带宽 (c) UCT short 和 bcopy 操作的消息率

A5 结论

本文介绍了UCX框架的设计、架构、接口和协议,该框架旨在为并行编程模型的实现提供统一、高效的网络API。通过原型实现和性能评估,我们验证了设计决策的有效性,证明了UCX在实现MPI和OpenSHMEM等模型所需的基本通信原语上具有出色的性能特征,其延迟、带宽和消息率均接近底层硬件的极限。

未来的工作将首先集中于使用UCX提出的接口和协议来实现MPI和OpenSHMEM。之后,将扩展UCX以适应混合编程模型,并为I/O应用提供支持。

方法细节中引用的参考文献