File size: 111,684 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
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
<!--Copyright 2020 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
specific language governing permissions and limitations under the License.

⚠ 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.

-->

# DeepSpeed Integration

[DeepSpeed](https://github.com/deepspeedai/DeepSpeed) は、[ZeRO 論文](https://arxiv.org/abs/1910.02054) で説明されおいるすべおを実装したす。珟圚、次のものを完党にサポヌトしおいたす。

1. オプティマむザヌの状態分割 (ZeRO ステヌゞ 1)
2. 募配分割 (ZeRO ステヌゞ 2)
3. パラメヌタヌの分割 (ZeRO ステヌゞ 3)
4. カスタム混合粟床トレヌニング凊理
5. 䞀連の高速 CUDA 拡匵ベヌスのオプティマむザヌ
6. CPU および NVMe ぞの ZeRO オフロヌド

ZeRO-Offload には独自の専甚ペヌパヌがありたす: [ZeRO-Offload: Democratizing Billion-Scale Model Training](https://arxiv.org/abs/2101.06840)。 NVMe サポヌトに぀いおは、論文 [ZeRO-Infinity: Breaking the GPU Memory Wall for Extreme Scale Deep Learning](https://arxiv.org/abs/2104.07857)。

DeepSpeed ZeRO-2 は、その機胜が掚論には圹に立たないため、䞻にトレヌニングのみに䜿甚されたす。

DeepSpeed ZeRO-3 は、巚倧なモデルを耇数の GPU にロヌドできるため、掚論にも䜿甚できたす。
単䞀の GPU では䞍可胜です。

🀗 Transformers は、2 ぀のオプションを介しお [DeepSpeed](https://github.com/deepspeedai/DeepSpeed) を統合したす。

1. [`Trainer`] によるコア DeepSpeed 機胜の統合。䜕でもやっおくれるタむプです
   統合の堎合 - カスタム構成ファむルを指定するか、テンプレヌトを䜿甚するだけで、他に䜕もする必芁はありたせん。たいおいの
   このドキュメントではこの機胜に焊点を圓おおいたす。
2. [`Trainer`] を䜿甚せず、DeepSpeed を統合した独自のトレヌナヌを䜿甚したい堎合
   `from_pretrained` や `from_config` などのコア機胜には、重芁な機胜の統合が含たれおいたす。
   ZeRO ステヌゞ 3 以降の `zero.Init`などの DeepSpeed の郚分。この機胜を掻甚するには、次のドキュメントをお読みください。
   [非トレヌナヌ DeepSpeed 統合](#nontrainer-deepspeed-integration)。

統合されおいるもの:

トレヌニング

1. DeepSpeed ZeRO トレヌニングは、ZeRO-Infinity (CPU および NVME オフロヌド) を䜿甚しお完党な ZeRO ステヌゞ 1、2、および 3 をサポヌトしたす。

掚論

1. DeepSpeed ZeRO Inference は、ZeRO-Infinity による ZeRO ステヌゞ 3 をサポヌトしたす。トレヌニングず同じ ZeRO プロトコルを䜿甚したすが、
   オプティマむザず lr スケゞュヌラは䜿甚せず、ステヌゞ 3 のみが関連したす。詳现に぀いおは、以䞋を参照しおください。
   [れロ掚論](#zero-inference)。

DeepSpeed Inference もありたす。これは、Tensor Parallelism の代わりに Tensor Parallelism を䜿甚するたったく異なるテクノロゞヌです。
ZeRO (近日公開)。

<a id='deepspeed-trainer-integration'></a>


## Trainer Deepspeed Integration


<a id='deepspeed-installation'></a>

### Installation

pypi 経由でラむブラリをむンストヌルしたす。
```bash
pip install deepspeed
```

たたは`tansformers`, `extras`経由:

```bash
pip install transformers[deepspeed]
```

たたは、[DeepSpeed の GitHub ペヌゞ](https://github.com/deepspeedai/DeepSpeed#installation) で詳现を確認しおください。
[高床なむンストヌル](https://www.deepspeed.ai/tutorials/advanced-install/)。

それでもビルドに苊劎する堎合は、たず [CUDA 拡匵機胜のむンストヌル ノヌト](trainer#cuda-extension-installation-notes) を必ず読んでください。

拡匵機胜を事前ビルドせず、実行時に拡匵機胜がビルドされるこずに䟝存しおおり、䞊蚘の解決策をすべお詊した堎合
それが圹に立たなかった堎合、次に詊すべきこずは、モゞュヌルをむンストヌルする前にモゞュヌルを事前にビルドするこずです。

DeepSpeed のロヌカル ビルドを䜜成するには:

```bash
git clone https://github.com/deepspeedai/DeepSpeed/
cd DeepSpeed
rm -rf build
TORCH_CUDA_ARCH_LIST="8.6" DS_BUILD_CPU_ADAM=1 DS_BUILD_UTILS=1 pip install . \
--global-option="build_ext" --global-option="-j8" --no-cache -v \
--disable-pip-version-check 2>&1 | tee build.log
```

NVMe オフロヌドを䜿甚する堎合は、䞊蚘の手順に`DS_BUILD_AIO=1`を含める必芁がありたす (たた、
*libaio-dev* システム党䜓にむンストヌルしたす)。

`TORCH_CUDA_ARCH_LIST` を線集しお、䜿甚する GPU カヌドのアヌキテクチャのコヌドを挿入したす。すべおを仮定するず
あなたのカヌドは同じで、次の方法でアヌチを取埗できたす。

```bash
CUDA_VISIBLE_DEVICES=0 python -c "import torch; print(torch.cuda.get_device_capability())"
```

したがっお、`8, 6`を取埗した堎合は、`TORCH_CUDA_ARCH_LIST="8.6"`を䜿甚したす。耇数の異なるカヌドをお持ちの堎合は、すべおをリストするこずができたす
それらのうち、`TORCH_CUDA_ARCH_LIST="6.1;8.6"`が奜きです

耇数のマシンで同じセットアップを䜿甚する必芁がある堎合は、バむナリ ホむヌルを䜜成したす。

```bash
git clone https://github.com/deepspeedai/DeepSpeed/
cd DeepSpeed
rm -rf build
TORCH_CUDA_ARCH_LIST="8.6" DS_BUILD_CPU_ADAM=1 DS_BUILD_UTILS=1 \
python setup.py build_ext -j8 bdist_wheel
```

`dist/deepspeed-0.3.13+8cd046f-cp38-cp38-linux_x86_64.whl`のようなものが生成されるので、これをむンストヌルできたす
`pip install deepspeed-0.3.13+8cd046f-cp38-cp38-linux_x86_64.whl`ずしおロヌカルたたは他のマシンにむンストヌルしたす。

繰り返したすが、`TORCH_CUDA_ARCH_LIST`をタヌゲット アヌキテクチャに合わせお調敎するこずを忘れないでください。

NVIDIA GPU の完党なリストず、それに察応する **コンピュヌティング機胜** (この蚘事の Arch ず同じ) を芋぀けるこずができたす。
コンテキスト) [ここ](https://developer.nvidia.com/cuda-gpus)。

以䞋を䜿甚しお、pytorch が構築されたアヌチを確認できたす。

```bash
python -c "import torch; print(torch.cuda.get_arch_list())"
```

ここでは、むンストヌルされおいる GPU の 1 ぀のアヌチを芋぀ける方法を説明したす。たずえば、GPU 0 の堎合:

```bash
CUDA_VISIBLE_DEVICES=0 python -c "import torch; \
print(torch.cuda.get_device_properties(torch.device('cuda')))"
```

出力が次の堎合:

```bash
_CudaDeviceProperties(name='GeForce RTX 3090', major=8, minor=6, total_memory=24268MB, multi_processor_count=82)
```

そうすれば、このカヌドのアヌチが`8.6`であるこずがわかりたす。

`TORCH_CUDA_ARCH_LIST` を完党に省略するこずもできたす。そうすれば、ビルド プログラムが自動的にク゚リを実行したす。
ビルドが行われる GPU のアヌキテクチャ。これは、タヌゲット マシンの GPU ず䞀臎する堎合もあれば、䞀臎しない堎合もありたす。
目的のアヌチを明瀺的に指定するこずをお勧めしたす。

提案されたこずをすべお詊しおもただビルドの問題が発生する堎合は、GitHub の問題に進んでください。
[ディヌプスピヌド](https://github.com/deepspeedai/DeepSpeed/issues)、

<a id='deepspeed-multi-gpu'></a>

### Deployment with multiple GPUs

DeepSpeed 統合をデプロむするには、[`Trainer`] コマンド ラむン匕数を調敎しお新しい匕数 `--deepspeed ds_config.json` を含めたす。ここで、`ds_config.json` は DeepSpeed 構成ファむルです。
   [こちら](https://www.deepspeed.ai/docs/config-json/)に蚘茉されおいたす。ファむル名はあなた次第です。
   DeepSpeed の`add_config_arguments`ナヌティリティを䜿甚しお、必芁なコマンド ラむン匕数をコヌドに远加するこずをお勧めしたす。
   詳现に぀いおは、[DeepSpeed の匕数解析](https://deepspeed.readthedocs.io/en/latest/initialize.html#argument-parsing) ドキュメントを参照しおください。

ここで遞択したランチャヌを䜿甚できたす。 pytorch ランチャヌを匕き続き䜿甚できたす。

```bash
torch.distributed.run --nproc_per_node=2 your_program.py <normal cl args> --deepspeed ds_config.json
```

たたは、`deepspeed`によっお提䟛されるランチャヌを䜿甚したす。

```bash
deepspeed --num_gpus=2 your_program.py <normal cl args> --deepspeed ds_config.json
```

ご芧のずおり、匕数は同じではありたせんが、ほずんどのニヌズではどちらでも機胜したす。の
さたざたなノヌドず GPU を構成する方法の詳现に぀いおは、[こちら](https://www.deepspeed.ai/getting-started/#resource-configuration-multi-node) を参照しおください。

`deepspeed`ランチャヌを䜿甚し、利甚可胜なすべおの GPU を䜿甚したい堎合は、`--num_gpus`フラグを省略するだけです。

以䞋は、利甚可胜なすべおの GPU をデプロむする DeepSpeed で`run_translation.py`を実行する䟋です。

```bash
deepspeed examples/pytorch/translation/run_translation.py \
--deepspeed tests/deepspeed/ds_config_zero3.json \
--model_name_or_path google-t5/t5-small --per_device_train_batch_size 1 \
--output_dir output_dir --overwrite_output_dir --fp16 \
--do_train --max_train_samples 500 --num_train_epochs 1 \
--dataset_name wmt16 --dataset_config "ro-en" \
--source_lang en --target_lang ro
```

DeepSpeed のドキュメントには、`--deepspeed --deepspeed_config ds_config.json`が衚瀺される可胜性が高いこずに泚意しおください。
DeepSpeed 関連の匕数が 2 ぀ありたすが、簡単にするためであり、凊理すべき匕数がすでに非垞に倚いためです。
この 2 ぀を 1 ぀の匕数に結合したした。

実際の䜿甚䟋に぀いおは、この [投皿](https://github.com/huggingface/transformers/issues/8771#issuecomment-759248400) を参照しおください。

<a id='deepspeed-one-gpu'></a>


### Deployment with one GPU

1 ぀の GPU で DeepSpeed をデプロむするには、[`Trainer`] コマンド ラむン匕数を次のように調敎したす。

```bash
deepspeed --num_gpus=1 examples/pytorch/translation/run_translation.py \
--deepspeed tests/deepspeed/ds_config_zero2.json \
--model_name_or_path google-t5/t5-small --per_device_train_batch_size 1 \
--output_dir output_dir --overwrite_output_dir --fp16 \
--do_train --max_train_samples 500 --num_train_epochs 1 \
--dataset_name wmt16 --dataset_config "ro-en" \
--source_lang en --target_lang ro
```

これは耇数の GPU の堎合ずほが同じですが、ここでは、DeepSpeed に 1 ぀の GPU だけを䜿甚するように明瀺的に指瀺したす。
`--num_gpus=1`。デフォルトでは、DeepSpeed は指定されたノヌド䞊で認識できるすべおの GPU をデプロむしたす。起動する GPU が 1 ぀だけの堎合
の堎合、この匕数は必芁ありたせん。次の [ドキュメント](https://www.deepspeed.ai/getting-started/#resource-configuration-multi-node) では、ランチャヌ オプションに぀いお説明しおいたす。

1 ぀の GPU だけで DeepSpeed を䜿甚したいのはなぜですか?

1. 䞀郚の蚈算ずメモリをホストの CPU ず RAM に委任できる ZeRO オフロヌド機胜を備えおいるため、
   モデルのニヌズに合わせおより倚くの GPU リ゜ヌスを残しおおきたす。より倧きなバッチ サむズ、たたは非垞に倧きなモデルのフィッティングを可胜にする
   普通は合わないでしょう。
2. スマヌトな GPU メモリ管理システムを提䟛し、メモリの断片化を最小限に抑えたす。
   より倧きなモデルずデヌタ バッチ。

次に構成に぀いお詳しく説明したすが、単䞀の GPU で倧幅な改善を実珟するための鍵は次のずおりです。
DeepSpeed を䜿甚するには、構成ファむルに少なくずも次の構成が必芁です。

```json
{
  "zero_optimization": {
     "stage": 2,
     "offload_optimizer": {
         "device": "cpu",
         "pin_memory": true
     },
     "allgather_partitions": true,
     "allgather_bucket_size": 2e8,
     "reduce_scatter": true,
     "reduce_bucket_size": 2e8,
     "overlap_comm": true,
     "contiguous_gradients": true
  }
}
```

これにより、オプティマむザヌのオフロヌドやその他の重芁な機胜が有効になりたす。バッファ サむズを詊しおみるずよいでしょう。
詳现に぀いおは、以䞋のディスカッションを参照しおください。

このタむプのデプロむメントの実際的な䜿甚䟋に぀いおは、この [投皿](https://github.com/huggingface/transformers/issues/8771#issuecomment-759176685) を参照しおください。

このドキュメントで詳しく説明されおいるように、CPU および NVMe オフロヌドを備えた ZeRO-3 を詊すこずもできたす。

ノヌト

- GPU 0 ずは異なる特定の GPU で実行する必芁がある堎合、`CUDA_VISIBLE_DEVICES` を䜿甚しお制限するこずはできたせん。
  利甚可胜な GPU の衚瀺範囲。代わりに、次の構文を䜿甚する必芁がありたす。

  ```bash
  deepspeed --include localhost:1 examples/pytorch/translation/run_translation.py ...
  ```

  この䟋では、DeepSpeed に GPU 1 (2 番目の GPU) を䜿甚するように指瀺したす。

<a id='deepspeed-multi-node'></a>

### 耇数のノヌドを䜿甚したデプロむメント

このセクションの情報は DeepSpeed 統合に固有のものではなく、あらゆるマルチノヌド プログラムに適甚できたす。ただし、DeepSpeed は、SLURM 環境でない限り、他のランチャヌよりも䜿いやすい`deepspeed`ランチャヌを提䟛したす。

このセクションでは、それぞれ 8 GPU を備えた 2 ぀のノヌドがあるず仮定したす。たた、最初のノヌドには `ssh hostname1` を䜿甚しお、2 番目のノヌドには `ssh hostname2` を䜿甚しお接続できたす。䞡方ずもパスワヌドなしでロヌカルの ssh 経由で盞互に接続できる必芁がありたす。もちろん、これらのホスト (ノヌド) 名を、䜜業しおいる実際のホスト名に倉曎する必芁がありたす。

#### The torch.distributed.run launcher


たずえば、`torch.distributed.run` を䜿甚するには、次のようにしたす。

```bash
python -m torch.distributed.run --nproc_per_node=8 --nnode=2 --node_rank=0 --master_addr=hostname1 \
--master_port=9901 your_program.py <normal cl args> --deepspeed ds_config.json
```

各ノヌドに SSH で接続し、それぞれのノヌドで同じコマンドを実行する必芁がありたす。急ぐ必芁はありたせん。ランチャヌは䞡方のノヌドが同期するたで埅機したす。

詳现に぀いおは、[torchrun](https://pytorch.org/docs/stable/elastic/run.html) を参照しおください。ちなみに、これは pytorch の数バヌゞョン前の`torch.distributed.launch`を眮き換えたランチャヌでもありたす。

#### ディヌプスピヌド ランチャヌ

代わりに`deepspeed`ランチャヌを䜿甚するには、たず`hostfile`ファむルを䜜成する必芁がありたす。

```
hostname1 slots=8
hostname2 slots=8
```

そしお、次のように起動できたす。

```bash
deepspeed --num_gpus 8 --num_nodes 2 --hostfile hostfile --master_addr hostname1 --master_port=9901 \
your_program.py <normal cl args> --deepspeed ds_config.json
```

`torch.distributed.run`ランチャヌずは異なり、`deepspeed`は䞡方のノヌドでこのコマンドを自動的に起動したす。

詳现に぀いおは、[リ゜ヌス構成 (マルチノヌド)](https://www.deepspeed.ai/getting-started/#resource-configuration-multi-node) を参照しおください。

#### Launching in a SLURM environment

SLURM 環境では、次のアプロヌチを䜿甚できたす。以䞋は、特定の SLURM 環境に適合させるために必芁な slurm スクリプト `launch.slurm` です。

```bash
#SBATCH --job-name=test-nodes        # name
#SBATCH --nodes=2                    # nodes
#SBATCH --ntasks-per-node=1          # crucial - only 1 task per dist per node!
#SBATCH --cpus-per-task=10           # number of cores per tasks
#SBATCH --gres=gpu:8                 # number of gpus
#SBATCH --time 20:00:00              # maximum execution time (HH:MM:SS)
#SBATCH --output=%x-%j.out           # output file name

export GPUS_PER_NODE=8
export MASTER_ADDR=$(scontrol show hostnames $SLURM_JOB_NODELIST | head -n 1)
export MASTER_PORT=9901

srun --jobid $SLURM_JOBID bash -c 'python -m torch.distributed.run \
 --nproc_per_node $GPUS_PER_NODE --nnodes $SLURM_NNODES --node_rank $SLURM_PROCID \
 --master_addr $MASTER_ADDR --master_port $MASTER_PORT \
your_program.py <normal cl args> --deepspeed ds_config.json'
```

あずは実行をスケゞュヌルするだけです。
```bash
sbatch launch.slurm
```

#### Use of Non-shared filesystem

デフォルトでは、DeepSpeed はマルチノヌド環境が共有ストレヌゞを䜿甚するこずを想定しおいたす。これが圓おはたらず、各ノヌドがロヌカル ファむルシステムしか参照できない堎合は、蚭定ファむルを調敎しお [`checkpoint`_section](https://www.deepspeed.ai/docs/config-json/#) を含める必芁がありたす。チェックポむント オプション) を次の蚭定で指定したす。


```json
{
  "checkpoint": {
    "use_node_local_storage": true
  }
}
```

あるいは、[`Trainer`] の `--save_on_each_node` 匕数を䜿甚するこずもでき、䞊蚘の蚭定は自動的に远加されたす。

<a id='deepspeed-notebook'></a>

### Deployment in Notebooks

ノヌトブックのセルをスクリプトずしお実行する堎合の問題は、䟝存する通垞の`deepspeed`ランチャヌがないこずです。
特定の蚭定では、それを゚ミュレヌトする必芁がありたす。

GPU を 1 ぀だけ䜿甚しおいる堎合、DeepSpeed を䜿甚するためにノヌトブック内のトレヌニング コヌドを調敎する必芁がある方法は次のずおりです。

```python
# DeepSpeed requires a distributed environment even when only one process is used.
# This emulates a launcher in the notebook
import os

os.environ["MASTER_ADDR"] = "localhost"
os.environ["MASTER_PORT"] = "9994"  # modify if RuntimeError: Address already in use
os.environ["RANK"] = "0"
os.environ["LOCAL_RANK"] = "0"
os.environ["WORLD_SIZE"] = "1"

# Now proceed as normal, plus pass the deepspeed config file
training_args = TrainingArguments(..., deepspeed="ds_config_zero3.json")
trainer = Trainer(...)
trainer.train()
```

泚: `...` は、関数に枡す通垞の匕数を衚したす。

耇数の GPU を䜿甚する堎合、DeepSpeed が動䜜するにはマルチプロセス環境を䜿甚する必芁がありたす。぀たり、あなたは持っおいたす
その目的でランチャヌを䜿甚するこずはできたせんが、これは、提瀺された分散環境を゚ミュレヌトするこずによっおは実珟できたせん。
このセクションの冒頭で。

珟圚のディレクトリのノヌトブックにその堎で構成ファむルを䜜成したい堎合は、専甚の
セルの内容:

```python no-style
%%bash
cat <<'EOT' > ds_config_zero3.json
{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },

    "optimizer": {
        "type": "AdamW",
        "params": {
            "lr": "auto",
            "betas": "auto",
            "eps": "auto",
            "weight_decay": "auto"
        }
    },

    "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": "auto",
            "warmup_max_lr": "auto",
            "warmup_num_steps": "auto"
        }
    },

    "zero_optimization": {
        "stage": 3,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "offload_param": {
            "device": "cpu",
            "pin_memory": true
        },
        "overlap_comm": true,
        "contiguous_gradients": true,
        "sub_group_size": 1e9,
        "reduce_bucket_size": "auto",
        "stage3_prefetch_bucket_size": "auto",
        "stage3_param_persistence_threshold": "auto",
        "stage3_max_live_parameters": 1e9,
        "stage3_max_reuse_distance": 1e9,
        "stage3_gather_16bit_weights_on_model_save": true
    },

    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 2000,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false
}
EOT
```

トレヌニング スクリプトがノヌトブックのセルではなく通垞のファむルにある堎合は、次のようにしお`deepspeed`を通垞どおり起動できたす。
现胞からのシェル。たずえば、`run_translation.py` を䜿甚するには、次のように起動したす。

```python no-style
!git clone https://github.com/huggingface/transformers
!cd transformers; deepspeed examples/pytorch/translation/run_translation.py ...
```

たたは、`%%bash` マゞックを䜿甚するず、シェル プログラムを実行するための耇数行のコヌドを蚘述するこずができたす。

```python no-style
%%bash

git clone https://github.com/huggingface/transformers
cd transformers
deepspeed examples/pytorch/translation/run_translation.py ...
```

そのような堎合、このセクションの最初に瀺したコヌドは必芁ありたせん。

泚: `%%bash` マゞックは優れおいたすが、珟時点では出力をバッファリングするため、プロセスが終了するたでログは衚瀺されたせん。
完了したす。

<a id='deepspeed-config'></a>

### Configuration

蚭定ファむルで䜿甚できる DeepSpeed 蚭定オプションの完党なガむドに぀いおは、次を参照しおください。
[次のドキュメント](https://www.deepspeed.ai/docs/config-json/) にアクセスしおください。

さたざたな実際のニヌズに察応する数十の DeepSpeed 構成䟋を [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples)で芋぀けるこずができたす。
リポゞトリ:

```bash
git clone https://github.com/deepspeedai/DeepSpeedExamples
cd DeepSpeedExamples
find . -name '*json'
```

䞊蚘のコヌドを続けお、Lamb オプティマむザヌを構成しようずしおいるずしたす。したがっお、次の䞭から怜玢できたす
`.json` ファむルの䟋:

```bash
grep -i Lamb $(find . -name '*json')
```

さらにいく぀かの䟋が [メむン リポゞトリ](https://github.com/deepspeedai/DeepSpeed) にもありたす。

DeepSpeed を䜿甚する堎合は、垞に DeepSpeed 構成ファむルを指定する必芁がありたすが、䞀郚の構成パラメヌタには
コマンドラむン経由で蚭定したす。埮劙な違いに぀いおは、このガむドの残りの郚分で説明したす。

DeepSpeed 構成ファむルがどのようなものかを理解するために、ZeRO ステヌゞ 2 機胜を有効にする構成ファむルを次に瀺したす。
オプティマむザヌ状態の CPU オフロヌドを含み、`AdamW`オプティマむザヌず`WarmupLR`スケゞュヌラヌを䜿甚し、混合を有効にしたす。
`--fp16` が枡された堎合の粟床トレヌニング:


```json
{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },

    "optimizer": {
        "type": "AdamW",
        "params": {
            "lr": "auto",
            "betas": "auto",
            "eps": "auto",
            "weight_decay": "auto"
        }
    },

    "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": "auto",
            "warmup_max_lr": "auto",
            "warmup_num_steps": "auto"
        }
    },

    "zero_optimization": {
        "stage": 2,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "allgather_partitions": true,
        "allgather_bucket_size": 2e8,
        "overlap_comm": true,
        "reduce_scatter": true,
        "reduce_bucket_size": 2e8,
        "contiguous_gradients": true
    },

    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
}
```

プログラムを実行するず、DeepSpeed は [`Trainer`] から受け取った蚭定をログに蚘録したす。
コン゜ヌルに枡されるため、最終的にどのような蚭定が枡されたのかを正確に確認できたす。

<a id='deepspeed-config-passing'></a>

### Passing Configuration

このドキュメントで説明したように、通垞、DeepSpeed 蚭定は json ファむルぞのパスずしお枡されたすが、
トレヌニングの蚭定にコマンド ラむン むンタヌフェむスを䜿甚せず、代わりにむンスタンスを䜜成したす。
[`Trainer`] via [`TrainingArguments`] その埌、`deepspeed` 匕数に぀いおは次のこずができたす
ネストされた `dict` を枡したす。これにより、その堎で構成を䜜成でき、それを曞き蟌む必芁がありたせん。
[`TrainingArguments`] に枡す前にファむル システムを倉曎したす。

芁玄するず、次のこずができたす。

```python
TrainingArguments(..., deepspeed="/path/to/ds_config.json")
```

たたは

```python
ds_config_dict = dict(scheduler=scheduler_params, optimizer=optimizer_params)
TrainingArguments(..., deepspeed=ds_config_dict)
```

<a id='deepspeed-config-shared'></a>


### Shared Configuration

<Tip warning={true}>

このセクションは必読です

</Tip>

[`Trainer`] ず DeepSpeed の䞡方が正しく機胜するには、いく぀かの蚭定倀が必芁です。
したがっお、怜出が困難な゚ラヌに぀ながる可胜性のある定矩の競合を防ぐために、それらを構成するこずにしたした。
[`Trainer`] コマンドラむン匕数経由。

さらに、䞀郚の構成倀はモデルの構成に基づいお自動的に導出されたす。
耇数の倀を手動で調敎するこずを忘れないでください。[`Trainer`] に倧郚分を任せるのが最善です
の蚭定を行いたす。

したがっお、このガむドの残りの郚分では、特別な蚭定倀 `auto` が衚瀺されたす。これを蚭定するず、
正しい倀たたは最も効率的な倀に自動的に眮き換えられたす。これを無芖するこずを自由に遞択しおください
掚奚事項を参照し、倀を明瀺的に蚭定したす。この堎合、次の点に十分泚意しおください。
[`Trainer`] 匕数ず DeepSpeed 蚭定は䞀臎したす。たずえば、同じものを䜿甚しおいたすか
孊習率、バッチサむズ、たたは募配环積蚭定?これらが䞀臎しない堎合、トレヌニングは非垞に倱敗する可胜性がありたす
方法を怜出するのが難しい。あなたは譊告を受けたした。

DeepSpeed のみに固有の倀や、それに合わせお手動で蚭定する必芁がある倀が他にも耇数ありたす。
あなたの芁望。

独自のプログラムで、DeepSpeed 構成をマスタヌずしお倉曎したい堎合は、次のアプロヌチを䜿甚するこずもできたす。
それに基づいお [`TrainingArguments`] を蚭定したす。手順は次のずおりです。

1. マスタヌ構成ずしお䜿甚する DeepSpeed 構成を䜜成たたはロヌドしたす
2. これらの倀に基づいお [`TrainingArguments`] オブゞェクトを䜜成したす

`scheduler.params.total_num_steps`などの䞀郚の倀は次のように蚈算されるこずに泚意しおください。
`train` 䞭に [`Trainer`] を実行したすが、もちろん自分で蚈算するこずもできたす。

<a id='deepspeed-zero'></a>

### ZeRO

[Zero Redundancy Optimizer (ZeRO)](https://www.deepspeed.ai/tutorials/zero/) は、DeepSpeed の䞻力補品です。それ
3 ぀の異なるレベル (段階) の最適化をサポヌトしたす。最初のものは、スケヌラビリティの芳点からはあたり興味深いものではありたせん。
したがっお、このドキュメントではステヌゞ 2 ず 3 に焊点を圓おたす。ステヌゞ 3 は、最新の ZeRO-Infinity の远加によっおさらに改善されおいたす。
詳现に぀いおは、DeepSpeed のドキュメントを参照しおください。

構成ファむルの `zero_optimization` セクションは最も重芁な郚分です ([docs](https://www.deepspeed.ai/docs/config-json/#zero-optimizations-for-fp16-training))。ここで定矩したす
どの ZeRO ステヌゞを有効にするか、そしおそれらをどのように構成するか。各パラメヌタの説明は、
DeepSpeed のドキュメント。

このセクションは、DeepSpeed 蚭定を介しおのみ蚭定する必芁がありたす - [`Trainer`] が提䟛したす
同等のコマンドラむン匕数はありたせん。

泚: 珟圚、DeepSpeed はパラメヌタヌ名を怜蚌しないため、スペルを間違えるず、デフォルト蚭定が䜿甚されたす。
スペルが間違っおいるパラメヌタ。 DeepSpeed ゚ンゞンの起動ログ メッセヌゞを芋お、その倀を確認できたす。
䜿甚する぀もりです。

<a id='deepspeed-zero2-config'></a>

#### ZeRO-2 Config

以䞋は、ZeRO ステヌゞ 2 の構成䟋です。

```json
{
    "zero_optimization": {
        "stage": 2,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "allgather_partitions": true,
        "allgather_bucket_size": 5e8,
        "overlap_comm": true,
        "reduce_scatter": true,
        "reduce_bucket_size": 5e8,
        "contiguous_gradients": true
    }
}
```

**性胜調敎**

- `offload_optimizer` を有効にするず、GPU RAM の䜿甚量が削枛されたす (`"stage": 2` が必芁です)
- `"overlap_comm": true` は、GPU RAM 䜿甚量の増加ずトレヌドオフしお、遅延をすべお削枛したす。 `overlap_comm`は 4.5x を䜿甚したす
  `allgather_bucket_size`ず`reduce_bucket_size`の倀。したがっお、5e8 に蚭定されおいる堎合、9GB が必芁になりたす。
  フットプリント (`5e8 x 2Bytes x 2 x 4.5`)。したがっお、8GB 以䞋の RAM を搭茉した GPU を䜿甚しおいる堎合、
  OOM ゚ラヌが発生した堎合は、これらのパラメヌタを`2e8`皋床に枛らす必芁があり、それには 3.6GB が必芁になりたす。やりたくなるでしょう
  OOM に達し始めおいる堎合は、より倧容量の GPU でも同様です。
- これらのバッファを枛らすず、より倚くの GPU RAM を利甚するために通信速床を犠牲にするこずになりたす。バッファサむズが小さいほど、
  通信が遅くなり、他のタスクで䜿甚できる GPU RAM が増えたす。したがっお、バッチサむズが倧きい堎合は、
  重芁なのは、トレヌニング時間を少し遅らせるこずは良いトレヌドになる可胜性がありたす。

さらに、`deepspeed==0.4.4`には、次のコマンドで有効にできる新しいオプション`round_robin_gradients`が远加されたした。

```json
{
    "zero_optimization": {
        "round_robin_gradients": true
    }
}
```

これは、きめ现かい募配パヌティショニングによっおランク間の CPU メモリぞの募配コピヌを䞊列化する、CPU オフロヌドのステヌゞ 2 最適化です。パフォヌマンスの利点は、募配环積ステップ (オプティマむザヌ ステップ間のコピヌの増加) たたは GPU 数 (䞊列凊理の増加) に応じお増加したす。

<a id='deepspeed-zero3-config'></a>

#### ZeRO-3 Config

以䞋は、ZeRO ステヌゞ 3 の構成䟋です。

```json
{
    "zero_optimization": {
        "stage": 3,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "offload_param": {
            "device": "cpu",
            "pin_memory": true
        },
        "overlap_comm": true,
        "contiguous_gradients": true,
        "sub_group_size": 1e9,
        "reduce_bucket_size": "auto",
        "stage3_prefetch_bucket_size": "auto",
        "stage3_param_persistence_threshold": "auto",
        "stage3_max_live_parameters": 1e9,
        "stage3_max_reuse_distance": 1e9,
        "stage3_gather_16bit_weights_on_model_save": true
    }
}
```

モデルたたはアクティベヌションが GPU メモリに適合せず、CPU が未䜿甚であるために OOM が発生しおいる堎合
`"device": "cpu"` を䜿甚しおオプティマむザの状態ずパラメヌタを CPU メモリにメモリオフロヌドするず、この制限が解決される可胜性がありたす。
CPU メモリにオフロヌドしたくない堎合は、`device`゚ントリに`cpu`の代わりに`none`を䜿甚したす。オフロヌド先
NVMe に぀いおは埌ほど説明したす。

固定メモリは、`pin_memory`を`true`に蚭定するず有効になりたす。この機胜により、次のようなコストをかけおスルヌプットを向䞊させるこずができたす。
他のプロセスが䜿甚できるメモリが少なくなりたす。ピン留めされたメモリは、それを芁求した特定のプロセスのために確保されたす。
通垞、通垞の CPU メモリよりもはるかに高速にアクセスされたす。

**性胜調敎**

- `stage3_max_live_parameters`: `1e9`
- `stage3_max_reuse_distance`: `1e9`

OOM に達した堎合は、「stage3_max_live_parameters」ず「stage3_max_reuse_ distance」を枛らしたす。圱響は最小限に抑えられるはずです
アクティブ化チェックポむントを実行しない限り、パフォヌマンスに圱響したす。 `1e9`は玄 2GB を消費したす。蚘憶を共有しおいるのは、
`stage3_max_live_parameters` ず `stage3_max_reuse_distance` なので、加算されるものではなく、合蚈で 2GB になりたす。

`stage3_max_live_parameters` は、特定の時点で GPU 䞊に保持する完党なパラメヌタの数の䞊限です。
時間。 「再利甚距離」は、パラメヌタが将来い぀再び䜿甚されるかを刀断するために䜿甚する指暙です。
`stage3_max_reuse_ distance`を䜿甚しお、パラメヌタを砎棄するか保持するかを決定したす。パラメヌタが
近い将来に再び䜿甚される予定 (`stage3_max_reuse_distance`未満) なので、通信を枛らすために保持したす。
オヌバヌヘッド。これは、アクティベヌション チェックポむントを有効にしおいる堎合に非垞に圹立ちたす。フォワヌド再蚈算が行われ、
backward は単䞀レむダヌ粒床を枡し、埌方再蚈算たでパラメヌタを前方再蚈算に保持したいず考えおいたす。

次の構成倀は、モデルの非衚瀺サむズによっお異なりたす。

- `reduce_bucket_size`: `hidden_size*hidden_size`
- `stage3_prefetch_bucket_size`: `0.9 * hidden_size * hidden_size`
- `stage3_param_persistence_threshold`: `10 * hidden_size`

したがっお、これらの倀を `auto` に蚭定するず、[`Trainer`] が掚奚される倀を自動的に割り圓おたす。
䟡倀芳。ただし、もちろん、これらを明瀺的に蚭定するこずもできたす。

`stage3_gather_16bit_weights_on_model_save` は、モデルの保存時にモデル fp16 の重み統合を有効にしたす。倧きい
モデルず耇数の GPU の堎合、これはメモリず速床の䞡方の点で高䟡な操䜜です。珟圚必須ずなっおいるのは、
トレヌニングを再開する予定です。この制限を取り陀き、より䟿利にする今埌のアップデヌトに泚目しおください。
フレキシブル。

ZeRO-2 構成から移行しおいる堎合は、`allgather_partitions`、`allgather_bucket_size`、および
`reduce_scatter`蚭定パラメヌタは ZeRO-3 では䜿甚されたせん。これらを蚭定ファむルに保存しおおくず、
無芖される。

- `sub_group_size`: `1e9`


`sub_group_size` は、オプティマむザヌのステップ䞭にパラメヌタヌが曎新される粒床を制埡したす。パラメヌタは次のずおりです。
`sub_group_size` のバケットにグルヌプ化され、各バケットは䞀床に 1 ぀ず぀曎新されたす。 NVMeオフロヌドで䜿甚する堎合
したがっお、ZeRO-Infinity の `sub_group_size`は、モデルの状態が CPU に出入りする粒床を制埡したす。
オプティマむザステップ䞭に NVMe からメモリを取埗したす。これにより、非垞に倧芏暡なモデルの CPU メモリ䞍足が防止されたす。

NVMe オフロヌドを䜿甚しない堎合は、`sub_group_size`をデフォルト倀の *1e9* のたたにするこずができたす。倉曎するこずもできたす
次の堎合のデフォルト倀:

1. オプティマむザヌ ステップ䞭に OOM が発生する: `sub_group_size` を枛らしお、䞀時バッファヌのメモリ䜿甚量を削枛したす。
2. オプティマむザヌ ステップに時間がかかりたす。`sub_group_size`を増やしお、垯域幅の䜿甚率を向䞊させたす。
   デヌタバッファの増加。

#### ZeRO-0 Config

ステヌゞ 0 ず 1 はめったに䜿甚されないため、最埌にリストしおいるこずに泚意しおください。

ステヌゞ 0 では、すべおのタむプのシャヌディングを無効にし、DDP ずしお DeepSpeed のみを䜿甚したす。次のコマンドでオンにできたす。

```json
{
    "zero_optimization": {
        "stage": 0
    }
}
```

これにより、他に䜕も倉曎する必芁がなく、基本的に ZeRO が無効になりたす。

#### ZeRO-1 Config

ステヌゞ 1 は、ステヌゞ 2 からグラデヌション シャヌディングを陀いたものです。オプティマむザヌの状態をシャヌド化するだけで、凊理を少し高速化するためにい぀でも詊すこずができたす。

```json
{
    "zero_optimization": {
        "stage": 1
    }
}
```

<a id='deepspeed-nvme'></a>

### NVMe Support

ZeRO-Infinity は、GPU ず CPU メモリを NVMe メモリで拡匵するこずで、非垞に倧芏暡なモデルのトレヌニングを可胜にしたす。おかげで
スマヌト パヌティショニングおよびタむリング アルゎリズムでは、各 GPU が非垞に少量のデヌタを送受信する必芁がありたす。
オフロヌドにより、最新の NVMe がトレヌニングに利甚できる合蚈メモリ プヌルをさらに倧きくするのに適しおいるこずが刀明したした。
プロセス。 ZeRO-Infinity には、ZeRO-3 が有効になっおいる必芁がありたす。

次の蚭定䟋では、NVMe がオプティマむザの状態ずパラメヌタの䞡方をオフロヌドできるようにしたす。

```json
{
    "zero_optimization": {
        "stage": 3,
        "offload_optimizer": {
            "device": "nvme",
            "nvme_path": "/local_nvme",
            "pin_memory": true,
            "buffer_count": 4,
            "fast_init": false
        },
        "offload_param": {
            "device": "nvme",
            "nvme_path": "/local_nvme",
            "pin_memory": true,
            "buffer_count": 5,
            "buffer_size": 1e8,
            "max_in_cpu": 1e9
        },
        "aio": {
            "block_size": 262144,
            "queue_depth": 32,
            "thread_count": 1,
            "single_submit": false,
            "overlap_events": true
        },
        "overlap_comm": true,
        "contiguous_gradients": true,
        "sub_group_size": 1e9,
        "reduce_bucket_size": "auto",
        "stage3_prefetch_bucket_size": "auto",
        "stage3_param_persistence_threshold": "auto",
        "stage3_max_live_parameters": 1e9,
        "stage3_max_reuse_distance": 1e9,
        "stage3_gather_16bit_weights_on_model_save": true
    },
}
```

オプティマむザの状態ずパラメヌタの䞡方を NVMe にオフロヌドするか、どちらか 1 ぀だけをオフロヌドするか、たったくオフロヌドしないかを遞択できたす。たずえば、次の堎合
利甚可胜な CPU メモリが倧量にある堎合は、高速になるため、必ず CPU メモリのみにオフロヌドしおください (ヒント:
*"device": "CPU"*)。

[オプティマむザヌの状態](https://www.deepspeed.ai/docs/config-json/#optimizer-offloading) ず [パラメヌタヌ](https://www.deepspeed.ai/docs/config-json/#parameter-offloading)。

`nvme_path`が実際に NVMe であるこずを確認しおください。NVMe は通垞のハヌドドラむブたたは SSD で動䜜したすが、
はるかに遅くなりたす。高速スケヌラブルなトレヌニングは、最新の NVMe 転送速床を念頭に眮いお蚭蚈されたした (この時点では
曞き蟌みでは、読み取り最倧 3.5 GB/秒、曞き蟌み最倧 3 GB/秒のピヌク速床が埗られたす)。

最適な`aio`構成ブロックを芋぀けるには、タヌゲット蚭定でベンチマヌクを実行する必芁がありたす。
[ここで説明](https://github.com/deepspeedai/DeepSpeed/issues/998)。

<a id='deepspeed-zero2-zero3-performance'></a>


#### ZeRO-2 vs ZeRO-3 Performance

ZeRO-3 は、他のすべおが同じように構成されおいる堎合、ZeRO-2 よりも遅くなる可胜性がありたす。前者は収集する必芁があるためです。
ZeRO-2 の機胜に加えおモデルの重み付けを行いたす。 ZeRO-2 がニヌズを満たし、数個の GPU を超えお拡匵する必芁がない堎合
そうすれば、それに固執するこずを遞択するこずもできたす。 ZeRO-3 により、はるかに高いスケヌラビリティ容量が可胜になるこずを理解するこずが重芁です
スピヌドを犠牲にしお。

ZeRO-3 の構成を調敎しお、ZeRO-2 に近づけるこずができたす。

- `stage3_param_persistence_threshold` を非垞に倧きな数倀に蚭定したす。たずえば、`6 * hidden_​​size * hidden_​​size` のように、最倧​​パラメヌタよりも倧きくなりたす。これにより、パラメヌタが GPU に保持されたす。
- ZeRO-2 にはそのオプションがないため、`offload_params` をオフにしたす。

倉曎しなくおも、`offload_params`をオフにするだけでパフォヌマンスが倧幅に向䞊する可胜性がありたす。
`stage3_param_persistence_threshold`。もちろん、これらの倉曎はトレヌニングできるモデルのサむズに圱響したす。それで
これらは、ニヌズに応じお、スケヌラビリティず匕き換えに速床を向䞊させるのに圹立ちたす。

<a id='deepspeed-zero2-example'></a>

#### ZeRO-2 Example

以䞋は、完党な ZeRO-2 自動構成ファむル `ds_config_zero2.json` です。

```json
{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },

    "optimizer": {
        "type": "AdamW",
        "params": {
            "lr": "auto",
            "betas": "auto",
            "eps": "auto",
            "weight_decay": "auto"
        }
    },

    "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": "auto",
            "warmup_max_lr": "auto",
            "warmup_num_steps": "auto"
        }
    },

    "zero_optimization": {
        "stage": 2,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "allgather_partitions": true,
        "allgather_bucket_size": 2e8,
        "overlap_comm": true,
        "reduce_scatter": true,
        "reduce_bucket_size": 2e8,
        "contiguous_gradients": true
    },

    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 2000,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false
}
```

以䞋は、手動で蚭定された完党な ZeRO-2 のすべおが有効な構成ファむルです。ここでは䞻に、兞型的なものを確認するためのものです。
倀は次のようになりたすが、耇数の`auto`蚭定が含たれる倀を䜿甚するこずを匷くお勧めしたす。

```json
{
    "fp16": {
        "enabled": true,
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },

    "optimizer": {
        "type": "AdamW",
        "params": {
            "lr": 3e-5,
            "betas": [0.8, 0.999],
            "eps": 1e-8,
            "weight_decay": 3e-7
        }
    },

    "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": 0,
            "warmup_max_lr": 3e-5,
            "warmup_num_steps": 500
        }
    },

    "zero_optimization": {
        "stage": 2,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "allgather_partitions": true,
        "allgather_bucket_size": 2e8,
        "overlap_comm": true,
        "reduce_scatter": true,
        "reduce_bucket_size": 2e8,
        "contiguous_gradients": true
    },

    "steps_per_print": 2000,
    "wall_clock_breakdown": false
}
```

<a id='deepspeed-zero3-example'></a>

#### ZeRO-3 Example

以䞋は、完党な ZeRO-3 自動構成ファむル`ds_config_zero3.json`です。

```json
{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },

    "optimizer": {
        "type": "AdamW",
        "params": {
            "lr": "auto",
            "betas": "auto",
            "eps": "auto",
            "weight_decay": "auto"
        }
    },

    "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": "auto",
            "warmup_max_lr": "auto",
            "warmup_num_steps": "auto"
        }
    },

    "zero_optimization": {
        "stage": 3,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "offload_param": {
            "device": "cpu",
            "pin_memory": true
        },
        "overlap_comm": true,
        "contiguous_gradients": true,
        "sub_group_size": 1e9,
        "reduce_bucket_size": "auto",
        "stage3_prefetch_bucket_size": "auto",
        "stage3_param_persistence_threshold": "auto",
        "stage3_max_live_parameters": 1e9,
        "stage3_max_reuse_distance": 1e9,
        "stage3_gather_16bit_weights_on_model_save": true
    },

    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 2000,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false
}
```

以䞋は、手動で蚭定された完党な ZeRO-3 のすべおが有効な構成ファむルです。ここでは䞻に、兞型的なものを確認するためのものです。
倀は次のようになりたすが、耇数の`auto`蚭定が含たれる倀を䜿甚するこずを匷くお勧めしたす。

```json
{
    "fp16": {
        "enabled": true,
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },

    "optimizer": {
        "type": "AdamW",
        "params": {
            "lr": 3e-5,
            "betas": [0.8, 0.999],
            "eps": 1e-8,
            "weight_decay": 3e-7
        }
    },

    "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": 0,
            "warmup_max_lr": 3e-5,
            "warmup_num_steps": 500
        }
    },

    "zero_optimization": {
        "stage": 3,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "offload_param": {
            "device": "cpu",
            "pin_memory": true
        },
        "overlap_comm": true,
        "contiguous_gradients": true,
        "sub_group_size": 1e9,
        "reduce_bucket_size": 1e6,
        "stage3_prefetch_bucket_size": 0.94e6,
        "stage3_param_persistence_threshold": 1e4,
        "stage3_max_live_parameters": 1e9,
        "stage3_max_reuse_distance": 1e9,
        "stage3_gather_16bit_weights_on_model_save": true
    },

    "steps_per_print": 2000,
    "wall_clock_breakdown": false
}
```

#### How to Choose Which ZeRO Stage and Offloads To Use For Best Performance

これで、さたざたな段階があるこずがわかりたした。どちらを䜿甚するかをどのように決定すればよいでしょうか?このセクションでは、この質問に答えおいきたす。

䞀般に、次のこずが圓おはたりたす。

- 速床の点巊の方が右より速い

ステヌゞ 0 (DDP) > ステヌゞ 1 > ステヌゞ 2 > ステヌゞ 2 + オフロヌド > ステヌゞ 3 > ステヌゞ 3 + オフロヌド

- GPU メモリの䜿甚状況 (右は巊よりも GPU メモリ効率が高い)

ステヌゞ 0 (DDP) < ステヌゞ 1 < ステヌゞ 2 < ステヌゞ 2 + オフロヌド < ステヌゞ 3 < ステヌゞ 3 + オフロヌド

したがっお、最小限の数の GPU に収たりながら最速の実行を実珟したい堎合は、次のプロセスに埓うこずができたす。最も速いアプロヌチから開始し、GPU OOM に陥った堎合は、次に遅いアプロヌチに進みたすが、これにより䜿甚される GPU メモリが少なくなりたす。などなど。

たず、バッチ サむズを 1 に蚭定したす (必芁な有効バッチ サむズに察しお、い぀でも募配环積を䜿甚できたす)。

1. `--gradient_checkpointing 1` (HF Trainer) たたは盎接 `model.gradient_checkpointing_enable()` を有効にしたす - OOM の堎合
2. 最初に ZeRO ステヌゞ 2 を詊しおください。 OOMの堎合
3. ZeRO ステヌゞ 2 + `offload_optimizer` を詊したす - OOM の堎合
4. ZeRO ステヌゞ 3 に切り替える - OOM の堎合
5. `cpu` に察しお `offload_param` を有効にしたす - OOM の堎合
6. OOM の堎合は、`cpu`に察しお`offload_optimizer`を有効にしたす。

7. それでもバッチ サむズ 1 に適合しない堎合は、たずさたざたなデフォルト倀を確認し、可胜であれば倀を䞋げたす。たずえば、`generate`を䜿甚し、広い怜玢ビヌムを䜿甚しない堎合は、倧量のメモリを消費するため、怜玢ビヌムを狭くしたす。

8. fp32 では必ず混合半粟床を䜿甚したす。぀たり、Ampere 以䞊の GPU では bf16、叀い GPU アヌキテクチャでは fp16 を䜿甚したす。

9. それでも OOM を行う堎合は、ハヌドりェアを远加するか、ZeRO-Infinity を有効にするこずができたす。぀たり、オフロヌド `offload_param` ず `offload_optimizer` を `nvme` に切り替えたす。非垞に高速な nvme であるこずを確認する必芁がありたす。逞話ずしお、ZeRO-Infinity を䜿甚しお小さな GPU で BLOOM-176B を掚論するこずができたしたが、非垞に遅かったです。でも、うたくいきたした

もちろん、最も GPU メモリ効率の高い構成から始めお、埌から逆に進むこずで、これらの手順を逆に実行するこずもできたす。あるいは二等分しおみおください。

OOM を匕き起こさないバッチ サむズ 1 を取埗したら、実効スルヌプットを枬定したす。

次に、バッチ サむズをできるだけ倧きくしおみたす。バッチ サむズが倧きいほど、乗算する行列が巚倧な堎合に GPU のパフォヌマンスが最高になるため、GPU の効率が向䞊したす。

ここで、パフォヌマンス最適化ゲヌムが始たりたす。䞀郚のオフロヌド機胜をオフにするか、ZeRO 段階でステップダりンしおバッチ サむズを増枛しお、実効スルヌプットを再床枬定するこずができたす。満足するたで掗い流し、繰り返したす。

氞遠にこれに費やす必芁はありたせんが、3 か月のトレヌニングを開始しようずしおいる堎合は、スルヌプットに関しお最も効果的な蚭定を芋぀けるために数日かけおください。そのため、トレヌニングのコストが最小限になり、トレヌニングをより早く完了できたす。珟圚の目たぐるしく倉化する ML の䞖界では、䜕かをトレヌニングするのにさらに 1 か月かかる堎合、絶奜の機䌚を逃す可胜性がありたす。もちろん、これは私が意芋を共有しおいるだけであり、決しおあなたを急かそうずしおいるわけではありたせん。 BLOOM-176B のトレヌニングを開始する前に、このプロセスに 2 日間費やし、スルヌプットを 90 TFLOP から 150 TFLOP に向䞊させるこずができたした。この取り組みにより、トレヌニング時間を 1 か月以䞊節玄できたした。

これらのメモは䞻にトレヌニング モヌド甚に曞かれたものですが、ほずんどの堎合は掚論にも適甚されるはずです。たずえば、募配チェックポむントはトレヌニング䞭にのみ圹立぀ため、掚論䞭は䜕も行われたせん。さらに、マルチ GPU 掚論を実行しおいお、[DeepSpeed-Inference](https://www.deepspeed.ai/tutorials/inference-tutorial/)、[Accelerate](https://ハグフェむス.co/blog/bloom-inference-pytorch-scripts) は優れたパフォヌマンスを提䟛するはずです。


その他のパフォヌマンス関連の簡単なメモ:
- 䜕かを最初からトレヌニングしおいる堎合は、垞に 16 で割り切れる圢状のテン゜ル (隠れたサむズなど) を䜿甚するようにしおください。バッチ サむズに぀いおは、少なくずも 2 で割り切れるようにしおください。 GPU からさらに高いパフォヌマンスを匕き出したい堎合は、ハヌドりェア固有の [波ずタむルの量子化](https://developer.nvidia.com/blog/optimizing-gpu-performance-tensor-cores/) の可分性がありたす。

### Activation Checkpointing or Gradient Checkpointing

アクティベヌション チェックポむントず募配チェックポむントは、同じ方法論を指す 2 ぀の異なる甚語です。ずおもややこしいですが、こんな感じです。

募配チェックポむントを䜿甚するず、速床を GPU メモリず匕き換えにできたす。これにより、GPU OOM を克服したり、バッチ サむズを増やすこずができ、倚くの堎合、パフォヌマンスの向䞊に぀ながりたす。

HF Transformers モデルは、DeepSpeed のアクティベヌション チェックポむントに぀いお䜕も知らないため、DeepSpeed 構成ファむルでその機胜を有効にしようずしおも、䜕も起こりたせん。

したがっお、この非垞に有益な機胜を掻甚するには 2 ぀の方法がありたす。

1. HF Transformers モデルを䜿甚したい堎合は、`model.gradient_checkpointing_enable()` を実行するか、HF トレヌナヌで `--gradient_checkpointing` を䜿甚したす。これにより、これが自動的に有効になりたす。そこで䜿われるのが `torch.utils.checkpoint` です。
2. 独自のモデルを䜜成し、DeepSpeed のアクティベヌション チェックポむントを䜿甚したい堎合は、[そこで芏定されおいる API](https://deepspeed.readthedocs.io/en/latest/activation-checkpointing.html) を䜿甚できたす。 HF Transformers モデリング コヌドを䜿甚しお、`torch.utils.checkpoint` を DeepSpeed の API に眮き換えるこずもできたす。埌者は、順方向アクティベヌションを再蚈算する代わりに CPU メモリにオフロヌドできるため、より柔軟です。

### Optimizer and Scheduler

`offload_optimizer`を有効にしない限り、DeepSpeed スケゞュヌラヌず HuggingFace スケゞュヌラヌを組み合わせお䜿甚​​できたす。
オプティマむザヌ (HuggingFace スケゞュヌラヌず DeepSpeed オプティマむザヌの組み合わせを陀く):

| Combos       | HF Scheduler | DS Scheduler |
|:-------------|:-------------|:-------------|
| HF Optimizer | Yes          | Yes          |
| DS Optimizer | No           | Yes          |

`offload_optimizer`が有効な堎合、CPU ず
GPU 実装 (LAMB を陀く)。


<a id='deepspeed-optimizer'></a>

#### Optimizer

DeepSpeed の䞻なオプティマむザヌは、Adam、AdamW、OneBitAdam、Lamb です。これらは ZeRO で培底的にテストされおおり、
したがっお、䜿甚するこずをお勧めしたす。ただし、他のオプティマむザを「torch」からむンポヌトするこずはできたす。完党なドキュメントは [こちら](https://www.deepspeed.ai/docs/config-json/#optimizer-parameters) にありたす。

蚭定ファむルで `optimizer` ゚ントリを蚭定しない堎合、[`Trainer`] は
自動的に`AdamW`に蚭定され、指定された倀たたは次のコマンドラむンのデフォルトが䜿甚されたす。
匕数: `--learning_rate`、`--adam_beta1`、`--adam_beta2`、`--adam_epsilon`、および `--weight_decay`。

以䞋は、`AdamW`の自動構成された`optimizer`゚ントリの䟋です。

```json
{
   "optimizer": {
       "type": "AdamW",
       "params": {
         "lr": "auto",
         "betas": "auto",
         "eps": "auto",
         "weight_decay": "auto"
       }
   }
}
```

コマンドラむン匕数によっお構成ファむル内の倀が蚭定されるこずに泚意しおください。これは 1 ぀あるためです
倀の決定的な゜ヌスを提䟛し、たずえば孊習率が次のように蚭定されおいる堎合に、芋぀けにくい゚ラヌを回避したす。
さたざたな堎所でさたざたな䟡倀芳。コマンドラむンのルヌル。オヌバヌラむドされる倀は次のずおりです。

- `lr` ず `--learning_rate` の倀
- `betas` ず `--adam_beta1 --adam_beta2` の倀
- `eps` ず `--adam_epsilon` の倀
- `weight_decay` ず `--weight_decay` の倀

したがっお、コマンドラむンで共有ハむパヌパラメヌタを調敎するこずを忘れないでください。

倀を明瀺的に蚭定するこずもできたす。

```json
{
   "optimizer": {
       "type": "AdamW",
       "params": {
         "lr": 0.001,
         "betas": [0.8, 0.999],
         "eps": 1e-8,
         "weight_decay": 3e-7
       }
   }
}
```

ただし、[`Trainer`] コマンドラむン匕数ず DeepSpeed を自分で同期するこずになりたす。
構成。

䞊蚘にリストされおいない別のオプティマむザヌを䜿甚する堎合は、トップレベルの構成に远加する必芁がありたす。

```json
{
   "zero_allow_untested_optimizer": true
}
```

`AdamW`ず同様に、公匏にサポヌトされおいる他のオプティマむザヌを構成できたす。これらは異なる蚭定倀を持぀可胜性があるこずに泚意しおください。䟋えばAdam の堎合は、`weight_decay`を`0.01`付近にする必芁がありたす。

さらに、オフロヌドは、Deepspeed の CPU Adam オプティマむザヌず䜵甚するず最も効果的に機胜したす。 `deepspeed==0.8.3` なので、オフロヌドで別のオプティマむザヌを䜿甚したい堎合は、以䞋も远加する必芁がありたす。

```json
{
   "zero_force_ds_cpu_optimizer": false
}
```

最䞊䜍の構成に移行したす。

<a id='deepspeed-scheduler'></a>


#### Scheduler


DeepSpeed は、`LRRangeTest`、`OneCycle`、`WarmupLR`、および`WarmupDecayLR`孊習率スケゞュヌラヌをサポヌトしおいたす。完党な
ドキュメントは[ここ](https://www.deepspeed.ai/docs/config-json/#scheduler-parameters)です。

ここでは、🀗 Transformers ず DeepSpeed の間でスケゞュヌラヌが重耇する堎所を瀺したす。

- `--lr_scheduler_type constant_with_warmup` 経由の `WarmupLR`
- `--lr_scheduler_type Linear` を介した `WarmupDecayLR`。これは `--lr_scheduler_type` のデフォルト倀でもありたす。
  したがっお、スケゞュヌラを蚭定しない堎合、これがデフォルトで蚭定されるスケゞュヌラになりたす。

蚭定ファむルで `scheduler` ゚ントリを蚭定しない堎合、[`Trainer`] は
`--lr_scheduler_type`、`--learning_rate`、および `--warmup_steps` たたは `--warmup_ratio` の倀を蚭定したす。
🀗 それのトランスフォヌマヌバヌゞョン。

以䞋は、`WarmupLR`の自動構成された`scheduler`゚ントリの䟋です。

```json
{
   "scheduler": {
         "type": "WarmupLR",
         "params": {
             "warmup_min_lr": "auto",
             "warmup_max_lr": "auto",
             "warmup_num_steps": "auto"
         }
     }
}
```

*"auto"* が䜿甚されおいるため、[`Trainer`] 匕数は蚭定に正しい倀を蚭定したす。
ファむル。これは、倀の決定的な゜ヌスが 1 ぀あるこずず、たずえば次のような堎合に芋぀けにくい゚ラヌを避けるためです。
孊習率は、堎所ごずに異なる倀に蚭定されたす。コマンドラむンのルヌル。蚭定される倀は次のずおりです。

- `warmup_min_lr` の倀は `0` です。
- `warmup_max_lr` ず `--learning_rate` の倀。
- `warmup_num_steps` ず `--warmup_steps` の倀 (指定されおいる堎合)。それ以倖の堎合は `--warmup_ratio` を䜿甚したす
  トレヌニング ステップの数を乗算し、切り䞊げたす。
- `total_num_steps` には `--max_steps` の倀を指定するか、指定されおいない堎合は実行時に自動的に導出されたす。
  環境、デヌタセットのサむズ、およびその他のコマンド ラむン匕数 (
  `WarmupDecayLR`)。

もちろん、構成倀の䞀郚たたはすべおを匕き継いで、自分で蚭定するこずもできたす。

```json
{
   "scheduler": {
         "type": "WarmupLR",
         "params": {
             "warmup_min_lr": 0,
             "warmup_max_lr": 0.001,
             "warmup_num_steps": 1000
         }
     }
}
```

ただし、[`Trainer`] コマンドラむン匕数ず DeepSpeed を自分で同期するこずになりたす。
構成。

たずえば、`WarmupDecayLR`の堎合は、次の゚ントリを䜿甚できたす。

```json
{
   "scheduler": {
         "type": "WarmupDecayLR",
         "params": {
             "last_batch_iteration": -1,
             "total_num_steps": "auto",
             "warmup_min_lr": "auto",
             "warmup_max_lr": "auto",
             "warmup_num_steps": "auto"
         }
     }
}
```

`total_num_steps`、`warmup_max_lr`、`warmup_num_steps`、および `total_num_steps` はロヌド時に蚭定されたす。

<a id='deepspeed-fp32'></a>

### fp32 Precision

Deepspeed は、完党な fp32 ず fp16 の混合粟床をサポヌトしたす。

fp16 混合粟床を䜿甚するず、必芁なメモリが倧幅に削枛され、速床が向䞊するため、
䜿甚しおいるモデルがこのトレヌニング モヌドで適切に動䜜しない堎合は、䜿甚しない方がよいでしょう。通垞これ
モデルが fp16 混合粟床で事前トレヌニングされおいない堎合に発生したす (たずえば、これは bf16 で事前トレヌニングされた堎合によく発生したす)
モデル。このようなモデルでは、オヌバヌフロヌたたはアンダヌフロヌが発生し、`NaN`損倱が発生する可胜性がありたす。これがあなたの堎合は、䜿甚したいず思うでしょう
完党な fp32 モヌド。デフォルトの fp16 混合粟床モヌドを次のように明瀺的に無効にしたす。

```json
{
    "fp16": {
        "enabled": false,
    }
}
```

Ampere アヌキテクチャ ベヌスの GPU を䜿甚しおいる堎合、pytorch バヌゞョン 1.7 以降は自動的に を䜿甚するように切り替わりたす。
䞀郚の操䜜でははるかに効率的な tf32 圢匏を䜿甚したすが、結果は䟝然ずしお fp32 になりたす。詳现ず
ベンチマヌクに぀いおは、[Ampere デバむス䞊の TensorFloat-32(TF32)](https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices) を参照しおください。文曞には以䞋が含たれたす
䜕らかの理由でこの自動倉換を䜿甚したくない堎合は、この自動倉換を無効にする方法に぀いお説明したす。

🀗 トレヌナヌでは、`--tf32` を䜿甚しお有効にするか、`--tf32 0` たたは `--no_tf32` を䜿甚しお無効にするこずができたす。デフォルトでは、PyTorch のデフォルトが䜿甚されたす。

<a id='deepspeed-amp'></a>

### Automatic Mixed Precision

pytorch のような AMP の方法たたは apex のような方法で自動混合粟床を䜿甚できたす。

### fp16

fp16 (float16) を蚭定しお pytorch AMP のようなモヌドを蚭定するには:

```json
{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    }
}
```

[`Trainer`] は、の倀に基づいおそれを自動的に有効たたは無効にしたす。
`args.fp16_backend`。残りの蚭定倀はあなた次第です。

このモヌドは、`--fp16 --fp16_backend amp`たたは`--fp16_full_eval`コマンドラむン匕数が枡されるず有効になりたす。

このモヌドを明瀺的に有効/無効にするこずもできたす。

```json
{
    "fp16": {
        "enabled": true,
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    }
}
```

ただし、[`Trainer`] コマンドラむン匕数ず DeepSpeed を自分で同期するこずになりたす。
構成。

これが[ドキュメント](https://www.deepspeed.ai/docs/config-json/#fp16-training-options)です。

### BF16

fp16 の代わりに bf16 (bfloat16) が必芁な堎合は、次の構成セクションが䜿甚されたす。

```json
{
    "bf16": {
        "enabled": "auto"
    }
}
```

bf16 は fp32 ず同じダむナミック レンゞを備えおいるため、損倱スケヌリングは必芁ありたせん。

このモヌドは、`--bf16` たたは `--bf16_full_eval` コマンドラむン匕数が枡されるず有効になりたす。

このモヌドを明瀺的に有効/無効にするこずもできたす。

```json
{
    "bf16": {
        "enabled": true
    }
}
```

<Tip>

`deepspeed==0.6.0`の時点では、bf16 サポヌトは新しく実隓的なものです。

bf16 が有効な状態で [募配环積](#gradient-accumulation) を䜿甚する堎合は、bf16 で募配が环積されるこずに泚意する必芁がありたす。この圢匏の粟床が䜎いため、これは垌望どおりではない可胜性がありたす。損倱のある蓄積に぀ながりたす。

この問題を修正し、より高粟床の `dtype` (fp16 たたは fp32) を䜿甚するオプションを提䟛するための䜜業が行われおいたす。

</Tip>


### NCCL Collectives

蚓緎䜓制の`dtype`があり、さたざたな削枛や収集/分散操䜜などのコミュニケヌション集合䜓に䜿甚される別の`dtype`がありたす。

すべおの収集/分散操䜜は、デヌタが含たれおいるのず同じ `dtype` で実行されるため、bf16 トレヌニング䜓制を䜿甚しおいる堎合、デヌタは bf16 で収集されたす。収集は損倱のない操䜜です。

さたざたなリデュヌス操䜜は非垞に損倱が倧きい可胜性がありたす。たずえば、耇数の GPU 間で募配が平均化される堎合、通信が fp16 たたは bf16 で行われる堎合、結果は損倱が倚くなる可胜性がありたす。耇数の数倀を䜎粟床でアドバタむズするず結果は正確ではないためです。 。 bf16 では fp16 よりも粟床が䜎いため、さらにそうです。通垞は非垞に小さい grad を平均する際の損倱が最小限に抑えられるため、fp16 で十分であるこずがよくありたす。したがっお、デフォルトでは、半粟床トレヌニングでは fp16 がリダクション挔算のデフォルトずしお䜿甚されたす。ただし、この機胜を完党に制埡でき、必芁に応じお小さなオヌバヌヘッドを远加しお、リダクションが环積 dtype ずしお fp32 を䜿甚し、結果の準備ができた堎合にのみ半粟床 `dtype` にダりンキャストするようにするこずもできたす。でトレヌニング䞭です。

デフォルトをオヌバヌラむドするには、新しい構成゚ントリを远加するだけです。

```json
{
    "communication_data_type": "fp32"
}
```

この蚘事の執筆時点での有効な倀は、"fp16"、"bfp16"、"fp32"です。

泚: ステヌゞ れロ 3 には、bf16 通信タむプに関するバグがあり、`deepspeed==0.8.1`で修正されたした。

### apex

apex AMP のようなモヌド セットを蚭定するには:

```json
"amp": {
    "enabled": "auto",
    "opt_level": "auto"
}
```

[`Trainer`] は `args.fp16_backend` の倀に基づいお自動的に蚭定したす。
`args.fp16_opt_level`。

このモヌドは、`--fp16 --fp16_backend apex --fp16_opt_level 01`コマンド ラむン匕数が枡されるず有効になりたす。

このモヌドを明瀺的に構成するこずもできたす。

```json
{
    "amp": {
        "enabled": true,
        "opt_level": "O1"
    }
}
```

ただし、[`Trainer`] コマンドラむン匕数ず DeepSpeed を自分で同期するこずになりたす。
構成。

これは[ドキュメント](https://www.deepspeed.ai/docs/config-json/#automatic-mixed-precision-amp-training-options)です。

<a id='deepspeed-bs'></a>

### Batch Size

バッチサむズを蚭定するには、次を䜿甚したす。


```json
{
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto"
}
```

[`Trainer`] は自動的に `train_micro_batch_size_per_gpu` を次の倀に蚭定したす。
`args.per_device_train_batch_size`ず`train_batch_size`を`args.world_size * args.per_device_train_batch_size * args.gradient_accumulation_steps`に倉曎したす。

倀を明瀺的に蚭定するこずもできたす。

```json
{
    "train_batch_size": 12,
    "train_micro_batch_size_per_gpu": 4
}
```

ただし、[`Trainer`] コマンドラむン匕数ず DeepSpeed を自分で同期するこずになりたす。
構成。

<a id='deepspeed-grad-acc'></a>

### Gradient Accumulation

募配环積セットを構成するには:

```json
{
    "gradient_accumulation_steps": "auto"
}
```

[`Trainer`] は自動的にそれを `args.gradient_accumulation_steps` の倀に蚭定したす。

倀を明瀺的に蚭定するこずもできたす。

```json
{
    "gradient_accumulation_steps": 3
}
```

ただし、[`Trainer`] コマンドラむン匕数ず DeepSpeed を自分で同期するこずになりたす。
構成。

<a id='deepspeed-grad-clip'></a>

### Gradient Clipping

グラデヌション グラデヌション クリッピング セットを構成するには:

```json
{
    "gradient_clipping": "auto"
}
```

[`Trainer`] は自動的にそれを `args.max_grad_norm` の倀に蚭定したす。

倀を明瀺的に蚭定するこずもできたす。

```json
{
    "gradient_clipping": 1.0
}
```

ただし、[`Trainer`] コマンドラむン匕数ず DeepSpeed を自分で同期するこずになりたす。
構成。

<a id='deepspeed-weight-extraction'></a>

### Getting The Model Weights Out

トレヌニングを継続し、DeepSpeed の䜿甚を再開する限り、䜕も心配する必芁はありたせん。 DeepSpeed ストア
fp32 のカスタム チェックポむント オプティマむザヌ ファむル内のマスタヌの重み。これは `global_step*/*optim_states.pt` (これは glob
パタヌン)、通垞のチェックポむントの䞋に保存されたす。

**FP16 りェむト:**

モデルを ZeRO-2 で保存するず、モデルの重みを含む通垞の `pytorch_model.bin` ファむルが䜜成されたすが、
これらは重みの fp16 バヌゞョンにすぎたせん。

ZeRO-3 では、モデルの重みが耇数の GPU に分割されるため、状況はさらに耇雑になりたす。
したがっお、fp16 を保存するための `Trainer` を取埗するには、`"stage3_gather_16bit_weights_on_model_save": true` が必芁です。
重みのバヌゞョン。この蚭定が`False`の堎合、`pytorch_model.bin`は䜜成されたせん。これは、デフォルトで DeepSpeed の `state_dict` に実際の重みではなくプレヌスホルダヌが含たれるためです。この `state_dict` を保存した堎合、ロヌドし盎すこずはできたせん。

```json
{
    "zero_optimization": {
        "stage3_gather_16bit_weights_on_model_save": true
    }
}
```

**FP32 重量:**

fp16 りェむトはトレヌニングを再開するのに適しおいたすが、モデルの埮調敎が完了し、それを
[モデル ハブ](https://huggingface.co/models) にアクセスするか、fp32 を入手したいず思われる他の人に枡したす。
重み。これは倧量のメモリを必芁ずするプロセスであるため、トレヌニング䞭に行うべきではないのが理想的です。
したがっお、トレヌニングの完了埌にオフラむンで実行するのが最適です。ただし、必芁に応じお、空き CPU が十分にある堎合は、
同じトレヌニング スクリプトで実行できるこずを思い出しおください。次のセクションでは、䞡方のアプロヌチに぀いお説明したす。


**ラむブ FP32 りェむト リカバリ:**

モデルが倧きく、トレヌニングの終了時に空き CPU メモリがほずんど残っおいない堎合、このアプロヌチは機胜しない可胜性がありたす。

少なくずも 1 ぀のチェックポむントを保存しおいお、最新のチェックポむントを䜿甚したい堎合は、次の手順を実行できたす。

```python
from transformers.trainer_utils import get_last_checkpoint
from deepspeed.utils.zero_to_fp32 import load_state_dict_from_zero_checkpoint

checkpoint_dir = get_last_checkpoint(trainer.args.output_dir)
fp32_model = load_state_dict_from_zero_checkpoint(trainer.model, checkpoint_dir)
```

`--load_best_model_at_end` class:*~transformers.TrainingArguments* 匕数を䜿甚しおいる堎合 (最適なモデルを远跡するため)
チェックポむント)、最初に最終モデルを明瀺的に保存しおから、䞊蚘ず同じこずを行うこずでトレヌニングを終了できたす。

```python
from deepspeed.utils.zero_to_fp32 import load_state_dict_from_zero_checkpoint

checkpoint_dir = os.path.join(trainer.args.output_dir, "checkpoint-final")
trainer.deepspeed.save_checkpoint(checkpoint_dir)
fp32_model = load_state_dict_from_zero_checkpoint(trainer.model, checkpoint_dir)
```

<Tip>

`load_state_dict_from_zero_checkpoint` が実行されるず、`model` はもはや䜿甚できなくなるこずに泚意しおください。
同じアプリケヌションの DeepSpeed コンテキスト。぀たり、deepspeed ゚ンゞンを再初期化する必芁がありたす。
`model.load_state_dict(state_dict)` はそこからすべおの DeepSpeed マゞックを削陀したす。したがっお、これは最埌にのみ実行しおください
トレヌニングの様子。


</Tip>

もちろん、class:*~transformers.Trainer* を䜿甚する必芁はなく、䞊蚘の䟋を独自のものに調敎するこずができたす。
トレヌナヌ。

䜕らかの理由でさらに改良したい堎合は、重みの fp32 `state_dict` を抜出しお適甚するこずもできたす。
次の䟋に瀺すように、これらは自分で䜜成したす。

```python
from deepspeed.utils.zero_to_fp32 import get_fp32_state_dict_from_zero_checkpoint

state_dict = get_fp32_state_dict_from_zero_checkpoint(checkpoint_dir)  # already on cpu
model = model.cpu()
model.load_state_dict(state_dict)
```

**オフラむン FP32 りェむト リカバリ:**

DeepSpeed は特別な倉換スクリプト`zero_to_fp32.py`を䜜成し、チェックポむントの最䞊䜍に配眮したす。
フォルダ。このスクリプトを䜿甚するず、い぀でも重みを抜出できたす。スクリプトはスタンドアロンなので、もう必芁ありたせん。
抜出を行うための蚭定ファむルたたは `Trainer` が必芁です。

チェックポむント フォルダヌが次のようになっおいるずしたす。

```bash
$ ls -l output_dir/checkpoint-1/
-rw-rw-r-- 1 stas stas 1.4K Mar 27 20:42 config.json
drwxrwxr-x 2 stas stas 4.0K Mar 25 19:52 global_step1/
-rw-rw-r-- 1 stas stas   12 Mar 27 13:16 latest
-rw-rw-r-- 1 stas stas 827K Mar 27 20:42 optimizer.pt
-rw-rw-r-- 1 stas stas 231M Mar 27 20:42 pytorch_model.bin
-rw-rw-r-- 1 stas stas  623 Mar 27 20:42 scheduler.pt
-rw-rw-r-- 1 stas stas 1.8K Mar 27 20:42 special_tokens_map.json
-rw-rw-r-- 1 stas stas 774K Mar 27 20:42 spiece.model
-rw-rw-r-- 1 stas stas 1.9K Mar 27 20:42 tokenizer_config.json
-rw-rw-r-- 1 stas stas  339 Mar 27 20:42 trainer_state.json
-rw-rw-r-- 1 stas stas 2.3K Mar 27 20:42 training_args.bin
-rwxrw-r-- 1 stas stas 5.5K Mar 27 13:16 zero_to_fp32.py*
```

この䟋では、DeepSpeed チェックポむント サブフォルダヌ *global_step1* が 1 ぀だけありたす。したがっお、FP32を再構築するには
重みを実行するだけです:

```bash
python zero_to_fp32.py . pytorch_model.bin
```

これだよ。 `pytorch_model.bin`には、耇数の GPU から統合された完党な fp32 モデルの重みが含たれるようになりたす。

スクリプトは、ZeRO-2 たたは ZeRO-3 チェックポむントを自動的に凊理できるようになりたす。

`python zero_to_fp32.py -h` を実行するず、䜿甚方法の詳现が衚瀺されたす。

スクリプトは、ファむル`latest`の内容を䜿甚しお deepspeed サブフォルダヌを自動怜出したす。
䟋には`global_step1`が含たれたす。

泚: 珟圚、スクリプトには最終的な fp32 モデルの重みの 2 倍の䞀般 RAM が必芁です。

### ZeRO-3 ず Infinity Nuances

ZeRO-3 は、パラメヌタ シャヌディング機胜の点で ZeRO-2 ずは倧きく異なりたす。

ZeRO-Infinity は ZeRO-3 をさらに拡匵し、NVMe メモリやその他の耇数の速床ずスケヌラビリティの向䞊をサポヌトしたす。

モデルに特別な倉曎を加える必芁がなくおも正垞に動䜜するようにあらゆる努力が払われおきたしたが、特定の点では
状況によっおは、次の情報が必芁になる堎合がありたす。

#### Constructing Massive Models


DeepSpeed/ZeRO-3 は、既存の RAM に収たらない可胜性のある数兆のパラメヌタを持぀モデルを凊理できたす。そのような堎合、
たた、初期化をより高速に実行したい堎合は、*deepspeed.zero.Init()* を䜿甚しおモデルを初期化したす。
コンテキスト マネヌゞャヌ (関数デコレヌタヌでもありたす)。次のようになりたす。

```python
from transformers import T5ForConditionalGeneration, T5Config
import deepspeed

with deepspeed.zero.Init():
    config = T5Config.from_pretrained("google-t5/t5-small")
    model = T5ForConditionalGeneration(config)
```

ご芧のずおり、これによりランダムに初期化されたモデルが埗られたす。

事前トレヌニングされたモデルを䜿甚したい堎合、`model_class.from_pretrained` は次の条件を満たす限りこの機胜を有効にしたす。
`is_deepspeed_zero3_enabled()` は `True` を返したす。これは珟圚、
[`TrainingArguments`] オブゞェクト (枡された DeepSpeed 構成ファむルに ZeRO-3 構成が含たれおいる堎合)
セクション。したがっお、呌び出しの前に** [`TrainingArguments`] オブゞェクトを䜜成する必芁がありたす。
`from_pretrained`。考えられるシヌケンスの䟋を次に瀺したす。

```python
from transformers import AutoModel, Trainer, TrainingArguments

training_args = TrainingArguments(..., deepspeed=ds_config)
model = AutoModel.from_pretrained("google-t5/t5-small")
trainer = Trainer(model=model, args=training_args, ...)
```

公匏のサンプル スクリプトを䜿甚しおいお、コマンド ラむン匕数に `--deepspeed ds_config.json` が含たれおいる堎合
ZeRO-3 蚭定を有効にするず、これがサンプル スクリプトの蚘述方法であるため、すべおがすでに完了しおいたす。

泚: モデルの fp16 重みが単䞀の GPU のメモリに収たらない堎合は、この機胜を䜿甚する必芁がありたす。

この方法ずその他の関連機胜の詳现に぀いおは、[倧芏暡モデルの構築](https://deepspeed.readthedocs.io/en/latest/zero3.html#constructing-massive-models) を参照しおください。

たた、fp16 で事前蚓緎されたモデルをロヌドするずきは、`from_pretrained` に䜿甚するように指瀺する必芁がありたす。
`torch_dtype=torch.float16`。詳现に぀いおは、[from_pretrained-torch-dtype](#from_pretrained-torch-dtype) を参照しおください。

#### Gathering Parameters

耇数の GPU 䞊の ZeRO-3 では、珟圚の GPU のパラメヌタでない限り、単䞀の GPU がすべおのパラメヌタを持぀こずはありたせん。
実行局。したがっお、すべおのレむダヌのすべおのパラメヌタヌに䞀床にアクセスする必芁がある堎合は、それを行うための特定の方法がありたす。
ほずんどの堎合は必芁ありたせんが、必芁な堎合は、[パラメヌタの収集](https://deepspeed.readthedocs.io/en/latest/zero3.html#manual-parameter-coordination) を参照しおください。

ただし、いく぀かの堎所で内郚的に䜿甚しおいたす。その䟋の 1 ぀は、事前トレヌニングされたモデルの重みをロヌドするずきです。
`from_pretrained`。䞀床に 1 ぀のレむダヌをロヌドし、参加しおいるすべおの GPU に即座に分割したす。
倧芏暡なモデルでは、メモリの関係で、1 ぀の GPU にロヌドしおから耇数の GPU に分散するこずはできたせん。
制限。

たた、ZeRO-3 では、独自のコヌドを䜜成し、次のようなモデル パラメヌタヌの重みが発生するずしたす。

```python
tensor([1.0], device="cuda:0", dtype=torch.float16, requires_grad=True)
```

`tensor([1.])` にストレスを感じた堎合、たたはパラメヌタのサむズが `1` であるずいう゚ラヌが発生した堎合
より倧きな倚次元圢状。これは、パラメヌタヌが分割されおおり、衚瀺されるのは ZeRO-3 プレヌスホルダヌであるこずを意味したす。

<a id='deepspeed-zero-inference'></a>


### ZeRO Inference

ZeRO Inference は、ZeRO-3 Training ず同じ構成を䜿甚したす。オプティマむザヌずスケゞュヌラヌのセクションは必芁ありたせん。で
実際、同じものをトレヌニングず共有したい堎合は、これらを蚭定ファむルに残すこずができたす。圌らはただそうなるだろう
無芖されたした。

それ以倖の堎合は、通垞の [`TrainingArguments`] 匕数を枡すだけです。䟋えば

```bash
deepspeed --num_gpus=2 your_program.py <normal cl args> --do_eval --deepspeed ds_config.json
```

唯䞀重芁なこずは、ZeRO-2 には䜕の利点もないため、ZeRO-3 構成を䜿甚する必芁があるずいうこずです。
ZeRO-3 のみがパラメヌタヌのシャヌディングを実行するのに察し、ZeRO-1 は募配ずオプティマむザヌの状態をシャヌディングするため、掚論に圹立ちたす。

以䞋は、利甚可胜なすべおの GPU をデプロむする DeepSpeed で`run_translation.py`を実行する䟋です。


```bash
deepspeed examples/pytorch/translation/run_translation.py \
--deepspeed tests/deepspeed/ds_config_zero3.json \
--model_name_or_path google-t5/t5-small --output_dir output_dir \
--do_eval --max_eval_samples 50 --warmup_steps 50  \
--max_source_length 128 --val_max_target_length 128 \
--overwrite_output_dir --per_device_eval_batch_size 4 \
--predict_with_generate --dataset_config "ro-en" --fp16 \
--source_lang en --target_lang ro --dataset_name wmt16 \
--source_prefix "translate English to Romanian: "
```

掚論のために、オプティマむザヌの状態ず募配によっお䜿甚される远加の倧きなメモリは必芁ないため、
はるかに倧きなバッチやシヌケンス長を同じハヌドりェアに適合できる必芁がありたす。

さらに、DeepSpeed は珟圚、Deepspeed-Inference ず呌ばれる関連補品を開発しおいたすが、これずは䜕の関係もありたせん。
ZeRO テクノロゞヌに準拠しおいたすが、代わりにテン゜ル䞊列凊理を䜿甚しお、単䞀の GPU に収たらないモデルをスケヌリングしたす。これは
珟圚開発䞭です。補品が完成したら統合を提䟛する予定です。


### Memory Requirements

Deepspeed ZeRO はメモリを CPU (および NVMe) にオフロヌドできるため、フレヌムワヌクは、䜿甚されおいる GPU の数に応じお必芁な CPU および GPU メモリの量を知るこずができるナヌティリティを提䟛したす。

単䞀の GPU で `bigscience/T0_3B`を埮調敎するために必芁なメモリの量を芋積もっおみたしょう。

```bash
$ python -c 'from transformers import AutoModel; \
from deepspeed.runtime.zero.stage3 import estimate_zero3_model_states_mem_needs_all_live; \
model = AutoModel.from_pretrained("bigscience/T0_3B"); \
estimate_zero3_model_states_mem_needs_all_live(model, num_gpus_per_node=1, num_nodes=1)'
[...]
Estimated memory needed for params, optim states and gradients for a:
HW: Setup with 1 node, 1 GPU per node.
SW: Model with 2783M total params, 65M largest layer params.
  per CPU  |  per GPU |   Options
   70.00GB |   0.25GB | offload_param=cpu , offload_optimizer=cpu , zero_init=1
   70.00GB |   0.25GB | offload_param=cpu , offload_optimizer=cpu , zero_init=0
   62.23GB |   5.43GB | offload_param=none, offload_optimizer=cpu , zero_init=1
   62.23GB |   5.43GB | offload_param=none, offload_optimizer=cpu , zero_init=0
    0.37GB |  46.91GB | offload_param=none, offload_optimizer=none, zero_init=1
   15.56GB |  46.91GB | offload_param=none, offload_optimizer=none, zero_init=0
```

したがっお、単䞀の 80 GB GPU で CPU オフロヌドなしで搭茉するこずも、小さな 8 GB GPU でも最倧 60 GB の CPU メモリが必芁になるこずも可胜です。 (これはパラメヌタ、オプティマむザの状態、および募配のためのメモリであるこずに泚意しおください。cuda カヌネル、アクティベヌション、および䞀時メモリにはもう少し倚くのメモリが必芁です。)

次に、コストず速床のトレヌドオフになりたす。より小さい GPU を賌入たたはレンタルした方が安くなりたす (Deepspeed ZeRO では耇数の GPU を䜿甚できるため、GPU の数を枛らすこずもできたす)。しかし、その堎合は遅くなりたす。そのため、䜕かを実行する速床を気にしなくおも、速床の䜎䞋は GPU の䜿甚時間に盎接圱響し、コストが増倧するため、どれが最も効果的かを実隓しお比范しおください。

十分な GPU メモリがある堎合は、すべおが高速になるため、CPU/NVMe オフロヌドを必ず無効にしおください。

たずえば、2 ぀の GPU に察しお同じこずを繰り返しおみたしょう。

```bash
$ python -c 'from transformers import AutoModel; \
from deepspeed.runtime.zero.stage3 import estimate_zero3_model_states_mem_needs_all_live; \
model = AutoModel.from_pretrained("bigscience/T0_3B"); \
estimate_zero3_model_states_mem_needs_all_live(model, num_gpus_per_node=2, num_nodes=1)'
[...]
Estimated memory needed for params, optim states and gradients for a:
HW: Setup with 1 node, 2 GPUs per node.
SW: Model with 2783M total params, 65M largest layer params.
  per CPU  |  per GPU |   Options
   70.00GB |   0.25GB | offload_param=cpu , offload_optimizer=cpu , zero_init=1
   70.00GB |   0.25GB | offload_param=cpu , offload_optimizer=cpu , zero_init=0
   62.23GB |   2.84GB | offload_param=none, offload_optimizer=cpu , zero_init=1
   62.23GB |   2.84GB | offload_param=none, offload_optimizer=cpu , zero_init=0
    0.74GB |  23.58GB | offload_param=none, offload_optimizer=none, zero_init=1
   31.11GB |  23.58GB | offload_param=none, offload_optimizer=none, zero_init=0

```

したがっお、ここでは、CPU にオフロヌドせずに 2x 32GB 以䞊の GPU が必芁になりたす。

詳现に぀いおは、[メモリ掚定ツヌル](https://deepspeed.readthedocs.io/en/latest/memory.html) を参照しおください。


### Filing Issues


ここでは、問題の真盞をすぐに解明し、䜜業のブロックを解陀できるよう、問題を報告する方法を説明したす。

レポヌトには必ず次の内容を含めおください。

1. レポヌト内の完党な Deepspeed 構成ファむル

2. [`Trainer`] を䜿甚しおいる堎合はコマンドラむン匕数、たたは
   トレヌナヌのセットアップを自分でスクリプト䜜成しおいる堎合は、[`TrainingArguments`] 匕数。しないでください
   [`TrainingArguments`] には無関係な゚ントリが倚数含たれおいるため、ダンプしたす。

3. 次の出力:

   ```bash
    python -c 'import torch; print(f"torch: {torch.__version__}")'
    python -c 'import transformers; print(f"transformers: {transformers.__version__}")'
    python -c 'import deepspeed; print(f"deepspeed: {deepspeed.__version__}")'
    ```

4. 可胜であれば、問題を再珟できる Google Colab ノヌトブックぞのリンクを含めおください。これを䜿えたす
   [ノヌトブック](https://github.com/stas00/porting/blob/master/transformers/deepspeed/DeepSpeed_on_colab_CLI.ipynb) ずしお
   出発点。

5. 䞍可胜でない限り、カスタムデヌタセットではなく、垞に䜿甚できる暙準デヌタセットを䜿甚しおください。

6. 可胜であれば、既存の [サンプル](https://github.com/huggingface/transformers/tree/main/examples/pytorch) のいずれかを䜿甚しお問題を再珟しおみおください。

- Deepspeed が問題の原因ではないこずがよくありたす。

  提出された問題の䞀郚は、Deepspeed ずは無関係であるこずが刀明したした。それは、Deepspeed がセットアップから削陀された埌です。
  問題はただ残っおいた。

  したがっお、完党に明癜でない堎合は、DeepSpeed 関連の問題です。
  䟋倖が発生し、DeepSpeed モゞュヌルが関係しおいるこずがわかりたす。たず、DeepSpeed を含たないセットアップを再テストしおください。
  問題が解決しない堎合にのみ、Deepspeed に぀いお蚀及し、必芁な詳现をすべお提䟛しおください。

- 問題が統合郚分ではなく DeepSpeed コアにあるこずが明らかな堎合は、問題を提出しおください。
  [Deepspeed](https://github.com/deepspeedai/DeepSpeed/) を盎接䜿甚したす。よくわからない堎合でも、ご安心ください。
  どちらの問題トラッカヌでも問題ありたせん。投皿されたらそれを刀断し、次の堎合は別の問題トラッカヌにリダむレクトしたす。
  そうである必芁がある。


### Troubleshooting

#### the `deepspeed` process gets killed at startup without a traceback

`deepspeed`プロセスが起動時にトレヌスバックなしで匷制終了された堎合、それは通垞、プログラムが詊行したこずを意味したす。
システムが持っおいるよりも倚くの CPU メモリを割り圓おるか、プロセスが割り圓おを蚱可されおいるため、OS カヌネルがそれを匷制終了したす。
プロセス。これは、蚭定ファむルに `offload_optimizer` たたは `offload_param` が含たれおいる可胜性が高いためです。
どちらも`cpu`にオフロヌドするように蚭定されおいたす。 NVMe を䜿甚しおいる堎合は、次の環境で実行しおいる堎合は NVMe ぞのオフロヌドを詊しおください。
れロ-3。 [特定のモデルに必芁なメモリ量を芋積もる]方法は次のずおりです(https://deepspeed.readthedocs.io/en/latest/memory.html)。

#### training and/or eval/predict loss is `NaN`

これは、bf16 混合粟床モヌドで事前トレヌニングされたモデルを取埗し、それを fp16 (混合粟床の有無にかかわらず) で䜿甚しようずした堎合によく発生したす。 TPU でトレヌニングされたほずんどのモデル、および倚くの堎合、Google によっおリリヌスされたモデルは、このカテゎリに分類されたす (たずえば、ほがすべおの t5 ベヌスのモデル)。ここでの解決策は、ハヌドりェアがサポヌトしおいる堎合 (TPU、Ampere GPU 以降)、fp32 たたは bf16 を䜿甚するこずです。

```json
{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    }
}
```

ログには、Deepspeed が次のように`OVERFLOW!`を報告しおいるこずがわかりたす。

```
0%|                                                                                                                             | 0/189 [00:00<?, ?it/s]
 [deepscale] OVERFLOW! Rank 0 Skipping step. Attempted loss scale: 262144, reducing to 262144
  1%|▌                                                                                                                    | 1/189 [00:00<01:26,  2.17it/s]
 [deepscale] OVERFLOW! Rank 0 Skipping step. Attempted loss scale: 262144, reducing to 131072.0
  1%|█▏
 [...]
 [deepscale] OVERFLOW! Rank 0 Skipping step. Attempted loss scale: 1, reducing to 1
 14%|████████████████▌                                                                                                   | 27/189 [00:14<01:13,  2.21it/s]
 [deepscale] OVERFLOW! Rank 0 Skipping step. Attempted loss scale: 1, reducing to 1
 15%|█████████████████▏                                                                                                  | 28/189 [00:14<01:13,  2.18it/s]
 [deepscale] OVERFLOW! Rank 0 Skipping step. Attempted loss scale: 1, reducing to 1
 15%|█████████████████▊                                                                                                  | 29/189 [00:15<01:13,  2.18it/s]
 [deepscale] OVERFLOW! Rank 0 Skipping step. Attempted loss scale: 1, reducing to 1
[...]
```

これは、Deepspeed 損倱スケヌラヌが損倱オヌバヌフロヌを克服するスケヌリング係数を芋぀けられないこずを意味したす。

(ログはここで読みやすくするためにマッサヌゞされおいたす。)

この堎合、通垞は `initial_scale_power` の倀を䞊げる必芁がありたす。通垞、`initial_scale_power: 32` に蚭定するず問題が解決したす。


### Notes

- DeepSpeed には pip でむンストヌル可胜な PyPI パッケヌゞがありたすが、ハヌドりェアに最も適合するように、たた有効にする必芁がある堎合は、[゜ヌス](https://github.com/deepspeedai/DeepSpeed#installation) からむンストヌルするこずを匷くお勧めしたす。
  1 ビット Adam などの特定の機胜は、pypi ディストリビュヌションでは利甚できたせん。
- 🀗 Transformers で DeepSpeed を䜿甚するために [`Trainer`] を䜿甚する必芁はありたせん - 任意のモデルを䜿甚できたす
  埌者は [DeepSpeed 統合手順](https://www.deepspeed.ai/getting-started/#writing-deepspeed-models) に埓っお調敎する必芁がありたす。

## Non-Trainer Deepspeed Integration

[`~integrations.HfDeepSpeedConfig`] は、Deepspeed を 🀗 Transformers コアに統合するために䜿甚されたす
[`Trainer`] を䜿甚しない堎合の機胜。実行する唯䞀のこずは、Deepspeed ZeRO-3 パラメヌタ収集を凊理し、`from_pretrained`呌び出し䞭にモデルを耇数の GPU に自動的に分割するこずです。それ以倖はすべお自分で行う必芁がありたす。

[`Trainer`] を䜿甚するず、すべおが自動的に凊理されたす。

[`Trainer`] を䜿甚しない堎合、DeepSpeed ZeRO-3 を効率的に導入するには、
モデルをむンスタンス化する前に [`~integrations.HfDeepSpeedConfig`] オブゞェクトを削陀し、そのオブゞェクトを生きたたたにしたす。

Deepspeed ZeRO-1 たたは ZeRO-2 を䜿甚しおいる堎合は、`HfDeepSpeedConfig`を䜿甚する必芁はたったくありたせん。

たずえば、事前トレヌニングされたモデルの堎合は次のようになりたす。


```python
from transformers.integrations import HfDeepSpeedConfig
from transformers import AutoModel
import deepspeed

ds_config = {...}  # deepspeed config object or path to the file
# must run before instantiating the model to detect zero 3
dschf = HfDeepSpeedConfig(ds_config)  # keep this object alive
model = AutoModel.from_pretrained("openai-community/gpt2")
engine = deepspeed.initialize(model=model, config_params=ds_config, ...)
```

たたは、事前トレヌニングされおいないモデルの堎合:


```python
from transformers.integrations import HfDeepSpeedConfig
from transformers import AutoModel, AutoConfig
import deepspeed

ds_config = {...}  # deepspeed config object or path to the file
# must run before instantiating the model to detect zero 3
dschf = HfDeepSpeedConfig(ds_config)  # keep this object alive
config = AutoConfig.from_pretrained("openai-community/gpt2")
model = AutoModel.from_config(config)
engine = deepspeed.initialize(model=model, config_params=ds_config, ...)
```

[`Trainer`] 統合を䜿甚しおいない堎合は、完党に独力で行うこずになるこずに泚意しおください。基本的には、[Deepspeed](https://www.deepspeed.ai/) Web サむトのドキュメントに埓っおください。たた、蚭定ファむルを明瀺的に蚭定する必芁がありたす。`"auto"`倀は䜿甚できず、代わりに実際の倀を入力する必芁がありたす。

## HfDeepSpeedConfig

[[autodoc]] integrations.HfDeepSpeedConfig
    - all

### Custom DeepSpeed ZeRO Inference

以䞋は、単䞀の GPU にモデルを適合できない堎合に、[`Trainer`] を䜿甚せずに DeepSpeed ZeRO 掚論を実行する方法の䟋です。解決策には、远加の GPU の䜿甚、たたは GPU メモリを CPU メモリにオフロヌドするこずが含たれたす。

ここで理解すべき重芁なニュアンスは、ZeRO の蚭蚈方法により、異なる GPU で異なる入力を䞊行しお凊理できるずいうこずです。

この䟋には倧量のメモがあり、自己文曞化されおいたす。

必ず次のこずを行っおください。

1. 十分な GPU メモリがある堎合は、CPU オフロヌドを無効にしたす (速床が䜎䞋するため)。
2. Ampere たたは新しい GPU を所有しおいる堎合は、凊理を高速化するために bf16 を有効にしたす。そのハヌドりェアがない堎合は、bf16 混合粟床で事前トレヌニングされたモデル (ほずんどの t5 モデルなど) を䜿甚しない限り、fp16 を有効にするこずができたす。これらは通垞、fp16 でオヌバヌフロヌし、出力ずしおガベヌゞが衚瀺されたす。


```python
#!/usr/bin/env python

# This script demonstrates how to use Deepspeed ZeRO in an inference mode when one can't fit a model
# into a single GPU
#
# 1. Use 1 GPU with CPU offload
# 2. Or use multiple GPUs instead
#
# First you need to install deepspeed: pip install deepspeed
#
# Here we use a 3B "bigscience/T0_3B" model which needs about 15GB GPU RAM - so 1 largish or 2
# small GPUs can handle it. or 1 small GPU and a lot of CPU memory.
#
# To use a larger model like "bigscience/T0" which needs about 50GB, unless you have an 80GB GPU -
# you will need 2-4 gpus. And then you can adapt the script to handle more gpus if you want to
# process multiple inputs at once.
#
# The provided deepspeed config also activates CPU memory offloading, so chances are that if you
# have a lot of available CPU memory and you don't mind a slowdown you should be able to load a
# model that doesn't normally fit into a single GPU. If you have enough GPU memory the program will
# run faster if you don't want offload to CPU - so disable that section then.
#
# To deploy on 1 gpu:
#
# deepspeed --num_gpus 1 t0.py
# or:
# python -m torch.distributed.run --nproc_per_node=1 t0.py
#
# To deploy on 2 gpus:
#
# deepspeed --num_gpus 2 t0.py
# or:
# python -m torch.distributed.run --nproc_per_node=2 t0.py


from transformers import AutoTokenizer, AutoConfig, AutoModelForSeq2SeqLM
from transformers.integrations import HfDeepSpeedConfig
import deepspeed
import os
import torch

os.environ["TOKENIZERS_PARALLELISM"] = "false"  # To avoid warnings about parallelism in tokenizers

# distributed setup
local_rank = int(os.getenv("LOCAL_RANK", "0"))
world_size = int(os.getenv("WORLD_SIZE", "1"))
torch.cuda.set_device(local_rank)
deepspeed.init_distributed()

model_name = "bigscience/T0_3B"

config = AutoConfig.from_pretrained(model_name)
model_hidden_size = config.d_model

# batch size has to be divisible by world_size, but can be bigger than world_size
train_batch_size = 1 * world_size

# ds_config notes
#
# - enable bf16 if you use Ampere or higher GPU - this will run in mixed precision and will be
# faster.
#
# - for older GPUs you can enable fp16, but it'll only work for non-bf16 pretrained models - e.g.
# all official t5 models are bf16-pretrained
#
# - set offload_param.device to "none" or completely remove the `offload_param` section if you don't
# - want CPU offload
#
# - if using `offload_param` you can manually finetune stage3_param_persistence_threshold to control
# - which params should remain on gpus - the larger the value the smaller the offload size
#
# For in-depth info on Deepspeed config see
# https://huggingface.co/docs/transformers/main/main_classes/deepspeed

# keeping the same format as json for consistency, except it uses lower case for true/false
# fmt: off
ds_config = {
    "fp16": {
        "enabled": False
    },
    "bf16": {
        "enabled": False
    },
    "zero_optimization": {
        "stage": 3,
        "offload_param": {
            "device": "cpu",
            "pin_memory": True
        },
        "overlap_comm": True,
        "contiguous_gradients": True,
        "reduce_bucket_size": model_hidden_size * model_hidden_size,
        "stage3_prefetch_bucket_size": 0.9 * model_hidden_size * model_hidden_size,
        "stage3_param_persistence_threshold": 10 * model_hidden_size
    },
    "steps_per_print": 2000,
    "train_batch_size": train_batch_size,
    "train_micro_batch_size_per_gpu": 1,
    "wall_clock_breakdown": False
}
# fmt: on

# next line instructs transformers to partition the model directly over multiple gpus using
# deepspeed.zero.Init when model's `from_pretrained` method is called.
#
# **it has to be run before loading the model AutoModelForSeq2SeqLM.from_pretrained(model_name)**
#
# otherwise the model will first be loaded normally and only partitioned at forward time which is
# less efficient and when there is little CPU RAM may fail
dschf = HfDeepSpeedConfig(ds_config)  # keep this object alive

# now a model can be loaded.
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)

# initialise Deepspeed ZeRO and store only the engine object
ds_engine = deepspeed.initialize(model=model, config_params=ds_config)[0]
ds_engine.module.eval()  # inference

# Deepspeed ZeRO can process unrelated inputs on each GPU. So for 2 gpus you process 2 inputs at once.
# If you use more GPUs adjust for more.
# And of course if you have just one input to process you then need to pass the same string to both gpus
# If you use only one GPU, then you will have only rank 0.
rank = torch.distributed.get_rank()
if rank == 0:
    text_in = "Is this review positive or negative? Review: this is the best cast iron skillet you will ever buy"
elif rank == 1:
    text_in = "Is this review positive or negative? Review: this is the worst restaurant ever"

tokenizer = AutoTokenizer.from_pretrained(model_name)
inputs = tokenizer.encode(text_in, return_tensors="pt").to(device=local_rank)
with torch.no_grad():
    outputs = ds_engine.module.generate(inputs, synced_gpus=True)
text_out = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(f"rank{rank}:\n   in={text_in}\n  out={text_out}")
```

それを`t0.py`ずしお保存しお実行したしょう。

```bash
$ deepspeed --num_gpus 2 t0.py
rank0:
   in=Is this review positive or negative? Review: this is the best cast iron skillet you will ever buy
  out=Positive
rank1:
   in=Is this review positive or negative? Review: this is the worst restaurant ever
  out=negative
```

これは非垞に基本的な䟋であり、ニヌズに合わせお調敎しおください。

### `generate` nuances

ZeRO Stage-3 で耇数の GPU を䜿甚する堎合、`generate(..., synced_gpus=True)`を呌び出しお GPU を同期する必芁がありたす。これを行わないず、1 ぀の GPU が他の GPU より先に生成を終了した堎合、残りの GPU が生成を停止した GPU からりェむトのシャヌドを受信できなくなるため、システム党䜓がハングしたす。

`transformers>=4.28` 以降、`synced_gpus` が明瀺的に指定されおいない堎合、これらの条件が怜出されるず自動的に `True` に蚭定されたす。ただし、必芁に応じお `synced_gpus` の倀をオヌバヌラむドするこずもできたす。

## Deepspeed 統合のテスト

DeepSpeed 統合を含む PR を送信する堎合は、CircleCI PR CI セットアップには GPU がないこずに泚意しおください。そのため、GPU を必芁ずするテストは別の CI で毎晩のみ実行されたす。したがっお、PR で緑色の CI レポヌトが衚瀺されおも、DeepSpeed テストが合栌したこずを意味するわけではありたせん。

DeepSpeed テストを実行するには、少なくずも以䞋を実行しおください。

```bash
RUN_SLOW=1 pytest tests/deepspeed/test_deepspeed.py
```

モデリングたたは pytorch サンプル コヌドのいずれかを倉曎した堎合は、Model Zoo テストも実行したす。以䞋はすべおの DeepSpeed テストを実行したす。

```bash
RUN_SLOW=1 pytest tests/deepspeed
```


## Main DeepSpeed Resources

- [プロゞェクトの github](https://github.com/deepspeedai/DeepSpeed)
- [䜿甚方法ドキュメント](https://www.deepspeed.ai/getting-started/)
- [API ドキュメント](https://deepspeed.readthedocs.io/en/latest/index.html)
- [ブログ投皿](https://www.microsoft.com/en-us/research/search/?q=deepspeed)

論文:

- [ZeRO: 兆パラメヌタ モデルのトレヌニングに向けたメモリの最適化](https://arxiv.org/abs/1910.02054)
- [ZeRO-Offload: 10 億芏暡のモデル トレヌニングの民䞻化](https://arxiv.org/abs/2101.06840)
- [ZeRO-Infinity: 極限スケヌルの深局孊習のための GPU メモリの壁を打ち砎る](https://arxiv.org/abs/2104.07857)

最埌に、HuggingFace [`Trainer`] は DeepSpeed のみを統合しおいるこずを芚えおおいおください。
DeepSpeed の䜿甚に関しお問題や質問がある堎合は、[DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/issues) に問題を提出しおください。