Main Content

복수의 GPU에서 MATLAB을 사용한 딥러닝

MATLAB®은 복수의 GPU를 병렬로 사용하여 단일 심층 신경망을 훈련시키는 것을 지원합니다. GPU와 함께 병렬 워커를 사용하여 로컬 컴퓨터, 클러스터, 클라우드에서 복수의 GPU로 훈련시킬 수 있습니다. 복수의 GPU를 사용하면 훈련 속도를 대폭 높일 수 있습니다. 다중 GPU 훈련으로 성능 이득이 기대되는지 보려면 다음 인자를 고려하십시오.

  • 각 GPU에서 반복은 얼마나 걸리는가? 각 GPU 반복이 짧다면 GPU 간 통신으로 인해 추가되는 오버헤드가 두드러질 수 있습니다. 보다 큰 배치 크기를 사용하여 반복당 계산을 늘려 보십시오.

  • 모든 GPU가 하나의 컴퓨터에 있는가? 서로 다른 컴퓨터에 있는 GPU 간 통신은 상당한 통신 지연을 유발합니다. 적절한 하드웨어가 이 영향을 줄일 수 있습니다. 자세한 내용은 고속 다중 노드 GPU 통신에 대한 고급 지원 항목을 참조하십시오.

로컬 컴퓨터에 있는 복수의 GPU를 사용하여 단일 신경망을 훈련시키려면 코드의 다른 부분은 변경하지 말고 ExecutionEnvironment 옵션을 "multi-gpu"로 지정하기만 하면 됩니다. trainnet 함수는 사용 가능한 GPU를 훈련 계산에 자동으로 사용합니다. 복수의 로컬 GPU를 사용하여 신경망을 훈련시키는 방법을 보여주는 예제는 Train Network Using Automatic Multi-GPU Support 항목을 참조하십시오.

원격 클러스터에서 훈련시킬 때는 ExecutionEnvironment 옵션을 "parallel-auto"로 지정하십시오. 클러스터가 하나 이상의 GPU에 액세스할 수 있는 경우 trainnet은 훈련에 GPU만 사용합니다. 고유한 GPU가 없는 워커는 훈련 계산에 사용되지 않습니다.

더 많은 리소스를 사용하기 위해 딥러닝 훈련을 클러스터 또는 클라우드로 확장할 수 있습니다. 병렬 옵션에 대한 자세한 내용은 Scale Up Deep Learning in Parallel, on GPUs, and in the Cloud 항목을 참조하십시오. 예제를 시도해 보려면 자동 병렬화 기능을 사용하여 클라우드의 신경망 훈련시키기 항목을 참조하십시오.

GPU 또는 병렬 옵션을 사용하려면 Parallel Computing Toolbox™가 필요합니다. GPU를 사용하려면 지원되는 GPU 장치도 필요합니다. 지원되는 장치에 대한 자세한 내용은 GPU 연산 요구 사항 (Parallel Computing Toolbox) 항목을 참조하십시오. 또한, 원격 클러스터를 사용하려면 MATLAB Parallel Server™가 필요합니다.

로컬 컴퓨터에서 복수의 GPU 사용하기

참고

ssh 또는 원격 데스크탑 프로토콜(RDP)을 통해 연결한 클라우드의 단일 컴퓨터에서 MATLAB을 실행하면, 신경망의 실행과 훈련에 로컬 컴퓨터에서 실행할 때와 동일한 코드가 사용됩니다.

복수의 GPU가 장착된 컴퓨터에 액세스할 수 있는 경우에는 trainingOptions 함수를 사용하여 ExecutionEnvironment 훈련 옵션을 "multi-gpu"로 설정하고 trainnet 함수를 사용하여 신경망을 훈련시킬 수 있습니다.

"multi-gpu"를 사용하면 로컬 병렬 풀에서 복수의 GPU를 사용할 수 있습니다. 현재 병렬 풀이 없다면, trainnet은 디폴트 클러스터 프로파일 설정을 사용하여 로컬 병렬 풀을 자동으로 시작합니다. 풀에는 사용할 수 있는 GPU만큼의 워커가 있습니다.

