Main Content

자동 병렬화 기능을 사용하여 클라우드의 신경망 훈련시키기

이 예제에서는 병렬 훈련에 대한 MATLAB® 자동 지원을 사용하여 컨벌루션 신경망을 훈련시키는 방법을 보여줍니다.

딥러닝 훈련에는 종종 몇 시간이나 며칠이 소요됩니다. 병렬 연산을 사용하면 로컬에서 또는 클라우드에 있는 클러스터에서 여러 개의 GPU(그래픽 처리 장치)를 사용하여 훈련 속도를 높일 수 있습니다. 복수의 GPU가 장착된 컴퓨터를 사용하는 경우에는 이 예제를 데이터의 로컬 복사본에 대해 실행할 수 있습니다. 리소스를 더 많이 사용하고 싶다면 딥러닝 훈련을 클라우드로 확장할 수 있습니다. 병렬 훈련 옵션에 대해 알아보려면 Scale Up Deep Learning in Parallel, on GPUs, and in the Cloud 항목을 참조하십시오. 이 예제에서는 MATLAB 자동 병렬 지원을 사용하여 클라우드에 있는 클러스터에서 딥러닝 신경망을 훈련시키는 방법을 보여줍니다.

요구 사항

이 예제를 실행하려면 먼저 클러스터를 구성하고 데이터를 클라우드로 업로드해야 합니다. MATLAB에서는 MATLAB 데스크탑에서 직접 클라우드에 클러스터를 만들 수 있습니다. 탭의 환경 영역에서 병렬연산 > 클러스터 생성 및 관리를 선택합니다. 클러스터 프로파일 관리자에서 클라우드 클러스터 생성을 클릭합니다. 또는 MathWorks® Cloud Center를 사용하여 계산 클러스터를 만들고 액세스할 수도 있습니다. 자세한 내용은 Getting Started with Cloud Center를 참조하십시오. 그런 다음 Amazon® S3 버킷으로 데이터를 업로드하면 MATLAB에서 직접 액세스할 수 있습니다. 이 예제에서는 기존에 Amazon S3에 저장되어 있는 CIFAR-10 데이터 세트 복사본을 사용합니다. 자세한 지침은 AWS에서 딥러닝 데이터 사용하기 항목을 참조하십시오.

클러스터 설정하기

클라우드 클러스터를 선택하고 병렬 풀을 시작한 후 워커의 개수를 클러스터 상의 GPU 개수로 설정합니다. 워커의 개수를 GPU의 개수보다 많이 지정하면 나머지 워커들은 유휴 상태가 됩니다.

numberOfGPUs = 4;
cluster = parcluster("MyClusterInTheCloud");
pool = parpool(cluster,numberOfGPUs);
Starting parallel pool (parpool) using the 'MyClusterInTheCloud' profile ...
Connected to parallel pool with 4 workers.

클러스터를 지정하지 않는 경우 디폴트 클러스터 프로파일이 사용됩니다. MATLAB 탭의 환경 영역에서 디폴트 클러스터 프로파일을 확인하고 병렬연산 > 클러스터 생성 및 관리를 선택합니다.

클라우드에서 데이터 세트 불러오기

imageDatastore를 사용하여 클라우드에서 훈련 데이터 세트와 테스트 데이터 세트를 불러옵니다. 이 예제에서는 Amazon S3에 저장되어 있는 CIFAR-10 데이터 세트 복사본을 사용합니다. 워커가 클라우드의 데이터저장소에 액세스할 수 있도록 하려면 AWS 자격 증명의 환경 변수가 올바르게 설정되었는지 확인하십시오. AWS에서 딥러닝 데이터 사용하기 항목을 참조하십시오.

