43
43
* Partial,指每个计算设备只拥有部分值,需要通过指定的规约操作才能恢复成全量数据。
44
44
45
45
<p align =" center " >
46
- <img src="images/auto_parallel/mesh.png" width="40%"/>
46
+ <img src="https://raw.githubusercontent.com/PaddlePaddle/docs/develop/docs/guides/paddle_v3_features/ images/auto_parallel/mesh.png" width="40%"/>
47
47
</p >
48
48
49
49
在如下的示例中,我们希望在 6 个计算设备上,创建一个形状为(4, 3)的分布式张量,其中沿着计算设备的 x 维,切分张量的 0 维;沿着计算设备的 y 维上,切分张量的 1 维。最终,每个计算设备实际拥有大小为(2, 1)的实际张量,如图所示。
@@ -63,7 +63,7 @@ placements = [dist.Shard(0), dist.Shard(1)]
63
63
dist_tensor = dist.shard_tensor(dense_tensor, mesh, placements)
64
64
```
65
65
<p align =" center " >
66
- <img src="images/auto_parallel/shard.png" width="40%"/>
66
+ <img src="https://raw.githubusercontent.com/PaddlePaddle/docs/develop/docs/guides/paddle_v3_features/ images/auto_parallel/shard.png" width="40%"/>
67
67
</p >
68
68
69
69
## 2.3 张量重切分
@@ -88,7 +88,7 @@ dist_tensor = dist.shard_tensor(dense_tensor, mesh0, placements0)
88
88
dist_tensor_after_reshard = dist.reshard(dist_tensor, mesh1, placements1)
89
89
```
90
90
<p align =" center " >
91
- <img src="images/auto_parallel/reshard.png" width="40%"/>
91
+ <img src="https://raw.githubusercontent.com/PaddlePaddle/docs/develop/docs/guides/paddle_v3_features/ images/auto_parallel/reshard.png" width="40%"/>
92
92
</p >
93
93
94
94
# 三、原理简介
@@ -115,7 +115,7 @@ dist_tensorD = relu(dist_tensorC)
115
115
```
116
116
117
117
<p align =" center " >
118
- <img src="images/auto_parallel/shard_anonation.png" width="40%"/>
118
+ <img src="https://raw.githubusercontent.com/PaddlePaddle/docs/develop/docs/guides/paddle_v3_features/ images/auto_parallel/shard_anonation.png" width="40%"/>
119
119
</p >
120
120
121
121
接下来就会进入自动并行的第一个核心逻辑 ** 切分推导** 。
@@ -124,17 +124,17 @@ dist_tensorD = relu(dist_tensorC)
124
124
在上述输入的切分状态下,框架会推导出会将 TensorA 的切分状态推导成按列切分,TensorB 保持切分状态不变,Matmul 的计算结果 TensorC 的切分状态是 Partial。
125
125
因为后续的 Relu 算子是非线性的,输入不能是 Partial 状态,所以框架会根据 ReluSPMD Rule 将 TensorC 输入 Relu 前的的分布式状态推导成 Replicated。
126
126
<p align =" center " >
127
- <img src="images/auto_parallel/shard_propogation.png" width="40%"/>
127
+ <img src="https://raw.githubusercontent.com/PaddlePaddle/docs/develop/docs/guides/paddle_v3_features/ images/auto_parallel/shard_propogation.png" width="40%"/>
128
128
</p >
129
129
130
130
接下来就会进入自动并行的第二个核心逻辑 ** 切分转换** 。
131
131
框架会根据 tensor 当前的切分状态(src_placement),和切分推导规则推导出的算子计算需要的切分状态(dst_placement),添加对应的通信/张量维度变换算子。
132
132
根据上图的切分推导,在计算 Matmul 添加 split 算子,在计算 Relue 添加 Allreduce,将输入 tensor 转换成需要的切分状态进行实际计算。
133
133
134
134
<p align =" center " >
135
- <img src="images/auto_parallel/shard_convertion.png" width="40%"/>
135
+ <img src="https://raw.githubusercontent.com/PaddlePaddle/docs/develop/docs/guides/paddle_v3_features/ images/auto_parallel/shard_convertion.png" width="40%"/>
136
136
</p >
137
- <!--  -->
137
+ <!--  -->
138
138
139
139
140
140
# 四、使用示例
@@ -341,7 +341,7 @@ for step, inputs in enumerate(dataloader):
341
341
自动并行的 API 在设计之初,就以实现统一的用户标记接口和逻辑为目标,保证动静半框架保证在相同的用户标记下,动静态图分布式执行逻辑一致。这样用户在全流程过程中只需要标记一套动态图组网,即可以实现动态图下的分布式训练 Debug 和 静态图下的分布式推理等逻辑。整个动转静训练的逻辑如下:
342
342
343
343
<p align =" center " >
344
- <img src="images/auto_parallel/dynamic-static-unified.png" width="40%"/>
344
+ <img src="https://raw.githubusercontent.com/PaddlePaddle/docs/develop/docs/guides/paddle_v3_features/ images/auto_parallel/dynamic-static-unified.png" width="40%"/>
345
345
</p >
346
346
347
347
``` python
0 commit comments