딥러닝을위한 멀티 GPU 시스템 구축 및 사용 방법

딥러닝을 위해 GPU를 사용하기 시작하자 딥러닝 기술이 빠르게 향상되었습니다. 알고리즘과 알고리즘의 실험을 다른 파라메터로 실행하고 신속한 피드백을 얻을 수 있다면 훨씬 더 빨리 배울 수 있습니다. 처음에는 딥러닝이 많은 시행 착오를 겪었습니다. 좋은 결과를 얻으려면 어떤 파라메터를 조정해야하는지, 어떤 퍼즐 조각이 누락되어 있는지 느껴야 합니다. GPU를 사용하면 빠르게 실패하고 중요한 교훈을 배울 수 있어 계속 개선 할 수 있습니다. 얼마 지나지 않아 Clouddflower 경연 대회에서 제 2의 기술을 배우기에 충분한 학습 기술이 사용되어 주어진 문장들 (날씨가 좋고 비가 내리는 날씨)에서 날씨 라벨을 예측하는 것이 었습니다.

이 성공 후 딥러닝 알고리즘을 더 빨리 훈련시키기 위해 여러 개의 GPU를 사용하자는 유혹이 생겼습니다. 또한 단일 GPU에 맞지 않는 매우 큰 모델을 학습하는 것에 관심이 생겼습니다. 그래서 나는 작은 GPU 클러스터를 만들고 여러 GPU를 사용하여 여러 노드로 딥러닝 속도를 높일 수 있는 가능성을 모색하고 싶었습니다.

GPU 클러스터의 중요 구성 요소

연구를 수행 할 때 구입할 하드웨어에 대한 주요 병목 현상은 네트워크 대역폭, 즉 초당 컴퓨터에서 컴퓨터로 전송할 수있는 데이터의 양이 얼마나 되는지가 중요한 것임을 곧 알게되었습니다. 네트워크 카드 (저렴한 카드는 약 4GB/s)의 네트워크 대역폭은 PCIe 3.0 대역폭 (15.75GB /s)의 속도와 비슷하지 않습니다. 따라서 컴퓨터 내의 GPU-GPU 통신은 빠르지만 컴퓨터 간에는 느려질 것입니다. 그 중에서도 대부분의 네트워크 카드는 CPU에 등록된 메모리에서만 작동하므로 두 노드 사이의 GPU 간 GPU 전송은 다음과 같습니다. GPU 1 ~ CPU 1 ~ 네트워크 카드 1 ~ 네트워크 카드 2 ~ CPU 2 ~ GPU 2. 이것이 의미하는 바는 느린 네트워크 카드를 선택하면 단일 컴퓨터을 속도를 따라갈 수 없다는 것입니다. 고속 네트워크 카드를 사용하는 경우에도 클러스터가 클 경우,

이것이 Google과 Microsoft 같은 많은 대기업이 GPU 클러스터가 아닌 CPU를 사용하여 큰 신경 네트워크를 구성하는 이유입니다. 운좋게도 Mellanox와 Nvidia는 최근이 문제를 해결하기 위해 함께 모였습니다. 그 결과 GPU 메모리 주소를 이해하고 GPU에서 GPU로 직접 컴퓨터간에 데이터를 전송할 수있는 네트워크 카드 드라이버인 GPUDirect RDMA를 만들었습니다.

 

 

일반적으로 싼 네트워크 카드를위한 가장 좋은 방법은 온라인 마켓입니다. 나는 eBay의 광케이블과 함께 GPUDirect RDMA를 지원하는 40Gbit/s Mellanox 네트워크 카드 세트를 저가에 구매했습니다. 저는 이미 6GB의 메모리를 갖춘 GTX Titan GPU 2 대를 가지고 있었고 단일 메모리에 맞지 않는 거대한 모델을 만들고 싶었기 때문에 6GB 카드를 유지하고 추가로 더 구입하여 24GB 메모리를 갖춘 클러스터를 구축하기로 했습니다. 되돌아 보면 이것은 다소 어리석은(그리고 값 비싼) 아이디어 였지만 당시에는 그러한 대형 모델의 성능과 GPU의 성능을 평가하는 방법에 대해서는 거의 알지 못했습니다. 빠른 노드 간 통신을 위해 PCIe 3.0 보드를 선택했습니다. 큰 네트워크를 다루기 위해 더 자유롭게 일할 수 있도록 GPU 메모리보다 약 2 배의 RAM을 갖는 것도 좋은 생각입니다. 딥러닝 프로그램은 GPU에 대해 하나의 스레드를 사용하므로 대부분의 경우 GPU만큼의 코어를 가진 CPU로 충분합니다.

하드웨어 : 소프트웨어 측면도 점검하십시오.

기본적으로 멀티 GPU 프로그래밍을 수행하는 방법에는 두가지 옵션이 있습니다. CUDA에서 수행하고 단일 스레드를 가지고 현재 장치를 설정하고 전용 메모리 스트림을 선언하여 각 ​​GPU에 할당함으로써 직접 GPU를 관리하는 방법과 다른 옵션은 단일 스레드가있는 CUDA 인식 MPI 를 사용 하는 것입니다 각 GPU에 대해 생성되며 모든 통신 및 동기화는 MPI에 의해 처리됩니다. 첫 번째 방법은 GPU를 반복하고 스트리밍 및 컴퓨팅을 처리하는 효율적인 추상화를 만들어야하기 때문에 다소 복잡합니다. 효율적인 추상화를 사용하더라도 코드가 줄바꿈으로 빠르게 분해되어 읽기 어렵고 유지하기가 쉽지 않습니다.

 

 

일부 샘플 MPI 코드. 첫 번째 작업은 한 세트의 데이터를 네트워크의 다른 모든 컴퓨터로 전파합니다. 두 번째 작업은 모든 프로세스에서 하나의 데이터세트를 수신합니다. 이것이 전부입니다. 매우 쉽습니다!

두 번째 옵션은 훨씬 효율적이고 깨끗합니다. MPI는 고성능 컴퓨팅의 표준이며 표준 라이브러리는 MPI 방법이 실제로 수행해야 할 작업을 실제로 수행 할 수 있음을 의미합니다. 기본 MPI는 위의 첫 번째 방법과 동일한 원칙이 사용되지만 추상화가 매우 뛰어나 단일 GPU 코드를 여러 GPU 코드 (적어도 데이터 병렬 처리의 경우)에 적용하기가 쉽습니다. 결과는 깨끗하고 유지 보수가 가능한 코드이므로 다중 GPU 컴퓨팅을 위해 항상 MPI를 사용하는 것이 좋습니다. MPI 라이브러리는 여러 언어로 제공되므로 원하는 언어로 페어링 할 수 있습니다. 이 두 가지 구성 요소를 통해 갈 준비가 되었으며 즉시 여러 GPU에 대한 딥러닝 알고리즘을 프로그래밍 할 수 있습니다.

출처 : http://timdettmers.com/2014/09/21/how-to-build-and-use-a-multi-gpu-system-for-deep-learning/

Tags:

딥러닝

gpu

GPU

Mellanox

GPUDirecct

RDMA

MPI