imdsTrain = imageDatastore("s3://cifar10cloud/cifar10/train", ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

imdsTest = imageDatastore("s3://cifar10cloud/cifar10/test", ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

각 범주에 속한 클래스의 개수와 영상의 개수를 계산합니다. labelCount는 레이블과 각 레이블을 갖는 영상의 개수가 포함된 테이블입니다. 훈련 데이터저장소에는 각 클래스에 대해 5,000개씩, 총 50,000개의 영상이 포함됩니다. 신경망의 마지막 완전 연결 계층에 있는 클래스의 개수를 OutputSize 인수로 지정할 수 있습니다.

classes = categories(imdsTrain.Labels);
numClasses = numel(classes);
labelCount = countEachLabel(imdsTrain)
labelCount=10×2 table
      Label       Count
    __________    _____

    airplane      5000 
    automobile    5000 
    bird          5000 
    cat           5000 
    deer          5000 
    dog           5000 
    frog          5000 
    horse         5000 
    ship          5000 
    truck         5000 

augmentedImageDatastore 객체 생성을 이용하여 증대 영상 데이터로 신경망을 훈련시킵니다. 이때 무작위 평행 이동 및 가로 반사를 사용합니다. 데이터 증대는 신경망이 과적합되는 것을 방지하고 훈련 영상의 정확한 세부 정보가 기억되지 않도록 하는 데 도움이 됩니다.

imageSize = [32 32 3];
pixelRange = [-4 4];
imageAugmenter = imageDataAugmenter( ...
    RandXReflection=true, ...
    RandXTranslation=pixelRange, ...
    RandYTranslation=pixelRange);
augmentedImdsTrain = augmentedImageDatastore(imageSize,imdsTrain, ...
    DataAugmentation=imageAugmenter, ...
    OutputSizeMode="randcrop");

신경망 아키텍처와 훈련 옵션 정의하기

CIFAR-10 데이터 세트에 대해 신경망 아키텍처를 정의합니다. 코드를 단순화하려면 입력값을 컨벌루션하는 컨벌루션 블록을 사용하십시오. 지원 함수 convolutionalBlock은 이 예제의 끝부분에서 제공되며, 각각 컨벌루션 계층, 배치 정규화 계층, ReLU 계층이 포함된 계층의 반복 블록을 생성합니다. 풀링 계층은 공간 차원을 다운샘플링합니다.

blockDepth = 4;
netWidth = 32;

layers = [
    imageInputLayer(imageSize) 
    
    convolutionalBlock(netWidth,blockDepth)
    maxPooling2dLayer(2,Stride=2)
    convolutionalBlock(2*netWidth,blockDepth)
    maxPooling2dLayer(2,Stride=2)    
    convolutionalBlock(4*netWidth,blockDepth)
    averagePooling2dLayer(8) 
    
    fullyConnectedLayer(numClasses)
    softmaxLayer
];

복수의 GPU를 사용하면 사용 가능한 연산 리소스가 늘어납니다. 미니 배치 크기를 GPU 개수로 설정하여 각 GPU 상의 워크로드를 일정하게 유지하고 미니 배치 크기에 따라 학습률을 조정합니다.

miniBatchSize = 256 * numberOfGPUs;
initialLearnRate = 1e-1 * miniBatchSize/256;

다음과 같이 훈련 옵션을 지정합니다.

  • SGDM 솔버를 사용하여 신경망을 Epoch 50회 훈련시킵니다.

  • 실행 환경을 parallel-auto로 설정하여, 현재 클러스터를 사용하여 신경망을 병렬로 훈련시킵니다. 풀이 GPU를 사용할 수 있는 경우, GPU를 갖는 워커가 훈련 계산을 수행합니다. 풀이 GPU를 사용할 수 없는 경우, 사용 가능한 모든 CPU 워커에서 훈련이 이루어집니다. 지원되는 GPU 장치에 대한 자세한 내용은 GPU 연산 요구 사항 (Parallel Computing Toolbox) 항목을 참조하십시오.

  • 훈련이 진행됨에 따라 학습률을 떨어뜨리는 학습률 조정 계획을 사용합니다.

  • L2 정규화를 사용하여 과적합을 방지합니다.

  • 미니 배치 크기를 설정하고 매 Epoch마다 데이터를 섞습니다.

  • 검증 데이터를 사용하여 신경망을 검증합니다.

  • 훈련 중에 시각적 피드백을 볼 수 있도록 훈련 진행 상황 플롯을 켭니다.

  • 신경망의 정확도를 추적합니다.

  • 상세 출력값을 비활성화합니다.

options = trainingOptions("sgdm", ...
    MaxEpochs=50, ...
    ExecutionEnvironment="parallel-auto", ...
    InitialLearnRate=initialLearnRate, ...
    LearnRateSchedule="piecewise", ...
    LearnRateDropFactor=0.1, ...
    LearnRateDropPeriod=45, ...
    L2Regularization=1e-10, ...
    MiniBatchSize=miniBatchSize, ...
    Shuffle="every-epoch", ...
    ValidationData=imdsTest, ...
    ValidationFrequency=floor(numel(imdsTrain.Files)/miniBatchSize), ...
    Plots="training-progress", ...
    Metrics="accuracy", ...
    Verbose=false);

신경망을 훈련시키고 분류에 사용하기

클러스터에서 신경망을 훈련시킵니다. 훈련 중에 플롯에 진행 상황이 표시됩니다.

net = trainnet(augmentedImdsTrain,layers,"crossentropy",options);

훈련된 신경망을 사용하여 로컬 컴퓨터에서 테스트 영상을 분류한 다음 예측된 레이블을 실제 레이블과 비교합니다. 여러 개의 관측값을 사용하여 예측을 수행하려면 minibatchpredict 함수를 사용합니다. 예측 점수를 레이블로 변환하려면 scores2label 함수를 사용합니다. minibatchpredict 함수는 GPU를 사용할 수 있으면 자동으로 GPU를 사용합니다.

scores = minibatchpredict(net,imdsTest);
YTest = scores2label(scores,classes);
accuracy = sum(YTest == imdsTest.Labels)/numel(imdsTest.Labels)
accuracy = 0.8938

다시 사용할 예정이 없다면 병렬 풀을 닫습니다.

delete(pool)
Parallel pool using the 'MyClusterInTheCloud' profile is shutting down.

지원 함수

컨벌루션 블록 함수

convolutionalBlock 함수는 각각 2차원 컨벌루션 계층, 배치 정규화 계층, ReLU 계층을 포함하는 numConvBlocks 컨벌루션 블록을 생성합니다. 각 2차원 컨벌루션 계층에는 numFilters개의 3×3 필터가 있습니다.

function layers = convolutionalBlock(numFilters,numConvBlocks)
    layers = [
        convolution2dLayer(3,numFilters,Padding="same")
        batchNormalizationLayer
        reluLayer
    ];
    
    layers = repmat(layers,numConvBlocks,1);
end

참고 항목

| | |

관련 항목