본문 바로가기

Infomation

Which GPU for Deep Learning?

요약번역 + @

여러개의 GPU를 써야 할까?

  • 여러개의 GPU를 한 컴퓨터에서 사용함. 40Gbit/s 의 통신속도를 가짐.
  • DNN을 여러개의 GPU에서 분산처리하는게 매우 어려운데 비해 스피드업은 그다지 빠르지 않음
  • 단, Data parallel에서 그치지 않고 Model parallel을 통하면 성능향상을 볼 수 있음
  • 멀티 GPU의 사용은 복잡한 네트워크와 거대한 데이터가 있어야 의미가 있는데 대기업이 아닌이상 이정도의 데이터를 확보하기 힘듦
  • 하지만 멀티 GPU를 사용한다면 동시에 여러 알고리즘을 각각의 GPU에서 실험할 수 있다는 장점이 있음
  • 10-15GB 이하의 작은 데이터셋을 사용한다면, 싱글 GPU로 충분함
  • 단, CNN은 weight sharing 때문에 data parallel이 가능해서 멀티 GPU가 유용함. 그러나, 멀티 GPU를 사용하는 알고리즘을 코딩하는 것은 싱글 GPU에 비해 훨씬 어렵다는 것을 잊지 말자.
  • 결론적으로 매우 매우 큰 데이터셋을 사용하는게 아닌 한 싱글 GPU로 충분함

그래서 어떤 GPU를 써야 할까? NVIDIA or AMD?

  • 몰랐는데, GPGPU 라이브러리인 CUDA와 OpenCL은 각각 NVIDIA와 AMD에서 지원하는 기술임. 즉 NVIDIA 그래픽카드를 사면 CUDA를 써야 하고, AMD 그래픽카드를 사면 OpenCL을 써야함.
  • Deep learning 라이브러리들이 대부분 CUDA 기반이므로 NVIDIA를 사야함
  • 뿐만 아니라 CUDA 커뮤니티가 OpenCL에 비해 훨씬 훌륭함

간단한 NN을 위해 필요한 메모리 크기는?

  • 필자는 GTX Titan with 6GB memory를 사용함
  • 보통 이렇게까지 많이 필요하지 않음
  • dropout + momentum/Nesterov(NAG)/AdaGrad/RMSProp 를 사용한 DNN의 메모리 필요량을 아래와 같이 계산해 볼 수 있음:

memory
Memory formula: The units for the first layer is the dimensionality of the input. In words this formula means: Sum up the weight sizes and input sizes each; multiply the input sizes by the batch size; multiply everything by 4 for bytes and by another 3 for the momentum and gradient matrix for the first term, and the dropout and error matrix for the second term; divide to get gigabytes.

주어진 예산에서 가장 빠른 GPU를 찾아보자!

  • Memory bandwidth
    • GPU의 성능은 일반적으로 FLOPS (FLoating-point OPerations per Second) 라는 초당 부동소수점 연산으로 측정함
    • 그러나 우리에게 중요한 건 그게 아니라 bandwidth가 몇 GB/s 가 나오느냐임. 이는 메모리를 초당 몇번이나 읽고 쓸 수 있는지를 의미
    • dot product 등의 모든 수학 연산이 전부 이 memory read/write bandwidth에 의존함
    • GPU bandwidths는 위키 페이지 를 참고하자
  • GPU(VGA) architecture
    • 또다른 중요한 룰은 그래픽카드의 아키텍처임
    • 900시리즈가 사용하는 Maxwell 아키텍처와 400, 500시리즈가 사용하는 Fermi 아키텍처가 600, 700시리즈가 사용하는 Kepler 아키텍처보다 빠름
    • 따라서 700(Kepler) 시리즈보다는 900(Maxwell) 시리즈를 고려해라.
  • 비싼 옵션: GTX Titan X or GTX 980
  • 저렴한 옵션: GTX 960 or GTX 680 with 4GB ram
  • RNN에 대해서는 GTX 970도 훌륭한 옵션이지만 복잡한 CNN을 돌릴 때는 3.5GB의 메모리와 괴상한 구조 때문에 문제가 생길 수 있음

GTX 970

  • GTX 970의 이상한 구조 때문에 메모리를 3.5GB 이상 사용하면 문제가 생길 수 있음
  • 이는 large CNN 을 학습할 때 문제가 됨
  • 하지만 시끄러웠던 것에 비하면 딥러닝에서 큰 문제는 없다. 메모리를 3.75GB 이하로 사용한다면 GTX 960보다 빠름
  • 메모리를 3.5GB 이하로 관리할 수 있다면, 바꿔 말해 3.5GB 이상 사용할 때 그걸 경고해주는 라이브러리를 함께 사용한다면 GTX 970은 매우 효율적인 선택
  • 이런 트러블을 신경쓰고 싶지 않다면 4GB GTX 960 or GTX 680을 추천

TL;DR advice

(그대로 퍼옴)

Best GPU overall: GTX Titan X
Cost efficient but expensive: GTX Titan X, GTX 980, GTX 980 Ti
Cost efficient but troubled: GTX 580 3GB (lacks software support) or GTX 970 (has memory problem)
Cheapest card with no troubles: GTX 960 4GB or GTX 680
I work with data sets > 250GB: GTX Titan, GTX 980 Ti or GTX Titan X
I have little money: GTX 680 3GB eBay
I have almost no money: AWS GPU spot instance
I do Kaggle: GTX 980 or GTX 960 4GB
I am a researcher: 1-4x GTX Titan X
I want to build a GPU cluster: This is really complicated, you can get some ideas here
I started deep learning and I am serious about it: Start with one GTX 680, GTX 980, or GTX 970 and buy more of those as you feel the need for them; save money for Pascal GPUs in 2016 Q2/Q3 (they will be much faster than current GPUs)

결론

  • 돈이 충분하다면 GTX Titan X or GTX 980
  • 돈이 부족하다면 GTX 960 or GTX 680. 문제가 있지만 컨트롤할 수 있다면 GTX 970
  • 정말 돈이 없다면 AWS GPU instance.

참고

기타

  • CNN 의 메모리 사이즈에 대한 단락은 생략했다. 본문을 참고하자. CNN은 메모리를 더 많이 필요로 하는 듯?
  • AWS GPU instance 에 대한 얘기도 생략했다. 저렴하게 사용하기에 좋으나 퍼포먼스가 부족하고 메모리 이슈 등이 존재.
  • 한 컴퓨터에서 멀티 GPU를 사용하는 것에 그치지 않고, 2대의 컴퓨터를 사용해서 총 4개의 GPU를 사용하는 포스트도 있다. GPU 클러스터를 만들고자 한다면 참고하자. 2대 이상의 컴퓨터를 사용할 때는 컴퓨터간 통신이 필요하고 따라서 Network bandwidth 이슈가 발생한다.