로컬 컴퓨터에서 복수의 GPU를 사용하여 사용자 지정 훈련을 수행하는 방법에 대한 자세한 내용은 Run Custom Training Loops on a GPU and in Parallel 항목을 참조하십시오.

클러스터에서 복수의 GPU 사용하기

원격 클러스터에서 복수의 GPU를 사용하는 훈련의 경우 trainingOptions 함수를 사용하여 ExecutionEnvironment 훈련 옵션을 "parallel-auto" 또는 "parallel-gpu"로 설정하십시오.

현재 병렬 풀이 없다면, trainnet은 디폴트 클러스터 프로파일 설정을 사용하여 병렬 풀을 자동으로 시작합니다. 풀이 GPU를 사용할 수 있는 경우, 고유한 GPU를 갖는 워커만 훈련 계산을 수행합니다. 풀에 GPU가 없는 경우, 사용 가능한 모든 CPU 워커에서 대신 훈련이 이루어집니다.

원격 클러스터에서 복수의 GPU를 사용하여 사용자 지정 훈련을 수행하는 방법에 대한 자세한 내용은 Run Custom Training Loops on a GPU and in Parallel 항목을 참조하십시오.

미니 배치 크기와 학습률 최적화하기

컨벌루션 신경망은 일반적으로 영상의 미니 배치를 사용하여 반복적으로 훈련됩니다. 이는 일반적으로 전체 데이터 세트가 너무 커서 GPU 메모리에 맞지 않기 때문입니다. 최적의 성능을 위해, trainingOptions 함수를 사용하여 MiniBatchSize 옵션을 변경해 미니 배치 크기로 실험할 수 있습니다.

최적의 미니 배치 크기는 정확히 어떤 신경망, 데이터 세트 및 GPU 하드웨어를 쓰느냐에 따라 달라집니다. 복수의 GPU를 사용하여 훈련시킬 때는 각 영상 배치가 GPU 간에 분산됩니다. 이로 인해 사용 가능한 총 GPU 메모리가 실질적으로 늘어나서 더 큰 배치 크기를 사용할 수 있게 됩니다. 각 GPU에서의 작업량을 일정하게 유지하기 위해 GPU 개수에 맞춰 미니 배치 크기를 선형적으로 확장하는 것이 좋습니다. 예를 들어, 미니 배치 크기를 64로 설정해 단일 GPU에서 훈련 중일 때 동일한 유형의 GPU를 4개 사용하도록 훈련을 확장하려면 각 GPU가 반복당 64개의 관측값을 처리하도록 미니 배치 크기를 256으로 증가시키면 됩니다.

미니 배치 크기를 증가시키면 각각의 반복이 더 높은 중요성을 갖게 되므로 사용자는 학습률을 높일 수 있습니다. 미니 배치 크기에 비례해서 학습률을 높이는 것이 좋습니다. 활용 분야에 따라, 미니 배치 크기와 학습률이 크면 어느 정도까지는 정확도를 감소시키지 않으면서 훈련 속도를 높일 수 있습니다.

실험 관리자 앱을 사용하여 일련의 하이퍼파라미터 값을 스윕하거나 베이즈 최적화를 사용하여 최적의 훈련 옵션을 찾을 수 있습니다. 실험 관리자를 사용하는 방법에 대한 자세한 내용은 Create a Deep Learning Experiment for Classification 항목을 참조하십시오.

훈련에 사용할 특정 GPU 선택하기

GPU를 모두 사용하고 싶지 않다면 훈련과 추론에 사용할 GPU를 직접 선택하면 됩니다. 이렇게 하면 성능이 떨어지는 GPU(예: 디스플레이 GPU)에서 훈련하는 것을 피할 수 있습니다.

GPU가 로컬 컴퓨터에 있는 경우, gpuDeviceTable (Parallel Computing Toolbox)gpuDeviceCount (Parallel Computing Toolbox) 함수를 사용하여 GPU 리소스를 검토하고 사용할 GPU의 인덱스를 확인할 수 있습니다.

"auto" 또는 "gpu" 옵션을 사용하는 단일 GPU 훈련의 경우, 기본적으로 MATLAB은 인덱스가 1인 GPU 장치를 사용합니다. 훈련을 시작하기 전에 장치를 선택하여 다른 GPU를 사용할 수 있습니다. gpuDevice (Parallel Computing Toolbox)를 사용하여 인덱스로 원하는 GPU를 선택합니다.

