File size: 39,133 Bytes
17c6d62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
<!--Copyright 2022 The HuggingFace Team. All rights reserved.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the

โš ๏ธ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
rendered properly in your Markdown viewer.

-->

# ๋‹ค์ค‘ GPU์—์„œ ํšจ์œจ์ ์ธ ํ›ˆ๋ จ [[efficient-training-on-multiple-gpus]]

๋‹จ์ผ GPU์—์„œ์˜ ํ›ˆ๋ จ์ด ๋„ˆ๋ฌด ๋А๋ฆฌ๊ฑฐ๋‚˜ ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๊ฐ€ ๋‹จ์ผ GPU์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๋‹ค์ค‘-GPU ์„ค์ •์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ GPU์—์„œ ๋‹ค์ค‘ GPU๋กœ ์ „ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž‘์—…์„ ๋ถ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ, ํ…์„œ ๋˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ฐ™์€ ๋ณ‘๋ ฌํ™” ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์„ค์ •์„ ๋ชจ๋‘์—๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์™„๋ฒฝํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์—†์œผ๋ฉฐ, ์–ด๋–ค ์„ค์ •์ด ๊ฐ€์žฅ ์ ํ•ฉํ•œ์ง€๋Š” ์‚ฌ์šฉํ•˜๋Š” ํ•˜๋“œ์›จ์–ด์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ์ฃผ๋กœ PyTorch ๊ธฐ๋ฐ˜์˜ ๊ตฌํ˜„์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๋ช…ํ•˜๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋…์€ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์—๋„ ์ ์šฉ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

<Tip>

 ์ฐธ๊ณ : [๋‹จ์ผ GPU ์„น์…˜](perf_train_gpu_one)์—์„œ ์†Œ๊ฐœ๋œ ์ „๋žต(ํ˜ผํ•ฉ ์ •๋ฐ€๋„ ํ›ˆ๋ จ ๋˜๋Š” ๊ทธ๋ž˜๋””์–ธํŠธ ๋ˆ„์  ๋“ฑ)์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋ธ ํ›ˆ๋ จ์— ์ ์šฉ๋˜๋ฉฐ, ๋‹ค์ค‘-GPU ๋˜๋Š” CPU ํ›ˆ๋ จ๊ณผ ๊ฐ™์€ ๋‹ค์Œ ์„น์…˜์œผ๋กœ ์ง„์ž…ํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ์„น์…˜์„ ์ฐธ๊ณ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

</Tip>

๋จผ์ € 1D ๋ณ‘๋ ฌํ™” ๊ธฐ์ˆ ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ๋…ผ์˜ํ•œ ํ›„, ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์„ ๊ฒฐํ•ฉํ•˜์—ฌ 2D ๋ฐ 3D ๋ณ‘๋ ฌํ™”๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋” ๋น ๋ฅธ ํ›ˆ๋ จ๊ณผ ๋” ํฐ ๋ชจ๋ธ์„ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค๋ฅธ ํšจ๊ณผ์ ์ธ ๋Œ€์•ˆ ๋ฐฉ์‹๋„ ์†Œ๊ฐœ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

## ๊ฐœ๋… [[concepts]]

๋‹ค์Œ์€ ์ด ๋ฌธ์„œ์—์„œ ์ž์„ธํžˆ ์„ค๋ช…๋  ์ฃผ์š” ๊ฐœ๋…์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.

1. **DataParallel (DP)** - ๋™์ผํ•œ ์„ค์ •์ด ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณต์ œ๋˜๊ณ , ๊ฐ ์„ค์ •์— ๋ฐ์ดํ„ฐ ์ผ๋ถ€๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌ๋Š” ๋ณ‘๋ ฌ๋กœ ์ˆ˜ํ–‰๋˜๋ฉฐ ๋ชจ๋“  ์„ค์ •์€ ๊ฐ ํ›ˆ๋ จ ๋‹จ๊ณ„์˜ ๋๋‚  ๋•Œ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
2. **TensorParallel (TP)** - ๊ฐ ํ…์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌถ์Œ์œผ๋กœ ๋ถ„ํ• ๋˜๊ธฐ์—, ์ „์ฒด ํ…์„œ๊ฐ€ ๋‹จ์ผ GPU์— ์ƒ์ฃผํ•˜๋Š” ๋Œ€์‹  ํ…์„œ์˜ ๊ฐ ์ƒค๋“œ๊ฐ€ ์ง€์ •๋œ GPU์— ์ƒ์ฃผํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ๊ฐ ์ƒค๋“œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ GPU์—์„œ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋˜๋ฉฐ ๊ฒฐ๊ณผ๋Š” ๋‹จ๊ณ„๊ฐ€ ๋๋‚  ๋•Œ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ๋ถ„ํ• ์ด ์ˆ˜ํ‰ ์ˆ˜์ค€์—์„œ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ˆ˜ํ‰ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
3. **PipelineParallel (PP)** - ๋ชจ๋ธ์ด ์ˆ˜์ง์œผ๋กœ (๋ ˆ์ด์–ด ์ˆ˜์ค€) ์—ฌ๋Ÿฌ GPU์— ๋ถ„ํ• ๋˜์–ด ๋ชจ๋ธ์˜ ๋‹จ์ผ GPU์—๋Š” ํ•˜๋‚˜ ๋˜๋Š” ์—ฌ๋Ÿฌ ๋ ˆ์ด์–ด๊ฐ€ ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. ๊ฐ GPU๋Š” ํŒŒ์ดํ”„๋ผ์ธ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋‹จ๊ณ„๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์ž‘์€ ๋ฐฐ์น˜ ๋ฌถ์Œ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
4. **Zero Redundancy Optimizer (ZeRO)** - TP์™€ ์œ ์‚ฌํ•˜๊ฒŒ ํ…์„œ๋ฅผ ์ƒค๋”ฉํ•˜์ง€๋งŒ, ์ „์ฒด ํ…์„œ๋Š” ์ˆœ๋ฐฉํ–ฅ ๋˜๋Š” ์—ญ๋ฐฉํ–ฅ ๊ณ„์‚ฐ์„ ์œ„ํ•ด ์žฌ๊ตฌ์„ฑ๋˜๋ฏ€๋กœ ๋ชจ๋ธ์„ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ œํ•œ๋œ GPU ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์˜คํ”„๋กœ๋“œ ๊ธฐ์ˆ ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
5. **Sharded DDP** - ZeRO์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์œผ๋กœ ๋‹ค๋ฅธ ZeRO ๊ตฌํ˜„์—์„œ๋„ ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด์ž…๋‹ˆ๋‹ค.

๊ฐ ๊ฐœ๋…์˜ ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ๋Œ€๊ทœ๋ชจ ์ธํ”„๋ผ์—์„œ ๋Œ€๊ทœ๋ชจ ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•˜๋Š” ๊ฒฝ์šฐ์˜ ๋Œ€๋žต์ ์ธ ๊ฒฐ์ • ๊ณผ์ •์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

## ํ™•์žฅ์„ฑ ์ „๋žต [[scalability-strategy]]

**โ‡จ ๋‹จ์ผ ๋…ธ๋“œ / ๋‹ค์ค‘-GPU**
* ๋ชจ๋ธ์ด ๋‹จ์ผ GPU์— ๋งž๋Š” ๊ฒฝ์šฐ:

    1. DDP - ๋ถ„์‚ฐ DP
    2. ZeRO - ์ƒํ™ฉ๊ณผ ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ๋” ๋น ๋ฅผ ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Œ

* ๋ชจ๋ธ์ด ๋‹จ์ผ GPU์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ:

    1. PP
    2. ZeRO
    3. TP

    ๋…ธ๋“œ ๋‚ด ์—ฐ๊ฒฐ ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅธ NVLINK ๋˜๋Š” NVSwitch์˜ ๊ฒฝ์šฐ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋Œ€๋ถ€๋ถ„ ๋น„์Šทํ•œ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์•ผ ํ•˜๋ฉฐ, PP๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ TP ๋˜๋Š” ZeRO๋ณด๋‹ค ๋น ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. TP์˜ ์ •๋„๋„ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ์„ค์ •์—์„œ ์Šน์ž๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์‹คํ—˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

    TP๋Š” ๊ฑฐ์˜ ํ•ญ์ƒ ๋‹จ์ผ ๋…ธ๋“œ ๋‚ด์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, TP ํฌ๊ธฐ <= ๋…ธ๋“œ๋‹น GPU ์ˆ˜์ž…๋‹ˆ๋‹ค.

* ๊ฐ€์žฅ ํฐ ๋ ˆ์ด์–ด๊ฐ€ ๋‹จ์ผ GPU์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ:

    1. ZeRO๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ - PP๋งŒ์œผ๋กœ๋Š” ๋งž์ง€ ์•Š์œผ๋ฏ€๋กœ TP๋ฅผ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
    2. ZeRO๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์œ„์˜ "๋‹จ์ผ GPU" ํ•ญ๋ชฉ๊ณผ ๋™์ผ


**โ‡จ ๋‹ค์ค‘ ๋…ธ๋“œ /  ๋‹ค์ค‘ GPU**

