forked from chenzomi12/AISystem
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path08.srt
1272 lines (954 loc) · 20.3 KB
/
08.srt
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
1
00:00:00,000 --> 00:00:04,025
字幕生成:qiaokai 字幕校对:A是传奇
2
00:00:05,127 --> 00:00:06,135
Hello,大家好
3
00:00:06,135 --> 00:00:08,135
欢乐的时光过得特别快
4
00:00:08,135 --> 00:00:10,135
又是时候说拜拜
5
00:00:14,995 --> 00:00:15,995
我是ZOMI
6
00:00:15,995 --> 00:00:18,995
今天来到推理型的模型优化
7
00:00:18,995 --> 00:00:21,995
计算图优化里面的最后一个内容了
8
00:00:21,995 --> 00:00:24,995
所以我今天的内容会排得特别的密
9
00:00:24,995 --> 00:00:27,995
然后我也会讲得特别的快了一点点
10
00:00:27,995 --> 00:00:29,995
首先今天主要是去讲讲
11
00:00:29,995 --> 00:00:30,995
Extend的内容
12
00:00:30,995 --> 00:00:33,995
还有Layer跟Memory的一些优化
13
00:00:33,995 --> 00:00:35,995
其实这些很多的相关的知识
14
00:00:35,995 --> 00:00:37,995
简单的理解一下就好了
15
00:00:37,995 --> 00:00:39,995
更多的是希望各个同事
16
00:00:39,995 --> 00:00:40,995
能够在工作当中
17
00:00:40,995 --> 00:00:41,995
跟我一起去发现
18
00:00:41,995 --> 00:00:42,995
更多不同的可能性
19
00:00:42,995 --> 00:00:44,995
或者更多优化的方式
20
00:00:44,995 --> 00:00:46,995
可以看到在整个工作流程当中
21
00:00:46,995 --> 00:00:49,995
现在来到了第二个和第三个步骤里面
22
00:00:49,995 --> 00:00:51,995
当然他们没有一个明确的界限之分
23
00:00:51,995 --> 00:00:53,995
基本上都可以通用的
24
00:00:53,995 --> 00:00:55,995
而Path的管理也是非常重要
25
00:00:55,995 --> 00:00:57,995
在这里面我推荐大家去看看
26
00:00:57,995 --> 00:01:00,995
AI编译里面的前端优化里面相关的内容
27
00:01:00,995 --> 00:01:01,995
虽然大家可以看到
28
00:01:01,995 --> 00:01:05,995
前端优化AI编译看了确实太少了
29
00:01:05,995 --> 00:01:07,995
你甚至就我自己不断的点来点去
30
00:01:07,995 --> 00:01:08,995
换了不同电脑
31
00:01:08,995 --> 00:01:09,995
可能在有时候出差的时候
32
00:01:09,995 --> 00:01:10,995
在北京点了
33
00:01:10,995 --> 00:01:11,995
有时候在深圳点了
34
00:01:11,995 --> 00:01:12,995
确实点来点去
35
00:01:12,995 --> 00:01:14,995
特别多了已经点的变成
36
00:01:17,799 --> 00:01:21,799
现在来到计算图详解的第二个内容
37
00:01:21,799 --> 00:01:23,799
第二个内容就是其他图的优化
38
00:01:23,799 --> 00:01:25,799
可以看到其他图的优化了很多
39
00:01:25,799 --> 00:01:27,799
就是针对不同的AI框架
40
00:01:27,799 --> 00:01:28,799
他可能没有直接的实现
41
00:01:28,799 --> 00:01:30,799
而是通过一些特殊的一些组合
42
00:01:30,799 --> 00:01:32,799
更多的是跟硬件或者特殊的网络模型
43
00:01:32,799 --> 00:01:35,927
或者特殊的网络模型,特殊的领域相关的
44
00:01:35,927 --> 00:01:36,927
看几个
45
00:01:36,927 --> 00:01:38,927
就是假设是Layer Norm的融合
46
00:01:38,927 --> 00:01:40,927
还有PReLU的替换
47
00:01:40,927 --> 00:01:41,927
Matmul的转变
48
00:01:41,927 --> 00:01:43,927
还有Binary跟Eltwise
49
00:01:43,927 --> 00:01:45,927
最后还有Reduce
50
00:01:45,927 --> 00:01:46,927
还有Global Pooling
51
00:01:46,927 --> 00:01:47,927
所以确实特别多
52
00:01:47,927 --> 00:01:49,927
看看具体的图
53
00:01:49,927 --> 00:01:52,927
这里面就不一个一个的去给大家展开了
54
00:01:52,927 --> 00:01:55,513
实际上像有些算子
55
00:01:55,513 --> 00:01:56,513
假设ReLU加Mul
56
00:01:56,513 --> 00:01:57,513
然后加Eltwise Sum
57
00:01:57,513 --> 00:01:58,513
然后加ReLU这种方式
58
00:01:58,513 --> 00:02:00,513
如果遇到这种图
59
00:02:00,513 --> 00:02:02,513
直接变成一个PReLU就行了
60
00:02:02,513 --> 00:02:03,513
当然了
61
00:02:03,513 --> 00:02:04,513
如果引擎里面
62
00:02:04,513 --> 00:02:06,513
推理引擎里面的没有PReLU这个算子
63
00:02:06,513 --> 00:02:08,513
也可以把它拆分成
64
00:02:08,513 --> 00:02:10,513
这堆算子的一个具体的实现
65
00:02:10,513 --> 00:02:12,513
就可以代替掉PReLU了
66
00:02:12,513 --> 00:02:14,513
所以说这里面没有一个统一的界限
67
00:02:14,513 --> 00:02:18,513
更多的是根据具体底层有什么算子
68
00:02:18,513 --> 00:02:20,513
就提供什么优化的Path
69
00:02:20,513 --> 00:02:21,513
而不是优化的Path
70
00:02:21,513 --> 00:02:22,513
我随便写
71
00:02:22,513 --> 00:02:23,513
你写推理引擎的人
72
00:02:23,513 --> 00:02:24,513
写Kernel的人
73
00:02:24,513 --> 00:02:25,513
你就随便自己写
74
00:02:25,513 --> 00:02:28,513
是有一个非常良好的合作关系
75
00:02:28,513 --> 00:02:29,513
才能够把整个推理引擎
76
00:02:29,513 --> 00:02:31,513
做到极致性能的优化
77
00:02:31,513 --> 00:02:34,513
下面像可以看到MatMul
78
00:02:34,513 --> 00:02:35,513
它确实有两个Transpose
79
00:02:35,513 --> 00:02:38,513
但实际上有些推理引擎里面
80
00:02:38,513 --> 00:02:39,513
它就已经把数的数据
81
00:02:39,513 --> 00:02:41,513
自动的做了一个Transpose
82
00:02:41,513 --> 00:02:43,513
这个时候可以减少一个数据的
83
00:02:43,513 --> 00:02:45,513
搬运的过程当中
84
00:02:45,513 --> 00:02:47,513
但还有很多像这种BinaryMul
85
00:02:47,513 --> 00:02:48,513
还有BinaryAdd
86
00:02:48,513 --> 00:02:51,513
就可以换成Eltwise Sum
87
00:02:51,513 --> 00:02:53,513
这种特殊的方式
88
00:02:54,701 --> 00:02:57,701
下面来看一个比较特殊
89
00:02:57,701 --> 00:02:59,701
ZOMI觉得最近也是比较有意思
90
00:02:59,701 --> 00:03:01,701
或者应该是去年年底吧
91
00:03:01,701 --> 00:03:02,701
今年年初
92
00:03:02,701 --> 00:03:03,701
去年年底
93
00:03:03,701 --> 00:03:05,701
现在已经是23年了
94
00:03:06,701 --> 00:03:07,701
有时候我在想
95
00:03:07,701 --> 00:03:09,701
有没有可能你在看这个视频的时候
96
00:03:09,701 --> 00:03:10,701
已经到24 25年的时候
97
00:03:10,701 --> 00:03:11,701
然后你发现
98
00:03:11,701 --> 00:03:13,701
我怎么还在看22年的视频
99
00:03:13,701 --> 00:03:14,701
或者23年的视频
100
00:03:15,701 --> 00:03:18,701
确实这个文章是23年发的
101
00:03:18,701 --> 00:03:20,701
它叫做FlashAttention
102
00:03:20,701 --> 00:03:22,701
它里面就对Attention
103
00:03:22,701 --> 00:03:23,701
做了一个特殊的优化
104
00:03:23,701 --> 00:03:26,701
下面看一下具体的图
105
00:03:26,701 --> 00:03:27,701
文章里面铺出来的图
106
00:03:27,701 --> 00:03:29,701
简单的去解读一下
107
00:03:29,701 --> 00:03:32,701
像现在大家用的非常多的
108
00:03:32,701 --> 00:03:33,701
Attention或者Transformer的
109
00:03:33,701 --> 00:03:35,701
一些网络模型的层
110
00:03:35,701 --> 00:03:37,701
但是Attention确实很少
111
00:03:37,701 --> 00:03:39,701
在推理引擎里面去应用
112
00:03:39,701 --> 00:03:41,701
确实像Attention层或者Transformer层了
113
00:03:41,701 --> 00:03:43,701
它没有跑得像卷积层
114
00:03:43,701 --> 00:03:44,701
这么快也没有经过
115
00:03:44,701 --> 00:03:46,701
那么多的特殊的优化
116
00:03:46,701 --> 00:03:48,701
那卷积的特殊的优化
117
00:03:48,701 --> 00:03:50,701
将会在下一个内容里面
118
00:03:50,701 --> 00:03:51,701
Kernel的执行
119
00:03:51,701 --> 00:03:53,701
或者具体的Runtime里面
120
00:03:53,701 --> 00:03:54,701
去给大家介绍的
121
00:03:54,701 --> 00:03:55,701
这里面看一下
122
00:03:55,701 --> 00:03:56,701
FlashAttention里面
123
00:03:56,701 --> 00:03:58,701
具体做了哪些工作
124
00:03:59,202 --> 00:04:00,202
其实知道
125
00:04:00,202 --> 00:04:02,202
在Attention或者Transformer里面
126
00:04:02,202 --> 00:04:06,202
大部分都是算QKV
127
00:04:06,202 --> 00:04:09,202
通过QKV这三个矩阵不断的相乘
128
00:04:09,202 --> 00:04:11,202
就得到Transformer
129
00:04:11,202 --> 00:04:12,202
或者Multi head-Attention这个层
130
00:04:12,202 --> 00:04:15,202
接着下一个网络模型
131
00:04:15,202 --> 00:04:16,202
就是算Softmax
132
00:04:16,202 --> 00:04:19,202
那Softmax在这里面就简称SM
133
00:04:19,202 --> 00:04:21,202
不要误解
134
00:04:21,202 --> 00:04:22,202
这里不是
135
00:04:35,000 --> 00:04:38,000
这里面就有一个SM去算QKV
136
00:04:38,000 --> 00:04:40,000
可以看到假设AI引擎
137
00:04:40,000 --> 00:04:42,000
会跑在具体的一些芯片里面
138
00:04:42,000 --> 00:04:44,000
具体的一些加速芯片
139
00:04:44,000 --> 00:04:47,000
大部分都不会有太多的一些SM
140
00:04:47,000 --> 00:04:49,000
SM确实里面的容量非常有限
141
00:04:49,000 --> 00:04:51,000
于是就会对矩阵
142
00:04:51,000 --> 00:04:53,000
分块来进行计算
143
00:04:53,000 --> 00:04:54,000
那这个Loop
144
00:04:54,000 --> 00:04:56,000
大家可以去看一下
145
00:04:56,000 --> 00:04:58,000
AI编译器里面的有一节内容
146
00:04:58,000 --> 00:04:59,000
就是Kernel的优化
147
00:04:59,000 --> 00:05:01,000
或者后端的优化里面就会讲
148
00:05:01,000 --> 00:05:02,000
为什么要装Loop
149
00:05:02,000 --> 00:05:05,000
然后怎么对这些进行一个切片
150
00:05:05,000 --> 00:05:06,000
这里面回到
151
00:05:06,000 --> 00:05:08,000
FlashAttention的一个内容里面
152
00:05:08,000 --> 00:05:10,000
看到K
153
00:05:10,000 --> 00:05:11,000
假设就会把一些
154
00:05:11,000 --> 00:05:13,000
取出一小块进行计算
155
00:05:13,000 --> 00:05:14,000
那像这种Q
156
00:05:14,000 --> 00:05:16,000
也可以取出一小块进行计算
157
00:05:16,000 --> 00:05:18,000
那计算完之后
158
00:05:18,000 --> 00:05:19,000
QKV要相乘
159
00:05:19,000 --> 00:05:20,000
相乘完之后
160
00:05:20,000 --> 00:05:22,000
再给Softmax进行一个运行运算的
161
00:05:22,000 --> 00:05:24,000
但是Softmax里面
162
00:05:24,000 --> 00:05:25,000
就会把数据摊平
163
00:05:25,000 --> 00:05:27,000
摊成一条进行一个计算
164
00:05:27,000 --> 00:05:29,000
因为Softmax是接受一个
165
00:05:29,000 --> 00:05:31,000
vector进行计算的
166
00:05:31,000 --> 00:05:32,000
如果是这样的话
167
00:05:32,000 --> 00:05:34,000
就算得非常慢了
168
00:05:34,000 --> 00:05:36,000
于是作者就在FlashAttention里面
169
00:05:36,000 --> 00:05:37,000
就提到了
170
00:05:37,000 --> 00:05:39,000
我通过滚动的方式
171
00:05:39,000 --> 00:05:41,000
去计算我的Softmax
172
00:05:41,000 --> 00:05:42,000
去计算这个SM
173
00:05:42,000 --> 00:05:45,000
使得我的速度就进一步去提升
174
00:05:45,000 --> 00:05:47,000
算完一块QKV
175
00:05:47,000 --> 00:05:49,000
再给到Softmax的结果进行重排
176
00:05:49,000 --> 00:05:52,000
通过这种新颖的计算方式
177
00:05:52,000 --> 00:05:53,000
使得Attention
178
00:05:53,000 --> 00:05:55,000
在GPT-2里面
179
00:05:55,000 --> 00:05:58,000
有了接近7倍的提升了
180
00:05:58,000 --> 00:05:59,000
这个可不得了
181
00:05:59,000 --> 00:06:00,000
大家要知道
182
00:06:00,000 --> 00:06:02,000
训练一个GPT-3的时间
183
00:06:02,000 --> 00:06:04,000
要80多天
184
00:06:04,000 --> 00:06:06,000
80多天128个GPU
185
00:06:06,000 --> 00:06:08,000
有多少人有多少人
186
00:06:08,000 --> 00:06:10,000
有资源去算这个的
187
00:06:10,000 --> 00:06:11,000
基本上如果我不做一些
188
00:06:11,000 --> 00:06:12,000
大模型的项目
189
00:06:12,000 --> 00:06:14,000
是拿不到这么多资源的
190
00:06:14,000 --> 00:06:15,000
所以说一般来说
191
00:06:15,000 --> 00:06:16,000
训练这个模型
192
00:06:16,000 --> 00:06:17,000
或者Transformer的模型
193
00:06:17,000 --> 00:06:18,000
特别特别慢
194
00:06:18,000 --> 00:06:19,000
但是有了FlashAttention之后
195
00:06:19,000 --> 00:06:20,000
就可以把
196
00:06:20,000 --> 00:06:22,000
真正的Attention的推理
197
00:06:22,000 --> 00:06:23,000
MultiAttention的推理
198
00:06:23,000 --> 00:06:25,000
变成现实
199
00:06:26,000 --> 00:06:27,000
如果我讲得不清楚
200
00:06:27,000 --> 00:06:28,000
也非常欢迎大家
201
00:06:28,000 --> 00:06:30,000
去翻一翻这篇论文
202
00:06:30,000 --> 00:06:31,000
这篇论文里面
203
00:06:31,000 --> 00:06:32,000
有非常多的公式
204
00:06:32,000 --> 00:06:33,000
里面给到的一个附录
205
00:06:33,000 --> 00:06:35,000
也是非常多
206
00:06:35,000 --> 00:06:36,000
下面来到
207
00:06:36,000 --> 00:06:39,000
计算图优化的第三个部分
208
00:06:39,000 --> 00:06:42,000
计算图优化详解
209
00:06:42,000 --> 00:06:43,000
那在这里面
210
00:06:43,000 --> 00:06:45,000
我还是非常推荐
211
00:06:45,000 --> 00:06:47,000
大家去看一看这个内容
212
00:06:47,000 --> 00:06:48,000
为什么呢
213
00:06:48,000 --> 00:06:49,000
因为在第三个部分
214
00:06:49,000 --> 00:06:51,000
更多的是对Layout跟Memory
215
00:06:51,000 --> 00:06:53,000
的一些优化
216
00:06:53,000 --> 00:06:54,000
可以看到
217
00:06:54,000 --> 00:06:55,000
Layout的优化
218
00:06:55,000 --> 00:06:57,000
就是数据布局的优化
219
00:06:57,000 --> 00:06:58,000
在数据布局里面
220
00:06:58,000 --> 00:07:00,000
确实讲了非常多
221
00:07:00,000 --> 00:07:02,000
从NCHW到NHWC
222
00:07:02,000 --> 00:07:04,000
再到华为自己推出的
223
00:07:04,000 --> 00:07:06,000
NCHWC0
224
00:07:06,000 --> 00:07:08,000
这种方式确实很特别
225
00:07:08,000 --> 00:07:09,000
可以看到
226
00:07:09,000 --> 00:07:10,000
不同的算子的层
227
00:07:10,000 --> 00:07:11,000
或者不同的Cast
228
00:07:11,000 --> 00:07:12,000
需要做一个
229
00:07:12,000 --> 00:07:13,000
Cast Data的转换
230
00:07:13,000 --> 00:07:14,000
针对网络模型
231
00:07:14,000 --> 00:07:16,000
上一层跟下层的算子的相同
232
00:07:16,000 --> 00:07:17,000
可能不需要转换
233
00:07:17,000 --> 00:07:18,000
但上一层输入
234
00:07:18,000 --> 00:07:20,000
跟下层输入不同的时候
235
00:07:20,000 --> 00:07:21,000
就需要进行一个
236
00:07:21,000 --> 00:07:23,000
插入具体的算子
237
00:07:23,000 --> 00:07:25,000
这也是在图优化里面去做的
238
00:07:25,000 --> 00:07:26,000
如果是相同的时候
239
00:07:26,000 --> 00:07:28,000
就要删掉一些算子
240
00:07:28,000 --> 00:07:30,000
所以说这里面的研究
241
00:07:30,000 --> 00:07:31,000
要根据计算图
242
00:07:31,000 --> 00:07:33,000
来进行优化
243
00:07:33,000 --> 00:07:34,000
第二个内容
244
00:07:34,000 --> 00:07:37,000
就是内存分配的算法
245
00:07:37,000 --> 00:07:39,000
确实内存分配
246
00:07:39,000 --> 00:07:40,000
要在图
247
00:07:40,000 --> 00:07:42,000
有图的概念进行一个预分配
248
00:07:42,000 --> 00:07:44,000
分配的方式有两个
249
00:07:44,000 --> 00:07:47,000
一个是Inplace Operation
250
00:07:47,000 --> 00:07:50,000
就像下面右下角这个图