forked from chenzomi12/AISystem
-
Notifications
You must be signed in to change notification settings - Fork 0
/
03.srt
2052 lines (1539 loc) · 32.2 KB
/
03.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
字幕生成:qiaokai 字幕校对:mkwei
2
00:00:05,533 --> 00:00:08,200
哈喽大家好我是ZOMI
3
00:00:08,400 --> 00:00:08,933
今天呢
4
00:00:08,933 --> 00:00:11,500
还是回到AI编译器系列里面
5
00:00:11,500 --> 00:00:12,733
的前端优化
6
00:00:12,733 --> 00:00:13,900
而前端优化上一节呢
7
00:00:13,900 --> 00:00:15,333
讲了一个图层的IR
8
00:00:15,333 --> 00:00:17,066
有了图层IR之后呢
9
00:00:17,066 --> 00:00:19,200
第一个pass就是算子融合
10
00:00:19,300 --> 00:00:22,166
算子融合又叫做OP Fusion
11
00:00:22,166 --> 00:00:23,766
那在今天算子融合里面呢
12
00:00:23,766 --> 00:00:24,766
主要分开
13
00:00:24,766 --> 00:00:26,766
三个内容给大家介绍的
14
00:00:26,800 --> 00:00:29,766
第一个呢就是算子融合的方式
15
00:00:29,766 --> 00:00:31,366
算子融合有很多种方式的
16
00:00:31,366 --> 00:00:33,700
大家不要觉得算子融合是很简单
17
00:00:33,900 --> 00:00:35,700
那平时觉得简单呢
18
00:00:35,700 --> 00:00:38,133
是因为看的更多的是卷积 BN
19
00:00:38,166 --> 00:00:40,133
ReLU这种算子的融合的策略
20
00:00:40,200 --> 00:00:41,800
那有了这些策略之后呢
21
00:00:41,800 --> 00:00:43,366
就会对他进行总结
22
00:00:43,366 --> 00:00:45,366
然后变成一个具体的一个
23
00:00:45,500 --> 00:00:47,666
优化的pass和优化的算法
24
00:00:47,666 --> 00:00:48,300
那接着呢
25
00:00:48,300 --> 00:00:50,900
来看看现在处于哪个位置
26
00:00:51,500 --> 00:00:53,366
第一个就是AI框架呀
27
00:00:53,366 --> 00:00:54,533
好多的AI框架
28
00:00:54,533 --> 00:00:56,566
会对Python的代码进行解析
29
00:00:56,566 --> 00:00:59,333
变成一个图层的IR就是计算图
30
00:00:59,400 --> 00:01:00,500
有了计算图之后呢
31
00:01:00,500 --> 00:01:02,666
就丢给真正的AI编译器
32
00:01:02,666 --> 00:01:04,700
AI编译器就会对代码
33
00:01:04,700 --> 00:01:06,100
对图层的AI
34
00:01:06,400 --> 00:01:08,300
进行前端的优化
35
00:01:08,300 --> 00:01:10,766
而现在呢还是在这个位置
36
00:01:11,700 --> 00:01:12,700
算子融合呢
37
00:01:12,700 --> 00:01:14,133
作为前端的一个pass
38
00:01:14,133 --> 00:01:16,133
对graph IR进行改变
39
00:01:16,133 --> 00:01:18,566
把一些小的算子变成一个大的算子
40
00:01:19,366 --> 00:01:21,366
现在来看看第一个最重要的内容
41
00:01:21,366 --> 00:01:23,600
就是算子的融合方式
42
00:01:23,966 --> 00:01:25,966
其实呢在真正做调研的时候啊
43
00:01:25,966 --> 00:01:28,800
我并不觉得算子的融合方式有多难
44
00:01:28,800 --> 00:01:30,900
但是真正看了之后我才发现哎
45
00:01:30,900 --> 00:01:32,000
原来算子的融合方式
46
00:01:32,000 --> 00:01:33,600
还能这么多吗
47
00:01:34,366 --> 00:01:35,533
好像有点大声啊
48
00:01:35,766 --> 00:01:38,166
小声点不然吵到隔壁录课的时候
49
00:01:38,533 --> 00:01:40,533
现在来看看网络模型的结构啊
50
00:01:40,533 --> 00:01:42,800
网络模型的结构呢其实也非常复杂
51
00:01:42,800 --> 00:01:44,800
可以看到一串一串下来
52
00:01:44,866 --> 00:01:47,333
大部分网络模型都是以这种方式来去
53
00:01:47,333 --> 00:01:48,166
组织的
54
00:01:48,266 --> 00:01:50,700
而其实有非常多的小算子
55
00:01:50,700 --> 00:01:51,966
能不能把这些小算子
56
00:01:51,966 --> 00:01:53,366
合成一个大的算子
57
00:01:53,366 --> 00:01:55,333
减少对Kernel的调度
58
00:01:55,333 --> 00:01:57,133
然后减少对内存的访问呢
59
00:01:57,133 --> 00:01:58,100
这个就是
60
00:01:58,133 --> 00:01:58,566
这个呢
61
00:01:58,566 --> 00:02:01,500
就是做算子融合最大的一个目的
62
00:02:01,866 --> 00:02:04,000
现在来看看融合有哪种方式
63
00:02:04,000 --> 00:02:05,600
假设现在有这么一个
64
00:02:05,600 --> 00:02:07,366
左边的这个计算图
65
00:02:07,400 --> 00:02:08,900
那我做一个纵向的融合
66
00:02:08,900 --> 00:02:11,500
把c算子和d算子进行融合
67
00:02:11,600 --> 00:02:12,266
这个时候呢
68
00:02:12,266 --> 00:02:15,500
已经减少了一次的Kernel的开销
69
00:02:15,500 --> 00:02:18,766
而且也减少了一次中间的数据的缓存
70
00:02:20,200 --> 00:02:21,333
那第二种方式呢
71
00:02:21,333 --> 00:02:23,533
就是我算子a计算完之后呢
72
00:02:23,533 --> 00:02:26,400
分别给b算子和c算子进行执行
73
00:02:26,466 --> 00:02:28,400
而b算子呢和c算子
74
00:02:28,400 --> 00:02:30,100
它是一个并行的执行呢
75
00:02:30,100 --> 00:02:32,366
就是b和c是同时执行的
76
00:02:32,366 --> 00:02:35,000
但这里面呢就会有两次的访存
77
00:02:35,300 --> 00:02:37,000
那我向右边的这个所示
78
00:02:37,000 --> 00:02:39,933
我把a算子和b算子一起去执行
79
00:02:39,933 --> 00:02:42,466
再把a算子和c算子进行执行
80
00:02:42,500 --> 00:02:45,000
AB跟AC是同时并行的
81
00:02:45,100 --> 00:02:48,300
这个时候呢我只执行两次Kernel的开销
82
00:02:48,300 --> 00:02:50,366
而且并发呢只有一个来回
83
00:02:50,366 --> 00:02:52,566
就是我只需要一次的访存
84
00:02:52,566 --> 00:02:54,300
这种方式也是可以的
85
00:02:54,766 --> 00:02:57,533
另外图还是这个图他的方式有很多啊
86
00:02:57,533 --> 00:03:00,700
像现在左边的b和c呢需要
87
00:03:00,700 --> 00:03:03,333
并发然后他需要调用两次的Kernel开销
88
00:03:03,766 --> 00:03:06,333
右边呢我把b和c进行融合
89
00:03:06,333 --> 00:03:08,266
那这种横向的融合
90
00:03:08,500 --> 00:03:10,366
确实叫做横向融合
91
00:03:10,366 --> 00:03:13,066
这里面呢减少了一次Kernel的调度
92
00:03:13,066 --> 00:03:14,900
而且两次的计算结果呢
93
00:03:14,900 --> 00:03:17,300
都放在同一个内存块里面
94
00:03:17,400 --> 00:03:20,066
加快了内存访问的效率
95
00:03:21,300 --> 00:03:22,933
哎没想到这里面这种图
96
00:03:22,933 --> 00:03:24,466
还有这么多融合方式啊
97
00:03:24,466 --> 00:03:25,900
现在呢来看看了
98
00:03:25,900 --> 00:03:28,200
a b c三个算子进行计算的时候呢
99
00:03:28,200 --> 00:03:30,066
会有三次的Kernel开销
100
00:03:30,066 --> 00:03:32,133
如果我把a和b进行融合
101
00:03:32,133 --> 00:03:34,500
就是a和b进行融合呢
102
00:03:34,666 --> 00:03:35,600
然后合并完之后
103
00:03:35,600 --> 00:03:38,066
把所有的结果丢在内存里面
104
00:03:38,133 --> 00:03:40,300
这个时候呢再给c进行计算
105
00:03:40,300 --> 00:03:42,600
另外一个结果呢给下一个进行计算
106
00:03:42,600 --> 00:03:43,166
这个时候呢
107
00:03:43,166 --> 00:03:45,500
可以提高内存的使用效率
108
00:03:45,766 --> 00:03:47,666
从上面举个例子可以看出
109
00:03:47,666 --> 00:03:49,266
不同的算子融合策略
110
00:03:49,266 --> 00:03:51,266
会产生不同的算子的开销
111
00:03:51,300 --> 00:03:52,066
也可以带来
112
00:03:52,066 --> 00:03:54,500
不同的内存访问的性能的提升
113
00:03:55,400 --> 00:03:57,566
现在呢来看看一个比较
114
00:03:57,700 --> 00:03:59,466
综合性的一个
115
00:03:59,566 --> 00:04:00,400
融合的方式
116
00:04:00,400 --> 00:04:03,566
现在有一个卷积算子1*1*256
117
00:04:03,566 --> 00:04:07,200
然后有一个卷积算子3*3*256
118
00:04:07,300 --> 00:04:10,266
我会把鼠标所在的这个卷积的算子呢
119
00:04:10,266 --> 00:04:11,700
把它进行一个扩充
120
00:04:11,866 --> 00:04:15,366
Enlarge卷积然后变成一个3*3*256
121
00:04:15,566 --> 00:04:15,933
接着呢
122
00:04:15,933 --> 00:04:18,900
对这两个3*3*256的进行一个合并
123
00:04:18,900 --> 00:04:20,266
合并成一个算子
124
00:04:20,266 --> 00:04:22,866
变成卷积3*3*522
125
00:04:23,066 --> 00:04:25,266
那有了这个横向的融合之后呢
126
00:04:25,266 --> 00:04:27,133
想做一个纵向的融合
127
00:04:27,200 --> 00:04:29,300
纵向的融合呢现在有个Split
128
00:04:29,300 --> 00:04:30,533
有个卷积有个Add
129
00:04:30,533 --> 00:04:33,100
现在呢把Split卷积Add
130
00:04:33,333 --> 00:04:36,766
把它合成一个算子变成Conv2d 3*3*256
131
00:04:36,766 --> 00:04:38,700
但是我觉得还不够
132
00:04:38,700 --> 00:04:40,700
像激活一般来说都可以合并在
133
00:04:40,700 --> 00:04:41,866
前一个计算里面
134
00:04:41,866 --> 00:04:44,700
所以呢要把卷积ReLU合并起来
135
00:04:45,300 --> 00:04:46,533
这个操作很有意思
136
00:04:46,533 --> 00:04:48,166
就是一开始的计算图
137
00:04:48,166 --> 00:04:49,000
是比较复杂的
138
00:04:49,000 --> 00:04:50,000
比较多算子的
139
00:04:50,066 --> 00:04:51,000
最后融合起来了
140
00:04:51,000 --> 00:04:53,100
就算子就减少了很多
141
00:04:53,100 --> 00:04:55,466
虽然有部分的计算呢可能会变大
142
00:04:55,466 --> 00:04:58,566
但是总体来说减少了Kernel的开销
143
00:04:58,566 --> 00:05:01,100
减少了对内存的不断的访问
144
00:05:03,766 --> 00:05:05,166
刚才上面那个例子呢
145
00:05:05,166 --> 00:05:07,766
其实已经很清楚的看到了
146
00:05:08,500 --> 00:05:10,800
算子融合确实对整个计算图
147
00:05:10,800 --> 00:05:12,066
或者整个运算的时候呢
148
00:05:12,066 --> 00:05:13,333
产生很大的收益
149
00:05:13,333 --> 00:05:14,933
那主要是解决两个问题
150
00:05:14,933 --> 00:05:16,966
一个是内存墙的问题
151
00:05:16,966 --> 00:05:19,266
就是减少访问内存
152
00:05:19,600 --> 00:05:21,966
那第二个呢就是并行墙的问题
153
00:05:21,966 --> 00:05:24,333
将计算图的算子的节点呢
154
00:05:24,333 --> 00:05:25,400
并行的编排
155
00:05:25,400 --> 00:05:28,133
从而提升整体的并行的效率
156
00:05:28,133 --> 00:05:30,600
这个呢就是做算子融合的目的
157
00:05:32,000 --> 00:05:34,533
现在呢一个非常经典的
158
00:05:34,533 --> 00:05:37,000
卷积 BN ReLU三个算子
159
00:05:37,000 --> 00:05:39,866
三个非常经典的算子进行融合
160
00:05:39,866 --> 00:05:41,600
看看它到底是怎么操作的
161
00:05:41,666 --> 00:05:43,366
那首先呢看一下BN
162
00:05:43,366 --> 00:05:44,400
在计算的时候呢
163
00:05:44,400 --> 00:05:46,933
需要去求那个输入数据
164
00:05:46,966 --> 00:05:49,766
特别是X的一个均值和方差
165
00:05:50,100 --> 00:05:52,533
在这里面呢先对X求均值
166
00:05:52,533 --> 00:05:54,500
然后再求方差
167
00:05:54,500 --> 00:05:56,733
然后呢使用均值和方差
168
00:05:56,766 --> 00:05:58,200
对每一个数据
169
00:05:58,200 --> 00:06:01,400
输入的数据做一个归一化和缩放的
170
00:06:02,166 --> 00:06:03,800
而这个均值和方差呢
171
00:06:03,800 --> 00:06:05,900
是学习的一个参数
172
00:06:05,900 --> 00:06:06,533
而X呢
173
00:06:06,533 --> 00:06:09,600
就是前面卷积算出来的一个输入
174
00:06:09,600 --> 00:06:11,800
接着呢给ReLU进行计算
175
00:06:11,800 --> 00:06:14,866
这个就是BN的一个正常的流程
176
00:06:15,966 --> 00:06:16,766
那看看
177
00:06:16,766 --> 00:06:18,933
正向的时候其实还是很简单
178
00:06:18,933 --> 00:06:20,400
但是反向的时候
179
00:06:20,400 --> 00:06:22,700
问题就变得非常复杂了
180
00:06:22,733 --> 00:06:23,800
反向的时候呢
181
00:06:23,800 --> 00:06:25,966
数据是从后面往前流的
182
00:06:25,966 --> 00:06:29,733
就我先算完ReLU再算BN再算卷积
183
00:06:29,900 --> 00:06:31,300
我在反向的时候呢
184
00:06:31,300 --> 00:06:33,166
首先我要求参数的误差
185
00:06:33,166 --> 00:06:35,700
例如∆γ ∆ß
186
00:06:35,700 --> 00:06:37,600
而这两个参数误差呢
187
00:06:37,600 --> 00:06:40,333
会依赖于输入∆y
188
00:06:41,300 --> 00:06:43,600
和之前的输入X
189
00:06:43,600 --> 00:06:46,100
这个X呢也会对它产生影响
190
00:06:46,133 --> 00:06:48,100
所以呢反向的过程呢
191
00:06:48,100 --> 00:06:51,666
包括求参数误差还有求输入误差
192
00:06:51,733 --> 00:06:52,733
两个部分
193
00:06:52,733 --> 00:06:55,500
BN这个算子呢在反向计算的时候呢
194
00:06:55,500 --> 00:06:56,966
关键的访存特征就是
195
00:06:56,966 --> 00:06:59,266
我需要对内存里面的这些参数
196
00:06:59,400 --> 00:07:00,566
进行访问
197
00:07:00,566 --> 00:07:01,133
第二个呢
198
00:07:01,133 --> 00:07:03,866
我需要大量的去访问∆y
199
00:07:03,866 --> 00:07:06,400
把之前反向计算出来的一个
200
00:07:06,400 --> 00:07:07,200
输出误差
201
00:07:07,200 --> 00:07:09,133
给到∆γ计算
202
00:07:09,133 --> 00:07:10,766
给到∆ß计算
203
00:07:10,800 --> 00:07:13,766
还给到∆X进行计算
204
00:07:13,766 --> 00:07:16,166
这种方式呢就引起计算
205
00:07:16,166 --> 00:07:18,600
对内存进行大量的访问
206
00:07:18,900 --> 00:07:21,166
在实际的AI框架计算里面呢
207
00:07:21,166 --> 00:07:23,966
它这个∆y呀不是单单一个数
208
00:07:23,966 --> 00:07:26,466
而是一个向量一个矩阵一个张量
209
00:07:26,500 --> 00:07:28,533
就可能甚至是高维的张量
210
00:07:28,533 --> 00:07:29,800
数据量是非常大的
211
00:07:29,800 --> 00:07:32,133
所以它对访存的要求是非常高的
212
00:07:32,133 --> 00:07:34,500
现在来看看计算访存的分析
213
00:07:34,500 --> 00:07:37,500
就是对这个访存进行一个简单的分析
214
00:07:37,966 --> 00:07:39,866
在网络模型训练的过程当中
215
00:07:39,866 --> 00:07:42,300
需要保存每一层的前项的
216
00:07:42,300 --> 00:07:43,366
计算的结果
217
00:07:43,400 --> 00:07:45,566
就是刚才所谓的BN的X
218
00:07:45,566 --> 00:07:48,100
在反向计算误差的时候用到的
219
00:07:48,100 --> 00:07:48,600
但是
220
00:07:48,600 --> 00:07:51,333
随着深度模型的网络模型越大
221
00:07:51,333 --> 00:07:52,600
模型层数越深
222
00:07:52,600 --> 00:07:55,200
需要保存的中间结果和参数量
223
00:07:55,200 --> 00:07:56,800
就会急剧的增加
224
00:07:57,133 --> 00:07:59,333
这个时候呢就需要消耗大量的内存
225
00:07:59,333 --> 00:08:00,200
所以在训练
226
00:08:00,200 --> 00:08:01,733
一个大一点的网络模型的时候
227
00:08:01,733 --> 00:08:03,000
经常说内存不够了
228
00:08:03,000 --> 00:08:05,533
希望内存或者显存更大
229
00:08:05,533 --> 00:08:06,500
而另一方面呢
230
00:08:06,500 --> 00:08:08,400
因为加速器或者NPU
231
00:08:08,400 --> 00:08:09,500
或者芯片上面的
232
00:08:09,500 --> 00:08:11,600
访存容量是非常有限的
233
00:08:11,600 --> 00:08:14,333
没办法无限制的去保存数据
234
00:08:14,500 --> 00:08:15,133
所以这个时候呢
235
00:08:15,133 --> 00:08:16,700
就需要把中间结果
236
00:08:16,700 --> 00:08:18,666
可能会offload到
237
00:08:18,866 --> 00:08:20,066
CPU内存里面
238
00:08:20,066 --> 00:08:22,533
并且在反向的时候再读取出来
239
00:08:22,566 --> 00:08:24,766
那这种方式是非常低效的
240
00:08:25,100 --> 00:08:25,533
那下面呢
241
00:08:25,533 --> 00:08:27,933
来看看一个更加明确的例子
242
00:08:27,933 --> 00:08:29,666
还是刚才的卷积 BN ReLU
243
00:08:29,666 --> 00:08:30,500
三个算子
244
00:08:30,533 --> 00:08:33,333
中间的这个横框呢就是内存
245
00:08:33,333 --> 00:08:35,899
那假设现在有两块内存
246
00:08:36,000 --> 00:08:36,866
正向的时候呢
247
00:08:36,866 --> 00:08:39,666
需要 Z1 W1进行完卷积计算
248
00:08:39,666 --> 00:08:40,799
输出X
249
00:08:41,066 --> 00:08:43,600
在BN计算的时候呢我需要把X输进去
250
00:08:43,600 --> 00:08:45,166
把γ ß输进去