forked from chenzomi12/AISystem
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path04.srt
1624 lines (1218 loc) · 28.8 KB
/
04.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,500
字幕生成:BLACK 字幕校对:凝渊
2
00:00:05,525 --> 00:00:06,600
Hello,大家好
3
00:00:06,600 --> 00:00:09,000
不知不觉又回到了AI编译器的
4
00:00:09,000 --> 00:00:11,600
这个围绕AI这个系列来展开
5
00:00:11,600 --> 00:00:14,400
那聊到AI可能很多人就不怎么关注了
6
00:00:14,400 --> 00:00:17,800
我发现传统的内容反而关注的人越来越多
7
00:00:17,800 --> 00:00:18,600
我是ZOMI
8
00:00:18,600 --> 00:00:21,000
今天就跟大家去汇报一下
9
00:00:21,000 --> 00:00:23,400
关于AI编译器的一些挑战
10
00:00:23,400 --> 00:00:26,200
还有关于它的发展的一些未来的思考和洞察
11
00:00:26,200 --> 00:00:28,600
今天的这个内容也是AI编译器
12
00:00:28,600 --> 00:00:31,200
和传统编译器里面的最后一个小节
13
00:00:31,200 --> 00:00:34,600
那未来我希望能够跟大家去详细的展开
14
00:00:34,600 --> 00:00:36,600
还关于AI编译器通用架构
15
00:00:36,600 --> 00:00:38,800
就是它的架构里面的每一个pass
16
00:00:38,800 --> 00:00:40,000
每一个细节点
17
00:00:40,000 --> 00:00:41,800
那讲完这些技术点
18
00:00:41,800 --> 00:00:43,800
大家再回过头来去看一下
19
00:00:43,800 --> 00:00:45,600
整个AI编译器的通用架构
20
00:00:45,600 --> 00:00:47,200
你就可能会想得更明白
21
00:00:47,200 --> 00:00:50,000
或者有更好的新的思路也可以告诉我
22
00:00:50,000 --> 00:00:52,600
然后我也希望大家能够参与到Math4
23
00:00:52,600 --> 00:00:53,800
还有其他AI框架
24
00:00:53,800 --> 00:00:56,000
参与到真正的开源项目当中
25
00:00:56,000 --> 00:00:58,000
现在想看一些比较新的
26
00:00:58,000 --> 00:01:00,800
或者比较热门的一些AI编译器的一个对比
27
00:01:00,800 --> 00:01:01,800
下面这个图
28
00:01:01,800 --> 00:01:05,200
我是取自于之前给大家去安利过的一篇文章
29
00:01:05,200 --> 00:01:09,000
The Deep Learning Compiler A Comprehensive Survey
30
00:01:09,000 --> 00:01:11,600
这篇文章是对AI编译器的综述
31
00:01:11,600 --> 00:01:13,000
那其中有一块table
32
00:01:13,000 --> 00:01:15,400
现在打开这篇文章来看看
33
00:01:15,400 --> 00:01:17,000
在这篇文章的第二页
34
00:01:17,000 --> 00:01:18,800
就横向的对比了TVM
35
00:01:18,800 --> 00:01:19,600
nGraph
36
00:01:19,600 --> 00:01:20,800
TC Glow
37
00:01:20,800 --> 00:01:21,600
还有XLA
38
00:01:21,600 --> 00:01:23,800
五个AI编译器的区别
39
00:01:23,800 --> 00:01:26,600
XLA是谷歌推出的为TensorFlow
40
00:01:26,600 --> 00:01:28,800
还有JAX作为它的底层编译层的
41
00:01:28,800 --> 00:01:31,000
它主要的特性是把神经网络
42
00:01:31,000 --> 00:01:33,400
或者计算图打开变成小算子
43
00:01:33,400 --> 00:01:34,600
那基于这些小算子
44
00:01:34,600 --> 00:01:36,400
再做一些图算的融合
45
00:01:36,400 --> 00:01:38,600
然后一起去做一个编译的
46
00:01:38,600 --> 00:01:41,000
整体的设计主要是定义了几个IR
47
00:01:41,000 --> 00:01:44,000
例如HLO、LLVM IR来去实现的
48
00:01:44,000 --> 00:01:45,600
在编译器里面的所有的Pass
49
00:01:45,600 --> 00:01:47,800
都是手工的提前去指定的
50
00:01:47,800 --> 00:01:51,000
也就是通过人工去发现一些规律
51
00:01:51,000 --> 00:01:53,600
最后把这些规律汇总成为代码
52
00:01:53,800 --> 00:01:56,200
TVM作为一个端到端的深度学习编译器
53
00:01:56,200 --> 00:01:57,800
主要是用在推理场景
54
00:01:57,800 --> 00:01:59,600
当然了训练场景其实也可以使用
55
00:01:59,600 --> 00:02:02,000
这个项目是由CMU的助理教授
56
00:02:02,000 --> 00:02:03,800
陈天奇发起的
57
00:02:03,800 --> 00:02:05,000
作为一个AI编译器
58
00:02:05,000 --> 00:02:07,600
它跟所有的框架都是松果核的关系
59
00:02:07,600 --> 00:02:09,400
就是它可以对接到多个框架
60
00:02:09,400 --> 00:02:11,200
最重要的目的就是想去解决
61
00:02:11,200 --> 00:02:12,400
人工写Kernel的问题
62
00:02:12,400 --> 00:02:14,600
然后对多个不同的硬件平台
63
00:02:14,600 --> 00:02:16,800
低级层面的代码进行优化
64
00:02:16,800 --> 00:02:18,200
它里面分为两层
65
00:02:18,200 --> 00:02:19,000
一层是Relay层
66
00:02:19,000 --> 00:02:20,400
一层是TVM层
67
00:02:20,400 --> 00:02:21,800
而Relay层关注于图
68
00:02:21,800 --> 00:02:23,000
TVM层关注于算子
69
00:02:23,000 --> 00:02:26,000
而TVM里面就借鉴了halide的一个想法
70
00:02:26,000 --> 00:02:27,200
把Compute和Schedule
71
00:02:27,200 --> 00:02:28,200
就是我的计算
72
00:02:28,200 --> 00:02:30,800
还有我的调度分离的这种方案
73
00:02:30,800 --> 00:02:33,600
当然还有Facebook早期的一个项目TC
74
00:02:33,600 --> 00:02:36,400
不过很可惜的就是随着PyTorch的兴起
75
00:02:36,400 --> 00:02:38,200
TC这个项目在Facebook里面
76
00:02:38,200 --> 00:02:39,600
没有得到一个很好的重视
77
00:02:39,600 --> 00:02:41,600
而这个项目已经没有持续的更新了
78
00:02:41,600 --> 00:02:43,400
但是这个项目的很多idea
79
00:02:43,400 --> 00:02:44,800
它的一个Polyhedral Model
80
00:02:44,800 --> 00:02:46,400
就是多面体的技术
81
00:02:46,400 --> 00:02:47,600
去解决编译器的问题
82
00:02:47,600 --> 00:02:49,800
这个思想其实现在被MindSpore所继承
83
00:02:49,800 --> 00:02:51,400
或者MindSpore基于这个idea
84
00:02:51,400 --> 00:02:53,400
做了很多自己的创新
85
00:02:53,400 --> 00:02:54,600
有了AI编译器
86
00:02:54,600 --> 00:02:56,800
AI编译器的输入是计算图
87
00:02:56,800 --> 00:03:00,200
而计算图是这些AI框架所产生的
88
00:03:00,200 --> 00:03:02,800
包括MindSpore、TensorFlow、PyTorch、Paddle-Paddle
89
00:03:02,800 --> 00:03:04,400
等不同的AI框架
90
00:03:04,400 --> 00:03:06,400
都会去产生计算图
91
00:03:06,400 --> 00:03:08,200
对计算图不了解的同学们
92
00:03:08,200 --> 00:03:10,400
可以回头看一下计算图的系列
93
00:03:10,400 --> 00:03:11,800
有了计算图之后
94
00:03:11,800 --> 00:03:14,600
就去了解AI框架
95
00:03:14,600 --> 00:03:17,400
下面来看看AI编译器的挑战
96
00:03:17,400 --> 00:03:18,600
关于AI编译器的挑战
97
00:03:18,600 --> 00:03:19,800
其实有几条内容是
98
00:03:19,800 --> 00:03:22,400
摘之于金雪峰老师在知乎上面的一篇文章
99
00:03:22,400 --> 00:03:23,800
这里面我根据个人的理解
100
00:03:23,800 --> 00:03:25,200
做了一些修改和补充
101
00:03:25,200 --> 00:03:27,400
第一个就是动态Shape的问题
102
00:03:27,400 --> 00:03:29,600
这个问题在昇腾硬件上面
103
00:03:29,600 --> 00:03:31,800
对接到PyTorch动态图的时候
104
00:03:31,800 --> 00:03:33,200
非常的突出
105
00:03:33,200 --> 00:03:34,800
也是非常难解决的
106
00:03:34,800 --> 00:03:36,400
第二个就是MindSpore底层的
107
00:03:36,400 --> 00:03:37,400
AI编译器的时候
108
00:03:37,400 --> 00:03:40,400
去解决动态Shape也是花了不少的精力
109
00:03:40,400 --> 00:03:43,600
第二点就是PyTorch的编译的时候的静态化
110
00:03:43,600 --> 00:03:45,400
这个也是很难解决的问题
111
00:03:45,400 --> 00:03:47,600
第三点就是如何通过AI编译器
112
00:03:47,600 --> 00:03:51,000
去压榨更多或者去发挥更多的硬件的性能
113
00:03:51,000 --> 00:03:54,400
第四点就是如何处理神经网络的一些特性
114
00:03:54,400 --> 00:03:56,200
例如自动微分和自动并行
115
00:03:56,200 --> 00:03:59,600
第五点就是如何去兼顾易用性和性能
116
00:04:02,600 --> 00:04:04,400
下面来看看第一点
117
00:04:04,400 --> 00:04:07,200
就是动态Shape和动态计算图的问题
118
00:04:07,200 --> 00:04:09,200
那比较突出的就是动态Shape
119
00:04:09,200 --> 00:04:11,200
现在一些主流的AI编译器
120
00:04:11,200 --> 00:04:14,000
主要是针对静态Shape进行输入
121
00:04:14,000 --> 00:04:15,600
然后完成整个编译化的
122
00:04:15,600 --> 00:04:16,800
包括TVM
123
00:04:16,800 --> 00:04:19,600
后来TVM其实也推出了一些解决动态Shape的方案
124
00:04:19,600 --> 00:04:22,400
但一开始确实也只是面向于静态Shape
125
00:04:22,400 --> 00:04:24,800
当计算图里面含有空字流的时候
126
00:04:24,800 --> 00:04:26,800
也是一个很大的挑战
127
00:04:26,800 --> 00:04:28,200
例如在NLP任务里面
128
00:04:28,200 --> 00:04:31,400
我输入给网络模型的一个序列的长度是不固定的
129
00:04:31,400 --> 00:04:32,400
有些句子长一点
130
00:04:32,400 --> 00:04:34,000
有些句子短一点
131
00:04:34,000 --> 00:04:36,800
这个时候就会引起大量的动态Shape需求
132
00:04:36,800 --> 00:04:38,800
第三点就是有些AI任务
133
00:04:38,800 --> 00:04:42,200
例如检测模型的SSP金字塔的时候
134
00:04:42,200 --> 00:04:45,000
很难通过把动态Shape改成静态Shape
135
00:04:45,000 --> 00:04:46,600
然后去解决的
136
00:04:47,600 --> 00:04:50,800
第二个比较大的挑战就是Python数据语言的static
137
00:04:50,800 --> 00:04:52,000
就是它的静态化
138
00:04:52,000 --> 00:04:54,400
在AI编辑器业界最常用的一种方法
139
00:04:54,400 --> 00:04:56,400
就是通过JIT即时编译
140
00:04:56,400 --> 00:04:59,200
让Python程序执行一个静态的优化
141
00:04:59,200 --> 00:05:01,000
从而提升性能
142
00:05:01,000 --> 00:05:03,400
而业界做一个JIT的通常的方法
143
00:05:03,400 --> 00:05:07,000
第一点就是提供一个Python的JIT的虚拟机
144
00:05:07,000 --> 00:05:10,000
第二种就是通过修饰符的方式
145
00:05:10,600 --> 00:05:14,000
下面来展开理解一下Python去执行的时候
146
00:05:14,000 --> 00:05:17,000
首先拿到一个Python的原代码.py
147
00:05:17,000 --> 00:05:21,200
然后Python的编译器会对原代码进行一个编译的处理
148
00:05:21,200 --> 00:05:25,400
所以会看到编译处理完经常会看到一些字节码.pyc
149
00:05:25,400 --> 00:05:28,000
在文件夹里面去存着
150
00:05:28,000 --> 00:05:29,600
就是我运行一个.py的时候
151
00:05:29,600 --> 00:05:31,400
经常会出现一些.pyc
152
00:05:31,400 --> 00:05:33,200
一开始也是觉得莫名其妙的
153
00:05:33,200 --> 00:05:35,400
后来理解了Python的一个编译流程之后
154
00:05:35,600 --> 00:05:38,600
就搞懂了.pyc就是它的字节码
155
00:05:38,600 --> 00:05:40,400
然后产生完字节码之后
156
00:05:40,600 --> 00:05:42,600
就给编译器进行编译处理
157
00:05:42,600 --> 00:05:44,800
最后程序再进行执行的
158
00:05:44,800 --> 00:05:47,000
而Python在执行的时候有两种方式
159
00:05:47,000 --> 00:05:48,400
第一种就是产生一个字节码
160
00:05:48,400 --> 00:05:51,400
然后通过Python的虚拟机给硬件去执行
161
00:05:51,600 --> 00:05:54,600
第二种就是提供JIT即时编译的编译器
162
00:05:54,600 --> 00:05:55,800
然后产生一个机器码
163
00:05:55,800 --> 00:05:57,800
然后直接给硬件去执行
164
00:05:57,800 --> 00:06:00,600
所以说Python在执行的时候有两种执行方式
165
00:06:00,600 --> 00:06:02,600
而左边的这种是最通用的
166
00:06:02,800 --> 00:06:04,400
刚才提到的一点就是
167
00:06:04,400 --> 00:06:07,000
Python它提供一个JIT的虚拟机
168
00:06:07,000 --> 00:06:11,000
好像Cpython它就混合了编译还有解析的功能
169
00:06:11,000 --> 00:06:14,800
将Python的原代码直接翻译成一系列的中间字节码
170
00:06:14,800 --> 00:06:16,000
就是.pyc
171
00:06:16,000 --> 00:06:18,400
然后由Cpython的一个内部虚拟机
172
00:06:18,400 --> 00:06:21,000
然后不断的去执行Python的一些指令
173
00:06:21,000 --> 00:06:22,800
第二种就是pypy
174
00:06:22,800 --> 00:06:26,200
直接利用JIT的即时编译器来去执行Python的代码
175
00:06:26,200 --> 00:06:28,000
假设现在有一些Python的原代码
176
00:06:28,000 --> 00:06:31,200
我按一些Python原代码的快进行一个编译
177
00:06:31,200 --> 00:06:32,600
编译成字节码
178
00:06:32,600 --> 00:06:33,600
编译成字节码的时候
179
00:06:33,800 --> 00:06:37,000
JIT编译器去执行Python的原代码的时候
180
00:06:37,000 --> 00:06:40,400
实际上程序执行的是已经编译好的字节码
181
00:06:40,600 --> 00:06:43,200
刚才提到了Python静态化的第二种方案
182
00:06:43,400 --> 00:06:45,000
就是通过修饰符
183
00:06:45,000 --> 00:06:46,200
对于修饰符这种
184
00:06:46,200 --> 00:06:48,600
其实在计算图的系列里面
185
00:06:48,600 --> 00:06:51,400
其实已经简单的去提过了
186
00:06:51,400 --> 00:06:52,400
这里面有两种
187
00:06:52,400 --> 00:06:53,800
第一种就是Tracing Based
188
00:06:53,800 --> 00:06:56,200
类似于PyTorch的fx的功能
189
00:06:57,000 --> 00:06:58,600
第二种就是AST Transform
190
00:06:58,600 --> 00:07:00,200
基于原码的转换
191
00:07:00,200 --> 00:07:02,200
类似于PyTorch的JIT的功能
192
00:07:02,200 --> 00:07:06,000
可以看到这下面的左右都是PyTorch的代码
193
00:07:06,000 --> 00:07:10,200
而PyTorch fx就是Tracing Based的这种方式
194
00:07:10,200 --> 00:07:12,000
我前面加一个修饰符
195
00:07:12,000 --> 00:07:13,000
然后通过修饰符
196
00:07:13,200 --> 00:07:15,400
一条一条语句去做一个跟踪
197
00:07:15,400 --> 00:07:16,800
然后把它做一个翻译
198
00:07:16,800 --> 00:07:18,800
第二种就是AST Transform
199
00:07:18,800 --> 00:07:20,000
就是原码转换
200
00:07:20,000 --> 00:07:22,400
我现在先写了一个函数
201
00:07:22,400 --> 00:07:24,000
然后通过一个修饰符
202
00:07:24,000 --> 00:07:26,600
对刚才的函数进行一个原码转换
203
00:07:28,000 --> 00:07:32,200
PyTorch它是一个动态图表达非常灵活的一个AI框架
204
00:07:32,200 --> 00:07:33,600
在它的动态图方案里面
205
00:07:33,800 --> 00:07:36,200
它是没有任何AI编辑相关的功能
206
00:07:36,200 --> 00:07:38,000
但是为了提升执行效率
207
00:07:38,200 --> 00:07:41,800
所以PyTorch推出了fx,JIT不同的一些方案
208
00:07:41,800 --> 00:07:44,200
但这些方案多多少少都有一些问题
209
00:07:44,200 --> 00:07:45,400
不是说非常纯粹
210
00:07:45,400 --> 00:07:47,400
而在最新的PyTorch 2.0里面
211
00:07:47,400 --> 00:07:49,400
他们说已经解决了这个问题了
212
00:07:49,400 --> 00:07:52,600
所以我希望能够后面有点时间去分析
213
00:07:52,600 --> 00:07:55,800
PyTorch 2.0这一块机制到底是怎么运作的
214
00:07:56,800 --> 00:07:58,800
下面看回PyTorch Static
215
00:07:58,800 --> 00:08:00,800
就是静态化所遇到的一些挑战
216
00:08:00,800 --> 00:08:03,200
第一个就是类型的推导
217
00:08:03,200 --> 00:08:06,000
从动态语言去编译成一个静态语言
218
00:08:06,000 --> 00:08:08,200
肯定是会有很多类型的转换
219
00:08:08,200 --> 00:08:09,200
静态类型
220
00:08:09,200 --> 00:08:12,200
不一定把所有的动态类型都能够表达出来
221
00:08:12,200 --> 00:08:14,200
第二个就是控制流的表达
222
00:08:14,200 --> 00:08:16,000
就是if,else,while,for等控制流
223
00:08:16,000 --> 00:08:18,000
其实你很难通过静态图
224
00:08:18,000 --> 00:08:19,400
完完全全的表示的
225
00:08:19,400 --> 00:08:22,200
现在比较好的一种方案就是子图的展开
226
00:08:22,200 --> 00:08:25,600
第三种就是灵活的语言表达和数据类型的转换
227
00:08:25,600 --> 00:08:28,400
因为Python里面有非常多灵活的表示
228
00:08:28,400 --> 00:08:30,600
其实还是归根于第一个问题
229
00:08:30,600 --> 00:08:33,200
就是动态的类型怎么把它静态化
230
00:08:33,200 --> 00:08:35,800
第四个就是JIT的编译性能
231
00:08:35,800 --> 00:08:38,800
不管是Tracing Based还是AST Transform
232
00:08:38,800 --> 00:08:39,800
就是源码转换
233
00:08:39,800 --> 00:08:43,600
都需要额外增加编译的开销
234
00:08:43,600 --> 00:08:46,000
有编译肯定会损失性能
235
00:08:46,000 --> 00:08:47,600
既想提升性能
236
00:08:47,600 --> 00:08:49,600
但是又忍不住编译的开销
237
00:08:49,600 --> 00:08:51,400
这是个矛盾
238
00:08:51,400 --> 00:08:53,800
假设开发一个MindSpore的AI框架
239
00:08:53,800 --> 00:08:55,800
希望对接到不同的硬件上面
240
00:08:55,800 --> 00:08:57,400
但是不可能每个硬件
241
00:08:57,400 --> 00:09:00,600
自己都会去做一些开发和性能的优化
242
00:09:00,600 --> 00:09:03,800
所以这里面极度的去依赖于AI的编译器
243
00:09:03,800 --> 00:09:06,200
去发挥不同硬件的算力
244
00:09:06,200 --> 00:09:08,400
在面向专用硬件的AI编译器
245
00:09:08,400 --> 00:09:11,200
其实也是遇到了非常大的挑战
246
00:09:11,200 --> 00:09:14,000
例如性能的优化了依赖于图算的融合
247
00:09:14,000 --> 00:09:16,000
就是我把小算子合成一个大算子
248
00:09:16,000 --> 00:09:18,800
那我算得起来可能更快少了一些IO
249
00:09:18,800 --> 00:09:21,400
面向DSA第二个比较大的挑战
250
00:09:21,400 --> 00:09:22,800
就是优化的复杂度