수업 정리(개인용)/cs231n

CS231n 2017 Lecture 8 : Deep Learning Software

yuuuuuuuuun 2020. 12. 26. 19:47

GPU가 강점을 보이는 연산은 행렬 곱이다. 행렬 곱은 벡터 내적을 여러 번 하는 것이기 때문에 병렬로 처리하면 엄청나게 빠르다. NVIDIA GPU를 쓰자.

 

GPU에 최적화된 프로그래밍을 위해 NVIDIA에서 cuda라는 언어를 제공, 하지만 고수준 API들을 쓰지 직접 cuda를 쓸 일은 없다.

 

 

CPU와 GPU간의 엄청난 성능 차이를 확인할 수 있고, cuda를 직접 짠 것과 cuDNN을 사용한 것의 차이도 확인할 수 있다. 거의 3배 가량의 차이가 나므로 그냥 cuDNN을 쓰자. 사실은 우리는 tensorflow나 pytorch를 쓸 것이기 때문에 그 조차도 할 필요가 없을 것이다.

 

Training 시에 bottleneck을 막는 방법으로

1. 데이터를 모두 RAM에 올리기

2. SSD 쓰기

3. CPU thread로 data를 prefetch하기

가 있다.

 

1,2번은 직관적이니까 넘어가고, 3번에서 prefetch란 사용될 것으로 여겨지는 데이터를 미리 ram에 올려서 gpu가 놀지 않게 해주는 방식인 듯 하다. 데이터가 너무 크면 전체가 한번에 ram에 올라가지는 않으므로 이렇게 해야 할 것이다. 그런데 딥러닝 프레임워크는 이미 이런 기능을 제공하는 경우가 많다.

 

이러한 딥러닝 프레임워크들은

1. Computational graph를 그리기 쉽게 해준다.

2. Gradient를 자동으로 계산해준다.

3. GPU를 잘 활용해준다.

 

TF와 pytorch를 비롯한 몇가지 프레임워크를 설명하는데, 2020년에는 크게 유용하지 않을 것 같다.

 

Static과 Dynamic한 프레임워크의 장단점을 소개하는 부분만 정리하고 넘어가자.

 

Static은 그래프를 미리 만들어놓고 데이터를 흘리는 방식이고, dynamic은 tf의 eager excution을 생각하면 될 것 같다.

 

Static

-미리 그래프를 그리므로 사전에 최적화 가능

-Serialization이 가능하므로 python말고 c++로 연산하는 등의 방법을 쓸 수 있음

-Runtime에서 조건에 따라 graph의 flow를 조작하기가 까다로움.

 

Dynamic

-그래프를 미리 안그리므로 사전에 최적화가 불가능

-계산할 때 마다 원래 python code가 필요하므로 더 빠른 언어로 계산할 수 없음.

-Runtime에서 조건에 따라 동적으로 graph flow를 조작할 수 있음.

-Python스러운 코딩이 가능.