Main Content

딥러닝 일괄 처리 작업을 클러스터로 보내기

이 예제에서는 계속해서 작업을 진행하거나 훈련 중에 MATLAB®을 닫을 수 있도록 딥러닝 훈련 일괄 처리 작업을 클러스터로 보내는 방법을 보여줍니다.

심층 신경망 훈련은 종종 몇 시간 혹은 며칠이 소요될 수 있습니다. 신경망을 일괄 처리 작업으로 훈련시킨 다음 준비가 되면 클러스터에서 결과를 가져오면 시간을 효율적으로 사용할 수 있습니다. 연산이 진행되는 동안 MATLAB에서 계속해서 작업할 수도 있고, MATLAB을 닫은 다음 나중에 작업 모니터를 사용하여 결과를 얻을 수도 있습니다. 선택적으로 훈련 중에 작업을 모니터링할 수 있으며, 작업이 완료되면 훈련된 신경망들을 가져온 다음 각각의 정확도를 비교할 수 있습니다.

요구 사항

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

일괄 처리 작업 제출하기

batch (Parallel Computing Toolbox) 함수를 사용하여 함수 또는 스크립트를 클러스터에 일괄 처리 작업으로 보낼 수 있습니다. 기본적으로 클러스터는 작업의 내용을 실행할 워커를 하나 할당합니다. 작업의 코드가 워커가 더 많으면 유리한 경우, 즉 일례로 자동 병렬 지원이나 parfor 루프가 포함되어 있는 경우, batch 함수의 Pool 이름-값 인수를 사용하여 워커를 더 많이 지정할 수 있습니다.

일괄 처리 작업을 스크립트로 제출할 경우, 기본적으로 클라이언트에서 워커로 작업 공간 변수가 복사됩니다. 작업 공간 변수를 워커에 복사하지 않으려면 일괄 처리 작업을 함수로 제출하십시오.

trainNetworkFcn은 이 예제에서 지원 파일로 제공됩니다. 이 함수는 주어진 미니 배치 크기를 사용하여 단일 신경망을 훈련시키고 훈련된 신경망과 그 정확도를 반환합니다. 각 미니 배치 크기에 대해 파라미터 스윕을 수행하도록 각 작업마다 서로 다른 미니 배치 크기를 지정하여 함수를 일괄 처리 작업으로 4번에 걸쳐 클러스터에 보냅니다. 함수를 일괄 처리 작업으로 보낼 때 함수의 출력값 개수와 입력 인수를 지정합니다.

c = parcluster;
miniBatchSize = [64 128 256 512];
numBatchJobs = numel(miniBatchSize);

for idx=1:numBatchJobs
    job(idx) = batch(c,"trainNetworkFcn",2,{idx,miniBatchSize(idx)});
end

모든 신경망을 병렬로 훈련시키는 단일 일괄 처리 작업을 사용하지 않고 개별 일괄 처리 작업에서 각각의 신경망을 훈련시키면 클러스터에서 병렬 풀을 시작하는 데 필요한 오버헤드를 방지하고 작업 모니터를 통해 각 신경망 계산의 진행 상황을 개별적으로 확인할 수 있습니다.

클러스터에 작업을 추가로 제출할 수 있습니다. 클러스터가 다른 작업을 실행 중이어서 사용할 수 없는 경우, 클러스터를 사용할 수 있을 때까지 새로 제출하는 작업이 대기 중 상태가 됩니다.

훈련 진행 상황 모니터링하기

작업 모니터를 확인하여 클러스터에 있는 작업의 현재 상태를 볼 수 있습니다. 탭의 환경 섹션에서 병렬연산 > 작업 모니터링을 선택하여 작업 모니터를 엽니다.

runningJobs.png

선택적으로, 일괄 처리 작업을 실행하는 워커의 데이터를 MATLAB 클라이언트로 전송하여 훈련 진행 상황을 자세히 모니터링할 수 있습니다. trainNetworkFcn에서는 각 반복 후에 출력 함수 sendTrainingProgress가 호출되어 현재 반복과 훈련 정확도를 ValueStore (Parallel Computing Toolbox)에 추가합니다. ValueStore는 특정 작업이 소유한 데이터를 저장하며, 각 데이터 항목은 값과 그에 대응하는 키로 구성됩니다.

function sendTrainingProgress(info)

    if info.State == "iteration"
        % Get the ValueStore object of the current job.
        store = getCurrentValueStore;
    
        % Store the training results in the job ValueStore object with a unique
        % key.
        key = idx;
        store(key) = struct(iteration=info.Iteration,accuracy=info.TrainingAccuracy);
    end

