딥러닝 머신 스펙 관련 - PCI-2 x8과 x16 차이가 많이 나나요?

노형석   
   조회 2830   추천 1    

안녕하세요~ 몇 년만에 글을 다시 적는지 모르겠습니다. 

대학원 다닐때니 십년도 훨씬 넘은 것 같습니다. 


다름이 아니라 요즘 딥러닝에 관심이 있어서 이거저거 해보고 있습니다. 

이제 기초좀보고 텐서플로우 깔아서 하나씩 확장해보려고 하는데요, 

슬슬 머신 지름신이 오는 것 같습니다. 


그래서 i7 에다가 1080Ti 정도로 맞춰볼까 합니다.

궁금한 점은, 1080Ti 한개는 일반 보드에서 x16으로 동작하는 것 같습니다. 

그런데 두개는 x8 x8로 동작하는 것 같은데, 이 경우 텐서플로우 등으로 큰 모델을 돌릴때 속도차이가 발생하는 건가요? 

검색을 해보니 게임이나 일반적인 경우에 대부분은 큰 차이가 없고, 특이한 경우에는 차이가 있는 것 같습니다. 


x16 두개를 지원하는 시스템으로 마련하려면 처음부터 제온으로 가야해서 비용이 만만치 않더라군요. 

고수분들의 의견을 부탁드립니다. 

박문형 2017-06
저도 우선 그렇게만 알고 있습니다..

그보다 더 중요한 것은 쿨링과 파워입니다..

GPU 4개정도 겹쳐서 돌리면 바람이 재대로 안통하는 경우 열축적으로 보드나 GPU기판이 타버리는(눌어버리는) 경우가 있습니다..
솔리스 2017-06
딥러닝을 제대로 하는 사람 기준으로는 차이가 큽니다.

딥러닝 제대로 하려면 사용하는 데이터셋은 완벽히 메모리에 올려둔 채로 돌려야 합니다.
100% 폰노이만 아키텍처로만 딥러닝 구조가 동작이 되어야 제대로 돌아갑니다.
그게 아니라 중간에 스토리지 엑세스가 들어가는 경우, 1일이면 될 학습이 10일, 100일이 걸립니다.

그렇다면 메모리와 GPU간의 대역폭을 따져봐야 하는데
일단 데스크탑용 인텔 CPU는 PCI-E 3.0 16x 하나면 꽉 차거나 거의 꽉 찹니다. (16~20레인 정도 줍니다.)
그 다음은 PCH 거쳐서 PCI-E 3.0을 16레인정도 더 쓸 수 있는데, CPU에 직접 물리는 PCI-E 3.0보다 10% 이상 속도가 느립니다.

메모리와 GPU만 통신하는 상황에서는 PCI-E 3.0 16x 대역폭도 부족합니다.
그래서 나온게 NV-Link입니다.

GPU 두 개 쓰려면 일단 데탑용 CPU로는 제대로 된 성능이 안 나옵니다.
(제가 AMD로 바꿔보려는게 AMD는 40레인을 주기 때문인데요, 물론 IPC가 낮아서 오히려 잃는게 더 클 수도 있습니다.)

딥러닝이 GPU 메모리의 데이터를 여러번 쓰는 구조가 아니라
컴퓨터의 메모리에서 데이터를 계속 입출력하는 구조이기 때문에
대역폭이 상당히 중요합니다.

완벽한 폰노이만 구조로 코딩하면 굳이 GPU 2개 필요 없습니다.
1080 Ti를 두개 써야 할 상황이라면, 이미 두개로 커버 안되는 상황입니다.
한개로 테스트하되 코딩 제대로 해서 성능 100% 쓰고,
그래도 커버 안되면 파라메터 서버 중앙에 두고 10대 20대씩 물려 쓰는게 좋습니다.

데스크탑용 CPU에 GPU 두개 이상 물리는건 돈낭비입니다.
아무리 지지고 볶아봐야 대역폭이 안됩니다.
     
입력데이터의 배치 크기를 키웠을 때
연산을 안 하고 GPU가 놀고 있는 현상이 보이면
RAM - GPU 대역폭이 부족하다고 볼 수 있을까요?
GPU는 1080ti를 사용하고 있습니다.

제 경우에는
Batch size를 키우면 GPU가 놀고 있고
Batch size를 줄이면 한번에 처리하는 숫자가 줄어서 속도가 느리고
해서 GPU를 잘 못 쓰고 있는 것 같습니다.
          
