引言 — 在之前的文章中介绍了RDMA的外卖模式,本篇文章介绍了英特尔的Gaudi的RoCE对于MPI支持的优化实现方法。
本文分为以下四个部分:
1. I人与E人
2. E人三要素
3. E人I人化
4. 不只是I人
I. I人与E人
外卖小哥中的
I人:送货于无形之中
E人:
送货前打电话:您家里有人么?
送货时敲门确认:这是您的物品,麻烦点个好评。
I人的做法,安静而内敛,不打扰是我的温柔,但是感觉不那么可靠。
E人的做法,热情而可靠,电话敲门双保险,但东西多了就有点烦。
这中间的难以取舍,用来类比RDMA读写与MPI通信模式之间的差异。
RDMA允许一台计算机直接读写另一台远程计算机的内存,而不需要通过操作系统或者CPU接入,因此可以减少延迟并且提高性能。
RDMA的读写操作假设发起方(initiator,也称为请求方)拥有本地和远程内存的指针。
也就是说,发起方必须知道远程机器上确切的内存地址才能进行操作。这意味着,RDMA要求通信的双方之间存在一定的内存地址共享或预先协商,确保发起方能够定位到远程内存。
然而,深度神经网络(DNN)应用通常使用的是基于MPI(Message Passing Interface)的集体操作(collective operations)。
集体操作是指多个参与者(计算节点)同时参与的数据通信操作,例如广播、聚合等。在这些操作中,通信模式通常基于“发送-接收(send-receive)”的方式,而不是RDMA的读写方式。
II. E人三要素
MPI集体操作中数据传输,包含了三个基本元素:
第一个元素是发送方(sender side),它持有发送缓冲区的指针。
发送方负责准备好需要发送的数据,并将数据存放在其本地的发送缓冲区中。这个缓冲区是内存中的一块区域,存储要传输的数据,类似于“待发送的存储空间”。
第二个元素是接收方(receiver side),它持有接收缓冲区的指针。
接收方需要为即将到来的数据准备接收缓冲区,类似于“待接收的存储空间”。一旦数据传输完成,数据将从发送方的发送缓冲区移到接收方的接收缓冲区。
第三个元素是数据传输的握手流程(rendezvous flow)。
这里的“rendezvous”指的是发送方和接收方之间的一种协商流程,确保双方都已经准备好进行数据传输。
通常情况下,数据传输前,发送方会通知接收方,并确认接收方已经分配好了接收缓冲区。
在这种握手机制下,数据才会从发送方移动到接收方。这个流程可以通过显式的“snend-receive”命令来完成,确保数据在双方之间顺利传输。
III. E人I人化
由于MPI集体操作是基于显式的发送和接收流程的,它们并不能直接映射到需要内存地址共享的RDMA读写操作中。
有多种方法可以将 MPI 操作映射到 RDMA 读写操作中,每种方法都有其优点和缺点:
一种方案是将 MPI 操作直接映射到 RDMA 的发送-接收(send-receive)操作。这意味着 MPI 中的显式发送和接收动作将对应到 RDMA 的相应操作。
看似直接,但存在一些问题,尤其是在处理数据传输的时机上。
这种方法无法解决握手流程的问题。在 MPI 中,数据传输依赖发送方和接收方之间的握手,即双方必须同步数据传输的时机。如果发送方在接收方准备好接收操作之前就发送了数据,问题就会出现。
如果发送方在接收方准备接收操作之前发送数据,那么接收方会发送 RNR NACK(Receiver Not Ready Negative Acknowledgement) , 表示接收方还没有准备好接收数据。这会触发数据的重传,导致性能大幅下降。这种情景就是典型的握手不匹配问题,重传增加了不必要的延迟和网络开销。
另一种方案是在接收方实现握手机制,即在接收方使用临时缓冲区先存储数据,等接收缓冲区准备好后再将数据从临时缓冲区复制(mem-copy)到最终接收缓冲区。这样可以确保发送方的数据可以先被暂时存储,避免了重传问题。
尽管这种方法避免了重传问题,但它有两个主要缺点:
高延迟:由于需要额外的内存复制操作(mem-copy),数据要先存储在临时缓冲区,再复制到目标缓冲区,这增加了传输过程中的延迟。
高内存需求:为了处理临时存储,系统需要分配额外的内存空间,这在大规模系统中可能会导致高内存占用,降低整体效率。
Intel Gaudi 加速器使用了基于硬件的实现,在发送方解决握手流程的问题。
这意味着不需要依赖软件层面的握手或重传,而是通过硬件机制来确保数据在正确的时机传输。
这种方法避免了因为接收方准备不足而导致的重传。
这种方法将复杂的握手和数据传输过程卸载到了NIC硬件上,用户通过一个简单的集体操作 API 即可使用。硬件负责处理底层的复杂流程,从而确保最小的延迟和高消息速率,提升了通信效率。
既有了E人的可靠,又有了I人的不打扰。
IV. 不只是I人
除了数据传输方面的优化,Gaudi还支持 In-network Reduction功能,用于优化分布式计算中的归约操作。
该功能通过在网络传输路径上直接进行归约操作,降低了计算需求,并改善了通信与计算阶段的重叠,以提高整体性能。
Reduction(归约)操作
Reduction 是一种常见的并行计算操作,用于将多个数据元素通过某种运算(例如求和、求最小值、求最大值等)组合成单个结果。例如,在深度学习中,当多个设备同时进行计算时,通常需要将每个设备计算出的梯度进行累加,归约操作用于将这些数据组合成最终的结果。
在大规模分布式系统中,传统的归约操作通常需要将数据从各个设备传输到一个中心节点进行处理,这增加了通信和计算的开销。
支持的运算类型
Intel Gaudi 3 加速器在其网络路径上的归约操作支持以下几种常见的运算类型:
Sum(求和):对所有输入数据进行累加。
Min(求最小值):选择输入数据中的最小值。
Max(求最大值):选择输入数据中的最大值。
支持的数据类型
该功能支持处理多种不同的数据类型,适应不同的计算需求:
FP32(32位浮点数)
FP16(16位浮点数)
BF16(bfloat16,一种专门优化机器学习的16位浮点数格式)
FP8(8位浮点数)
支持这些不同的数据类型意味着 Gaudi 3 加速器可以在精度和性能之间找到平衡,选择合适的数据格式来加速计算,同时保持所需的准确度。
FP16 和 BF16 归约的 FP32 累积
为了提高计算精度,Gaudi 3 支持将 FP16 和 BF16 这两种低精度浮点数的归约操作以 FP32(32位浮点数) 的方式进行累积。具体好处包括:
改进计算与通信的重叠
归约操作通常会在计算和通信阶段之间产生一定的等待时间,因为设备需要先完成通信(即将数据发送或接收)后才能进行归约计算。而通过 In-network Reduction,Gaudi 3 能够在数据传输的过程中直接进行归约操作,使得通信和计算阶段可以很好地重叠,从而减少等待时间,提升整体的系统效率。
参考文献:
高阅读量文章