多台Linux(Ubuntu16.4)下搭建Matlab2017a分布式计算引擎服务(MDCE)集群

一、引言

这一篇也是拖了挺久的才更新完。18年9月刚刚摸实验室服务器的时候,学长那边正好要跑MATLAB程序。后来学习了如何在服务器上安装MATLAB ,利用MATLB自带的并行计算工具在一台服务器上跑。但是感觉光用一台服务器的计算资源程序还是跑得不够快,于是想怎么样可以把可用的五台服务器给用上。调研了发现MATLAB自带的分布式计算引擎(Matlab Distributed Computing Engine,MDCE)服务可以调用这五台服务器的计算资源进行分布式并行计算。
接下来就探索如何在多台Linux(Ubuntu16.4)系统下搭建Matlab分布式计算引擎服务(MDCE)集群,由于网上关于Linux系统下搭建MDCE的教程比较少,我把自己搭建的过程向大家介绍一下。

二、介绍

关于Matlab分布式计算引擎服务的原理网上挺多资料的,主要参照官方文档理解。
https://ww2.mathworks.cn/products/distriben.html
https://ww2.mathworks.cn/products/parallel-computing.html
这个视频也把原理介绍得很清楚:
https://ww2.mathworks.cn/videos/cluster-computing-with-matlab-for-system-administrators-99076.html

官方:
利用 MATLAB Distributed Computing Server™,可以在计算机集群、云上运行计算密集型 MATLAB® 程序和 Simulink® 模型。您可以在多核电脑上、运用 Parallel Computing Toolbox™ 开发程序或模型,然后在 MATLAB Distributed Computing Server 上运行开发的程序或模型,从而扩展到多台计算机。该服务器支持批处理作业、并行计算以及分布式大数据。该服务器包括内置集群作业调度器,并为常用第三方调度器提供支持。

在这里插入图片描述
其他博客:
Distributed Computing Toolbox就是分布式计算工具箱,简称DCT,其可以在多台计算机组成的Cluster中实现分布式或并行式计算。简单来说,我们是把一个很繁重的工作,分解成许多小任务,然后分给不同的计算机去处理,最后把计算结果汇总,以达到提高计算效率的目的。
Matlab的做法是这样的:在每台参与计算的计算机中启动一个叫Matlab Distributed Computing Engine的服务,该服务能启动参与计算的worker的Matlab session和管理各台计算机workers的job manager。Job manager对workers进行管理,给workers分配计算任务,接收workers计算后的结果。而你本人就是client,你要把你的工作分解为多个任务,然后把任务给job manager。job manager就会根据workers的多少和空闲情况,适当地把任务分配给workers去做。workers完成任务后,会把结果返回给job manager。当所有workers都完成任务后,用户client,便可以从job manager里取回结果。

三、Linux搭建MDCE的流程

1.实验环境说明,安装MATLAB

实验室里有五台戴尔的服务器可用,每台被检测可用12核(貌似Matlab最高支持12core/台或者是服务器上限制了核心数的使用),正好用来做分布式并行式计算。可以看看在局域网内每台机子的IP地址,我这五台机子的IP地址:10.2.6.220-10.2.6.223,10.2.6.225。大家各自查看自己的机子IP地址。

实验环境:
Matlab2017a版本,五台Linux(Ubuntu16.4)系统的服务器

首先,按照在Linux环境(Ubuntu16.04)下安装Matlab2017a的方法,在每台待搭建的机子上都安装相同序列号相同版本的matlab。

在搭建工作前注意一下几点:
(1) 保证每台机子之间能够正常通信,可使用ping命令测试。
(2) 保证每台机子安装的Matlab版本一致,且最好安装在同一目录下,避免后面配置时更改路径。
(3) 安装Matlab时,把工具箱全部安装上,确保MATLAB Distributed Computing Server选上。之后不会使用“License Manager”服务,可以选择不安装该项。详细的安装过程可以参照这里:在Linux环境(Ubuntu16.04)下安装Matlab2017a

Matlab安装的一些问题(这是探索过程掉过坑的):
Q:部署Matlab分布式计算服务是否需要Matlab网络版本?
A:每台机子使用相同的单机版序列号安装Matlab即可。 安装单机版和网络版的区别: 网络版本比单机版多了一个licenses manger,由于license问题MATLAB安装破解失败。
Q:Linux系统上已经安装好的Matlab如何卸载?
A:直接删除安装目录下的文件夹便可以卸载。具体参照自己的安装目录。

卸载 MATLAB
sudo rm -rf /usr/local/MATLAB/

下面,开始MDCE搭建流程。

2.安装并开启MDCE服务

每台机子上安装MDCE服务并开启服务。
cd命令进入每台机子的matlab安装目录下的这个文件:
/usr/local/MATLAB/R2017a/toolbox/distcomp/bin
运行下面的命令:

sudo ./mdce install

在这里插入图片描述
然后,运行下面的命令:

sudo ./mdce start

在这里插入图片描述
这样就在每台机子上开启了MATLAB的分布式计算服务。

3.修改hostname映射

每台机子上打开hostname和ip地址的映射表,然后修改。

sudo vi /etc/hosts

打开之后的原始文件一般是这样子的。
在这里插入图片描述
修改之后是这样的,把127.0.1.1 computer5 这一行删掉。
在这里插入图片描述
每台机子上修改,也是把含有127.0.1.1这一行删掉,相当于每台机子上的hosts都需要改成跟上面这张图一样的内容。具体来说,在每台主机上都有一个hostname和ip地址的映射表,每台机子彼此知道彼此hostname叫什么,对应的ip是什么。

