2016년 12월 2일 금요일

caffe, multi gpu 사용시 batch size 문제와 속도 저하 문제

의문
single GPU일 때, 만약 batch size로 10을 썼더니 GPU 효율이 99%였다고하자. GPU가 두개라면 batch size를 20으로, GPU가 4개라면 batch size를 40으로 바꾸어주어야 모든 GPU의 효율이 99%가 될까? 아니면 그냥 10으로 두어도 caffe가 알아서 활용할까?

교과서 답
참고: https://github.com/BVLC/caffe/blob/master/docs/multigpu.md
현재 multi-gpu는 training에만 지원함.
실행 옵션으로 --gpu=0,1 혹은 --gpu=all로 설정여부를 선택함.
하지만 solver에서 혹은 caffe가 batch사이즈를 보고 잘라서 넣지는 않음.
즉, train_val의 batch size를 늘려주고, 이에따라 solver도 수정하여야 함.
참고로 GPU를 두개달면 최고 ~1.8배까지 빨라지고 4개를 달면 ~3.5배까지 빨라짐.

그런데 실제로는?
그런데... 그냥 돌려도 활용을 한다(사실 하는 것처럼 보인다). 하지만 실제로 학습속도를 확인하면 느리다.
그래서 batch를 2배(혹은 1.5배)로 해서 돌리면 out of memory가 난다.
개인적으로 NVCC를 enable하지 않았다면 gpu하나로 돌리는 것이 더 빠르다고 생각한다.

추후 업데이트
이후 여러 환경에서 실험을 다시함.
실험 PC2: TITANX, caffe0.14.0, cuda7.5, cudnn4.1:
    23초 / 49 images train
실험 PC3: TITANX, caffe1.0.0, cuda8.0, cudnn5.1:
    20초 / 49 images train
실험 PC4: TITANXx2, SLI, PCI1/3에 설치, caffe1.0.0, cuda8.0, cudnn5.1, nvcc:
    22초 / 49 images train
즉, SW는 최신으로 업데이트하면 빨리지지만 multi-gpu는 시키는대로 HW 및 SW를 설치하고 실험해도 느려짐.

실제로 이와 관련된 질문이 꽤 있음.
https://groups.google.com/forum/#!topic/digits-users/gn3MQ9QcxMY