-
Notifications
You must be signed in to change notification settings - Fork 207
/
Lecture 8 Deep Learning Software.ko.srt
3697 lines (2916 loc) · 106 KB
/
Lecture 8 Deep Learning Software.ko.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
0
00:00:00,000 --> 00:00:06,000
Translated by visionNoob, KNU
https://github.com/insurgent92/CS231N_17_KOR_SUB
1
00:00:09,679 --> 00:00:13,891
12시가 지났으니
진행하도록 하겠습니다.
2
00:00:13,891 --> 00:00:17,822
이번 8강에서는
Deep learning software에 대해 알아볼 것입니다.
3
00:00:17,822 --> 00:00:21,283
매년 아주 많은 변화가 생기는
정말 재미있는 주제입니다.
4
00:00:21,283 --> 00:00:25,621
다만 매년 너무 많이 바뀌어서
매번 강의준비가 좀 빡세긴 합니다.
5
00:00:25,621 --> 00:00:30,024
우선 몇가지 공지사항을 전달하겠습니다.
6
00:00:30,024 --> 00:00:34,563
우선 지난 화요일에 프로젝트 기획서
제출기한이 마감되었습니다.
7
00:00:34,563 --> 00:00:42,766
다들 좋은 아이디어를 가지고 기한내에 잘 제출했길 바랍니다.
8
00:00:42,766 --> 00:00:50,217
현재 프로젝트 분야에 맞는 적절한 TA를 배치중에 있습니다.
9
00:00:50,217 --> 00:00:54,264
추후에 더 많은 정보가 공지될 것입니다.
10
00:00:54,264 --> 00:00:56,563
그리고 현재 과제1을 채점중에 있습니다.
11
00:00:56,563 --> 00:01:00,942
가능한 빨리 점수를 알려드리도록 하겠습니다.
12
00:01:00,942 --> 00:01:08,680
그리고 과제2의 제출기한도 얼마 남지 않았습니다.
다음 주 까지 라는 것을 꼭 명심하시기 바랍니다.
13
00:01:08,680 --> 00:01:16,231
과제2를 진행할 때 반드시 Google Cloud를 잘 종료시켜서
각자 크래딧을 아끼도록 하세요
14
00:01:16,231 --> 00:01:24,812
그리고 다시한번 말씀드리고 싶은 것은 과제2에서 GPU를
사용한만한 것은 마지막 문제뿐이 없다는 것입니다.
15
00:01:24,812 --> 00:01:32,250
나머지 문제들은 python과 numpy만 사용하기 때문에
GPU를 쓸 일이 없습니다.
16
00:01:32,250 --> 00:01:36,701
GPU는 정말 필요할 때만 사용하셔서 크래딧을 아껴 쓰시기 바랍니다.
17
00:01:36,701 --> 00:01:39,973
마지막으로 이제 곧 중간고사가 예정되어 있습니다.
18
00:01:39,973 --> 00:01:45,683
벌써 중간고사 기간이라는 것이 믿어지지 않지만
중간고사는 5월 9일 화요일 수업시간에 진행됩니다.
19
00:01:45,683 --> 00:01:47,901
중간고사는 이론중심으로 출제될 것입니다.
20
00:01:47,901 --> 00:01:57,071
지금까지 수업을 잘 이해하고 있는지를 확인하기 위한
몇가지 이론적인 문제들을 출제할 것입니다.
21
00:01:57,071 --> 00:02:02,506
몇 가지 예상문제를 올려놓도록 하겠습니다.
22
00:02:02,506 --> 00:02:03,695
질문 있나요?
23
00:02:03,695 --> 00:02:05,310
[학생이 질문]
24
00:02:05,310 --> 00:02:10,675
오픈북이냐고 질문하셨는데요
오픈북은 아닙니다.
25
00:02:10,675 --> 00:02:15,671
지금까지 항상 클로즈북으로 진행해 왔습니다.
26
00:02:15,671 --> 00:02:21,735
여러분이 수업에서 다룬 것들의 직관들을 얼마나
이해했는지를 확인하는 것 위주로 출제될 것입니다.
27
00:02:23,618 --> 00:02:27,577
자 그럼 지난시간의 내용을 간단하게 복습해 보도록 하겠습니다.
28
00:02:27,577 --> 00:02:29,737
지난 시간에 다양한 딥러닝 최적화 알고리즘을 배웠습니다.
29
00:02:29,737 --> 00:02:34,975
SGD, Momentum, Nesterov, RMSProp 그리고 Adam
에 대해서 배웠습니다.
30
00:02:34,975 --> 00:02:45,492
이 방법들을 모두 기본적인 SGD를 조금씩 변형시킨 방법이었죠
구현 자체는 간단하나 네트워크의 수렴속도는 더 빨랐습니다.
31
00:02:45,492 --> 00:02:48,529
그리고 regularization에 대해서도 배웠습니다.
특히나 Dropout에 관한 것이었죠
32
00:02:48,529 --> 00:02:56,975
Dropout은 forward pass에서 임의의 부분은 0으로 만들고
test time에서는 그 noise를 marginalize out 했습니다.
33
00:02:56,975 --> 00:03:02,805
그리고 딥러닝에서 사용하는 다양한 regularization들의
일반적인 패턴에 대해서는 배웠습니다.
34
00:03:02,805 --> 00:03:08,415
Train time에 noise를 추가하고, Test time에는
marginalize out 합니다.
35
00:03:08,415 --> 00:03:15,376
그리고 Transfer learning도 배웠습니다. Pre-train
model을 다운받아서 fine-tune 하는 방법이죠
36
00:03:15,376 --> 00:03:21,314
Transfer learning을 이용하면 데이터셋이 많지 않더라도
딥러닝 문제를 다룰 수 있는 방법이었습니다.
37
00:03:22,781 --> 00:03:29,615
이번 시간에는 화제를 조금 돌려서 소프트웨어/하드웨어가 동작하는
방식에 대해서 조금 다배워보도록 하겠습니다.
38
00:03:29,615 --> 00:03:36,276
그리고 실제 여러분이 학습 시 사용하는 소프트웨어들을
조금 더 심도깊게 다뤄보도록 하겠습니다.
39
00:03:36,276 --> 00:03:43,967
정리하자면 CPU와 GPU에 대해 조금 배울 것이고, 요즘 사람들이
가장 많이 사용하는 립러닝 프레임워크들에 대해서도 배울 것입니다.
40
00:03:45,471 --> 00:03:52,961
자 우선 이런 얘기는 수도 없이 많이 들으셨을 것입니다.
컴퓨터에 CPU와 GPU가 있다는 것 말입니다.
41
00:03:52,961 --> 00:04:02,655
딥러닝에서 GPU를 사용하는데, 사실 지금까지 왜 GPU가 CPU가 좋은지
에 대해서 명확하게 언급하지 않고 넘어갔습니다.
42
00:04:02,655 --> 00:04:06,472
컴퓨터를 조립해본 적이 있나요?
손 한번 들어보시겠습니까
43
00:04:06,472 --> 00:04:10,965
한 1/3에서 절반정도는 계시는군요
44
00:04:10,965 --> 00:04:15,174
이 사진은 제 컴퓨터입니다. 제가 직접 조립했죠
45
00:04:15,174 --> 00:04:22,261
컴퓨터 내부에서 많은 부품들이 있습니다. 아마 여러분들은 각각이
무엇인지 아실 거라고 믿습니다.
46
00:04:22,261 --> 00:04:25,594
CPU는 Central Processing Unit이죠
47
00:04:25,594 --> 00:04:31,391
이 조그마한 칩은 쿨러 믿에 숨어있습니다.
48
00:04:31,391 --> 00:04:39,555
CPU는 엄청 작습니다. 공간을 크게 잡아먹지 않죠
49
00:04:39,555 --> 00:04:46,221
자 여기 GPU들을 보면 공간을 엄청 차지하고 있습니다.
괴물같은 녀석들입니다.
50
00:04:46,221 --> 00:04:50,296
GPU는 자기만의 쿨러가 있고 파워도 엄청 먹고 엄청 큽니다.
51
00:04:50,296 --> 00:04:59,139
GPU가 얼마나 많은 파워를 사용하는지 그리고 얼마나 큰지는
케이스에서 얼마나 많은 부분을 차지하는지만 봐도 알 수 있습니다.
52
00:04:59,139 --> 00:05:04,516
GPU란 것이 무엇이길래 딥러닝에서 이렇게 중요한 걸까요
53
00:05:04,516 --> 00:05:08,937
GPU는 graphics card 혹은
Graphics Processing Unit 이라고 합니다.
54
00:05:08,937 --> 00:05:16,166
사실 GPU는 computer graphics를 랜더링하기 위해서
만들어졌습니다. 게임같은 것들을 위해서죠
55
00:05:16,166 --> 00:05:23,247
자 다시한번 손을 들어보죠, 여기에 집에서 컴퓨터게임을
하시는 분들이 계십니까?
56
00:05:23,247 --> 00:05:25,693
절반정도 있군요 좋습니다.
57
00:05:25,693 --> 00:05:32,196
게임을 하시거나 컴퓨터를 직접 조립해 보신 분들이라면
다음과 같은 질문에 대한 나름대로의 의견을 가지고 계실 것입니다.
58
00:05:32,196 --> 00:05:34,095
[웃음]
59
00:05:34,095 --> 00:05:37,666
이는 Computer Science에서 가장 큰 논쟁 중 하나입니다.
60
00:05:37,666 --> 00:05:42,620
Intel vs AMD 라던가, 그래픽카드의 경우
NVIDIA vs AMD 같은 논쟁들이죠
61
00:05:42,620 --> 00:05:45,394
텍스트 에디터의 경우 Vim vs Emacs도 있겠군요
62
00:05:45,394 --> 00:05:51,945
대부분의 게이머들은 이 논쟁에 대해서
자기만의 의견을 가지고 있습니다.
63
00:05:51,945 --> 00:05:59,116
딥러닝의 경우는 대부분 한쪽만 선택합니다.
NVIDIA죠
64
00:05:59,116 --> 00:06:05,117
만약 AMD 카드를 가지고있다면 아마 딥러닝에 사용하는데
문제가 많을 것입니다.
65
00:06:05,117 --> 00:06:08,812
지난 수년간 NVIDIA는 딥러닝에 많은 공을 들여왔습니다.
66
00:06:08,812 --> 00:06:11,997
NVIDIA의 전략은 세간의 주목을 받았습니다.
67
00:06:11,997 --> 00:06:19,354
Nvidia의 많은 엔지니어들은 딥러닝에 적합한 하드웨어를
만들기 위해서 많은 노력을 했습니다.
68
00:06:19,354 --> 00:06:27,718
그래서 딥러닝과 관련해서는 NVIDIA GPU가
거의 독점적으로 언급됩니다.
69
00:06:27,718 --> 00:06:35,268
아마 미래에는 또 다른 후발주자가 생겨날 지 모르겠지만
적어도 지금은 NVIDIA가 독점적입니다.
70
00:06:35,268 --> 00:06:41,705
자 그럼 CPU와 GPU의 차이는 무엇일까요? 제가 아주 간단하게
표로 한번 정리해 봤습니다.
71
00:06:41,705 --> 00:06:52,079
위에 두개는 Intel의 최신 상업용 CPU들이고 밑에 두개는
NVIDIA의 최신 상업용 GPU들입니다.
72
00:06:52,079 --> 00:06:55,975
여기에는 몇 가지 주요 트렌드가 있습니다.
73
00:06:55,975 --> 00:07:03,284
GPU와 CPU모두 임의의 명령어를 수행할 수 있는
범용 컴퓨팅 머신입니다.
74
00:07:03,284 --> 00:07:05,987
하지만 이 둘은 질적으로 아주 다릅니다.
75
00:07:05,987 --> 00:07:16,714
CPU의 경우 core의 수가 적습니다. 오늘날의 상업용 테스크탑 CPU의
경우에 코어가 4개에서 6개 조금 많으면 10개 정도입니다.
76
00:07:16,714 --> 00:07:24,893
그리고 hyperthreading 기술와 더불어 CPU는 8 ~ 20개의
스레드를 동시에 실행시킬 수 있습니다.
77
00:07:24,893 --> 00:07:29,700
따라서 CPU는 한번에 20가지의 일(스레드)을
할 수 있는 것입니다.
78
00:07:29,700 --> 00:07:34,527
이 숫자(20)가 그닥 커보이진 않습니다. 하지만
CPU의 멀티스레드는 아주 강력합니다.
79
00:07:34,527 --> 00:07:37,223
아주 많은 일을 할 수 있으면 엄청 빠릅니다.
80
00:07:37,223 --> 00:07:43,011
모든 CPU 명령어들은 정말 많은 일을 할 수 있죠
그리고 아주 독립적으로 수행합니다.
81
00:07:43,011 --> 00:07:51,909
하지만 GPU의 경우는 상황이 조금 다릅니다.
고성능의 상업 GPU의 경우 수천개의 코어가 있습니다.
82
00:07:51,909 --> 00:08:00,412
NVIDIA Titan XP와 같은 최상위 모델의 경우 3840개의
코어가 있습니다. 정말 엄청난 수 입니다.
83
00:08:02,223 --> 00:08:06,357
동일 가격의 CPU를 보면 코어가 10개 뿐이 없죠
84
00:08:06,357 --> 00:08:12,207
하지만 GPU의 단점을 보자면 각각의 코어가
더 느린 clock speed에서 동작한다는 점입니다.
85
00:08:12,207 --> 00:08:14,439
그리고 두번째는 그 코어들이 그렇게 많은 일을 할 수 없다는 것입니다.
86
00:08:14,439 --> 00:08:19,680
사실 CPU와 GPU코어는 1:1로 비교할 수 없습니다.
87
00:08:19,680 --> 00:08:22,510
GPU코어들은 독립적으로 동작하지 않습니다.
88
00:08:22,510 --> 00:08:29,297
코어마다 독립적인 테스크가 있는 것이 아니라 많은 코어들이
하나의 테스크를 병렬적으로 수행하는 것이죠
89
00:08:29,297 --> 00:08:32,405
따라서 코어의 수만 가지고 직접적으로 비교할 수는 없습니다.
90
00:08:32,405 --> 00:08:41,370
하지만 GPU의 코어의 수가 많다는 것은 어떤 테스크가 있을 때
이 일을 병렬로 수행하기 아주 적합하다는 것은 알 수 있습니다.
91
00:08:41,370 --> 00:08:44,742
하지만 그 테스크는 전부 같은 테스크여야 할 것입니다.
92
00:08:44,742 --> 00:08:49,387
그리고 또 한가지 말씀드릴 것은 메모리와 관련된 것입니다.
93
00:08:49,387 --> 00:08:58,523
CPU에도 캐시가 있습니다. 하지만 비교적 작습니다. CPU는 대부분의
메모리를 RAM에서 끌어다 씁니다.
94
00:08:58,523 --> 00:09:06,589
RAM은 일반적으로 8, 12, 16, 32 GB 바이트 정도이죠
95
00:09:06,589 --> 00:09:10,646
반면 GPU는 칩 안에 RAM이 내장되어 있습니다.
96
00:09:12,055 --> 00:09:22,675
실제 RAM와 GPU간의 통신은 상당한 보틀넥을 초래합니다.
그렇게 떄문에 GPU는 보통 칩에 RAM이 내장되어 있습니다.
97
00:09:23,955 --> 00:09:33,481
Titan XP의 경우 내장 메모리가 12GB정도 됩니다.
98
00:09:33,481 --> 00:09:41,790
GPU는 12GB의 메모리와 GPU 코어 사이의 캐싱을 하기 위한
일종의 다계층 캐싱 시스템을 가지고 있습니다.
99
00:09:41,790 --> 00:09:46,908
이는 CPU의 캐싱 계층구조와 아주 유사합니다.
100
00:09:47,985 --> 00:09:52,583
CPU는 범용처리에 적합합니다.
CPU는 아주 다양한 일을 할 수 있죠
101
00:09:52,583 --> 00:09:57,089
그리고 GPU는 병렬처리에 더 특화되어 있습니다.
102
00:09:57,089 --> 00:10:04,106
GPU에서 정말 잘 동작하고 아주 적합한 알고리즘은 바로
행렬곱(Matrix multiplication) 연산입니다.
103
00:10:04,106 --> 00:10:14,348
왼쪽 행렬은 행이 엄청 많은 행렬입니다.
오른쪽은 열이 많죠
104
00:10:14,348 --> 00:10:25,009
오른쪽 행렬은 왼쪽 두 행렬의 내적입니다. 그리고 이 때의
내적 연산은 모두 서로 독립적입니다.
105
00:10:25,009 --> 00:10:33,653
오른쪽의 결과행렬을 살펴보면 각각의 원소가 전부 독립적입니다.
따라서 모두 병렬로 수행될 수 있습니다.
106
00:10:33,653 --> 00:10:38,289
그리고 각 원소들은 모두 같은 일을 수행합니다.
두개의 벡터를 내적하는 것이죠.
107
00:10:38,289 --> 00:10:44,177
다만 서로 입력 데이터만 조금씩 다를 뿐입니다.
108
00:10:44,177 --> 00:10:55,166
GPU는 결과 행렬의 각 요소들을 병렬로 계산할 수 있으며
이러한 특성 때문에 GPU는 엄청나게 빠릅니다.
109
00:10:55,166 --> 00:11:04,940
이런 연산들은 GPU가 정말 잘 하는 것들입니다.
CPU였다면 각 원소를 하나씩만 계산할 것입니다.
110
00:11:06,337 --> 00:11:13,829
물론 CPU라고 그렇게 단순하게 동작하지는 않습니다. CPU는
여러개의 코어가 있고 Vectorized instructions이 존재합니다.
111
00:11:13,829 --> 00:11:19,568
그렇다고 해도 아주 massive한 병렬화 문제에 대해서는
GPU의 처리량이 압도적입니다.
112
00:11:19,568 --> 00:11:25,404
가령 행렬의 크기가 엄청 큰 경우가 될 수 있겠습니다. 그리고
비슷한 맥락으로 Convolution의 경우도 같습니다.
113
00:11:25,404 --> 00:11:36,359
convolution에는 입력(텐서)이 있고 가중치가 있죠 cov 출력은
마찬가지로 입력과 가중치간의 내적입니다.
114
00:11:36,359 --> 00:11:43,354
GPU의 경우라면 이 연산을 각 코어에 분배시켜서
아주 빠르게 연산할 수 있도록 해줍니다.
115
00:11:43,354 --> 00:11:49,510
이런 종류의 연산들이 일반적으로 CPU에 비해 GPU에서
연산 속도의 이점을 볼 수 있는 것들입니다.
116
00:11:51,695 --> 00:11:55,498
여러분들도 직접 GPU에서 실행되는 코드를 작성할 수 있습니다.
117
00:11:55,498 --> 00:12:03,614
NVIDIA에서 CUDA를 지원하는데 그 코드를 보면 c언어
스럽게 생겼습니다. 하지만 GPU에서 실행되는 코드입니다.
118
00:12:03,614 --> 00:12:05,484
하지만 CUDA코드를 작성하는 것은 상당히 까다롭습니다.
119
00:12:05,484 --> 00:12:12,002
GPU의 성능을 전부 짜낼 수 있는 코드를 작성하는 것은
상당히 힘든 일입니다.
120
00:12:12,002 --> 00:12:19,163
아주 세심하게 메모리구조를 관리해야 합니다. 가령 cache misses나
branch mispredictions 같은 것들을 전부 고려해야 하죠
121
00:12:19,163 --> 00:12:22,930
따라서 여러분 스스로 아주 효율적인 CUDA code를
작성하는 것은 상당히 어렵습니다.
122
00:12:22,930 --> 00:12:32,537
때문에 NVIDIA는 GPU에 고도로 최적화시킨 기본연산
라이브러리를 배포해 왔습니다.
123
00:12:32,537 --> 00:12:40,610
가령 cuBLAS는 다양한 행렬곱을 비롯한 연산들을 제공합니다.
이는 아주 고도로 최적화되어 있습니다.
124
00:12:40,610 --> 00:12:46,438
이는 GPU에서 아주 잘 동작하고 하드웨어 사용의
이론적 최대치까지 끌어올려 놓은 라이브러리입니다.
125
00:12:46,438 --> 00:12:54,499
유사하게 cuDNN이라는 라이브러리도 있습니다. 이는 convolution,
forward/backward pass, batch norm, rnn 등
126
00:12:54,499 --> 00:12:57,454
등 딥러닝에 필요한 거의 모든 기본적인 연산들을
제공하고 있습니다.
127
00:12:57,454 --> 00:13:03,842
NVIDIA는 자사의 하드웨어에 아주 효율적으로 동작하는
라이브러리를 바이어리로 배포하고 있습니다.
128
00:13:03,842 --> 00:13:09,624
따라서 실제로는 딥러닝을 위해 CUDA 코드를 직접 작성하는
일은 없을 것입니다.
129
00:13:09,624 --> 00:13:14,173
이미 다른 사람들이 작성한 코드를 불러와서 쓰기만 하면 됩니다.
130
00:13:14,173 --> 00:13:19,573
이미 NVIDIA에서 극도로 최적화된 소스를 가져와서 쓰기만 하면 됩니다.
131
00:13:19,573 --> 00:13:23,693
그리고 또 하나의 언어가 있는데 OpenCL입니다.
OpenCL이 조금 더 범용적입니다.
132
00:13:23,693 --> 00:13:29,185
NVIDIA GPU에서만 동작하는 것이 아니라 AMD 에서도
그리고 CPU에서도 동작합니다.
133
00:13:29,185 --> 00:13:43,938
하지만 OpenCL은 아직 딥러닝에 극도로 최적화된 연산이나 라이브러리가
개발되지는 않았습니다. 그래서 CUDA보다는 성능이 떨어집니다.
134
00:13:43,938 --> 00:13:51,839
미래에는 더 많은 open standard가 생기고 이종 플랫폼 간의
다양한 방법들이 생겨날지도 모르겠지만
135
00:13:51,839 --> 00:13:55,488
현재로썬 NVIDIA가 딥러닝의 선두주자입니다.
136
00:13:55,488 --> 00:14:01,686
GPU 프로그래밍을 직접 해보면 익힐 수 있는 다양한 리소스들이 있습니다.
아마 아주 흥미로울 것입니다.
137
00:14:01,686 --> 00:14:05,900
아주 massive한 병령처리 아키텍쳐를 다루는 것이기 때문에
코드를 작성하는 패러다임도 조금 다를 것입니다.
138
00:14:05,900 --> 00:14:08,023
하지만 이 이상은 우리 강의의 주제를 벗어나기 때문에
여기까지만 하겠습니다.
139
00:14:08,023 --> 00:14:12,263
다시한번 만씀드리지만 GPU로의 딥러닝을 위해서
굳이 스스로 CUDA code를 작성할 필요는 없습니다.
140
00:14:12,263 --> 00:14:16,600
사실 저의 경우도 연구 프로젝트를 진행하면서
CUDA code를 직접 짜본 적은 없습니다.
141
00:14:16,600 --> 00:14:22,219
하지만 여러분이 직접 코드를 짜진 않더라도 어떻게 동작하는지
잘 알아두는 것은 상당히 유욜할 수 있습니다.
142
00:14:23,488 --> 00:14:29,168
실제 CPU와 GPU의 성능을 한번 살펴보고 싶으시다면,
제가 작년 여름이 벤치마크 한 것이 있습니다.
143
00:14:29,168 --> 00:14:36,065
그때 당시 성능이 꽤 괜찮았던 Intel CPU와
성능이 가장 좋았던 NVIDIA GPU를 비교한 것입니다.
144
00:14:38,747 --> 00:14:48,954
더 자세한 내용은 제 Github에서 찾아볼 수 있습니다.
VGG16/19와 다양한 ResNets을 이용했는데요
145
00:14:49,830 --> 00:14:57,114
그리고 그 결과 GPU에서 보통 65에서 75배의 speed up을 볼 수
있었습니다. 완전히 같은 연산량으로 비교한 것이죠
146
00:14:57,114 --> 00:15:00,984
GPU의 경우는 Pascal TitanX입니다.
147
00:15:00,984 --> 00:15:08,604
CPU의 경우 최상위 성능 까지는 아니였지만
Intel E5 Processor였습니다.
148
00:15:08,604 --> 00:15:15,550
하지만 여러분들이 이와 같은 딥러닝 벤치마크를 살펴볼 때
정말 조심해야 할 점이 있습니다.
149
00:15:15,550 --> 00:15:20,103
왜냐하면 비교군 간에 불공평한 비교를 하기 십상이기 떄문이죠
150
00:15:20,103 --> 00:15:26,339
따라서 여러분들이 벤치마크를 살펴볼 때 어떤 부분이 불공평한지를
주도면밀하게 살펴볼 필요가 있습니다.
151
00:15:26,339 --> 00:15:35,855
제가 이 벤치마크에 대해 말씀드려 보자면 이 결과는 사실
CPU에게는 조금 불리합니다.
152
00:15:35,855 --> 00:15:38,721
제가 CPU에서는 성능을 최대화 시킬 수 있을만큼
공을 들이기 않았기 때문입니다.
153
00:15:38,721 --> 00:15:42,483
저는 아마 BLAS 라이브러리가 CPU에서 더 잘 동작하도록
수정해 볼 수도 있었을 것입니다.
154
00:15:42,483 --> 00:15:44,540
그렇게 되면 이 표의 결과 보다는 조금 더 좋았을 것입니다.
155
00:15:44,540 --> 00:15:51,964
하지만 이또한 뛰어난 성능이긴 합니다. Torch를 설치하고
CPU와 GPU로 실행시켜본 것입니다.
156
00:15:51,964 --> 00:15:57,872
이 성능도 나쁘진 않지만 CPU의 성능을 극대화 시킨 것은 아닙니다.
157
00:15:57,872 --> 00:16:02,422
CPU의 성능을 높힐 수 있는 여지는 충분했습니다.
158
00:16:02,422 --> 00:16:15,543
그리고 또 하나의 벤치마크가 있는데 convolution 연산에
cuDNN을 사용한 것과 일반적인 CUDA를 사용한 것입니다.
159
00:16:15,543 --> 00:16:17,623
오픈소스 커뮤니티에 게제된 결과입니다.
160
00:16:17,623 --> 00:16:24,653
여기에서 볼 수 있는 것은 동일한 하드웨어와 동일한 딥러닝
프레임워크를 사용한 것이고 다른 점은 오직
161
00:16:24,653 --> 00:16:37,442
cuDNN/CUDA 입니다. CUDA은 조금 덜 최적화된 것이죠.
cuDNN이 3X의 속도향상이 있습니다.
162
00:16:37,442 --> 00:16:45,202
일반적으로 여러분이 GPU 코드를 직접 작성해야 한다면
cuDNN을 반드시 사용해야 할 것입니다.
163
00:16:45,202 --> 00:16:51,602
cuDNN 라이브러리를 쓰고 안 쓰고의 차이가 거의
3배가 날테니 말입니다.
164
00:16:51,602 --> 00:17:02,882
그리고 실제로 GPU로 학습을 할 때 생기는 문제 중 하나는 바로 Model과
Model의 가중치는 전부 GPU RAM에 상주하고 있는 반면에
165
00:17:02,882 --> 00:17:07,243
실제 Train data(Big data)는 SSD와 같은 하드드라이브에
있다는 것입니다.
166
00:17:07,243 --> 00:17:13,204
때문에 Train time에 디스크에서 데이터를 읽어드리는 작업을
세심하게 신경쓰지 않으면 보틀넥이 발생할 수 있습니다.
167
00:17:14,321 --> 00:17:23,002
GPU는 forward/backward 가 아주 빠른 것은 사실이지만, 디스크
에서 데이터를 읽어드리는 것이 보틀넥이 되는 것입니다.
168
00:17:23,002 --> 00:17:25,699
이는 상당히 좋지 않은 상황이고 느려지게 될 것입니다.
169
00:17:25,700 --> 00:17:31,459
해결책 중 하나는 바로 데이터셋이 작은 경우에는 전체를
RAM에 올려 놓는 것입니다.
170
00:17:31,459 --> 00:17:36,479
데이터셋이 작지 않더라도, 서버에 RAM 용량이 크다면
가능할 수도 있을 것입니다.
171
00:17:36,479 --> 00:17:42,917
혹은 HDD대신에 SSD를 사용하는 방법이 있습니다.
데이터를 읽는 속도를 개선시킬 수 있겠죠
172
00:17:42,917 --> 00:17:52,152
또 한가지 방법은 바로 CPU의 다중스레드를 이용해서 데이터를
RAM에 미리 올려 놓는 것(pre-fetching) 입니다.
173
00:17:52,152 --> 00:17:57,724
그리고 buffer에서 GPU로 데이터를 전송시키게 되면
성능향상을 기대할 수 있을 것입니다.
174
00:17:57,724 --> 00:18:08,804
물론 이런 설정 자체가 조금 까다롭긴 하지만 GPU는 빠른데 데이터
전송 자체가 충분히 빠르지 못하면 보틀넥이 생길수 밖에 없습니다.
175
00:18:08,804 --> 00:18:11,657
이 부분은 항상 인지하고 있어야 합니다.
176
00:18:11,657 --> 00:18:17,432
지금까지는 딥러닝에 관련한 GPU와 CPU에 대한
간략한 소개였습니다.
177
00:18:17,432 --> 00:18:21,616
자 이제 조금 주제를 틀어서
소프트웨어와 관련된 이야기를 해볼까 합니다.
178
00:18:21,616 --> 00:18:25,006
실제로 사람들이 사용하는 딥러닝 프레임워크와 관련된 것입니다.
179
00:18:25,006 --> 00:18:28,819
다음으로 넘어가기에 앞서 혹시 CPU와 GPU에 관한
질문 있으십니까?
180
00:18:28,819 --> 00:18:30,519
네 질문있나요?
181
00:18:30,519 --> 00:18:34,686
[학생이 질문]
182
00:18:40,961 --> 00:18:45,854
질문은 바로 데이터읽기 에서의 병목을 해결하기 위해서
프로그래밍으로 우리가 할 수 있는 일이 무엇인지 입니다.
183
00:18:45,854 --> 00:18:50,833
소프트웨어적으로 할 수 있는 일은
CPU에서 미리 불러오는 것입니다.(pre-fetching)
184
00:18:50,833 --> 00:18:55,054
여러분은 다음과 같이 과정들이 순차적으로 진행되는
것을 원하지 않을 수 있습니다.
185
00:18:55,054 --> 00:18:58,791
디스크에서 데이터를 읽습니다. 그리고 미니배치의 데이터가
다 읽힐 때 까지 기다립니다.
186
00:18:58,791 --> 00:19:02,458
그리고 미니배치를 GPU에 전송합니다.
그리고 GPU에서 forward/backward를 수행하고
187
00:19:02,458 --> 00:19:05,442
그다음 또 다른 미니배치를 읽는 것이죠
이 단계를 전부 순차적으로 진행합니다.
188
00:19:06,714 --> 00:19:15,469
하지만 그러지 말고 CPU의 멀티스레딩을 통해 디스크에서
데이터를 불러오는 백그라운드 작업을 하고 있다면
189
00:19:15,469 --> 00:19:17,076
이 과정을 interleave하게 진행할 수 있을 것입니다.
190
00:19:17,076 --> 00:19:21,506
GPU이 계산을 수행하는 동안 CPU의 백그라운드 스레드는
디스크에서 데이터를 불러옵니다.
191
00:19:21,506 --> 00:19:28,534
그리고 CPU의 메인 스레드에서 synchronization를 관리하게 되면
이 모든 작업이 병렬로 수행될 수 있을 것입니다.
192
00:19:28,534 --> 00:19:38,016
그리고 고맙게도 여러분이 딥러닝 프레임워크를 사용한다면 이미 다
구현되어 있습니다. 일일이 구현하기 까다롭기 때문이죠
193
00:19:38,016 --> 00:19:41,738
딥러닝 프레임워크의 동향을 급변하고 있습니다.
194
00:19:41,738 --> 00:19:47,915
작년까지만 해도 Caffe, Torch, Tensorflow에 대해서만
언급했었습니다.
195
00:19:47,915 --> 00:20:00,232
1년 전까지만 해도 Tensorflow가 가장 최신의 프레임워크라서
사람들에게 널리 쓰이지 않았었습니다.
196
00:20:00,232 --> 00:20:06,310
하지만 지금은 아주 유명해져서 많은 사람들이 선택하는
메인 프레임워크가 되었습니다. 아주 큰 변화입니다.
197
00:20:07,342 --> 00:20:12,282
그리고 작년부터 정말 많은 프레임워크가 생겨나고 있습니다.
198
00:20:12,282 --> 00:20:18,052
특히나 Caffe2와 PyTorch가 생겼습니다.Facebook에서 밀고있는
프레임워크로 아주 흥미롭습니다.
199
00:20:18,052 --> 00:20:20,409
그 밖에도 정말 많은 프레임워크들이 있습니다.
200
00:20:20,409 --> 00:20:24,089
Baidu에는 Paddle이 있고 Microsoft는 CNTK이 있죠
201
00:20:24,089 --> 00:20:33,449
Amazon은 주로 MXNet을 사용하는데 이 밖에도 정말 많은
프레임워크가 있습니다. 다 써볼 시간도 부족하죠
202
00:20:33,449 --> 00:20:43,572
이 그림에서 주목할만한 재미있는 점은 바로 딥러닝 프레임워크의
초창기 세대는 학계(academia)에서 구축되었다는 것입니다.
203
00:20:43,572 --> 00:20:49,388
원래 Caffe은 Berkeley에서 Torch는 NYU에서 개발되었고
이후 Facebook과 공동연구를 시작한 것이죠
204
00:20:49,388 --> 00:20:52,077
Theana은 대부분 Montreal에서 개발했습니다.
205
00:20:52,077 --> 00:20:56,491
하지만 다음세대의 딥러닝 프레임워크들은
기업(industry)에서 태동했습니다.
206
00:20:56,491 --> 00:21:00,659
Caffe2와 PyTorch는 Facebook에서 나왔습니다.
TensorFlow은 Google에서 나왔죠
207
00:21:00,659 --> 00:21:08,925
최근 몇 년간의 흥미로운 변화는 바로
academia에서 industry로의 이동이라고 할 수 있습니다.
208
00:21:08,925 --> 00:21:13,187
이제는 industry가 이러한 강력한 프레임워크를 제공하고 있습니다.
209
00:21:14,147 --> 00:21:24,850
오늘은 대부분 PyTorch와 TensorFlow에 대해서 말씀드릴 것입니다.
아마 여러분은 앞으로 이 두 프레임워크를 자주 다루게 될 것입니다.
210
00:21:24,850 --> 00:21:32,192
Caffe와 Caffe2도 간단히 설명해 드리겠습니다.
하지만 깊게 말씀드리진 않을 것입니다.
211
00:21:32,192 --> 00:21:36,705
우선 더 깊게 들어가기 전에 제가 어떤 것을 주로 사용했는지
미리 말씀드려야 할 것 같습니다.
212
00:21:36,705 --> 00:21:43,501
저 같은 경우에는 지난 몇 년간 Torch를 이용했습니다.
아주 많이 사용했고 참 좋아하는 녀석입니다.
213
00:21:43,501 --> 00:21:48,568