MATLAB 并行:跨节点运行
跨节点运行概括:
首先: 使用北极星的matlab就全部使用,学校的就全部使用学校的。两个版本的matlab不能混着跑 !,否则认证服务器会死掉!
1、并行任务文件名为 bjxabc.m
2、去除里面 parpool('local',20);%cn_nl改为parpool('local',28);
3、提交任务:
任务提交,这里以demo为例(可以自己运行测试下)
a、cn_nl运行:pkurunmatlabbjx-cnnl 2 28 bjxabc
其中2 为两个节点,28为每个节点跑的核心数,bjxabc为demo,可以替换成你自己的文件名称(不含.m)
b、cn-short运行:pkurunmatlabbjx-cns 2 20 bjxabc
c、cn-long运行:pkurunmatlabbjx-cnlong 2 20 bjxabc
详细内容:
++++++++++++++++++++++++++++++++++++++++
一、MATLAB,节点内并行:
1、下面是一个节点内并行运行的程序,文件名为abc.m运行20核:
parpool('local',20);%cn_nl改为parpool('local',28);
A = zeros(100,1);
parfor i = 1:100
pause(10);
%A(i) = i;
A(i) = sin(i*2*pi/20);
end
save('/lustre3/yourname/matlab/testR.mat', 'A');
2、任务提交:
先执行:
source /appsnew/source/matlab2021b-bjxserver.sh
在执行,可以在cn_nl,cn-short,cn-long上跑:
cnnl执行:pkurun-cnnl 1 28 "matlab -nodesktop -nosplash -r abc"
cn-short执行:pkurun-cns 1 20 "matlab -nodesktop -nosplash -r abc"
cn-long执行: pkurun-cnlong 1 20 "matlab -nodesktop -nosplash -r abc"
执行后会生成提交脚本(cn_nl分区),并自动提交,也可以改生成的脚本添加参数和命令:
[chen@login07 matlab]$ cat job.srp232233
#!/bin/bash
#SBATCH -J mat232233
#SBATCH -p cn_nl
#SBATCH -N 1
#SBATCH -o mat232233_%j.out
#SBATCH -e mat232233_%j.err
#SBATCH --no-requeue
#SBATCH -A chen_g1
#SBATCH --qos=chencnnl
#SBATCH -c 28
pkurun matlab -nodesktop -nosplash -r abc
二、MATLAB,跨节点并行(如果选择一个节点就是节点内运行):
1、运行文件,这里以demo为例(文件在/appsnew/usr/Matlab/bjxabc.m )
% The user's MATLAB codes
A = zeros(100,1);
parfor i = 1:100
pause(10);
A(i) = i;
%A(i) = sin(i*2*pi/20);
end
save('/lustre3/yourname/matlab/testR.mat', 'A');
可以看出没有这行了:parpool('local',20);
这里让系统去分配cpu核心了
2、任务提交,这里以demo为例
a、cn_nl运行:pkurunmatlabbjx-cnnl 2 28 bjxabc
其中2 为两个节点,28为每个节点跑的核心数,bjxabc为demo,可以替换成你自己的文件名称(不含.m)
b、cn-short运行:pkurunmatlabbjx-cns 2 20 bjxabc
c、cn-long运行:pkurunmatlabbjx-cnlong 2 20 bjxabc
和cnnl类似
3、生成的脚本为:
1)提交脚本以job.srb加时间为开头如:job.srp234653,不需要改这个脚本
#!/bin/bash
#SBATCH -J bjx234653
#SBATCH -p cn_nl
#SBATCH -N 1
#SBATCH -o bjx234653_%j.out
#SBATCH -e bjx234653_%j.err
#SBATCH --no-requeue
#SBATCH -A chen_g1
#SBATCH --qos=chencnnl
#SBATCH -c 1
source /appsnew/source/matlab2021a-server.sh
hosts=`scontrol show hostname $SLURM_JOB_NODELIST` ;echo $hosts
matlab -nodesktop -nosplash -r "matlabslurm234653;quit" -logfile LogFile234653.txt
2)matlab队列提交文件,matlabslurm234653.m
slCharacterEncoding('UTF-8')
%% The path of your job
JobPath = '/lustre3/chen/test/matlab/matlab';%%工作路径,系统生成,也可以更改
cd(JobPath);
Matpwd= '/appsnew/usr/Matlab/';
%% Import Cluster Profile
allName = parallel.clusterProfiles();
if ~ismember('bjx-matlab_slurm_exclusive',allName)
parallel.importProfile([Matpwd,'/bjx-matlab_slurm_exclusive']);
end
%% Culster Settings
b = parcluster('bjx-matlab_slurm_exclusive');
b.ClusterMatlabRoot = '/appsnew/usr/Matlab/MATLAB2021a-pkuserver';
% Slurm job parameters
b.AdditionalProperties.JobName = 'matlab_bjx234653';
b.AdditionalProperties.Partition = 'cn_nl';
b.AdditionalProperties.NodeNum = '2'; %%这些改提交的节点数
b.AdditionalProperties.account = 'chen_g1';
b.AdditionalProperties.ntasks = '28';
b.AdditionalProperties.qos = 'chencnnl';
b.AdditionalProperties.exclusive = ' ';
b.AdditionalProperties.norequeue = ' ';
j = batch(b,'bjxabc','Pool',55) % Run a job for 63 works which is (64-1) %%将bjxabc替换为你的函数,还有更改55为你的核心数
这些只是生成的文件,如果没有复杂的计算不用更改。
如果想改脚本提交,可以改1),2)中红色部分
然后sbatch 所改的job.srb+时间的脚本:sbatch job.srp234653
4、提交过程:会有两个任务,一个是slurm提交matlab的脚本(第一个),后一个是由matlab提交的slurm脚本
5、结果:
1) cat Job1/Job1.log (或者类似的Job1,Job2...文件夹)
The scheduler has allocated the following nodes to this job:
s11b07n[02-03]
"/appsnew/usr/Matlab/MATLAB2021a-pkuserver/bin/mw_mpiexec" -l -n 56 "/appsnew/usr/Matlab/MATLAB2021a-pkuserver/bin/worker" -parallel
[0] Sending a stop signal to all the labs...
[0] Parallel pool is shutting down.[0]
Exiting with code: 0
输出为0就是成功了
2)cat Job1/tpde931c96_1f7e_40f6_a37e_99ecfb1b13e9 (输入tp补全就是matlab提交slurm脚本)
sbatch --job-name=Job1 --output='/lustre3/chen/test/matlab/matlab/Job1/Job1.log' --ntasks=56 --cpus-per-task=1 --job-name=matlab_bjx234653 --partition=cn_nl -N 2 -A chen_g1 --exclusive --ntasks-per-node=28 --qos=chencnnl --no-requeue '/appsnew/usr/Matlab.....communicatingJobWrapper.sh'
3)几个输出:
cat *.err *.out LogFile234653.txt
还有 testR.mat
可以在shell 或者matlab里查看