gpuDevice(index)
ExecutionEnvironment 옵션을 "auto" 또는 "gpu"로 설정하면 trainnet은 선택된 GPU를 자동으로 사용합니다.

"multi-gpu" 옵션을 사용하는 복수의 GPU 훈련의 경우, 기본적으로 MATLAB은 로컬 컴퓨터에서 사용할 수 있는 모든 GPU를 사용합니다. GPU를 제외시키려면 병렬 풀을 미리 시작하고 장치를 직접 선택하면 됩니다.

예를 들어, 3개의 GPU가 있지만 인덱스가 13인 장치만 사용하려 한다고 가정하겠습니다. 다음 코드를 사용하여 두 개의 워커가 있는 병렬 풀을 시작하고 각 워커에서 하나의 GPU를 선택할 수 있습니다.

useGPUs = [1 3];
parpool("Processes",numel(useGPUs));
spmd 
    gpuDevice(useGPUs(spmdIndex)); 
end

ExecutionEnvironment 옵션을 "multi-gpu"로 설정하면 trainnet은 자동으로 현재 병렬 풀을 사용합니다("parallel-auto" 또는 "parallel-gpu"로 설정한 경우도 결과는 동일함).

복수의 GPU에서 복수의 신경망 훈련시키기

모델당 하나의 GPU를 사용하여 병렬로 복수의 모델을 훈련시키려면 사용할 수 있는 GPU당 하나의 워커로 병렬 풀을 시작하고 다른 워커에서 각 신경망을 훈련시킵니다. parfor 또는 parfeval을 사용하여 각각의 워커에서 동시에 신경망을 실행합니다. trainingOptions 함수를 사용하여 각 워커에서 ExecutionEnvironment 이름-값 옵션을 "gpu"로 설정합니다.

예를 들어, 다음 형식의 코드를 사용하여 사용할 수 있는 모든 GPU에서 병렬로 복수의 신경망을 훈련시킵니다.

options = trainingOptions("sgdm",ExecutionEnvironment="gpu");

parfor i=1:gpuDeviceCount("available")
    trainnet(…,options); 
end

로컬 MATLAB을 차단하지 않고 백그라운드에서 실행하려면 parfeval 함수를 사용하십시오. 예를 들어, parforparfeval을 사용하여 복수의 신경망을 훈련시키는 방법을 보려면 다음을 참조하십시오.

고속 다중 노드 GPU 통신에 대한 고급 지원

trainnet 함수를 비롯한 MATLAB의 다중 GPU 특징 중 일부는 성능 향상을 위해 빠른 상호 연결을 통한 직접 통신에 최적화되어 있습니다.

적절한 하드웨어 연결이 있다면, 복수의 GPU 간의 데이터 전송은 NVLink와 같은 빠른 peer-to-peer 통신을 사용합니다(가능한 경우).

컴퓨터 간의 빠른 상호 연결(예: Infiniband) 또는 여러 컴퓨터에서 GPU 간의 빠른 상호 연결(예: GPUDirect RDMA)과 함께 Linux 계산 클러스터를 사용하고 있다면, MATLAB의 고속 다중 노드 지원을 활용할 수도 있습니다. 풀의 모든 워커에서 이 지원을 사용하려면 환경 변수 PARALLEL_SERVER_FAST_MULTINODE_GPU_COMMUNICATION1로 설정하십시오. 클러스터 프로파일 관리자에서 이 환경 변수를 설정하십시오.

이 기능은 GPU 통신용 NVIDIA NCCL 라이브러리의 일부입니다. 이를 구성하려면 특별히 NCCL_SOCKET_IFNAME과 같은 추가 환경 변수를 설정하여 네트워크 인터페이스 프로토콜을 정의해야 합니다. 자세한 내용은 NCCL documentation에서 특히 NCCL Environment Variables 관련 섹션을 참조하십시오.

참고 항목

| | | (Parallel Computing Toolbox) | (Parallel Computing Toolbox) |

관련 항목