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