end

제출된 각 작업에 대해 신경망의 훈련 정확도를 표시하는 Figure를 만듭니다.

  • 훈련 중인 신경망의 정확도를 표시하는 서브플롯을 만듭니다.

  • 작업의 ValueStore 객체를 가져옵니다.

  • 작업이 ValueStore에 항목을 추가할 때마다 실행할 콜백 함수를 지정합니다. 콜백 함수 updatePlot은 이 예제의 끝부분에서 제공되며, 신경망의 현재 훈련의 정확도를 플로팅합니다.

figure
for i=1:numBatchJobs
    subplot(2,2,i)
    xlabel("Iteration");
    ylabel("Accuracy (%)");
    ylim([0 100])
    lines(i) = animatedline;

    store{i} = job(i).ValueStore;
    store{i}.KeyUpdatedFcn = @(store,key) updatePlot(lines(i),store(key).iteration,store(key).accuracy);
end

프로그래밍 방식으로 결과 가져오기

클러스터로 작업을 제출한 후에는 연산이 진행되는 동안 MATLAB에서 계속해서 작업할 수 있습니다. 작업이 완료되어야 코드의 나머지 부분을 실행할 수 있는 경우 wait 명령을 사용하여 MATLAB을 차단하십시오. 여기서는 작업이 끝날 때까지 기다리십시오.

wait(job(1))

작업이 끝나면 fetchOutputs 함수를 사용하여 결과를 가져옵니다. 여기서는 훈련된 신경망과 그 정확도를 가져옵니다.

for idx=1:numBatchJobs
    results{idx}=fetchOutputs(job(idx));
end
results{:}
ans=1×2 cell array
    {1×1 SeriesNetwork}    {[0.6644]}

ans=1×2 cell array
    {1×1 SeriesNetwork}    {[0.6824]}

ans=1×2 cell array
    {1×1 SeriesNetwork}    {[0.6482]}

ans=1×2 cell array
    {1×1 SeriesNetwork}    {[0.6398]}

MATLAB을 닫은 경우에도, 연산이 진행되는 동안 또는 연산이 완료된 후에 클러스터에 있는 작업을 복구하여 결과를 가져올 수 있습니다. MATLAB을 닫기 전에 작업 ID를 기록해 두고 나중에 findJob 함수를 사용하여 작업을 가져오십시오.

작업을 가져오려면 먼저 parcluster 함수를 사용하여 클러스터에 대한 cluster 객체를 만드십시오. 그런 다음 findJob에 작업 ID를 제공합니다. 여기서 작업 ID는 3입니다.

c = parcluster("MyClusterInTheCloud");
job = findJob(c,ID=3);

더 이상 필요하지 않은 작업을 삭제합니다. 작업 모니터에서 작업이 제거됩니다.

delete(job(1));

특정 클러스터에 제출된 모든 작업을 삭제하려면 클러스터와 연결된 모든 작업을 delete 함수에 전달합니다.

delete(c.Jobs);

작업 모니터를 사용하여 결과 가져오기

일괄 처리 작업을 제출하면 연산이 모두 클러스터에서 수행되므로 MATLAB을 안전하게 닫을 수 있습니다. 다른 MATLAB 세션에서 작업 모니터를 사용하여 작업의 상태를 확인할 수 있습니다.

작업이 완료되면 작업 모니터에서 결과를 가져올 수 있습니다. 탭의 환경 섹션에서 병렬연산 > 작업 모니터링을 선택하여 작업 모니터를 엽니다. 그런 다음 작업을 마우스 오른쪽 버튼으로 클릭하여 상황별 메뉴를 표시합니다. 이 메뉴에서는 다음을 수행할 수 있습니다.

  • 세부 정보 표시를 클릭하여 작업 공간으로 작업 불러오기

  • 출력값 가져오기를 클릭하여 훈련된 신경망과 그 정확도 가져오기

  • 모두 마친 후 삭제를 클릭하여 작업 삭제

jobContextMenu.png

지원 함수

updatePlot 함수는 서브플롯에 신경망의 현재 훈련의 정확도를 나타내는 점을 추가합니다. 이 함수는 animated line 객체와 신경망의 현재 반복 및 정확도를 받습니다.

function updatePlot(line,iteration,accuracy)

addpoints(line,iteration,accuracy);
drawnow limitrate nocallbacks

end

참고 항목

(Parallel Computing Toolbox) | (Parallel Computing Toolbox)

관련 예제

세부 정보