Skip to content

Commit 1a35f01

Browse files
chore(content): sync from Feishu
1 parent aeded17 commit 1a35f01

3 files changed

Lines changed: 182 additions & 38 deletions

File tree

docs/.vitepress/data/generated/feishu.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"order": 2,
4141
"documentId": "H5x1dK6LzoVFmuxUzDicmuQ1nbb",
4242
"objectType": "docx",
43-
"revisionId": 677
43+
"revisionId": 741
4444
}
4545
]
4646
}

docs/wiki/F9oKw4GUgi30lQkgWScckzjfnfd.md

Lines changed: 156 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -61,29 +61,53 @@ presenter: @陈嘉骏
6161

6262
用计算机进行计算,用程序秒速计算。计算机程序是由处理器执行的一串指令流,时钟周期是处理器执行指令的基本单位。在冯诺伊曼架构下,执行一个指令需要进行取指、译码、执⾏、访存、写回这一系列流水线,也就是说在这一意义上5个时钟周期才能执行一套完整的流程。IPC 性能(Instructions Per Cycle)是指一个时钟周期可以执行的指令数量,对于下图,IPC 性能只有1/5。
6363

64-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/9d4b2e50044a3ab90aa8c06e.png)
64+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/9d4b2e50044a3ab90aa8c06e.png" caption="处理器的 IPC 性能是1/5" width="876" height="157" transparent />
6565

6666
下图展示了一个典型的串行计算流程。计算机同时只能执行一条指令。
6767

68-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/750234eba2659e0b1b7fddc9.png)
68+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/750234eba2659e0b1b7fddc9.png" caption="串行计算" width="604" height="250" />
6969

7070
通过让处理器在同时时间执行指令的不同阶段,可以在一个时钟周期内完成取指、译码、执⾏、访存、写回五个环节,也就是其 IPC 性能达到1。
7171

72-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/0dc9b6380a3a47caf0cc482e.png)
72+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/0dc9b6380a3a47caf0cc482e.png" caption="IPC 性能达到1" width="972" height="282" />
7373

7474
### 并行计算
7575

7676
在有不止一个处理器的时候,我们可以同时执行多条指令,也就是把不同的指令分配到不同的计算单元。如果我们有n个处理器,我们可以同时执行n条指令,我们处理任务的效率也就提升了n倍。这时候处理器的 IPC 性能就超过了1,我们说这样的处理器有超标量性能。
7777

78-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/8dbca1339495a6e3d7084bbf.png)
78+
<FeishuGrid>
7979

80-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/c7f510ecc4578cd7553760aa.png)
80+
<FeishuGridColumn width="0.51745">
81+
82+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/8dbca1339495a6e3d7084bbf.png" caption="并行计算" width="660" height="359" />
83+
84+
</FeishuGridColumn>
85+
86+
<FeishuGridColumn width="0.48255">
87+
88+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/c7f510ecc4578cd7553760aa.png" width="1920" height="1121" transparent />
89+
90+
</FeishuGridColumn>
91+
92+
</FeishuGrid>
8193

8294
并行计算出现在各个尺度:处理器内部、多个处理器之间、不同设备之间乃至一整个集群里都存在并行计算。
8395

84-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/fc770da5bee278a8bf96967d.png)
96+
<FeishuGrid>
97+
98+
<FeishuGridColumn width="0.460881">
99+
100+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/fc770da5bee278a8bf96967d.png" caption="一个多核处理器芯片,有多个核心,每个都可以作为“处理器”" width="450" height="453" />
85101

86-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/d722fa1d40e8a60cf328288f.png)
102+
</FeishuGridColumn>
103+
104+
<FeishuGridColumn width="0.539119">
105+
106+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/d722fa1d40e8a60cf328288f.png" caption="机房中一个机柜有多个节点,一个节点有多个处理器" width="934" height="802" />
107+
108+
</FeishuGridColumn>
109+
110+
</FeishuGrid>
87111

