![分布式机器学习:系统、工程与实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/463/47500463/b_47500463.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.2 点对点通信
从一个进程到另一个进程的数据传输称为点对点通信。在PyTorch中,点对点通信通过send()、recv()、isend()和irecv()四个函数来实现。图2-2所示为发送和接收的示意图。
![](https://epubservercos.yuewen.com/DA71C1/26895880107207806/epubprivate/OEBPS/Images/45814_43_1.jpg?sign=1739094269-xq0HhF8US7UZW2E7PudB4cp87MF3j0V7-0-8ba10848cc37e02146cf0e8ef210ea19)
图2-2
发送和接收在PyTorch中的样例如下。
![](https://epubservercos.yuewen.com/DA71C1/26895880107207806/epubprivate/OEBPS/Images/45814_43_2.jpg?sign=1739094269-8GI7XcCW2rP0POOzP212X7XKRgUL3ebU-0-0db2ea8f3ed8730d391bbad7e8ba97e5)
在上述例子中,两个进程都首先以零张量开始,然后进程0对张量进行操作,并将其发送到进程1,这样它们都以1.0结束。注意,进程1需要分配内存以存储即将接收的数据;还要注意的是,send()和recv()这两个函数是阻塞实现的,即两个进程都会阻塞直到通信完成。另一种API是非阻塞的,如isend()和irecv(),其在非阻塞情况下会继续执行,这两个方法将返回一个Worker对象,我们可以在该对象上进行wait()操作。
当我们对进程的通信进行细粒度控制或者面对不规则通信模式时,点对点通信很有用,它可用于实现复杂巧妙的算法。
与点对点通信相反,集合通信是允许一个组中所有进程进行通信的模式。组是所有进程的子集,要创建一个组,我们可以将一个rank列表传递给dist.new_group(group)。在默认情况下,集合通信在所有进程上执行,“所有进程”也称为world。例如,为了获得所有进程中所有张量的总和,我们可以使用dist.all_reduce(tensor,op,group)函数,具体示例代码如下。
![](https://epubservercos.yuewen.com/DA71C1/26895880107207806/epubprivate/OEBPS/Images/45814_43_3.jpg?sign=1739094269-A3PVTFPY1ZJGaFyQgQxRtbB9945LRvkX-0-8e81bfc9ede7e7b3a8f9a644c873a826)
需要注意,集合通信基于点对点通信来实现。