Main Content

워커에서 일괄 처리 작업 실행 및 파일 액세스하기

batch를 사용하여 계산을 백그라운드에서 실행되도록 분담할 수 있습니다. 코드가 파일에 액세스해야 하는 경우 'AttachedFiles' 또는 'AdditionalPaths'와 같은 추가 옵션을 사용하여 데이터에 액세스할 수 있습니다. 계산이 진행되는 동안 MATLAB에서 작업을 종료하거나 계속할 수 있으며 나중에 결과를 복구할 수 있습니다.

예제 준비하기

지원 함수 prepareSupportingFiles를 사용하여 이 예제에 필요한 데이터를 현재 작업 폴더로 복사합니다.

prepareSupportingFiles;

현재 작업 폴더에는 이제 4개의 파일(A.dat, B1.dat, B2.datB3.dat)이 있습니다.

일괄 처리 작업 실행하기

parcluster를 사용하여 cluster 객체를 만듭니다. 기본적으로 parcluster는 디폴트 클러스터 프로파일을 사용합니다. MATLAB 탭에 있는 환경 섹션의 병렬연산 > 디폴트 클러스터 선택에서 디폴트 클러스터 프로파일을 확인합니다.

c = parcluster();

코드를 함수 내에 삽입하고 batch를 사용하여 일괄 처리 작업으로 제출합니다. 사용자 지정 함수의 예는 지원 함수 divideData를 참조하십시오. 출력 인수의 예상 개수 및 셀형 배열을 함수에 대한 입력값으로 지정합니다.

batch를 사용하여 스크립트 파일을 전송하는 경우 MATLAB은 모든 작업 공간 변수를 클러스터로 전송하며, 스크립트에서 사용하지 않는 변수 역시 전송합니다. 작업 공간이 클 경우 데이터 전송 시간에 부정적인 영향을 줍니다. 이러한 통신 오버헤드를 방지하려면 스크립트를 함수 파일로 변환하는 것이 좋습니다. 스크립트 맨 앞에 함수 라인을 추가하여 이 작업을 수행할 수 있습니다. 이 예제에서는 오버헤드를 줄이기 위해 divideData가 이 라이브 스크립트 외부의 파일에 정의되어 있습니다.

코드가 병렬 풀을 사용하는 경우 'Pool' 이름-값 쌍 인수를 사용하여 워커 개수를 지정해 병렬 풀을 만듭니다. batch는 추가적으로 하나의 워커를 사용하여 함수를 실행합니다.

기본적으로 batch는 워커의 초기 작업 폴더를 MATLAB 클라이언트의 현재 폴더로 변경합니다. 이렇게 하면 워커에서 초기 작업 폴더를 제어하는 데 유용합니다. 예를 들어, Windows 클라이언트 컴퓨터에서 Linux 클러스터로 제출하는 경우와 같이 클러스터가 다른 파일 시스템을 사용하여 초기 작업 디렉터리를 제어하려는 경우가 있을 수 있습니다.

  • 워커의 초기 작업 폴더를 유지하고 디폴트 값을 사용하려면 'CurrentFolder''.'으로 설정하십시오.

  • 초기 작업 폴더를 변경하려면 'CurrentFolder'를 원하는 폴더로 설정하십시오.

이 예제에서는 3개의 워커가 있는 병렬 풀을 사용하고 초기 작업 폴더의 임시 위치를 선택합니다. batch를 사용하여 divideData에서 계산을 분담하십시오.

job = batch(c,@divideData,1,{}, ...
    'Pool',3, ...
    'CurrentFolder',tempdir);

batch가 병렬 워커에서 divideData를 실행하므로 계산이 수행되는 동안 계속해서 MATLAB에서 작업할 수 있습니다.

작업이 완료될 때까지 MATLAB을 차단하려면 job 객체의 wait 함수를 사용하십시오.

wait(job);