88112
影响并行计算的指标有延迟(Latency)和吞吐(Throughput)。延迟是一个计算单元的运算速度,也就是完成一次计算需要的时间,通常由计算单元设计、时钟频率、流水线深度以及内存层次等共同决定。延迟越低,每个计算单元的性能越强,每次计算算的更快。吞吐(Throughput)表示单位时间内完成的计算量。当任务具有足够并行性且计算资源能够被充分利用时,增加计算单元数量通常可以提高吞吐。
89113

@@ -101,6 +125,10 @@ presenter: @陈嘉骏
101125

102126
判断不同计算之间是否存在输入/输出依赖关系。如果一个计算需要另一个计算的结果,则必须按顺序执行;如果多个计算只依赖已有输入,则可以同时执行。第一段代码具有数据依赖,而第二段不具有,因而第二段代码的 c、d、e 的值可以并行计算得到,而第一段不可以。
103127

128+
<FeishuGrid>
129+
130+
<FeishuGridColumn width="0.5">
131+
104132
```Plain Text
105133
function Dep(a, b)
106134
c := a * b
@@ -110,6 +138,10 @@ end function
110138
```
111139

112140

141+
</FeishuGridColumn>
142+
143+
<FeishuGridColumn width="0.5">
144+
113145
```Plain Text
114146
function NoDep(a, b)
115147
c := a * b
@@ -119,6 +151,10 @@ end function
119151
```
120152

121153

154+
</FeishuGridColumn>
155+
156+
</FeishuGrid>
157+
122158
#### 竞争、互斥与锁(Race, Mutual Exclusion & Lock)
123159

124160
多个任务访问共享资源时,可能产生竞争。例如多个线程同时修改同一个变量或者多个任务同时写入同一块内存。这时需要通过锁(Lock)、原子操作(Atomic Operation)和同步机制(Synchronization)保证计算结果正确。
@@ -132,13 +168,25 @@ end function
132168
- 科学计算:气候模拟、物理模拟、生物模拟……
133169
- 矩阵计算、逐元素计算:**深度学习和人工智能**
134170

135-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/a136621e199b6d598f854ae2.png)
171+
<FeishuGrid>
172+
173+
<FeishuGridColumn width="0.430779">
174+
175+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/a136621e199b6d598f854ae2.png" caption="科学计算" width="660" height="302" />
176+
177+
</FeishuGridColumn>
178+
179+
<FeishuGridColumn width="0.569221">
180+
181+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/e766b9fe1f84ba20f64ff3f4.png" caption="矩阵计算" width="403" height="139" transparent />
182+
183+
</FeishuGridColumn>
136184

137-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/e766b9fe1f84ba20f64ff3f4.png)
185+
</FeishuGrid>
138186

139-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/7e78dc77116e1ce3d1b8dc98.png)
187+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/7e78dc77116e1ce3d1b8dc98.png" caption="深度学习和人工智能" width="2616" height="614" />
140188

141-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/1361ec5448a45539746ff1d0.png)
189+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/1361ec5448a45539746ff1d0.png" caption="NVIDIA GPU的矩阵并行计算" width="2871" height="1209" />
142190

143191
### 如何将任务切分到不同计算单元?
144192

@@ -154,37 +202,49 @@ end function
154202

155203
**功能切分**:按照功能将任务进行拆分,把相同类型的计算放到一起。
156204

157-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/cbaa7f602426d490b1123d1e.png)
205+
<FeishuGrid>
158206

159-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/c80158862882e88fa6033030.png)
207+
<FeishuGridColumn width="0.63537">
208+
209+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/cbaa7f602426d490b1123d1e.png" caption="域切分(Domain Decomposition)" width="1192" height="408" />
210+
211+
</FeishuGridColumn>
212+
213+
<FeishuGridColumn width="0.36463">
214+
215+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/c80158862882e88fa6033030.png" caption="功能切分(Functional Decomposition)" width="587" height="353" />
216+
217+
</FeishuGridColumn>
218+
219+
</FeishuGrid>
160220

161221
Transformer 中,我们将输入的数据切分后输入不同的 GPU,在不同的 GPU 上进行一部分计算,从而实现数据并行化。
162222

