Matlab的集群使用技巧

我们对于Matlab的日常使用往往发生在Windows和Mac上,虽然Matlab对于这两个系统的优化一般,进行一些简单的数值计算和普通画图也基本够用。近日,由于需要进行大规模计算,原本的方案已无法满足我的计算需求。在一台4代i5处理器4核4线程睿频3.7GHz的windows台式机上,单日任务量单核运算需100s,多核运算需41s,这样对于25年的数据就需要103小时才能计算完成。很显然,没有人会这样做,于是我考虑使用学校集群进行多核并行运算。

本文将介绍Matlab在集群上的使用技巧,如何在登陆节点、计算节点通过命令行/可视化界面等方式完成计算。

本文以tamu-ada集群为例,主要参考HPRC-WIKI-TAMU的使用说明。

零、集群程序的图形化显示

之所以把这一段作为第零章,是因为我花了很久很久的时间去寻找它图形化界面的方案。
参考:https://stackoverflow.com/questions/39622173/cant-run-ssh-x-on-macos-sierra/53750550#53750550

  1. Reinstall XQuartz using Homebrew: brew cask install xquartz (the option --forced may be necessary)
  2. Add the XQuartz launcher to the system default (following the solution in this Reddit post:
    launchctl load -w /Library/LaunchAgents/org.macosforge.xquartz.startx.plist
  3. Restart the system.
  4. After doing these, my DISPLAY variable is set properly,And X11 forwarding in ssh works as well.
$ echo $DISPLAY
/private/tmp/com.apple.launchd.mfXFpzZ0gC/org.macosforge.xquartz:0

the Last thing: log in your linux server

ssh -X hengkai.yao@ada.tamu.edu

一、登陆节点的使用

# 一般图形化界面使用
ssh -X hengkai.yao@ada.tamu.edu
[ netID@cluster ~]$ module load Matlab
[ netID@cluster ~]$ matlab -desktop
# 命令行使用
matlab -nosplash -nodisplay
# 默认用光登陆节点的全部核心,可限制核数
>>feature('NumThreads',4);
# 仅使用单核
[ netID@cluster ~]$ matlab -singleCompThread

二、HPRC计算节点的使用

2.1 使用HPRC MATLAB APP

该APP并不具有普适性,因此以后再补。

2.2 使用命令行提交MATLAB代码

该代码也是TAMU开发的。

>> tp=TAMUClusterProperties();
>> tp.workers(4);
>> tp.walltime('07:00');
>> myjob=tamu_run_batch(tp,'mysimulation.m');

2.3 使用linux命令行提交MATLAB代码-matlabsubmit


-bash-4.1$ matlabsubmit -h
/software/hprc/Matlab/bin/matlabsubmit: option requires an argument -- h
Usage: /software/hprc/Matlab/bin/matlabsubmit [options] SCRIPTNAME

This tools automates the process of running matlab codes on the compute nodes.

OPTIONS:
  -h Shows this message
  -m set the amount of requested memory in MEGA bytes(e.g. -m 20000)
  -t sets the walltime; form hh:mm Cluster profiles let you define certain properties for your cluster(e.g. -t 03:27)
  -w sets the number of ADDITIONAL workers
  -g indicates script needs GPU  (no value needed)
  -b sets the billing account to use 
  -s set number of threads for multithreading (default: 8 ( 1  when -w > 0)
  -p set number of workers per node
  -f run function call instead of script
  -x add explicit batch scheduler option
  
DEFAULT VALUES:
  memory   : 2500 per core 
  time     : 02:00
  workers  : 0
  gpu      : no gpu 
  threading: on, 8 threads
We will discuss briefly some of the more common parallel matlab concepts. For more detailed information about these constructs, as well as additional parallel constructs consult the Parallel Computing Toolbox User Guide.
# 首先加载Matlab模块
module load Matlab/R2018b

[ netID@cluster ~]$ matlabsubmit myscript.m
# 命令选项
-bash-4.1$ matlabsubmit -h
# 单节点多线程,总8个worker,仅一个节点
-bash-4.1$ matlabsubmit -w 8 test.m
# 多节点多线程,总24个worker,每个节点跑4个worker
-bash-4.1$ matlabsubmit -w 24 -p 4 test.m
# 设置内存量,mb为单位,以200G内存为例
-bash-4.1$ matlabsubmit -m 200000 test.m
# 运行后查看屏幕输出
-bash-4.1$ tail -f ./MatlabSubmitLOG1/matlab.log

2.3 使用Matlab Parallel Toolbox

# 导入Cluster Profile
>> tamu_import_TAMU_clusterprofile()
>> tp=TAMUClusterProperties;
>> tp.workers(4);
>> clusterObject=tamu_set_profile_properties(tp);
# 开启并行池,和本地开多线程并行池类似
mypool = parpool 4
    :
delete(mypool)

三、常用并行语句结构

3.1 parfor - for的并行写法

# 不可进行并行间调用
# 循环内save会报错
parfor i=1:1024
   A(i)=sin((i/1024)*2*pi);
end

在parfor中不能直接使用save或clear,需使用function来调用。

parfor iDay=1:365
    data=sSSHtrans(:,:,iDay)-sSSHtransMean;
    save_data(['ssh_',num2str(dates(iDay)),'.mat'],data);
end
%---------------------------------------------------
function save_data(path, data)
    save(path, 'data', '-v7');
end

3.2 spmd - 同一变量名的多个存在

spmd还没有实际使用过,欢迎使用过的小伙伴留言。

spmd (4)
    data = load(['data' num2str(labindex)])
    myresult = myfun(data)
end

3.3 GPU

一直没有机会用到GPU,通常适用于总计算量大但每一线程的计算内容少,一行内的加减乘除。

Last modification:August 1st, 2019 at 04:30 pm
If you think my article is useful to you, please feel free to appreciate

2 comments

  1. Chi Google Chrome 75.0.3770.101 Android 9 美国 美国

    我做涡识别,是在集群上开spmd。每个worker处理一个ssh snapshot,正好符合single program multiple data。我倒是没用过parfor。

    1. Eddy Safari 604.1 iPhone 美国 美国
      @Chi

      行家啊,回头我得试试,我就是在fag方法做涡识别。

Leave a Comment