Matlab是强大的计算软件,这不需要过多介绍了,大到航天航空领域,小到计算方程式,Matlab无处不在。

像是这种大型的计算工具必然要支持分布式群集计算功能,即让多台电脑、服务器,协同计算同一数据,以实现“人多力量大”的加速效果。

我本人不会使用Matlab,但出于对老婆的关心,考虑到她常因电脑性能不足,而为了一个计算登上数个小时,我决心利用家里的电脑资源(家庭服务器+家庭日用电脑主机)来打造一个基本的Matlab计算群集,以达到加速效果。而这样的一个布局,也正符合了我当初设计的“家庭云”的理念。

有了Matlab云集,上网本现在都可以跑大型计算了~ 

 

 

第一步:安装Matlab及其分布式计算服务(MDCE)

MDCE服务是需要另外购买的,学生版不提供(盗版基本都包括了)。

 

- 安装Matlab程序的部分我就省略了。安装好以后,请运行Matlab(我以2013a版本为范例)
- 在顶端地址栏部分打开以下路径:C:\Program Files\MATLAB\R2013a\toolbox\distcomp\bin (见下图)

 

 

- 然后分先后运行 !mdce install 以及 !mdce start (注意指令前面的感叹号!)

此时可以右键点击左边的addMatlabToWindowsFirewall.bat,然后选择在Windows资源管理器中打开,然后以管理员身份运行。这样的目的是为了打开防火墙中Matlab分布式计算的对应端口。

到这里就算完成Matlab分布式计算服务的安装了。需要注意的是:所有将参与该计算群集或使用该计算群集功能的服务器和计算机都需要完成以上操作,包括很弱的上网本也要,不开启MDCE服务是不能连接计算机群的

 

 

第二步:进行机群的配置

光是完成以上安装还不行,还要进行配置,即把所有可以用的计算机资源都联系捆绑在一起。

· 具体操作是在刚才打开防火墙的批运行文件目录下(C:\Program Files\MATLAB\R2013a\toolbox\distcomp\bin),以管理员身份再运行admincenter.bat文件,然后就会看见下图:

 

当然我们首先点击那个“Add or Find”,然后被要求输入主机名或相应IP地址(如果有多台主机,则需要重复此项操作将其全部加入)

完成后结果如下:

 

现在我有三台四核CPU电脑在计算机群内,且都开启了MDCE服务,接下来我要做的就是建立一个Job,然后选择开启的总线程,然后做一个示范性计算。

· 建立Job就是点上图中间部分左侧的Start
· 然后随便写一个名字,我用Job1
· 然后选择由哪台电脑作为主机来发起该计算 (见下图)

然后设置要开启的总线程(workers),由上图可见,三台四核CPU主机一共可以提供12个workers,即12条线程同时启动进行Matlab并行计算。

这里要说明一下的是,“核心”是指电脑的物理核,多线程不算核心,譬如Intel i7 四核8线程CPU只能作为四核对待,只能提供4个worker,而AMD的FX八核处理器,由于是物理核,则能提供8个worker

还有一点,服务器集群中的worker必须要统一,即大家都必须使用同等数量的worker来协同工作,不能某一台性能强点就开启四核,另一台弱点只开启两核,这样不行!所以,请不要把双核CPU、四核CPU混在一起作为一个集群,除非你只打算在四核主机上开启两个worker。

以上图为例,我勾选了全部三台主机作为计算集群,然后每台开启四个核,即四个worker,然后总共有12个worker将为我同时进行计算。

到这里,配置部分就完成了。接下来要在Matlab操作机器上调用以上配置。Matlab称之为Cluster Profile

 

第三步:Matlab客户机调用集群

回到Matlab主程序,打开下图显示的Manage Cluster Profiles

 

打开上述管理器后,默认情况下只有一个local档案(这是给Matlab开启本机多核计算的档案,不要删除了)。我们直接点击那个Discover Clusters就可以了,不需要手动配置,选择On your network(本地局域网内)

完成后看到下图

我用1和2表明了先后要做的两件事:1.给档案改名(右键然后选择改名,我改为cluster)。2.检测一下是否一切正常

全部测试通过!如果你有某项测试未通过,可以点击感叹号看到具体原因,很多时候是防火墙造成的,注意执行前面提到的开启防火墙。(如果实在是弄不清防火墙设置,可以索性关闭了~

到这里就大功告成了!演示一下开启12个worker进行计算

 matlabpool open cluster; 是调用cluster配置文件,开启12个worker的指令,右下角显示的是成功开启的worker数量。

matlabpool close; 是关闭分布式计算/并行计算的指令,建议每次用完都执行一次。

因为我不会具体的matlab代码,所以没法演示一段12 worker一起计算的表现。根据老婆之前调用8个worker(服务器+家中主电脑)的经验,仅把for循环改为parfor循环(具体参见Matlab官方指导有关如何运用并行计算),原先一个小时的计算现在能提速2.5倍甚至更多。

 

最后:关于一些疑问和解答

1. 首先要解释一下以上Matlab的分布式计算和博客主题“家庭云”的关系。很多网站的文章在提到“家庭云”的概念时,总是暗示,甚至错误地把“云技术”与“云储存”划上等号。“云技术”说白了是服务器的利用,而在服务器端存储文件,只是云技术的一部分。Matlab的分布式计算,正巧可以帮助理解云计算的核心概念,而在家中架设一个实时开放的Matlab服务器,这就是“家庭云计算”的典型表现,超越了我之前云储存的应用范围。

 

2. 这个云目前为止只是在家中局域网的范围服务,在学校在公司,怎么使用家中的云?

如果有看过前面的博文,会知道家庭云最基本的一项功能就是提供×××连接。我没有打算把Matlab服务器公开到互联网上,所以端口不用在路由器上映射,如果学校或公司电脑需要用到家里的云,×××连接回家就好了,所有IP都是固定好设置好的,与在网内使用服务无异。

 

3. Matlab分布式计算的防火墙端口设置是比较麻烦的。根据官方资料,如果线程多了,所使用的端口也会相应增加。也就是说,8个worker所需要打开的端口,和12个worker所需要打开的端口是不一样的!所以,上面不会设置防火墙的网友可以索性把它关闭了。

 

4. 上网本的最高阶利用:

上网本是很弱的设备,勉强跑个Windows就可以了,谈运行Matlab?简直笑话!但是,有了云集Matlab,可以在上网本上运行任何计算。这里需要注意的是,在配置上述第二步骤的时候,上网本千万不要加入到群集中,只勾选服务器就可以了。上网本所需要做的就是把代码和数据从本机发送给服务器,然后计算的工作由服务器处理。