@@ -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
105133function Dep(a, b)
106134c := a * b
@@ -110,6 +138,10 @@ end function
110138```
111139
112140
141+ </FeishuGridColumn >
142+
143+ <FeishuGridColumn width =" 0.5 " >
144+
113145``` Plain Text
114146function NoDep(a, b)
115147c := 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
161221Transformer 中,我们将输入的数据切分后输入不同的 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
211275c[0]=a[0]+b[0]
212276c[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
219287load a
220288load 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