결과를 가져오려면 job 객체에 fetchOutputs를 사용하십시오. divideData는 워커가 찾을 수 없는 파일에 종속되어 있으므로 fetchOutputs가 오류를 발생시킵니다. 작업에서 Task 객체의 Error 속성에 대해 getReport를 사용하여 오류 정보에 액세스할 수 있습니다. 이 예제에서 코드는 워커가 찾을 수 없는 파일에 종속됩니다.

getReport(job.Tasks(1).Error)
ans = 
    'Error using divideData (line 4)
     Unable to read file 'B2.dat'. No such file or directory.'

워커에서 파일에 액세스하기

기본적으로 batch는 코드를 자동으로 분석하고 필요한 파일을 워커로 전송합니다. 필요한 파일을 명시적으로 전송해야 하는 경우도 있는데, 예를 들어 런타임에 파일 이름을 결정하는 경우가 그렇습니다.

이 예제에서 divideDatabatch가 자동으로 감지하고 전송하는 지원 파일 A.dat에 액세스합니다. 이 함수는 B1.dat에도 액세스하지만, 런타임에 파일 이름을 확인하므로 자동 종속성 분석에서 이를 감지할 수 없습니다.

type divideData.m 
function X = divideData()
    A = load("A.dat"); 
    X = zeros(flip(size(A)));
    parfor i = 1:3
        B = load("B" + i + ".dat");
        X = X + A\B;
    end
end

워커가 액세스할 수 있는 위치에 데이터가 있는 경우 이름-값 쌍 인수 'AdditionalPaths'를 사용하여 위치를 지정할 수 있습니다. 'AdditionalPaths'는 이 경로를 워커의 MATLAB 검색 경로에 추가하여 워커에서 데이터를 볼 수 있도록 합니다.

pathToData = pwd;
job(2) = batch(c,@divideData,1,{}, ...
    'Pool',3, ...
    'CurrentFolder',tempdir, ...
    'AdditionalPaths',pathToData);
wait(job(2));

워커가 액세스할 수 없는 위치에 데이터가 있는 경우 'AttachedFiles' 이름-값 쌍 인수를 사용하여 파일을 워커로 전송할 수 있습니다. 클라이언트와 워커가 동일한 파일을 공유하지 않거나 클러스터가 비공유 모드에서 일반 스케줄러 인터페이스를 사용하는 경우 사용자가 파일을 전송해야 합니다. 자세한 내용은 Configure Using the Generic Scheduler Interface (MATLAB Parallel Server) 항목을 참조하십시오.

filenames = "B" + string(1:3) + ".dat";
job(3) = batch(c,@divideData,1,{}, ...
    'Pool',3, ...
    'CurrentFolder',tempdir, ...
    'AttachedFiles',filenames);

기존 작업 찾기

작업을 제출한 후 MATLAB을 닫고 나중에 결과를 가져올 수 있습니다. MATLAB을 닫기 전에 작업 ID를 기록해 두십시오.

job3ID = job(3).ID
job3ID = 25

MATLAB을 다시 열면 findJob 함수를 사용하여 작업을 찾을 수 있습니다.

job(3) = findJob(c,'ID',job3ID);
wait(job(3));

또는 작업 모니터를 사용하여 작업을 추적할 수도 있습니다. 작업 모니터는 MATLAB 탭에 있는 환경 섹션의 병렬연산 > 작업 모니터링에서 열 수 있습니다.

결과 가져오기 및 데이터 정리하기

일괄 처리 작업의 결과를 가져오려면 fetchOutputs 함수를 사용하십시오. fetchOutputsbatch를 사용하여 실행된 함수의 출력값을 셀형 배열으로 반환합니다.

X = fetchOutputs(job(3))
X = 1×1 cell array
    {40×207 double}

필요한 모든 출력값을 가져온 후 job 객체가 더 이상 필요하지 않은 경우, 객체를 삭제하여 데이터를 정리하고 불필요하게 리소스를 사용하지 않도록 합니다.

delete(job)
clear job

참고 항목

| | |