163-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/073bdf2c2281ae02eb679a8b.png)
223+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/073bdf2c2281ae02eb679a8b.png" caption="Transformer 模型中的数据并行" width="2482" height="1234" />
164224

165225
#### 模型并行
166226

167227
将一个模型拆分成多个部分,分别放到不同计算单元执行,不同 GPU 保存不同的模型参数。
168228

169-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/6b4e102be3e544b13ba8919b.png)
229+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/6b4e102be3e544b13ba8919b.png" caption="模型并行" width="2382" height="1272" />
170230

171231
#### 流水线并行
172232

173233
将模型按阶段划分,让不同计算单元负责不同阶段,并让多个输入同时流动。通过类似生产线的方式,避免 GPU 空闲。可以类比 CPU 中的指令级并行。
174234

175-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/4e80a26a98810dd2ff9385fa.png)
235+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/4e80a26a98810dd2ff9385fa.png" caption="流水并行" width="2474" height="1268" />
176236

177237
#### 张量并行
178238

179239
将单个计算操作内部的数据进行切分,让多个计算单元共同完成一次计算。张量并行的通讯频繁,要求 GPU 之间有高速互联。
180240

181-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/8fd01bf8f5efdd8972ce648f.png)
241+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/8fd01bf8f5efdd8972ce648f.png" caption="张量并行" width="2470" height="1228" />
182242

183243
#### 三维并行
184244

185245
对于一个超大规模的模型训练,应对于数据、模型和张量计算任务都进行切分,实现组合多种并行方式。
186246

187-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/9c6d6df25367d2d1508028a1.png)
247+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/9c6d6df25367d2d1508028a1.png" caption="三维并行" width="2608" height="1234" />
188248

189249
## 并行计算机
190250

@@ -201,12 +261,16 @@ Transformer 中,我们将输入的数据切分后输入不同的 GPU,在不
201261

202262
传统串行计算模型。特点是一个处理单元 、一条指令流、一组数据流。
203263

204-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/dff3d67ed7dbfc91d7d16965.png)
264+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/dff3d67ed7dbfc91d7d16965.png" caption="SISD:单指令单数据" width="946" height="412" />
205265

206266
#### SIMD:单指令多数据
207267

208268
同一条指令同时作用于多个数据。例如数组计算中可以把多条相同操作变成一条指令:
209269

270+
<FeishuGrid>
271+
272+
<FeishuGridColumn width="0.5">
273+
210274
```Plain Text
211275
c[0]=a[0]+b[0]
212276
c[1]=a[1]+b[1]
@@ -215,6 +279,10 @@ c[3]=a[3]+b[3]
215279
```
216280

217281

282+
</FeishuGridColumn>
283+
284+
<FeishuGridColumn width="0.5">
285+
218286
```Plain Text
219287
load a
220288
load b
@@ -223,13 +291,17 @@ store c
223291
```
224292

225293

226-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/8f7f7dda43e403dcc736333e.png)
294+
</FeishuGridColumn>
295+
296+
</FeishuGrid>
297+
298+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/8f7f7dda43e403dcc736333e.png" width="1026" height="560" />
227299

228300
#### MISD:多指令单数据
229301

230302
多个计算单元对同一个数据执行不同操作。
231303

232-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/eaa70cb069a72eec9b7bb50d.png)
304+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/eaa70cb069a72eec9b7bb50d.png" caption="MISD" width="1194" height="436" />
233305

234306
应用非常少,只有某些专用硬件使用。
235307

@@ -241,7 +313,7 @@ store c
241313
- 多节点 HPC
242314
- GPU(通常抽象为 MIMD + SIMT)
243315

244-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/99158267689e4755ff541a13.png)
316+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/99158267689e4755ff541a13.png" caption="MIMD" width="1200" height="474" />
245317

246318
### 如何实现并行计算?——并行编程模型(by Programmers)
247319

@@ -257,23 +329,47 @@ store c
257329
- SPMD(Single Program Multiple Data)
258330
- MPMD(Multiple Program Multiple Data)
259331

