自动并行训练知识点记录
1.tensor在不同视角下的名称
单卡视角下:dense_tensor(只在单独的设备上计算,没有设备间通信)
多卡视角下:dist_tensor (会有一些分布式属性,有设备间通信)
import paddle
import paddle.distributed as dist
mesh = dist.ProcessMesh([[2, 4, 5], [0, 1, 3]], dim_names=['x', 'y'])
dense_tensor = paddle.to_tensor([[1,2,3],
[4,5,6],
[7,8,9],
[10,11,12]])
placements = [dist.Shard(0), dist.Shard(1)]
dist_tensor = dist.shard_tensor(dense_tensor, mesh, placements)

2.张量分布式切分方式
- Replicate,指张量在所有计算设备上保持全量状态。
- Shard(axis),指将张量沿 axis 维度 做切分后,放到不同的计算设备上。
- Partial,指每个计算设备只拥有部分值,需要通过指定的规约操作才能恢复成全量数据。

注意shard和partial的区别,shard是从物理上切分dense_tensor,将其按不同维度切分到不同的进程组中,再分配到对应设备上,而partial则是逻辑上切分,并不是做了实际的张量切分,只是一个概念,例如在数据并行中,每组数据在某个设备上会对于所有参数计算它们的一次梯度,而最终需要将每个mircro_batch计算的梯度做梯度累加,才是最终的梯度,因此此时单个设备上的梯度,就算是partial切分,而每个设备上保存的部分数据大小是一致的,和最后规约后的大小也是一致的。
3.一个分布式的计算示例:
