이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

자동 병렬 지원을 사용하여 클라우드의 네트워크 훈련시키기

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

요구 사항

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

병렬 풀 설정하기

클러스터에서 병렬 풀을 시작하고 워커의 개수를 클러스터 상의 GPU 개수로 설정합니다. 워커의 개수를 GPU의 개수보다 많이 지정하면 나머지 워커들은 유휴 상태가 됩니다. 이 예제에서는 사용하는 클러스터가 디폴트 클러스터 프로파일로 설정되어 있다고 가정합니다. 디폴트 클러스터 프로파일은 MATLAB 탭의 병렬 > 디폴트 클러스터 선택에서 확인하십시오.

numberOfWorkers = 8;
parpool(numberOfWorkers);
Starting parallel pool (parpool) using the 'MyClusterInTheCloud' profile ...
connected to 8 workers.

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

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

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

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

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 데이터 세트에 대해 네트워크 아키텍처를 정의합니다. 코드를 단순화하려면 입력값을 컨벌루션하는 컨벌루션 블록을 사용하십시오. 풀링 계층은 공간 차원을 다운샘플링합니다.

blockDepth = 4; % blockDepth controls the depth of a convolutional block
netWidth = 32; % netWidth controls the number of filters in a convolutional block

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(10)
    softmaxLayer
    classificationLayer
];

훈련 옵션을 정의합니다. 실행 환경을 parallel로 설정하여, 현재 클러스터를 사용하여 네트워크를 병렬로 훈련시킵니다. 복수의 GPU를 사용하면 사용 가능한 연산 리소스가 늘어납니다. 미니 배치 크기를 GPU 개수로 설정하여 각 GPU 상의 워크로드를 일정하게 유지합니다. 미니 배치 크기에 따라 학습률의 크기를 조정합니다. 훈련이 진행됨에 따라 학습률을 떨어뜨리는 학습률 일정을 사용합니다. 훈련 중에 시각적 피드백을 볼 수 있도록 훈련 진행 상황 플롯을 켭니다.

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

options = trainingOptions('sgdm', ...
    'ExecutionEnvironment','parallel', ... % Turn on automatic parallel support.
    'InitialLearnRate',initialLearnRate, ... % Set the initial learning rate.
    'MiniBatchSize',miniBatchSize, ... % Set the MiniBatchSize.
    'Verbose',false, ... % Do not send command line output.
    'Plots','training-progress', ... % Turn on the training progress plot.
    'L2Regularization',1e-10, ...
    'MaxEpochs',50, ...
    'Shuffle','every-epoch', ...
    'ValidationData',imdsTest, ...
    'ValidationFrequency',floor(numel(imdsTrain.Files)/miniBatchSize), ...
    'LearnRateSchedule','piecewise', ...
    'LearnRateDropFactor',0.1, ...
    'LearnRateDropPeriod',45);

네트워크를 훈련시키고 분류에 사용하기

클러스터에서 네트워크를 훈련시킵니다. 훈련 중에 플롯에 진행 상황이 표시됩니다.

net = trainNetwork(augmentedImdsTrain,layers,options)

net = 
  SeriesNetwork with properties:

    Layers: [43×1 nnet.cnn.layer.Layer]

훈련된 네트워크를 사용하여 로컬 컴퓨터에서 테스트 이미지를 분류하여 이 네트워크의 정확도를 확인합니다. 그런 다음 예측된 레이블을 실제 레이블과 비교합니다.

YPredicted = classify(net,imdsTest);
accuracy = sum(YPredicted == imdsTest.Labels)/numel(imdsTest.Labels)

헬퍼 함수 정의하기

네트워크 아키텍처에서 컨벌루션 블록을 만드는 함수를 정의합니다.

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

참고 항목

| |

관련 항목