260-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/d464a314a3f90cf4b5059248.png)
332+
<FeishuGrid>
333+
334+
<FeishuGridColumn width="0.417824">
335+
336+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/d464a314a3f90cf4b5059248.png" caption="消息传递模型" width="352" height="245" />
337+
338+
</FeishuGridColumn>
261339

262-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/000c53359c8b479286596cd5.png)
340+
<FeishuGridColumn width="0.582176">
341+
342+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/000c53359c8b479286596cd5.png" caption="MPI 模型" width="352" height="175" />
343+
344+
</FeishuGridColumn>
345+
346+
</FeishuGrid>
263347

264348
### 如何实现并行计算?——“SIMT”模型 & CUDA(by NVIDIA)
265349

266350
为了更好的发挥硬件性能,充分配合硬件设计,我们既要考虑用程序描述好计算,也要考虑计算机进行计算的方式。GPU 编程是一种特殊的并行模型。CUDA 使用**SIMT(Single Instruction Multiple Threads)**思想:程序员编写线程级程序,由 GPU 自动组织大量线程执行。
267351

268-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/b9940567d8cda6324e2f9a38.png)
352+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/b9940567d8cda6324e2f9a38.png" caption="CUDA 计算模型" width="1058" height="502" />
269353

270354
### 如何实现并行计算?—— Tile 模型 & Block 编程(by DSLs)
271355

272356
随着 AI 加速需求增加,出现了更高层的编程抽象,例如 Triton 和 TileLang。与 CUDA thread-level 编程不同,CUDA 关注线程,而 Tile 关注数据块(Tile)和计算块(Block)。
273357

274-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/0772c750962331b8b43efd8b.png)
358+
<FeishuGrid>
359+
360+
<FeishuGridColumn width="0.601892">
361+
362+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/0772c750962331b8b43efd8b.png" caption="SIMT vs Tile" width="1376" height="768" />
363+
364+
</FeishuGridColumn>
365+
366+
<FeishuGridColumn width="0.398108">
367+
368+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/6b242fbace3f3912f113078f.png" width="1840" height="1562" />
275369

276-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/6b242fbace3f3912f113078f.png)
370+
</FeishuGridColumn>
371+
372+
</FeishuGrid>
277373

278374
### 不同层次的并行抽象
279375

@@ -291,14 +387,42 @@ store c
291387

292388
### AI 中的并行计算
293389

294-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/82a17faa08b079e163ac437b.png)
390+
<FeishuGrid>
391+
392+
<FeishuGridColumn width="0.695431">
393+
394+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/82a17faa08b079e163ac437b.png" caption="算子" width="2622" height="1006" transparent />
395+
396+
</FeishuGridColumn>
397+
398+
<FeishuGridColumn width="0.304569">
399+
400+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/367f82d7ef890a6ee8fef1bc.png" caption="集群通信" width="996" height="884" transparent />
401+
402+
</FeishuGridColumn>
403+
404+
</FeishuGrid>
405+
406+
<FeishuGrid>
407+
408+
<FeishuGridColumn width="0.353404">
409+
410+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/23995a477b75c0dcb78c8c44.png" caption="分布式训练" width="1706" height="1206" />
411+
412+
</FeishuGridColumn>
413+
414+
<FeishuGridColumn width="0.323273">
415+
416+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/9dba658b4a1a8a0231240df1.png" caption="强化学习" width="1072" height="830" />
417+
418+
</FeishuGridColumn>
295419

296-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/367f82d7ef890a6ee8fef1bc.png)
420+
<FeishuGridColumn width="0.323323">
297421

298-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/23995a477b75c0dcb78c8c44.png)
422+
<FeishuImage src="/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/54403bf4a6d1041fa706732f.png" width="1036" height="802" />
299423

300-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/9dba658b4a1a8a0231240df1.png)
424+
</FeishuGridColumn>
301425

302-
![](/feishu/wiki/F9oKw4GUgi30lQkgWScckzjfnfd/54403bf4a6d1041fa706732f.png)
426+
</FeishuGrid>
303427

304428
好了,去研究有趣的 AI Infra 吧!

0 commit comments

Comments
 (0)