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");

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

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

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

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

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

  • 실행 환경을 parallel로 설정하여, 현재 클러스터를 사용하여 신경망을 병렬로 훈련시킵니다.

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

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

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

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

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

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

options = trainingOptions("sgdm", ...
    MaxEpochs=50, ...
    ExecutionEnvironment="parallel", ...
    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", ...
    Verbose=false);

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

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

net = trainNetwork(augmentedImdsTrain,layers,options);

훈련된 신경망을 사용하여 로컬 컴퓨터에서 테스트 영상을 분류한 다음 예측된 레이블을 실제 레이블과 비교합니다.

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

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

delete(pool)

지원 함수

컨벌루션 블록 함수

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

참고 항목

| |

관련 항목