딥러닝 일괄 처리 작업을 클러스터로 보내기
이 예제에서는 계속해서 작업을 진행하거나 훈련 중에 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
이름-값 인수를 사용하여 워커를 더 많이 지정할 수 있습니다.
일괄 처리 작업을 스크립트로 제출할 경우, 기본적으로 클라이언트에서 워커로 작업 공간 변수가 복사됩니다. 작업 공간 변수를 워커에 복사하지 않으려면 일괄 처리 작업을 함수로 제출하십시오.
trainConvNet
함수는 이 예제에서 지원 파일로 제공됩니다. 이 함수에 액세스하려면 예제를 라이브 스크립트로 여십시오. 이 함수는 주어진 미니 배치 크기를 사용하여 단일 신경망을 훈련시키고 훈련된 신경망과 그 정확도를 반환합니다. 각 미니 배치 크기에 대해 파라미터 스윕을 수행하도록 각 작업마다 서로 다른 미니 배치 크기를 지정하여 함수를 일괄 처리 작업으로 4번에 걸쳐 클러스터에 보냅니다. 함수를 일괄 처리 작업으로 보낼 때 함수의 출력값 개수와 입력 인수를 지정합니다.
c = parcluster("MyClusterInTheCloud"); miniBatchSize = [64 128 256 512]; numBatchJobs = numel(miniBatchSize); for idx=1:numBatchJobs job(idx) = batch(c,"trainConvNet",2,{idx,miniBatchSize(idx)}); end
모든 신경망을 병렬로 훈련시키는 단일 일괄 처리 작업을 사용하지 않고 개별 일괄 처리 작업에서 각각의 신경망을 훈련시키면 클러스터에서 병렬 풀을 시작하는 데 필요한 오버헤드를 방지하고 작업 모니터를 통해 각 신경망 계산의 진행 상황을 개별적으로 확인할 수 있습니다.
클러스터에 작업을 추가로 제출할 수 있습니다. 클러스터가 다른 작업을 실행 중이어서 사용할 수 없는 경우, 클러스터를 사용할 수 있을 때까지 새로 제출하는 작업이 대기 중 상태가 됩니다.
훈련 진행 상황 모니터링하기
작업 모니터를 확인하여 클러스터에 있는 작업의 현재 상태를 볼 수 있습니다. 홈 탭의 환경 섹션에서 병렬연산 > 작업 모니터링을 선택하여 작업 모니터를 엽니다.
선택적으로, 일괄 처리 작업을 실행하는 워커의 데이터를 MATLAB 클라이언트로 전송하여 훈련 진행 상황을 자세히 모니터링할 수 있습니다. trainConvNet
함수에서는 각 반복 후에 출력 함수 sendTrainingProgress
가 호출되어 현재 반복과 훈련 정확도를 ValueStore
(Parallel Computing Toolbox)에 추가합니다. ValueStore
는 특정 작업이 소유한 데이터를 저장하며, 각 데이터 항목은 값과 그에 대응하는 키로 구성됩니다.
function stop = sendTrainingProgress(info) if info.State == "iteration" && ~isempty(info.TrainingAccuracy) % 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 stop = false; 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 dlnetwork} {[0.6866]}
ans=1×2 cell array
{1×1 dlnetwork} {[0.5964]}
ans=1×2 cell array
{1×1 dlnetwork} {[0.6542]}
ans=1×2 cell array
{1×1 dlnetwork} {[0.6230]}
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 세션에서 작업 모니터를 사용하여 작업의 상태를 확인할 수 있습니다.
작업이 완료되면 작업 모니터에서 결과를 가져올 수 있습니다. 홈 탭의 환경 섹션에서 병렬연산 > 작업 모니터링을 선택하여 작업 모니터를 엽니다. 그런 다음 작업을 마우스 오른쪽 버튼으로 클릭하여 상황별 메뉴를 표시합니다. 이 메뉴에서는 다음을 수행할 수 있습니다.
세부 정보 표시를 클릭하여 작업 공간으로 작업 불러오기
출력값 가져오기를 클릭하여 훈련된 신경망과 그 정확도 가져오기
모두 마친 후 삭제를 클릭하여 작업 삭제
지원 함수
updatePlot
함수는 서브플롯에 신경망의 현재 훈련의 정확도를 나타내는 점을 추가합니다. 이 함수는 animated line 객체와 신경망의 현재 반복 및 정확도를 받습니다.
function updatePlot(line,iteration,accuracy) addpoints(line,iteration,accuracy); drawnow limitrate nocallbacks end
참고 항목
batch
(Parallel Computing Toolbox) | ValueStore
(Parallel Computing Toolbox)
관련 예제
- parfor를 사용하여 다중 딥러닝 신경망 훈련시키기
- AWS에서 딥러닝 데이터 사용하기
- Work with Deep Learning Data in Azure
- Offload Experiments as Batch Jobs to a Cluster
세부 정보
- 일괄 처리 (Parallel Computing Toolbox)