4.客户端界面操作

选择一台机子作为客户端,在这里我选择了computer2做为客户端进行操作。computer2的IP为10.2.6.222,每个机子的IP可以自己去查到。

下面的步骤仅在客户端机子(computer2)上操作,这个操作过程可能会出现一些问题,最后给出我在搭建过程中的常见问题及答案。

首先,打开客户端界面。

sudo /usr/local/MATLAB/R2017a/toolbox/distcomp/bin/admincenter

在这里插入图片描述
然后,填写待搭建的机子的IP号,把每台机子的IP列进去。
在这里插入图片描述
然后,测试连通性。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
很开心的发现全部都是绿色的,然后可以关闭窗口啦,说明很顺利。

接下来,创建调度器。
在这里插入图片描述
设置调度器名称,并选择一个机子来做调度器的功能,这个选择不影响这个机子计算资源的使用。
在这里插入图片描述
最后,就是创建工作节点啦。workers为MATLAB计算引擎,也是工作节点。
在这里插入图片描述
在这里就是设置你想要多少个工作节点来进行计算,这个工作节点worker数是可以比可用的核心数要大的,相当于并行计算的线程能够更多一些吧,但是也是有一定瓶颈的。
在这里,我设置是把核心数和工作节点数对应的。
把所有的物理机选上,选择刚刚设置好的调度器,根据每一台选用你想用的工作节点数,我这里选每一台物理机开启12个worker,与12个核心数相同。
在这里插入图片描述
接下来就等着它建立worker,可以发现五台机子可以有60个worker。
在这里插入图片描述

5.MATLAB验证

打开MATLAB。

sudo /usr/local/MATLAB/R2017a/bin/matlab

在这里插入图片描述
选择parallel → Manage Cluster Profile, 打开集群管理器,
在这里插入图片描述
选择之前建立的调度器所管理的集群,一般情况下会变成默认的了,然后选择Validation选项卡,点击Validate,等待着验证。完成后可以发现这个集群有60个worker。
在这里插入图片描述
如果使用本地的集群资源,同样Validate,发现本地可用的有12个worker。
在这里插入图片描述
接下来的使用就是开启并行计算工具跑代码就可以了。

6.代码验证

具体代码网上的有很多,一般都是把循环for改成parfor,把代码改成可以并行计算的代码。可以利用计时器,tic-toc记录测试代码分布式并行计算的时间。
开启并行计算的方法网上的方法也很多,我这里是先调用再计算的方式。可以先打卡MATLAB左下角的开启并行计算图标,举个例子,下图这是开启了之后的状态,显示了36个worker可工作,想调用几个worker都是可以设置的,不详细说明了。
在这里插入图片描述
具体你想调用几个worker进行计算可以在MATLAB命令行里运行以下命令:

>> parpool(20)  %启动20个worker进行计算

在这里插入图片描述
我用的这个程序可以发现,使用20个worker工作会比使用4个worker工作的时间要快。但是计算时间有时候与代码的复杂程度有关,也和调度的这个过程有关。有些简单的程序不使用并行计算也可能比使用并行计算的时间快。多任务对调度器也有要求,也是需要有好的调度算法。一般来说,越复杂的代码使用并行计算的效果越明显。

四、常见问题

Q1:在Admin center内连接主机后,发现MDCE service状态为unavailable怎么办?
在这里插入图片描述
A1:对应的主机matlab上没有安装MDCE服务,在对应的主机上使用命令行安装并且开始MDCE服务(第三章第2点)。然后发现对应主机的MDCE service状态变为running。
在这里插入图片描述
Q2:在Admin center内运行Test Connectivity发现hostname有错误,服务端口也连接不上。
在这里插入图片描述
A2:更改/etc/hosts文件内的IP地址和主机号,将要搭建的主机的IP和主机号对应,并在每一个要搭建的主机都进行修改成一样的对应关系表。(第三章第3点)
在这里插入图片描述
光改一台机子不行,每台机子都得改成相同的,不然就会这样:
在这里插入图片描述
每台机子都改完之后会变成这样:
在这里插入图片描述
Q3:在Test Connectivity成功后,开始添加MJS调度器,需要一台主机来做调度。客户端和调度器的计算资源能否可以使用?
A3:可以将客户端主机加入Hosts,右图也说明了客户端和调度器的计算资源都可以用于计算。

五、结语

通过上面的流程,我们在实验室服务器上搭建了Matlab分布式计算(MDCE)服务集群,由五台物理机组成,其中包含一台客户端,一台调度器,所有机子都可以做计算资源。这样子已经足够可以加速跑一跑代码了,之前一台机子12个worker跑学姐的代码跑了五天,之后缩短了一半多的时间。
这也算是在探索中出的一份多台Linux(Ubuntu16.4)下搭建Matlab2017a分布式计算引擎服务(MDCE)集群的流程。毕竟在Linux下搭的,其中也走过不少坑,大家有问题可以多交流。

参考:
在Linux环境(Ubuntu16.04)下安装Matlab2017a
https://blog.csdn.net/qq_31285709/article/details/82083902

Window下Matlab分布式计算集群建立方法
https://blog.csdn.net/xiaotianlan/article/details/52151032
https://blog.csdn.net/zhangfuliang123/article/details/75047676
https://blog.csdn.net/kklots/article/details/24675575

linux搭建过程的问题
https://blog.csdn.net/huntstart/article/details/51124889

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章