솔리스 2017-06
1. 배치 늘릴 때 GPU Utilization이 낮아지면 데이터가 메모리에 올라가지 않아서 그럴 가능성이 큽니다.
CPU L1 Cache보다 10배 느린게 L2 Cache이고,
L2 Cache보다 10배 느린게 L3 Cache이고,
L3 Cache보다 10배 느린게 Memory (흔히 말하는 램. 폰노이만 구조에서는 Memory라고 합니다.) 입니다.

Memory보다 최소 10배 느린게 Storage (흔히 말하는 SSD/HDD 등. 폰노이만 구조에서는 Storage라고 합니다.) 입니다.
그래서 데이터가 Storage에 들어있고 학습할 때 마다 여기서 불러온다면
1일이면 될 학습이 1년 걸리는 경우가 허다합니다.

(여담이지만 구글은 이러저러한 모든 최적화를 다 한 상태에서 GPU 1000개 물리고 보통 1개월 정도 학습시킵니다.)

데이터를 모두 메모리에 올려둔 경우에는 GPU 활성화율이 50% 아래로 떨어지기가 어렵습니다. (GPU 전송 시간이 GPU 연산 시간보다 긴 경우)
다만, 아주 간단한 구조의 네트워크라면 GPU 활성화율이 낮아질 수 있는데, 그 경우엔 그냥 CPU로 SIMD써서 코딩하는게 더 빠릅니다.

즉 말씀하신 상황은 일단 학습데이터가 메모리에 다 올라가고 있는지 확인해 보셔야 합니다.
배치가 늘어서 GPU 시간이 짧아진다는건, GPU에 전송하는 시간이 길어져서이기보다는 I/O 처리에서 걸리는 시간이 길어져서일 가능성이 더 큽니다.
(정확한건 코드를 봐야 알겠지만요.)


2. (잡담) 배치를 늘리는게 좋은 결과를 내지는 않습니다. (정확히는 미니배치겠죠)
배치를 늘리면 GPU 활성화율을 높이고 학습을 빠르게 진행시킬 수 있지만
최종적으로 학습된 모델의 성능은 대체로 떨어집니다.

최근에는 배치 사이즈를 32 정도로만 사용합니다.
백프롭 과정에서 그래디언트 업데이트 시 대체로 배치 평균을 써서 정밀한 조율이 안 되기 때문입니다.
참고정도만 하셔도 좋을 것 같습니다.

그래서  Quadro Q6000같은건 메모리가 24기가지만, 오히려 GP100은 16기가로 줄어듭니다. (대신에 메모리 속도는 10배인가 빠릅니다.)
최근에는 배치 사이즈가 작아져서 왠만해서는 16기가도 다 쓰기 힘들고, 사실 16기가에 배치 32개도 못 올리는 네트웍이라면 99% 오버피팅이란 의미라서..
               
감사합니다
분명 램에 올라간것 같은데
병목이 어디인지 확인 해 봐야겠네요
박문형 2017-06
그렇게 된다면 이번 년도 후반기에 나올 인텔 및 AMD 서버 CPU 들에서는 상당한 성능을 기대할 수 있을지도 모르겠습니다..
노형석 2017-06
좋은 의견 감사드립니다. RAM<->GPU 간 읽기/쓰기가 빈번하고 양이 많을때에 대역폭에 문제가 되는 것 같군요.
아직은 시작해보는 단계라, 그런 걱정은 할일이 없을 것 같으니, 일단은 무시해도 되는 이슈 같습니다.

짧은 글에 길고 자세히 설명해주셔서 감사합니다.
좋은하루 되세요~
토토롱 2017-06
배치사이즈 조정과 데이터 피딩, 주요 변수의배치를 잘 고려하면 - 이라기보다 검증된 딥러닝 프레임워크를 쓰시면 대부분 대역폭에는 큰 문제가 없다는게 결론입니다.

유의미한 차이가 없다고 하면 거짓말이겠으나, 40레인 정도 갖는 CPU라면 GPU 4장 정도는 커버 가능하니 GPU를 늘리고 분산처리에 유리한 구조를 만드는게 더 효율적이지 않을까요




제목Page 1/3
2015-12   8974   백메가
2015-10   8560   yourip
12-26   733   sephiroce
12-05   932   백만스물하나
2017-11   1336   Kams6052
2017-10   1568   까치98
2017-09   2935   날개
2017-07   3725   백만스물하나
2017-06   3789   백만스물하나
2017-06   3955   백만스물하나
2017-06   2831   노형석
2017-05   2793   김황중
2017-05   2366   백만스물하나
2017-05   2218   띠껑
2017-05   2270   승후니도쿄
2017-05   4451   승후니도쿄
2017-05   3455   blueMango
2017-04   3399   하셀호프
2017-04   2775   베리파잉
2017-04   3110   하셀호프
2017-04   2209   신현준
2017-04   2777   임은천