누리온 및 뉴론 시스템에서 MATLAB 데스크톱 및 MATLAB Parallel Server 사용 방법
원격데스크톱(VNC, 우분투 OS) 에서 MATLAB 데스크톱 프로그램을 사용할 수 있으며, 누리온 및 뉴론 시스템의 작업 스케줄러를 통해서 할당된 계산 노드에서 MATLAB Parallel Server를 사용하여 대규모 병렬 연산 작업을 실행할 수 있습니다. (MATLAB 지원 버전 : R2024a)
누리온 및 뉴론 시스템에서 MATLAB 데스크톱 및 MATLAB Parallel Server를 사용하기 위해서는 사용자(소속기관)가 라이선스를 보유해야 하며, 아래 지침에 따라 MATLAB 사용자 라이선스 활성화를 수행해야 합니다.
보유 라이선스 현황 및 활성화된 컴퓨터를 확인하기 위해서는 Mathworks 계정에 접속하시기 바랍니다.
MATLAB Parallel Computing Toolbox 라이선스를 보유한 사용자는 MATLAB 데스크톱 프로그램이 실행되고 있는 누리온/뉴론 MyKSC의 로컬 서버에서 MATLAB 병렬 연산을 실행할 수 있습니다. 아래 예시는 뉴론 MyKSC에서 MATLAB 병렬 연산 실행 예시이며, 누리온 MyKSC에서도 동일한 방식으로 실행할 수 있습니다.
MATLAB 데스크톱 프로그램의 Parallel computing options(병렬연산)에서 Create and Manage Clusters(클러스터 생성 및 관리)를 메뉴를 클릭합니다.
(뉴론) Cluster Profile Manager 화면
Cluster Profile Manager가 실행되면 Cluster Profile에서 Processes를 선택하고 Set as Default 설정 후 Edit 버튼을 눌러서 MATLAB_VNC 앱에 할당된 CPU 코어 수 이내에서 Numworkers 값을 설정합니다.
(뉴론) Cluster Profile(Processes) 옵션 설정 화면
Command Window에서 사용자의 MATLAB 병렬 프로그램이 저장된 디렉터리로 이동하여 실행 명령어를 입력합니다. 아래 예시에서는 MATLAB 데스크톱 프로그램이 실행되고 있는 로컬 서버에서 MALTAB 병렬 연산을 수행하는 방법을 보여주고 있습니다.
(뉴론 CPU 기반의 대화식 병렬 연산 작업실행 예시)
(뉴론) 로컬 노드 1대, 3 CPU 코어
Numworkers : 3
(뉴론) 로컬 서버에서 CPU 기반 MATLAB 병렬 프로그램 실행 화면
(뉴론 GPU 기반의 대화식 병렬 연산 작업 실행 예시)
(뉴론) 로컬 노드 1대, 2 CPU 코어, 2 GPU
Numworkers : 2
(뉴론) 로컬 서버에서 GPU 기반 MATLAB 병렬 프로그램 실행 화면
2) 누리온/뉴론 계산 노드에서 MATLAB 병렬 연산 작업 실행
MATLAB Parallel Server 라이선스를 보유한 사용자는 누리온/뉴론 시스템의 계산 노드에서 MATLAB 병렬 연산 작업을 실행할 수 있습니다.
MATLAB Parallel Server를 통한 병렬 컴퓨팅 연산을 실행하기 위해서는 온라인 라이선스 활성화 또는 사용자 라이선스 서버 연결이 필요하며 사용자 MATLAB 사용자 라이선스 활성화를 참고 하시기 바랍니다.
누리온/뉴론 시스템에서 MATLAB parallel server를 통한 병렬 연산 실행 개요
a. 누리온
MATLAB 데스크톱 프로그램의 Parallel computing options에서 Create and Manage Clusters... 메뉴의 Discover Clusters를 실행하여 누리온 시스템을 위한MATLAB Parallel Server cluster로 'Nurion'을 선택하여 프로파일을 추가합니다.
(누리온) MATLAB Parallel Server cluster 찾기 화면-1
(누리온) MATLAB Parallel Server cluster 찾기 화면-2
Cluster Profile 목록에서 Nurion을 선택하고 Set as Default 설정 후 Edit 버튼을 눌러서 아래와 같은 파라미터의 값을 설정합니다.
(누리온) Cluster Profile Manager 실행 화면
Numworkers : 병렬 연산을 실행할 워커수를 지정합니다. 누리온 시스템에서 matlab 병렬 연산을 위한 계산 노드는 노드 당 40개의 CPU 코어를 가지고 있습니다. 사용자의 MATLAB Parallel server 라이선스 수 이내에서 워커수를 짝수로 설정합니다.
JobStorageLocation : 사용자의 스크래치 디렉터리에서 작업 정보가 저장될 경로를 지정합니다.
RequiresOnlineLicensing : Matlab Parallel Server 온라인 라이선스 활성화를 위해서는 true로 설정합니다.
* MATLAB Parallel Server 라이선스도 온라인 라이선싱으로 변경 되어야 합니다. (관련 링크)
EmailAddress : 작업 시작 및 종료 시 안내 메일을 받을 사용자 메일 주소를 지정합니다.
QueueName: 누리온 시스템에서 MATLAB 병렬 연산을 위해 사용할 배치 작업 스케줄러(PBS Pro) 작업큐의 이름을 지정합니다. 현재 norm_skl 큐만 사용 가능합니다.
MATLAB 병렬 연산작업은 누리온 시스템의 배치 작업 스케줄러(PBS Pro)를 통해 할당된 계산 노드에서 실행되며, MyKSC의 배치작업 App을 실행하여 제출된 사용자 작업 및 큐 정보 등을 확인할 수 있습니다.
(누리온) MyKSC 배치 작업 App 실행 화면
b. 뉴론
MATLAB 데스크톱 프로그램의 Parallel computing options에서 Create and Manage Clusters... 메뉴의 Discover Clusters를 실행하여 뉴론 시스템을 위한 MATLAB Parallel Server cluster로 Neuron을 선택하여 프로파일을 추가합니다.
(뉴론) MATLAB Parallel Server cluster 찾기 화면-1
(뉴론) MATLAB Parallel Server cluster 찾기 화면-2
Cluster Profile 목록에서 Neuron을 선택하고 Set as Default 설정 후 Edit 버튼을 눌러서 아래와 같은 파라미터의 값을 설정합니다.
(뉴론) Cluster Profile Manager 실행 화면
Numworkers : 병렬 연산을 실행할 워커수를 지정합니다. 뉴론 시스템에서 matlab 병렬 연산을 위한 계산 노드는 다양한 구성을 가지고 있습니다. 사용자의 MATLAB Parallel server 라이선스 수 이내에서 워커수를 설정합니다.
JobStorageLocation : 사용자의 스크래치 디렉터리에서 작업 정보가 저장될 경로를 지정합니다.
RequiresOnlineLicensing : Matlab Parallel Server 온라인 라이선스 활성화를 위해서는 true로 설정합니다. * MATLAB Parallel Server 라이선스도 온라인 라이선싱으로 변경 되어야 합니다. (관련 링크)
EmailAddress : 작업 종료 시 안내 메일을 보낼 사용자 메일 주소를 지정
GPU: 계산 노드 당 GPU 수를 지정
MemPerCPU : CPU 코어 당 메모리 용량을 지정
Nodes : 계산 노드 수를 지정
Partition: 파티션(큐)를 지정
TaskPerNode: 계산 노드 당 타스크 수를 지정
뉴론 시스템의 배치 작업 스케줄러(SLURM)에서 지원하는 Partition(큐) 리스트 및 Partition(큐) 별 계산 노드 정보 등은 스케줄러를 통한 작업실행(SLURM) 또는 KSC 배치작업 APP의 큐 정보를 참조하시기 바랍니다.
(뉴론) Cluster Profile Manager에서 파라미터 설정하기-1
(뉴론) Cluster Profile Manager에서 파라미터 설정하기-2
( CPU 기반의 일괄 처리식 병렬 연산 작업 실행 예시)
(뉴론) 리모트 계산 노드 2대, 16 CPU 코어/노드
Numworkers : 32
GPU : 0
MemPerCPU : 4gb
Nodes : 2
Partition : skl
TasksPerNode : 16
batch 함수에서 병렬 풀은 병렬 작업 관리를 위해 사용자가 필요로 하는 워커수(CPU 코어수) 보다 한 개 더 요구됩니다. 예시와 같이 31개의 워커(CPU 코어)를 사용하는 병렬 작업은 32개의 워커(CPU 코어)가 필요합니다.
SERVER 192.168.100.101 50604GT654FG 27000
USE_SERVER
## 사용자 홈 디렉터리에 .matlab/R2024a 디렉터리를 생성한 후 라이선스 파일을 복사해야 합니다.
#> mkdir -p ~/.matlab/R2024a_licenses
#> cp ~/network.lic ~/.matlab/R2024a_licenses
( parallel_plot.m)
primeNumbers = primes(unit64(2^18));
compositeNumbers = primeNumbers.*primeNumbers(randperm(numel(primeNumbers)));
factors = zeros(numel(primeNumbers),2);
numWorkers = [1 2 3];
tLocal = zeros(size(numWorkers));
for w = 1:numel(numWorkers)
tic;
parfor (idx = 1:numel(compositeNumbers), numWorkers(w))
factors(idx,:) = factor(compositeNumbers(idx));
end
tLocal(w) = toc;
end
f = figure;
plot(numWorkers, tLocal);
title('Run time with the number of workers');
xlabel('Number of workers);
xticks(numWorkers);
ylabel('Run time(sec)');
pool = parpool('Processes', 3);
parallel_plot;
delete(pool);
(multi_gpu.m)
N=1000;
numIterations = 1000;
r = gpuArray.linspace(0,4,N);
x = rand(1,N,"gpuArray");
numGPUs = gpuDeviceCount("available");
parpool("Processes",numGPUs);
numSimulations = 100;
X = zeros(numSimulations,N,"gpuArray");
parfor i = 1:numSimulations
X(i,:) = rand(1,N,"gpuArray");
for n=1:numIterations
X(i,:) = r.*X(i,:).*(1-X(i,:));
end
end
figure
plot(r,X,'.');
numGPUS = gpuDeviceCount("available");
pool = parpool("Processes",numGPUS);
multi_gpu;
delete(pool);
parallel_plot.m
primeNumbers = primes(unit64(2^19));
compositeNumbers = primeNumbers.*primeNumbers(randperm(numel(primeNumbers)));
factors = zeros(numel(primeNumbers),2);
numWorkers = [1 2 4 8 16 32];
tLocal = zeros(size(numWorkers));
for w = 1:numel(numWorkers)
tic;
parfor (idx = 1:numel(compositeNumbers), numWorkers(w))
factors(idx,:) = factor(compositeNumbers(idx));
end
tLocal(w) = toc;
end
f = figure;
plot(numWorkers, tLocal);
title('Run time with the number of workers');
xlabel('Number of workers);
xticks(numWorkers);
ylabel('Run time(sec)');
pool = parpool('Nurion', 32);
parallel_plot;
delete(pool);
(parallelFcn.m)
function [numWorkers,tLocal] = parallelFcn()
compositeNumbers = primeNumbers.*primeNumbers(randperm(numel(primeNumbers)));
factors = zeros(numel(primeNumbers),2);
numWorkers = [1 2 4 8 16 31];
tLocal = zeros(size(numWorkers));
for w = 1:numel(numWorkers)
tic;
parfor (idx = 1:numel(compositeNumbers), numWorkers(w))
factors(idx,:) = factor(compositeNumbers(idx));
end
tLocal(w) = toc;
end
end