* ๋…ธ๋“œ ๊ฐ„ ์—ฐ๊ฒฐ ์†๋„๊ฐ€ ๋น ๋ฅธ ๊ฒฝ์šฐ:

    1. ZeRO - ๋ชจ๋ธ์— ๋Œ€๋ถ€๋ถ„์˜ ์ˆ˜์ •์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์Œ
    2. PP+TP+DP - ํ†ต์‹ ์ด ์ ์ง€๋งŒ ๋ชจ๋ธ์— ๋Œ€๋Œ€์ ์ธ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•จ

* ๋…ธ๋“œ ๊ฐ„ ์—ฐ๊ฒฐ ์†๋„๊ฐ€ ๋А๋ฆฌ๋ฉฐ, GPU ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—ฌ์ „ํžˆ ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ:

    1. DP+PP+TP+ZeRO-1
	


## ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌํ™” [[data-parallelism]]

2๊ฐœ์˜ GPU๋งŒ์œผ๋กœ๋„ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๋“ค์€ `DataParallel` (DP)๊ณผ `DistributedDataParallel` (DDP)์„ ํ†ตํ•ด ํ–ฅ์ƒ๋œ ํ›ˆ๋ จ ์†๋„๋ฅผ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” PyTorch์˜ ๋‚ด์žฅ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ DDP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ, DP๋Š” ์ผ๋ถ€ ๋ชจ๋ธ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. [PyTorch ๋ฌธ์„œ](https://pytorch.org/docs/master/generated/torch.nn.DataParallel.html)์—์„œ๋„ DDP์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

### DP vs DDP [[dp-vs-ddp]]

`DistributedDataParallel` (DDP)์€ ์ผ๋ฐ˜์ ์œผ๋กœ `DataParallel` (DP)๋ณด๋‹ค ๋น ๋ฅด์ง€๋งŒ, ํ•ญ์ƒ ๊ทธ๋ ‡์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค:
* DP๋Š” ํŒŒ์ด์ฌ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์ธ ๋ฐ˜๋ฉด, DDP๋Š” ๋‹ค์ค‘ ํ”„๋กœ์„ธ์Šค ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์— GIL๊ณผ ๊ฐ™์€ ํŒŒ์ด์ฌ ์Šค๋ ˆ๋“œ ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.
* ๊ทธ๋Ÿฌ๋‚˜ GPU ์นด๋“œ ๊ฐ„์˜ ๋А๋ฆฐ ์ƒํ˜ธ ์—ฐ๊ฒฐ์„ฑ์€ DDP๋กœ ์ธํ•ด ์‹ค์ œ๋กœ ๋А๋ฆฐ ๊ฒฐ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋‘ ๋ชจ๋“œ ๊ฐ„์˜ GPU ๊ฐ„ ํ†ต์‹  ์˜ค๋ฒ„ํ—ค๋“œ์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

[DDP](https://pytorch.org/docs/master/notes/ddp.html):

- ์‹œ์ž‘ํ•  ๋•Œ, ์ฃผ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ชจ๋ธ์„ gpu 0์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  gpu๋กœ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค.
- ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ ๋ฐฐ์น˜์— ๋Œ€ํ•ด:
   1. ๊ฐ gpu๋Š” ์ž์ฒด ๋ฏธ๋‹ˆ ๋ฐฐ์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
   2. `backward` ๋™์•ˆ ๋กœ์ปฌ ๊ทธ๋ž˜๋””์–ธํŠธ๊ฐ€ ์ค€๋น„๋˜๋ฉด, ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์— ํ‰๊ท ํ™”๋ฉ๋‹ˆ๋‹ค.

[DP](https://pytorch.org/docs/master/generated/torch.nn.DataParallel.html):

๊ฐ ๋ฐฐ์น˜์— ๋Œ€ํ•ด:
   1. gpu 0์€ ๋ฐ์ดํ„ฐ ๋ฐฐ์น˜๋ฅผ ์ฝ๊ณ  ๊ฐ gpu์— ๋ฏธ๋‹ˆ ๋ฐฐ์น˜๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
   2. ์—…๋ฐ์ดํŠธ๋œ ๋ชจ๋ธ์„ gpu 0์—์„œ ๊ฐ gpu๋กœ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค.
   3. `forward`๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฐ gpu์˜ ์ถœ๋ ฅ์„ gpu 0์œผ๋กœ ๋ณด๋‚ด๊ณ  ์†์‹ค์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
   4. gpu 0์—์„œ ๋ชจ๋“  gpu๋กœ ์†์‹ค์„ ๋ถ„์‚ฐํ•˜๊ณ  `backward`๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
   5. ๊ฐ gpu์—์„œ ๊ทธ๋ž˜๋””์–ธํŠธ๋ฅผ gpu 0์œผ๋กœ ๋ณด๋‚ด๊ณ  ์ด๋ฅผ ํ‰๊ท ํ™”ํ•ฉ๋‹ˆ๋‹ค.

DDP๋Š” ๊ฐ ๋ฐฐ์น˜๋งˆ๋‹ค ๊ทธ๋ž˜๋””์–ธํŠธ๋ฅผ ๋ณด๋‚ด๋Š” ํ†ต์‹ ๋งŒ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, DP๋Š” ๋ฐฐ์น˜๋งˆ๋‹ค 5๊ฐœ์˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

DP๋Š” ํŒŒ์ด์ฌ ์Šค๋ ˆ๋“œ๋ฅผ ํ†ตํ•ด ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•˜๋ฉฐ, DDP๋Š” [torch.distributed](https://pytorch.org/docs/master/distributed.html)๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค.

DP์—์„œ๋Š” gpu 0์ด ๋‹ค๋ฅธ gpu๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ, gpu์˜ ํ™œ์šฉ๋„๊ฐ€ ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค.

DDP๋Š” ์—ฌ๋Ÿฌ ๋Œ€์˜ ์ปดํ“จํ„ฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, DP์˜ ๊ฒฝ์šฐ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

DP์™€ DDP ์‚ฌ์ด์—๋Š” ๋‹ค๋ฅธ ์ฐจ์ด์ ์ด ์žˆ์ง€๋งŒ, ์ด ํ† ๋ก ๊ณผ๋Š” ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด 2๊ฐ€์ง€ ๋ชจ๋“œ๋ฅผ ๊นŠ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, [์ด ๋ฌธ์„œ](https://www.telesens.co/2019/04/04/distributed-data-parallel-training-using-pytorch-on-aws/)๋ฅผ ๊ฐ•๋ ฅํžˆ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ๋ฉ‹์ง„ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋‹ค์–‘ํ•œ ํ•˜๋“œ์›จ์–ด์—์„œ ์—ฌ๋Ÿฌ ๋ฒค์น˜๋งˆํฌ์™€ ํ”„๋กœํŒŒ์ผ๋Ÿฌ ์ถœ๋ ฅ์„ ์„ค๋ช…ํ•˜์—ฌ ํ•„์š”ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋ชจ๋‘ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ๋ฒค์น˜๋งˆํฌ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

| Type   | NVlink | Time |
| :----- | -----  | ---: |
| 2:DP   | Y      | 110s |
| 2:DDP  | Y      | 101s |
| 2:DDP  | N      | 131s |


๋ถ„์„:

์—ฌ๊ธฐ์„œ DP๋Š” NVlink๊ฐ€ ์žˆ๋Š” DDP๋ณด๋‹ค ์•ฝ 10% ๋А๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ NVlink๊ฐ€ ์—†๋Š” DDP๋ณด๋‹ค ์•ฝ 15% ๋น ๋ฆ…๋‹ˆ๋‹ค.

์‹ค์ œ ์ฐจ์ด๋Š” ๊ฐ GPU๊ฐ€ ๋‹ค๋ฅธ GPU์™€ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์–‘์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋™๊ธฐํ™”ํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๋А๋ฆฐ ๋งํฌ๊ฐ€ ์ด ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ „์ฒด ๋ฒค์น˜๋งˆํฌ ์ฝ”๋“œ์™€ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค:

ํ•ด๋‹น ๋ฒค์น˜๋งˆํฌ์—์„œ `NCCL_P2P_DISABLE=1`์„ ์‚ฌ์šฉํ•˜์—ฌ NVLink ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

```bash

# DP
rm -r /tmp/test-clm; CUDA_VISIBLE_DEVICES=0,1 \
python examples/pytorch/language-modeling/run_clm.py \
--model_name_or_path openai-community/gpt2 --dataset_name wikitext --dataset_config_name wikitext-2-raw-v1 \
--do_train --output_dir /tmp/test-clm --per_device_train_batch_size 4 --max_steps 200

{'train_runtime': 110.5948, 'train_samples_per_second': 1.808, 'epoch': 0.69}

# DDP w/ NVlink
rm -r /tmp/test-clm; CUDA_VISIBLE_DEVICES=0,1 \
torchrun --nproc_per_node 2 examples/pytorch/language-modeling/run_clm.py \
--model_name_or_path openai-community/gpt2 --dataset_name wikitext --dataset_config_name wikitext-2-raw-v1 \
--do_train --output_dir /tmp/test-clm --per_device_train_batch_size 4 --max_steps 200

{'train_runtime': 101.9003, 'train_samples_per_second': 1.963, 'epoch': 0.69}

# DDP w/o NVlink
rm -r /tmp/test-clm; NCCL_P2P_DISABLE=1 CUDA_VISIBLE_DEVICES=0,1 \
torchrun --nproc_per_node 2 examples/pytorch/language-modeling/run_clm.py \
--model_name_or_path openai-community/gpt2 --dataset_name wikitext --dataset_config_name wikitext-2-raw-v1 \
--do_train --output_dir /tmp/test-clm --per_device_train_batch_size 4 --max_steps 200

{'train_runtime': 131.4367, 'train_samples_per_second': 1.522, 'epoch': 0.69}
```

ํ•˜๋“œ์›จ์–ด: ๊ฐ๊ฐ 24GB์˜ TITAN RTX 2๊ฐœ + NVlink๊ณผ 2๊ฐœ์˜ NVLink (`nvidia-smi topo -m`์—์„œ `NV2`์ž…๋‹ˆ๋‹ค.)
์†Œํ”„ํŠธ์›จ์–ด: `pytorch-1.8-to-be` + `cuda-11.0` / `transformers==4.3.0.dev0`

## ZeRO ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌํ™” [[zero-data-parallelism]]

ZeRO๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌํ™” (ZeRO-DP)๋Š” ๋‹ค์Œ [๋ธ”๋กœ๊ทธ ๊ธ€](https://www.microsoft.com/en-us/research/blog/zero-deepspeed-new-system-optimizations-enable-training-models-with-over-100-billion-parameters/)์˜ ๋‹ค์Œ ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ์„ค๋ช…๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
![DeepSpeed-Image-1](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/parallelism-zero.png)

์ด ๊ฐœ๋…์€ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜์ ์ธ `DataParallel` (DP)๊ณผ ๋™์ผํ•˜์ง€๋งŒ, ์ „์ฒด ๋ชจ๋ธ ๋งค๊ฐœ๋ณ€์ˆ˜, ๊ทธ๋ž˜๋””์–ธํŠธ ๋ฐ ์˜ตํ‹ฐ๋งˆ์ด์ € ์ƒํƒœ๋ฅผ ๋ณต์ œํ•˜๋Š” ๋Œ€์‹  ๊ฐ GPU๋Š” ๊ทธ ์ค‘ ์ผ๋ถ€๋งŒ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰ ์‹œ๊ฐ„์—๋Š” ์ฃผ์–ด์ง„ ๋ ˆ์ด์–ด์— ๋Œ€ํ•ด ์ „์ฒด ๋ ˆ์ด์–ด ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๊ฐ GPU๊ฐ€ ์„œ๋กœ์—๊ฒŒ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค - ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค.

๊ฐ๊ฐ 3๊ฐœ์˜ ๋ ˆ์ด์–ด์™€ 3๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ๋ชจ๋ธ์„ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
```
La | Lb | Lc
---|----|---
a0 | b0 | c0
a1 | b1 | c1
a2 | b2 | c2
```
๋ ˆ์ด์–ด La์—๋Š” ๊ฐ€์ค‘์น˜ a0, a1 ๋ฐ a2๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

3๊ฐœ์˜ GPU๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, Sharded DDP (= Zero-DP)๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ชจ๋ธ์„ 3๊ฐœ์˜ GPU์— ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค:

```
GPU0:
La | Lb | Lc
---|----|---
a0 | b0 | c0

GPU1:
La | Lb | Lc
---|----|---
a1 | b1 | c1

GPU2:
La | Lb | Lc
---|----|---
a2 | b2 | c2
```

์ผ๋ฐ˜์ ์ธ DNN ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์ƒ์ƒํ•ด๋ณด๋ฉด ์ด๋Š” ํ…์„œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ์ˆ˜ํ‰ ์Šฌ๋ผ์ด์‹ฑ์ž…๋‹ˆ๋‹ค. ์ˆ˜์ง ์Šฌ๋ผ์ด์‹ฑ์€ ์ „์ฒด ๋ ˆ์ด์–ด ๊ทธ๋ฃน์„ ๋‹ค๋ฅธ GPU์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์‹œ์ž‘์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ด๋Ÿฌํ•œ ๊ฐ๊ฐ์˜ GPU๋Š” DP์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ผ๋ฐ˜์ ์ธ ๋ฏธ๋‹ˆ ๋ฐฐ์น˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค:
```
x0 => GPU0
x1 => GPU1
x2 => GPU2
```

์ž…๋ ฅ์€ ์ˆ˜์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ผ๋ฐ˜ ๋ชจ๋ธ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋  ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ €, ์ž…๋ ฅ์€ ๋ ˆ์ด์–ด La์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

GPU0์—๋งŒ ์ง‘์ค‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. x0์€ ์ˆœ๋ฐฉํ–ฅ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด a0, a1, a2 ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ GPU0์—๋Š” a0๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. GPU1์—์„œ a1์„, GPU2์—์„œ a2๋ฅผ ์ „์†ก๋ฐ›์•„ ๋ชจ๋ธ์˜ ๋ชจ๋“  ์กฐ๊ฐ์„ ํ•˜๋‚˜๋กœ ๋ชจ์๋‹ˆ๋‹ค.

๋ณ‘๋ ฌ์ ์œผ๋กœ, GPU1์€ ๋ฏธ๋‹ˆ ๋ฐฐ์น˜ x1์„ ๋ฐ›๊ณ  a1๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, a0 ๋ฐ a2 ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ GPU0 ๋ฐ GPU2์—์„œ ์ด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

GPU2๋„ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ x2๋ฅผ ๋ฐ›๊ณ  GPU0 ๋ฐ GPU1์—์„œ ๊ฐ๊ฐ a0๊ณผ a1์„, ๊ทธ๋ฆฌ๊ณ  ์ž์‹ ์˜ a2์™€ ํ•จ๊ป˜ ์ „์ฒด ํ…์„œ๋ฅผ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.

3๊ฐœ์˜ GPU๋Š” ๋ณต์›๋œ ์ „์ฒด ํ…์„œ๋ฅผ ๋ฐ›๊ณ  forward๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๊ณ„์‚ฐ์ด ์™„๋ฃŒ๋˜๋ฉด ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋Š” ์‚ญ์ œ๋˜๊ณ , ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ๊ณ„์‚ฐ ์ค‘์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ณต์›์€ ์‚ฌ์ „ ํŒจ์น˜๋ฅผ ํ†ตํ•ด ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋Š” ๋ ˆ์ด์–ด Lb์— ๋Œ€ํ•ด ๋ฐ˜๋ณต๋˜๊ณ , ๊ทธ ๋‹ค์Œ Lc๋กœ ์ˆœ๋ฐฉํ–ฅ์œผ๋กœ, ๊ทธ๋‹ค์Œ์€ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ Lc -> Lb -> La๋กœ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์ด๊ฒƒ์€ ํšจ์œจ์ ์ธ ๊ทธ๋ฃน ๋ฐฐ๋‚ญ ์—ฌํ–‰์ž์˜ ์ค‘๋Ÿ‰ ๋ถ„๋ฐฐ ์ „๋žต์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค:

1. ์‚ฌ๋žŒ A๊ฐ€ ํ…ํŠธ๋ฅผ ์šด๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค.
2. ์‚ฌ๋žŒ B๊ฐ€ ๋‚œ๋กœ๋ฅผ ์šด๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค.
3. ์‚ฌ๋žŒ C๊ฐ€ ๋„๋ผ๋ฅผ ์šด๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋งค์ผ ๋ฐค ๊ฐ์ž ๊ฐ€์ง„ ๊ฒƒ์„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๊ณต์œ ํ•˜๊ณ , ๊ฐ€์ง€์ง€ ์•Š์€ ๊ฒƒ์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋กœ๋ถ€ํ„ฐ ๋ฐ›๊ณ , ์•„์นจ์—๋Š” ํ• ๋‹น๋œ ์œ ํ˜•์˜ ์žฅ๋น„๋ฅผ ์‹ธ๊ณ  ๊ณ„์†ํ•ด์„œ ์—ฌํ–‰์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Sharded DDP / Zero DP์ž…๋‹ˆ๋‹ค.

์ด ์ „๋žต์„ ๊ฐ๊ฐ ์ž์‹ ์˜ ํ…ํŠธ, ๋‚œ๋กœ ๋ฐ ๋„๋ผ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์šด๋ฐ˜ํ•ด์•ผ ํ•˜๋Š” ๋‹จ์ˆœํ•œ ์ „๋žต๊ณผ ๋น„๊ตํ•ด๋ณด๋ฉด ํ›จ์”ฌ ๋น„ํšจ์œจ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Pytorch์˜ DataParallel (DP ๋ฐ DDP)์ž…๋‹ˆ๋‹ค.

์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ๋…ผ๋ฌธ์„ ์ฝ์„ ๋•Œ ๋‹ค์Œ ๋™์˜์–ด๋ฅผ ๋งŒ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: Sharded, Partitioned.

ZeRO๊ฐ€ ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๋ฐฉ์‹์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด, ํ…์„œ ๋ณ‘๋ ฌํ™”์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ดํ›„์— ์„ค๋ช…๋  ์ˆ˜์ง ๋ชจ๋ธ ๋ณ‘๋ ฌํ™”์™€๋Š” ๋‹ฌ๋ฆฌ ๊ฐ ๋ ˆ์ด์–ด์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ„ํ• /๋ถ„ํ• ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ตฌํ˜„:

- [DeepSpeed](https://www.deepspeed.ai/tutorials/zero/)๋Š” 1๋‹จ๊ณ„ + 2๋‹จ๊ณ„ + 3๋‹จ๊ณ„์˜ ZeRO-DP๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
- [Fairscale](https://github.com/facebookresearch/fairscale/#optimizer-state-sharding-zero)์€ 1๋‹จ๊ณ„ + 2๋‹จ๊ณ„ + 3๋‹จ๊ณ„์˜ ZeRO-DP๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
- [`transformers` ํ†ตํ•ฉ](main_classes/trainer#trainer-integrations)

## ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋ธ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ(์ˆ˜์ง์ ) ๋ฐ ํŒŒ์ดํ”„๋ผ์ธ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ[[naive-model-parallelism-vertical-and-pipeline-parallelism]]

Naive Model Parallelism (MP)์€ ๋ชจ๋ธ ๋ ˆ์ด์–ด ๊ทธ๋ฃน์„ ๋‹ค์ค‘ GPU์— ๋ถ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๋ ˆ์ด์–ด๋ฅผ `.to()`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ์žฅ์น˜๋กœ ์ „ํ™˜ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ํ•ด๋‹น ๋ ˆ์ด์–ด๋กœ ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐˆ ๋•Œ ๋ฐ์ดํ„ฐ๋„ ๋ ˆ์ด์–ด์™€ ๋™์ผํ•œ ์žฅ์น˜๋กœ ์ „ํ™˜๋˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ˆ˜์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋ธ์ด ๊ทธ๋ ค์ง€๋Š” ๋ฐฉ์‹์ด ๋ ˆ์ด์–ด๋ฅผ ์„ธ๋กœ๋กœ ์Šฌ๋ผ์ด์Šคํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ˆ˜์ง ๋ชจ๋ธ ๋ณ‘๋ ฌํ™”๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋‹ค์ด์–ด๊ทธ๋žจ์€ 8๋ ˆ์ด์–ด ๋ชจ๋ธ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

```
===================  ===================
|  0 | 1 | 2 | 3  |  |  4 | 5 | 6 | 7  |
===================  ===================
        gpu0                 gpu1
```
์šฐ๋ฆฌ๋Š” ๋ชจ๋ธ์„ ์ˆ˜์ง์œผ๋กœ 2๊ฐœ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๋ ˆ์ด์–ด 0-3์„ GPU0์— ๋ฐฐ์น˜ํ•˜๊ณ  ๋ ˆ์ด์–ด 4-7์„ GPU1์— ๋ฐฐ์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ ˆ์ด์–ด 0์—์„œ 1๋กœ, 1์—์„œ 2๋กœ, 2์—์„œ 3์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋™์•ˆ์—๋Š” ์ผ๋ฐ˜์ ์ธ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ ˆ์ด์–ด 3์—์„œ ๋ ˆ์ด์–ด 4๋กœ ์ „๋‹ฌ๋˜์–ด์•ผ ํ•  ๋•Œ๋Š” GPU0์—์„œ GPU1๋กœ ์ด๋™ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํ†ต์‹  ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฐธ์—ฌํ•˜๋Š” GPU๊ฐ€ ๋™์ผํ•œ ์ปดํ“จํŒ… ๋…ธ๋“œ(์˜ˆ: ๋™์ผํ•œ ๋ฌผ๋ฆฌ์ ์ธ ๊ธฐ๊ณ„)์— ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ๋ณต์‚ฌ๋Š” ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ GPU๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ปดํ“จํŒ… ๋…ธ๋“œ(์˜ˆ: ์—ฌ๋Ÿฌ ๊ธฐ๊ณ„)์— ์œ„์น˜ํ•œ ๊ฒฝ์šฐ ํ†ต์‹  ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ์ƒ๋‹นํžˆ ํฌ๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ ˆ์ด์–ด 4๋ถ€ํ„ฐ 5๋กœ, 6์œผ๋กœ, 7๋กœ ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ๋ชจ๋ธ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ง„ํ–‰๋˜๊ณ , 7๋ฒˆ์งธ ๋ ˆ์ด์–ด๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๋ ˆ์ด์–ด 0์œผ๋กœ ๋ณด๋‚ด๊ฑฐ๋‚˜ ๋˜๋Š” ๋ ˆ์ด๋ธ”์„ ๋งˆ์ง€๋ง‰ ๋ ˆ์ด์–ด๋กœ ๋ณด๋‚ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์†์‹ค์„ ๊ณ„์‚ฐํ•˜๊ณ  ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ์ :
- ์ด ๋ฐฉ์‹์„ "naive" MP๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ด์œ ๋Š” ์ฃผ์–ด์ง„ ์ƒํ™ฉ์— ํ•˜๋‚˜์˜ GPU๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  GPU๊ฐ€ ์œ ํœด ์ƒํƒœ๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 4๊ฐœ์˜ GPU๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹จ์ผ GPU์˜ ๋ฉ”๋ชจ๋ฆฌ ์–‘์„ 4๋ฐฐ๋กœ ๋Š˜๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€ ํ•˜๋“œ์›จ์–ด๋Š” ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์žฅ์น˜ ๊ฐ„ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 4๊ฐœ์˜ 6GB ์นด๋“œ๋Š” naive MP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 1๊ฐœ์˜ 24GB ์นด๋“œ์™€ ๋™์ผํ•œ ํฌ๊ธฐ๋ฅผ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ›„์ž๋Š” ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํ›ˆ๋ จ์„ ๋” ๋นจ๋ฆฌ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ๋ฅผ ๋“ค์–ด 40GB ์นด๋“œ๊ฐ€ ์žˆ๊ณ  45GB ๋ชจ๋ธ์„ ๋งž์ถ”์–ด์•ผ ํ•  ๊ฒฝ์šฐ 4๊ฐœ์˜ 40GB ์นด๋“œ๋กœ ๋งž์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋””์–ธํŠธ์™€ ์˜ตํ‹ฐ๋งˆ์ด์ € ์ƒํƒœ ๋•Œ๋ฌธ์— ๊ฐ€๊นŒ์Šค๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค).
- ๊ณต์œ  ์ž„๋ฒ ๋”ฉ์€ GPU ๊ฐ„์— ๋ณต์‚ฌํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ ๋ณ‘๋ ฌํ™” (PP)์€ ๊ฑฐ์˜ naive MP์™€ ๋™์ผํ•˜์ง€๋งŒ GPU ์œ ํœด ์ƒํƒœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ค์–ด์˜ค๋Š” ๋ฐฐ์น˜๋ฅผ ๋งˆ์ดํฌ๋กœ ๋ฐฐ์น˜๋กœ ๋‚˜๋ˆ„๊ณ  ์ธ๊ณต์ ์œผ๋กœ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ƒ์„ฑํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ GPU๊ฐ€ ๋™์‹œ์— ๊ณ„์‚ฐ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

[GPipe ๋…ผ๋ฌธ](https://ai.googleblog.com/2019/03/introducing-gpipe-open-source-library.html)์—์„œ ๊ฐ€์ ธ์˜จ ๊ทธ๋ฆผ์€ ์ƒ๋‹จ์— naive MP๋ฅผ, ํ•˜๋‹จ์—๋Š” PP๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

![mp-pp](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/parallelism-gpipe-bubble.png)

ํ•˜๋‹จ ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ PP๊ฐ€ ์œ ํœด ์˜์—ญ์ด ์ ์€ ๊ฒƒ์„ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํœด ๋ถ€๋ถ„์„ "bubble"์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์ด์–ด๊ทธ๋žจ์˜ ์–‘์ชฝ ๋ถ€๋ถ„์€ ์ฐธ์—ฌํ•˜๋Š” GPU๊ฐ€ 4๊ฐœ์ธ ๋ณ‘๋ ฌ์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ฆ‰, 4๊ฐœ์˜ GPU๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ์— ์ฐธ์—ฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 4๊ฐœ์˜ ํŒŒ์ดํ”„ ๋‹จ๊ณ„ F0, F1, F2 ๋ฐ F3์˜ ์ˆœ๋ฐฉํ–ฅ ๊ฒฝ๋กœ์™€ B3, B2, B1 ๋ฐ B0์˜ ์—ญ๋ฐฉํ–ฅ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

PP๋Š” ์กฐ์ •ํ•ด์•ผ ํ•  ์ƒˆ๋กœ์šด ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ์ธ `chunks`๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋™์ผํ•œ ํŒŒ์ดํ”„ ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ์ผ๋ จ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌถ์–ด์„œ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ `chunks=4`๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GPU0์€ 0, 1, 2 ๋ฐ 3 (F0,0, F0,1, F0,2, F0,3) ๋ฌถ์Œ์—์„œ ๋™์ผํ•œ ์ˆœ๋ฐฉํ–ฅ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋‹ค๋ฅธ GPU๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ์™„๋ฃŒ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ๋งŒ GPU0์ด ๋ฌถ์Œ์˜ ์—ญ์ˆœ์œผ๋กœ 3, 2, 1 ๋ฐ 0 (B0,3, B0,2, B0,1, B0,0) ๊ฒฝ๋กœ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋…์ ์œผ๋กœ ์ด๋Š” ๊ทธ๋ž˜๋””์–ธํŠธ ๋ˆ„์  ๋‹จ๊ณ„ (GAS)์™€ ๋™์ผํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ํŒŒ์ดํ† ์น˜์—์„œ๋Š” `chunks`๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  DeepSpeed์—์„œ๋Š” ๋™์ผํ•œ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ GAS๋กœ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

๋ฌถ์Œ์œผ๋กœ ์ธํ•ด PP๋Š” ๋งˆ์ดํฌ๋กœ ๋ฐฐ์น˜ (MBS)์˜ ๊ฐœ๋…์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. DP๋Š” ์ „์—ญ ๋ฐ์ดํ„ฐ ๋ฐฐ์น˜ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋‹ˆ ๋ฐฐ์น˜๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ DP ์ฐจ์ˆ˜๊ฐ€ 4์ด๊ณ  ์ „์—ญ ๋ฐฐ์น˜ ํฌ๊ธฐ๊ฐ€ 1024์ด๋ฉด 256์”ฉ 4๊ฐœ์˜ ๋ฏธ๋‹ˆ ๋ฐฐ์น˜๋กœ ๋ถ„ํ• ๋ฉ๋‹ˆ๋‹ค (1024/4). ๊ทธ๋ฆฌ๊ณ  `chunks` (๋˜๋Š” GAS)์˜ ์ˆ˜๊ฐ€ 32์ด๋ฉด ๋งˆ์ดํฌ๋กœ ๋ฐฐ์น˜ ํฌ๊ธฐ๋Š” 8์ด ๋ฉ๋‹ˆ๋‹ค (256/32). ๊ฐ ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋งˆ์ดํฌ๋กœ ๋ฐฐ์น˜์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

DP + PP ์„ค์ •์˜ ์ „์—ญ ๋ฐฐ์น˜ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•˜๋ ค๋ฉด `mbs*chunks*dp_degree` (`8*32*4=1024`)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

`chunks=1`๋กœ ์„ค์ •ํ•˜๋ฉด ๋งค์šฐ ๋น„ํšจ์œจ์ ์ธ naive MP๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ, ๋งค์šฐ ํฐ `chunks` ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์•„์ฃผ ์ž‘์€ ๋งˆ์ดํฌ๋กœ ๋ฐฐ์น˜ ํฌ๊ธฐ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ํšจ์œจ์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ GPU ํ™œ์šฉ์„ ์œ„ํ•ด ์–ด๋–ค ๊ฐ’์ด ๊ฐ€์žฅ ์ ์ ˆํ•œ์ง€ ์‹คํ—˜์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ "dead" ์‹œ๊ฐ„์˜ ๋ฒ„๋ธ”์ด ์กด์žฌํ•˜์—ฌ ๋งˆ์ง€๋ง‰ `forward` ๋‹จ๊ณ„๊ฐ€ `backward` ๋‹จ๊ณ„๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ์„ ์™„๋ฃŒํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ, `chunks`์˜ ๊ฐ€์žฅ ์ ์ ˆํ•œ ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์˜ ๋ชฉ์ ์€ ๋ชจ๋“  ์ฐธ์—ฌํ•˜๋Š” GPU์—์„œ ๋™์‹œ์— ๊ณ ๋„๋กœ ํ™œ์šฉ๋˜๋Š” GPU ํ™œ์šฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์—ฌ ๋ฒ„๋ธ”์˜ ํฌ๊ธฐ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์€ ์ „ํ†ต์ ์ธ ํŒŒ์ดํ”„๋ผ์ธ API์™€ ๋” ํ˜„๋Œ€์ ์ธ ์†”๋ฃจ์…˜์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ์ „ํ†ต์ ์ธ ํŒŒ์ดํ”„๋ผ์ธ API ์†”๋ฃจ์…˜๊ณผ ํ˜„๋Œ€์ ์ธ ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ „ํ†ต์ ์ธ ํŒŒ์ดํ”„๋ผ์ธ API ์†”๋ฃจ์…˜:
- ํŒŒ์ดํ† ์น˜
- FairScale
- DeepSpeed
- Megatron-LM

ํ˜„๋Œ€์ ์ธ ์†”๋ฃจ์…˜:
- Varuna
- Sagemaker

์ „ํ†ต์ ์ธ ํŒŒ์ดํ”„๋ผ์ธ API ์†”๋ฃจ์…˜์˜ ๋ฌธ์ œ์ :
- ๋ชจ๋ธ์„ ์ƒ๋‹นํžˆ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์€ ๋ชจ๋“ˆ์˜ ์ •์ƒ์ ์ธ ํ๋ฆ„์„ `nn.Sequential` ์‹œํ€€์Šค๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ชจ๋ธ์˜ ์„ค๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ํ˜„์žฌ ํŒŒ์ดํ”„๋ผ์ธ API๋Š” ๋งค์šฐ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋งค์šฐ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ ์ „๋‹ฌ๋˜๋Š” ๋งŽ์€ ํŒŒ์ด์ฌ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํŒŒ์ดํ”„๋ผ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ•˜๋‚˜์˜ ํ…์„œ ๋˜๋Š” ํ…์„œ์˜ ํŠœํ”Œ์„ ์œ ์ผํ•œ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ์œผ๋กœ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ…์„œ๋Š” ๋งˆ์ดํฌ๋กœ ๋ฐฐ์น˜๋กœ ๋ฏธ๋‹ˆ ๋ฐฐ์น˜๋กœ ๋ฌถ์„ ๊ฒƒ์ด๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ ์ฐจ์›์œผ๋กœ ๋ฐฐ์น˜ ํฌ๊ธฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์€ ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/pytorch/pytorch/pull/50693
- ํŒŒ์ดํ”„ ๋‹จ๊ณ„ ์ˆ˜์ค€์—์„œ ์กฐ๊ฑด๋ถ€ ์ œ์–ด ํ๋ฆ„์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, T5์™€ ๊ฐ™์€ ์ธ์ฝ”๋”-๋””์ฝ”๋” ๋ชจ๋ธ์€ ์กฐ๊ฑด๋ถ€ ์ธ์ฝ”๋” ๋‹จ๊ณ„๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
- ๊ฐ ๋ ˆ์ด์–ด๋ฅผ ์ •๋ ฌํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋ชจ๋ธ์˜ ์ถœ๋ ฅ์ด ๋‹ค๋ฅธ ๋ชจ๋ธ์˜ ์ž…๋ ฅ์ด ๋˜๋„๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์•„์ง Varuna์™€ SageMaker๋กœ ์‹คํ—˜ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ํ•ด๋‹น ๋…ผ๋ฌธ๋“ค์€ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๋“ค์˜ ๋ชฉ๋ก์„ ๊ทน๋ณตํ–ˆ๊ณ  ์‚ฌ์šฉ์ž์˜ ๋ชจ๋ธ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ›จ์”ฌ ์ ๊ฒŒ ํ•„์š”ํ•˜๋‹ค๊ณ  ๋ณด๊ณ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„:
- [ํŒŒ์ดํ† ์น˜](https://pytorch.org/docs/stable/pipeline.html) (ํŒŒ์ดํ† ์น˜-1.8์—์„œ ์ดˆ๊ธฐ ์ง€์›, 1.9์—์„œ ์ ์ง„์ ์œผ๋กœ ๊ฐœ์„ ๋˜๊ณ  1.10์—์„œ ๋” ๊ฐœ์„ ๋จ). [์˜ˆ์ œ](https://github.com/pytorch/pytorch/blob/master/benchmarks/distributed/pipeline/pipe.py)๋„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
- [FairScale](https://fairscale.readthedocs.io/en/latest/tutorials/pipe.html)
- [DeepSpeed](https://www.deepspeed.ai/tutorials/pipeline/)
- [Megatron-LM](https://github.com/NVIDIA/Megatron-LM)์€ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค - API ์—†์Œ.
- [Varuna](https://github.com/microsoft/varuna)
- [SageMaker](https://arxiv.org/abs/2111.05972) - ์ด๋Š” AWS์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์†Œ์œ  ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.
- [OSLO](https://github.com/tunib-ai/oslo) - ์ด๋Š” Hugging Face Transformers๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋œ ํŒŒ์ดํ”„๋ผ์ธ ๋ณ‘๋ ฌํ™”์ž…๋‹ˆ๋‹ค.

๐Ÿค— Transformers ์ƒํƒœ: ์ด ์ž‘์„ฑ ์‹œ์ ์—์„œ ๋ชจ๋ธ ์ค‘ ์–ด๋А ๊ฒƒ๋„ ์™„์ „ํ•œ PP๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. GPT2์™€ T5 ๋ชจ๋ธ์€ naive MP๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ์žฅ์• ๋ฌผ์€ ๋ชจ๋ธ์„ `nn.Sequential`๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ๋ชจ๋“  ์ž…๋ ฅ์„ ํ…์„œ๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ชจ๋ธ์—๋Š” ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜์„ ๋งค์šฐ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐํƒ€ ์ ‘๊ทผ ๋ฐฉ๋ฒ•:

DeepSpeed, Varuna ๋ฐ SageMaker๋Š” [๊ต์ฐจ ํŒŒ์ดํ”„๋ผ์ธ(Interleaved Pipeline)](https://docs.aws.amazon.com/sagemaker/latest/dg/model-parallel-core-features.html) ๊ฐœ๋…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
![interleaved-pipeline-execution](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/parallelism-sagemaker-interleaved-pipeline.png)

์—ฌ๊ธฐ์„œ๋Š” ๋ฒ„๋ธ”(์œ ํœด ์‹œ๊ฐ„)์„ ์—ญ๋ฐฉํ–ฅ ํŒจ์Šค์— ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

Varuna๋Š” ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ์Šค์ผ€์ค„๋ง์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค์ผ€์ค„์„ ๊ฐœ์„ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

OSLO๋Š” `nn.Sequential`๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š๊ณ  Transformers๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํŒŒ์ดํ”„๋ผ์ธ ๋ณ‘๋ ฌํ™”๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

## ํ…์„œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ [[tensor-parallelism]]

ํ…์„œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์—์„œ๋Š” ๊ฐ GPU๊ฐ€ ํ…์„œ์˜ ์ผ๋ถ€๋ถ„๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ „์ฒด ํ…์„œ๊ฐ€ ํ•„์š”ํ•œ ์—ฐ์‚ฐ์— ๋Œ€ํ•ด์„œ๋งŒ ์ „์ฒด ํ…์„œ๋ฅผ ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค.

์ด ์„น์…˜์—์„œ๋Š” [Megatron-LM](https://github.com/NVIDIA/Megatron-LM) ๋…ผ๋ฌธ์ธ [Efficient Large-Scale Language Model Training on GPU Clusters](https://arxiv.org/abs/2104.04473)์—์„œ์˜ ๊ฐœ๋…๊ณผ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Transformer์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋Š” fully connected `nn.Linear`์™€ ๋น„์„ ํ˜• ํ™œ์„ฑํ™” ํ•จ์ˆ˜์ธ `GeLU`์ž…๋‹ˆ๋‹ค.

Megatron ๋…ผ๋ฌธ์˜ ํ‘œ๊ธฐ๋ฒ•์„ ๋”ฐ๋ผ ํ–‰๋ ฌ์˜ ์ ๊ณฑ ๋ถ€๋ถ„์„ `Y = GeLU(XA)`๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ `X`์™€ `Y`๋Š” ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ๋ฒกํ„ฐ์ด๊ณ  `A`๋Š” ๊ฐ€์ค‘์น˜ ํ–‰๋ ฌ์ž…๋‹ˆ๋‹ค.

ํ–‰๋ ฌ ํ˜•ํƒœ๋กœ ๊ณ„์‚ฐ์„ ์‚ดํŽด๋ณด๋ฉด, ํ–‰๋ ฌ ๊ณฑ์…ˆ์„ ๋‹ค์ค‘ GPU๋กœ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
![Parallel GEMM](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/parallelism-tp-parallel_gemm.png)

๊ฐ€์ค‘์น˜ ํ–‰๋ ฌ `A`๋ฅผ `N`๊ฐœ์˜ GPU์— ๋Œ€ํ•ด ์—ด๋ณ„๋กœ ๋ถ„ํ• ํ•˜๊ณ  ๋ณ‘๋ ฌ๋กœ ํ–‰๋ ฌ ๊ณฑ์…ˆ `XA_1`์—์„œ `XA_n`๊นŒ์ง€ ์ˆ˜ํ–‰ํ•˜๋ฉด `N`๊ฐœ์˜ ์ถœ๋ ฅ ๋ฒกํ„ฐ `Y_1, Y_2, ..., Y_n`๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ ๋…๋ฆฝ์ ์œผ๋กœ `GeLU`์— ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
![independent GeLU](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/parallelism-tp-independent-gelu.png)

์ด ์›๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ GPU ๊ฐ„์˜ ์ž„์˜ ๊นŠ์ด์˜ MLP๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฒฐ๊ณผ ๋ฒกํ„ฐ๋ฅผ ์ƒค๋“œ๋กœ๋ถ€ํ„ฐ ์žฌ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๊นŒ์ง€๋Š” GPU ๊ฐ„์˜ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Megatron-LM ๋…ผ๋ฌธ์˜ ์ €์ž๋“ค์€ ์ด์— ๋Œ€ํ•œ ์œ ์šฉํ•œ ๊ทธ๋ฆผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:
![parallel shard processing](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/parallelism-tp-parallel_shard_processing.png)

๋‹ค์ค‘ ํ—ค๋“œ ์–ดํ…์…˜ ๋ ˆ์ด์–ด์˜ ๋ณ‘๋ ฌํ™”๋Š” ๋”์šฑ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๋…๋ฆฝ์ ์ธ ๋‹ค์ค‘ ํ—ค๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ๋ณ‘๋ ฌํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค!
![parallel self-attention](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/parallelism-tp-parallel_self_attention.png)

ํŠน๋ณ„ ๊ณ ๋ ค์‚ฌํ•ญ: TP๋Š” ๋งค์šฐ ๋น ๋ฅธ ๋„คํŠธ์›Œํฌ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ํ•œ ๊ฐœ ์ด์ƒ์˜ ๋…ธ๋“œ์—์„œ TP๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋…ธ๋“œ์— 4๊ฐœ์˜ GPU๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ TP์˜ ์ตœ๋Œ€ ์ฐจ์ˆ˜๋Š” 4์ž…๋‹ˆ๋‹ค. TP ์ฐจ์ˆ˜๊ฐ€ 8์ธ ๊ฒฝ์šฐ ์ตœ์†Œํ•œ 8๊ฐœ์˜ GPU๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์„น์…˜์€ ์›๋ž˜์˜ [๋” ์ž์„ธํ•œ TP ๊ฐœ์š”](https://github.com/huggingface/transformers/issues/10321#issuecomment-783543530)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. 
์ž‘์„ฑ์ž๋Š” [@anton-l](https://github.com/anton-l)์ž…๋‹ˆ๋‹ค.

SageMaker๋Š” ๋” ํšจ์œจ์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด TP์™€ DP๋ฅผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์ฒด ์ด๋ฆ„:
- DeepSpeed๋Š” ์ด๋ฅผ [ํ…์„œ ์Šฌ๋ผ์ด์‹ฑ](https://www.deepspeed.ai/training/#model-parallelism)์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๊ตฌํ˜„:
- [Megatron-LM](https://github.com/NVIDIA/Megatron-LM)์€ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋ธ์— ๋งค์šฐ ํŠนํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
- [parallelformers](https://github.com/tunib-ai/parallelformers) (ํ˜„์žฌ๋Š” ์ถ”๋ก ์—๋งŒ ํ•ด๋‹น)
- [SageMaker](https://arxiv.org/abs/2111.05972) - ์ด๋Š” AWS์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์†Œ์œ  ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.
- [OSLO](https://github.com/tunib-ai/oslo)์€ Transformers๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํ…์„œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๊ตฌํ˜„์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค— Transformers ํ˜„ํ™ฉ:
- core: ์•„์ง ํ•ต์‹ฌ ๋ถ€๋ถ„์— ๊ตฌํ˜„๋˜์ง€ ์•Š์Œ
- ๊ทธ๋Ÿฌ๋‚˜ ์ถ”๋ก ์„ ํ•˜๋ ค๋ฉด [parallelformers](https://github.com/tunib-ai/parallelformers)๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋ธ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ต์‹ฌ ๋ถ€๋ถ„์— ๊ตฌํ˜„๋˜๊ธฐ ์ „๊นŒ์ง€ ๊ทธ๋“ค์˜ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ›ˆ๋ จ ๋ชจ๋“œ๋„ ์ง€์›๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
- Deepspeed-Inference๋Š” CUDA ์ปค๋„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋งค์šฐ ๋น ๋ฅธ ์ถ”๋ก  ๋ชจ๋“œ์—์„œ BERT, GPT-2 ๋ฐ GPT-Neo ๋ชจ๋ธ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [์—ฌ๊ธฐ](https://www.deepspeed.ai/tutorials/inference-tutorial/)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

## DP+PP [[dppp]]

DeepSpeed [pipeline tutorial](https://www.deepspeed.ai/tutorials/pipeline/)์—์„œ ๋‹ค์Œ ๋‹ค์ด์–ด๊ทธ๋žจ์€ DP์™€ PP๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

![dp-pp-2d](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/parallelism-zero-dp-pp.png)

์—ฌ๊ธฐ์„œ DP ๋žญํฌ 0์€ GPU2๋ฅผ ๋ณด์ง€ ๋ชปํ•˜๊ณ , DP ๋žญํฌ 1์€ GPU3์„ ๋ณด์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. DP์—๊ฒŒ๋Š” ๋”ฑ 2๊ฐœ์˜ GPU์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. GPU0์€ PP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GPU2์—๊ฒŒ ์ผ๋ถ€ ์ž‘์—…์„ "๋น„๋ฐ€๋ฆฌ์—" ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  GPU1๋„ GPU3์„ ๋„์›€์œผ๋กœ ์‚ผ์•„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ์ฐจ์›๋งˆ๋‹ค ์ ์–ด๋„ 2๊ฐœ์˜ GPU๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์ตœ์†Œํ•œ 4๊ฐœ์˜ GPU๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„:
- [DeepSpeed](https://github.com/deepspeedai/DeepSpeed)
- [Megatron-LM](https://github.com/NVIDIA/Megatron-LM)
- [Varuna](https://github.com/microsoft/varuna)
- [SageMaker](https://arxiv.org/abs/2111.05972)
- [OSLO](https://github.com/tunib-ai/oslo)

๐Ÿค— Transformers ํ˜„ํ™ฉ: ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์Œ

## DP+PP+TP [[dppptp]]

๋” ํšจ์œจ์ ์ธ ํ›ˆ๋ จ์„ ์œ„ํ•ด PP์™€ TP ๋ฐ DP๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ 3D ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

![dp-pp-tp-3d](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/parallelism-deepspeed-3d.png)

์ด ๋‹ค์ด์–ด๊ทธ๋žจ์€ [3D parallelism: Scaling to trillion-parameter models](https://www.microsoft.com/en-us/research/blog/deepspeed-extreme-scale-model-training-for-everyone/)์ด๋ผ๋Š” ๋ธ”๋กœ๊ทธ ๊ธ€์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ์ฐจ์›๋งˆ๋‹ค ์ ์–ด๋„ 2๊ฐœ์˜ GPU๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์ตœ์†Œํ•œ 8๊ฐœ์˜ GPU๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„:
- [DeepSpeed](https://github.com/deepspeedai/DeepSpeed) - DeepSpeed๋Š” ๋”์šฑ ํšจ์œจ์ ์ธ DP์ธ ZeRO-DP๋ผ๊ณ ๋„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
- [Megatron-LM](https://github.com/NVIDIA/Megatron-LM)
- [Varuna](https://github.com/microsoft/varuna)
- [SageMaker](https://arxiv.org/abs/2111.05972)
- [OSLO](https://github.com/tunib-ai/oslo)

๐Ÿค— Transformers ํ˜„ํ™ฉ: ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์Œ. PP์™€ TP๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

## ZeRO DP+PP+TP [[zero-dppptp]]

DeepSpeed์˜ ์ฃผ์š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” DP์˜ ํ™•์žฅ์ธ ZeRO์ž…๋‹ˆ๋‹ค. ZeRO-DP์— ๋Œ€ํ•ด ์ด๋ฏธ [ZeRO Data Parallelism](#zero-data-parallelism)์—์„œ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Š” PP๋‚˜ TP๋ฅผ ํ•„์š”๋กœํ•˜์ง€ ์•Š๋Š” ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ PP์™€ TP์™€ ๊ฒฐํ•ฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ZeRO-DP๊ฐ€ PP์™€ (์„ ํƒ์ ์œผ๋กœ TP์™€) ๊ฒฐํ•ฉ๋˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ZeRO ๋‹จ๊ณ„ 1(์˜ตํ‹ฐ๋งˆ์ด์ € ๋ถ„ํ• )๋งŒ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

์ด๋ก ์ ์œผ๋กœ๋Š” ZeRO ๋‹จ๊ณ„ 2(๊ทธ๋ผ๋””์–ธํŠธ ๋ถ„ํ• )๋ฅผ ํŒŒ์ดํ”„๋ผ์ธ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ด๋Š” ์„ฑ๋Šฅ์— ๋‚˜์œ ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ๋งˆ์ดํฌ๋กœ ๋ฐฐ์น˜๋งˆ๋‹ค ๊ทธ๋ผ๋””์–ธํŠธ๋ฅผ ์ƒค๋”ฉํ•˜๊ธฐ ์ „์— ์ถ”๊ฐ€์ ์ธ ๋ฆฌ๋“€์Šค-์Šค์บํ„ฐ ์ปฌ๋ ‰ํ‹ฐ๋ธŒ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ์ด๋Š” ์ž ์žฌ์ ์œผ๋กœ ์ƒ๋‹นํ•œ ํ†ต์‹  ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์˜ ํŠน์„ฑ์ƒ ์ž‘์€ ๋งˆ์ดํฌ๋กœ ๋ฐฐ์น˜๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ, ์‚ฐ์ˆ  ์—ฐ์‚ฐ ๊ฐ•๋„(๋งˆ์ดํฌ๋กœ ๋ฐฐ์น˜ ํฌ๊ธฐ)๋ฅผ ๊ท ํ˜• ์žˆ๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ ํŒŒ์ดํ”„๋ผ์ธ ๋ฒ„๋ธ”(๋งˆ์ดํฌ๋กœ ๋ฐฐ์น˜ ์ˆ˜)์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ํ†ต์‹  ๋น„์šฉ์€ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ, PP๋กœ ์ธํ•ด ์ •์ƒ๋ณด๋‹ค ์ ์€ ์ˆ˜์˜ ๋ ˆ์ด์–ด๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ์€ ํฌ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. PP๋Š” ์ด๋ฏธ ๊ทธ๋ž˜๋””์–ธํŠธ ํฌ๊ธฐ๋ฅผ ``1/PP``๋กœ ์ค„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ž˜๋””์–ธํŠธ ์ƒค๋”ฉ์˜ ์ ˆ์•ฝ ํšจ๊ณผ๋Š” ์ˆœ์ˆ˜ DP๋ณด๋‹ค๋Š” ๋ฏธ๋ฏธํ•ฉ๋‹ˆ๋‹ค.

ZeRO ๋‹จ๊ณ„ 3๋„ ๊ฐ™์€ ์ด์œ ๋กœ ์ข‹์€ ์„ ํƒ์ด ์•„๋‹™๋‹ˆ๋‹ค - ๋” ๋งŽ์€ ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ZeRO๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ด์ ์€ ZeRO-Offload์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ๊ณ„ 1์ด๋ฏ€๋กœ ์˜ตํ‹ฐ๋งˆ์ด์ € ์ƒํƒœ๋ฅผ CPU๋กœ ์˜คํ”„๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„:
- [Megatron-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed) ๋ฐ [BigScience์˜ Megatron-Deepspeed](https://github.com/bigscience-workshop/Megatron-DeepSpeed), ์ด์ „ ์ €์žฅ์†Œ์˜ ํฌํฌ์ž…๋‹ˆ๋‹ค.
- [OSLO](https://github.com/tunib-ai/oslo)

์ค‘์š”ํ•œ ๋…ผ๋ฌธ:

- [Using DeepSpeed and Megatron to Train Megatron-Turing NLG 530B, A Large-Scale Generative Language Model](
https://arxiv.org/abs/2201.11990)

๐Ÿค— Transformers ํ˜„ํ™ฉ: ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์Œ, PP์™€ TP๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

## FlexFlow [[flexflow]]

[FlexFlow](https://github.com/flexflow/FlexFlow)๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ณ‘๋ ฌํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๋…ผ๋ฌธ: ["Beyond Data and Model Parallelism for Deep Neural Networks" by Zhihao Jia, Matei Zaharia, Alex Aiken](https://arxiv.org/abs/1807.05358)

์ด๋Š” Sample-Operator-Attribute-Parameter๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ผ์ข…์˜ 4D ๋ณ‘๋ ฌํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

1. Sample = ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌํ™” (์ƒ˜ํ”Œ๋ณ„ ๋ณ‘๋ ฌ)
2. Operator = ๋‹จ์ผ ์—ฐ์‚ฐ์„ ์—ฌ๋Ÿฌ ํ•˜์œ„ ์—ฐ์‚ฐ์œผ๋กœ ๋ณ‘๋ ฌํ™”
3. Attribute = ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌํ™” (๊ธธ์ด๋ณ„ ๋ณ‘๋ ฌ)
4. Parameter = ๋ชจ๋ธ ๋ณ‘๋ ฌํ™” (์ˆ˜ํ‰ ๋˜๋Š” ์ˆ˜์ง๊ณผ ๊ด€๊ณ„์—†์ด)

์˜ˆ์‹œ:
* Sample

512 ๊ธธ์ด์˜ 10๊ฐœ์˜ ๋ฐฐ์น˜๋ฅผ ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค. ์ด๋ฅผ sample ์ฐจ์›์œผ๋กœ 2๊ฐœ์˜ ์žฅ์น˜์— ๋ณ‘๋ ฌํ™”ํ•˜๋ฉด, 10 x 512๋Š” 5 x 2 x 512๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

* Operator

๋ ˆ์ด์–ด ์ •๊ทœํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด, ์šฐ์„  std๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ๋กœ mean์„ ๊ณ„์‚ฐํ•œ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๊ทœํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Operator ๋ณ‘๋ ฌํ™”๋Š” std์™€ mean์„ ๋ณ‘๋ ฌ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ operator ์ฐจ์›์œผ๋กœ 2๊ฐœ์˜ ์žฅ์น˜ (cuda:0, cuda:1)์— ๋ณ‘๋ ฌํ™”ํ•˜๋ฉด, ๋จผ์ € ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋‘ ์žฅ์น˜๋กœ ๋ณต์‚ฌํ•œ ๋‹ค์Œ cuda:0์—์„œ std๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  cuda:1์—์„œ ๋™์‹œ์— mean์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

* Attribute

512 ๊ธธ์ด์˜ 10๊ฐœ์˜ ๋ฐฐ์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ attribute ์ฐจ์›์œผ๋กœ 2๊ฐœ์˜ ์žฅ์น˜์— ๋ณ‘๋ ฌํ™”ํ•˜๋ฉด, 10 x 512๋Š” 10 x 2 x 256์ด ๋ฉ๋‹ˆ๋‹ค.

* Parameter

์ด๋Š” tensor ๋ชจ๋ธ ๋ณ‘๋ ฌํ™” ๋˜๋Š” naive layer-wise ๋ชจ๋ธ ๋ณ‘๋ ฌํ™”์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

![flex-flow-soap](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/parallelism-flexflow.jpeg)

์ด ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ค‘์š”ํ•œ ์ ์€ (1) GPU/TPU/CPU ๋Œ€ (2) RAM/DRAM ๋Œ€ (3) ๋น ๋ฅธ ์ธํŠธ๋ผ-์ปค๋„ฅํŠธ ๋Œ€ ๋А๋ฆฐ ์ธํ„ฐ-์ปค๋„ฅํŠธ์™€ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์–ด๋””์—์„œ ์–ด๋–ค ๋ณ‘๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ• ์ง€๋ฅผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ ์œผ๋กœ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜๋‚˜ ๋งค์šฐ ์ค‘์š”ํ•œ ์ธก๋ฉด์€ FlexFlow๊ฐ€ ์ •์ ์ด๊ณ  ๊ณ ์ •๋œ ์›Œํฌ๋กœ๋“œ๋ฅผ ๊ฐ€์ง„ ๋ชจ๋ธ์— ๋Œ€ํ•œ DNN ๋ณ‘๋ ฌํ™”๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋™์ ์ธ ๋™์ž‘์„ ๊ฐ€์ง„ ๋ชจ๋ธ์€ ๋ฐ˜๋ณต๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ณ‘๋ ฌํ™” ์ „๋žต์„ ์„ ํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์žฅ์ ์€ ์„ ํƒํ•œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ 30๋ถ„ ๋™์•ˆ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ  ์ด ํŠน์ • ํ™˜๊ฒฝ์„ ์ตœ์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ƒ์˜ ์ „๋žต์„ ์ œ์•ˆํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถ€ํ’ˆ์„ ์ถ”๊ฐ€/์ œ๊ฑฐ/๊ต์ฒดํ•˜๋ฉด ์‹คํ–‰ํ•˜๊ณ  ๊ทธ์— ๋Œ€ํ•œ ๊ณ„ํš์„ ๋‹ค์‹œ ์ตœ์ ํ™”ํ•œ ํ›„ ํ›ˆ๋ จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ค์ •์€ ์ž์ฒด์ ์ธ ์‚ฌ์šฉ์ž ์ •์˜ ์ตœ์ ํ™”๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค— Transformers ํ˜„ํ™ฉ: ์•„์ง ํ†ตํ•ฉ๋˜์ง€ ์•Š์Œ. ์ด๋ฏธ [transformers.utils.fx](https://github.com/huggingface/transformers/blob/master/src/transformers/utils/fx.py)๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ์„ FX-์ถ”์ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” FlexFlow์˜ ์„ ํ–‰ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ FlexFlow๊ฐ€ ์šฐ๋ฆฌ์˜ ๋ชจ๋ธ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


## ์–ด๋–ค ์ „๋žต์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”? [[which-strategy-to-use-when]]

๋‹ค์Œ์€ ์–ด๋–ค ๋ณ‘๋ ฌํ™” ์ „๋žต์„ ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋งค์šฐ ๋Œ€๋žต์ ์ธ ๊ฐœ์š”์ž…๋‹ˆ๋‹ค. ๊ฐ ๋ชฉ๋ก์˜ ์ฒซ ๋ฒˆ์งธ ์ „๋žต์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

**โ‡จ ๋‹จ์ผ GPU**

* ๋ชจ๋ธ์ด ๋‹จ์ผ GPU์— ๋งž๋Š” ๊ฒฝ์šฐ:

    1. ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ

* ๋ชจ๋ธ์ด ๋‹จ์ผ GPU์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ:

    1. ZeRO + CPU ๋ฐ ์˜ต์…˜์œผ๋กœ NVMe ์–ธ๋กœ๋“œ
    2. ์œ„์™€ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋˜, ๊ฐ€์žฅ ํฐ ๋ ˆ์ด์–ด๊ฐ€ ๋‹จ์ผ GPU์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Memory Centric Tiling(์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ์ฐธ์กฐ)์„ ์ถ”๊ฐ€์ ์œผ๋กœ ์‚ฌ์šฉ

* ๊ฐ€์žฅ ํฐ ๋ ˆ์ด์–ด๊ฐ€ ๋‹จ์ผ GPU์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ:

1. ZeRO - [Memory Centric Tiling](https://deepspeed.readthedocs.io/en/latest/zero3.html#memory-centric-tiling) (MCT) ํ™œ์„ฑํ™”. ์ด๋ฅผ ํ†ตํ•ด ํฌ๊ธฐ๊ฐ€ ๋งค์šฐ ํฐ ๋ ˆ์ด์–ด๋ฅผ ์ž„์˜๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MCT๋Š” GPU์— ํ™œ์„ฑํ™”๋œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ˆ˜๋ฅผ ์ค„์ด์ง€๋งŒ ํ™œ์„ฑํ™” ๋ฉ”๋ชจ๋ฆฌ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ž‘์„ฑ ๊ธฐ์ค€์œผ๋กœ ์ด ์š”๊ตฌ์‚ฌํ•ญ์€ ๋งค์šฐ ๋“œ๋ฌผ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๊ฐ€ `torch.nn.Linear`๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

**โ‡จ ๋‹จ์ผ ๋…ธ๋“œ / ๋‹ค์ค‘ GPU**

* ๋ชจ๋ธ์ด ๋‹จ์ผ GPU์— ๋งž๋Š” ๊ฒฝ์šฐ:

    1. DDP - ๋ถ„์‚ฐ DP
    2. ZeRO - ์ƒํ™ฉ๊ณผ ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ๋น ๋ฅผ ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

* ๋ชจ๋ธ์ด ๋‹จ์ผ GPU์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ:

    1. PP
    2. ZeRO
    3. TP

    NVLINK ๋˜๋Š” NVSwitch๋ฅผ ํ†ตํ•œ ๋งค์šฐ ๋น ๋ฅธ ์ธํŠธ๋ผ-๋…ธ๋“œ ์—ฐ๊ฒฐ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๊ฑฐ์˜ ๋™๋“ฑํ•  ๊ฒƒ์ด๋ฉฐ, ์ด๋Ÿฌํ•œ ์—ฐ๊ฒฐ์ด ์—†๋Š” ๊ฒฝ์šฐ PP๊ฐ€ TP๋‚˜ ZeRO๋ณด๋‹ค ๋น ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ TP์˜ ์ฐจ์ˆ˜๋„ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ์„ค์ •์—์„œ ์šฐ์Šน์ž๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์‹คํ—˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

    TP๋Š” ๊ฑฐ์˜ ํ•ญ์ƒ ๋‹จ์ผ ๋…ธ๋“œ ๋‚ด์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, TP ํฌ๊ธฐ <= ๋…ธ๋“œ๋‹น GPU ์ˆ˜์ž…๋‹ˆ๋‹ค.

* ๊ฐ€์žฅ ํฐ ๋ ˆ์ด์–ด๊ฐ€ ๋‹จ์ผ GPU์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ:

    1. ZeRO๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ - PP๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ TP๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    2. ZeRO๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, "๋‹จ์ผ GPU"์˜ ํ•ญ๋ชฉ๊ณผ ๋™์ผํ•œ ํ•ญ๋ชฉ ์ฐธ์กฐ


**โ‡จ ๋‹ค์ค‘ ๋…ธ๋“œ / ๋‹ค์ค‘ GPU**

* ๋น ๋ฅธ ๋…ธ๋“œ ๊ฐ„ ์—ฐ๊ฒฐ์ด ์žˆ๋Š” ๊ฒฝ์šฐ:

    1. ZeRO - ๋ชจ๋ธ์— ๋Œ€ํ•œ ์ˆ˜์ •์ด ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    2. PP+TP+DP - ํ†ต์‹ ์ด ์ ์ง€๋งŒ ๋ชจ๋ธ์— ๋Œ€ํ•œ ๋Œ€๊ทœ๋ชจ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

* ๋А๋ฆฐ ๋…ธ๋“œ ๊ฐ„ ์—ฐ๊ฒฐ ๋ฐ GPU ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ:

    1. DP+PP+TP+ZeRO-1