frensel 发表于 2006-12-11 22:27:03

Matlab的Distributed Computing Toolbox初探

我的实验室有五台双核Pentium D 925计算机,这正适合用来做分布式或并行式计算。我打算只调用那些计算机中的一个核参与计算,留下一个核可以让其他人正常地使用该计算机。我们在这里将会介绍Matlab中Distributed Computing Toolbox的基本使用方法,目标是实现简单的分布式计算。
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里取回结果。
具体的概念可以参考Matlab的帮助,我们也不能说得很准确。我们在这里只想给出使用Matlab实现分布式计算的简单步骤,以便初学者快速入门。
1、首先第一步要做的,就是令每台要参与计算的计算机组成局域网。比如我有三台计算机,其IP地址分别为192.168.1.101-192.168.1.103,以下简称计算机名为101,102和103。
2、在三台计算机中安装Matlab Distributed Computing Engine(mdce)服务。安装方法为:如Matlab的安装地址为C:\Program Files\MATLAB\R2006b,则Start->Run->cmd到命令行窗口,进入C:\Program Files\MATLAB\R2006b\toolbox\distcomp\bin目录,运行mdce install命令安装mdce服务。接着去控制台->管理工具->服务,查看Matlab Distributed Computing Engine的属性。进入登录页,选择“此帐户”,输入NT AUTHORITY\NetworkService,删除下面的密码,让该服务以NetworkService的形式登入,以便该服务存取共享的映射网络驱动器中的原程序文件。接着便可以启动该服务了。注意以后重新开机,该服务都会启动,当然你可以设置让它手动启动。
3、启动job manager。任一台计算机都可以启动job manager,只要mdce服务启动了即可。比如使用计算机101,在C:\Program Files\MATLAB\R2006b\toolbox\distcomp\bin目录下,运行以下命令:
startjobmanager -name frenseljobm
该命令启动jobmanager,其名字叫frenseljobm,启动地点为计算机101。
4、启动workers。任一台计算机都可以启动workers,只要mdce服务启动了即可。比如使用计算机101,在C:\Program Files\MATLAB\R2006b\toolbox\distcomp\bin目录下,运行以下命令:
startworker -jobmanagerhost 192.168.1.101 -jobmanager frenseljobm -name worker1
此命令指明在计算机192.168.1.101中,启动名为worker1的worker,而该worker受名为frenseljobm的jobmanager管理。就是说来自乡下101的可怜工人worker1,成为万恶的监工frenseljobm的“马仔”了。接着,监工frenseljobm要在不同村102和103中雇用更多的工人worker2、worker3。运行如下的命令:
startworker -jobmanagerhost 192.168.1.101 -jobmanager frenseljobm -name worker2 -remotehost 192.168.1.102
即可在102计算机中启动一个新的,名为worker2的worker,如此类推启动103计算机的worker3。使用nodestatus命令可以查看节点的状态,加上-remotehost可以查看其他节点的状态。
5、如令计算机101为client,即我们的程序在这里编写的。设程序文件位于D:\Matlab_code\testDCT中。共享出文件夹Matlab_code,在文件夹中按工具->映射网络驱动器->令盘符为Z:->文件夹里填\\192.168.1.101\Matlab_code。于是Z:\testDCT便成为放置你程序的地方了。以同样的方法,让计算机102和103都建立映射网络驱动器,令盘符为Z:,文件夹里填\\192.168.1.101\Matlab_code。这时三台机都可以通过Z:\testDCT访问原程序文件。
6、现在便可以进行计算了。这里给出测试的代码。首先写一个函数,模拟我们实际的工作。
% hp.m
function f = hp(m, n)
H1 = zeros(n);
H2 = zeros(n);
for i = 1 : m
    H = H1 + H2;
end
f = H;
end
将此程序hp.m放在D:\Matlab_code\testDCT中。此函数计算n维随机矩阵的加法m次。接着建立另一个m文件,做具体的分布式计算。
% runDCT.m
tic
% 寻找资源,比如jobmanager在什么地方,叫什么名字。
jm = findResource('scheduler', 'type', 'jobmanager', 'name',...
    'frenseljobm', 'LookupURL', '192.168.1.101');
% 使用刚才找到的资源建立一个工作
job = createJob(jm);
% 设置该工作的文件关联,让所有workers都可以找到原程序文件。
set(job, 'PathDependencies', {'Z:\testDCT'})
% 另一种方法,把用到的原程序文件传给所有workers。
% set(job, 'FileDependencies', {'hp.m'})
N = 100;
M = 1000000;
% 建立三个任务,每任务都是算hp(M, N)。
createTask(job, @hp, 1, {M, N});
createTask(job, @hp, 1, {M, N});
createTask(job, @hp, 1, {M, N});
% 提交工作给jobmanager。
submit(job)
% 等待所有workers都把任务做完。
waitForState(job, 'finished')
% 取出计算结果。
results = getAllOutputArguments(job);
toc
同样地,该程序runDCT.m也是放在D:\Matlab_code\testDCT中。该程序计算了三次100维矩阵的加法1000000次,即算了100维矩阵的加法3000000次。如果在单机上运行:
>> tic, a = hp(3000000, 100); toc
Elapsed time is 63.096369 seconds.
而使用三台机作分布式计算时:
>> runDCT
Elapsed time is 24.323556 seconds.
效率有明显的提升。但注意到,当第一次进行分布式计算时,其他几台机要从Z:\testDCT中读取原程序文件,会使得计算速度降低。
总结来说,Matlab的Distributed Computing Toolbox为我们提供了一种简便的分布式或并行式计算的实现方法。以上所写的是为了对DCT具体做法的整个过程做一次简单的介绍,我也是初学使用这个工具箱,文章可能很粗糙和存在许多谬误,敬请指正。

taohe 发表于 2006-12-11 23:07:40

谢谢分享原创经验。没有用过这个工具箱。正好学习一下。

bainhome 发表于 2006-12-11 23:21:27

这个工具箱没有用过,几个论坛看下来,这好像也是第一次有人从step1开始进行的全面讨论,因为个人不太懂这个方面的内容,只好过来单纯鼓个掌,顺便加个精华,欢迎诸位高手再继续讨论!

junziyang 发表于 2006-12-12 09:50:13

门外汉,也来鼓个掌。谢谢共享。
看来frensel的介绍,感觉这个工具箱非常不错。尤其对没资金购买顶级配置电脑的实验室(像我们这样:()来说非常实用,可以把实验室的多台机器充分调动起来,实现高效运算。

要请教frensel的是,对参与分布计算的几台机器的配置是否有要求?例如,是否要配置相同,例如CPU主频等?Intel CPU和AMD CPU的机器能否协同工作?谢谢!

frensel 发表于 2006-12-12 10:22:25

原帖由 junziyang 于 2006-12-12 09:50 发表
门外汉,也来鼓个掌。谢谢共享。
看来frensel的介绍,感觉这个工具箱非常不错。尤其对没资金购买顶级配置电脑的实验室(像我们这样:()来说非常实用,可以把实验室的多台机器充分调动起来,实现高效运算。

要 ...
没有问题的,worker能力低,就算得慢一点,可能别的workers完成两个任务了,能力低的workers才完成一个。当然,如果你的工作只有两个任务,分配给一个快,一个慢的workers去做,又要求同步,即等待所有workers都完成任务,这样势必影响效率。CPU不同也没关系,根据Matlab帮助所说的,计算平台(Windows、Linux、Mac)不同也可以。

shunfly 发表于 2006-12-12 19:17:50

感谢分享
门外汉问点问题哦
% 建立三个任务,每任务都是算hp(M, N)。
createTask(job, @hp, 1, {M, N});
createTask(job, @hp, 1, {M, N});
createTask(job, @hp, 1, {M, N});
从这里很难看出这3台机器的通信或者交流?
他的通信机制如何?
比如相互之间要取读交换数据?
可惜啊,本来我这里有10多台空机器,现在都有密码了,我做不了试验了.

nostalgica 发表于 2006-12-12 20:58:37

好帖收藏了,希望有机会能用的到。

frensel 发表于 2006-12-13 01:25:56

原帖由 shunfly 于 2006-12-12 19:17 发表
感谢分享
门外汉问点问题哦
% 建立三个任务,每任务都是算hp(M, N)。
createTask(job, @hp, 1, {M, N});
createTask(job, @hp, 1, {M, N});
createTask(job, @hp, 1, {M, N});
从这里很难看出这3台机器的通 ...
这只是建立三个任务,当把工作提交后,会根据任务建立的先后放进队列,先进先出,提交给空闲的workers计算。因为这个例子是讲分布式计算的,各workers间没有通信,workers只要能读共享目录中的原程序代码即可,当然也可以把代码直接打包传给workers。这个工具箱也能做并行计算,但我还未测试过,不能解答你的问题。

shunfly 发表于 2006-12-13 10:46:28

是我理解错了
分布式/并行
要是我也有可以实验的机器就好了

cwit 发表于 2006-12-13 11:30:38

这个很有意思,很早就有这个需求了.
很感谢你的分享!
跟踪中...

frensel 发表于 2006-12-13 13:08:35

原帖由 shunfly 于 2006-12-13 10:46 发表
是我理解错了
分布式/并行
要是我也有可以实验的机器就好了
用一台机器也可以测试DCT的,即client、job manager和worker都在同一台机中,只是效率不太好……
我测试过一台两核机上同时运行client,一个job manager和两个workers,效率还不如用一个worker。

shunfly 发表于 2006-12-13 23:35:26

不是双核的也可以不?
这样CPU可以调度不?
双核的也就相当于2台机器
我改天试试再说
原帖由 frensel 于 2006-12-13 13:08 发表

用一台机器也可以测试DCT的,即client、job manager和worker都在同一台机中,只是效率不太好……
我测试过一台两核机上同时运行client,一个job manager和两个workers,效率还不如用一个worker。

tnt1981 发表于 2006-12-16 09:20:50

里面的内容还是不错 能够好好参考matlab功能强大哦 ^_^

frensel 发表于 2006-12-16 13:09:26

原帖由 shunfly 于 2006-12-13 23:35 发表
不是双核的也可以不?
这样CPU可以调度不?
双核的也就相当于2台机器
我改天试试再说

行的,单核的就启动一个worker。但最好不要把client、job manager和worker都放在同一台单核机中,这样效率会大大降低。同样地,在两核机中,不要运行两个workers后,又运行client和job manager。

tnt1981 发表于 2006-12-26 20:21:52

请问你每台机子都启动mdce服务以后。是不是只要一台机子启动jobmanager,还是所有的都要启动。我的101启动jobmanager,102没有启动就出现没有job管理进程的错误。应该怎么做?

river6 发表于 2007-1-6 02:00:25

原帖由 tnt1981 于 2006-12-26 20:21 发表
接着去控制台->管理工具->服务,查看Matlab Distributed Computing Engine的属性。进入登录页,选择“此帐户”,输入NT AUTHORITY\NetworkService,删除下面的密码,让该服务以NetworkService的形式登入,以便该服务存取共享的映射网络驱动器中的原程序文件。接着便可以启动该服务了。

请问为什么我一旦修改了登入形式后就不能启动engine服务了?换了几天机子都是这样. 只能在本地形式才能启动服务.

tingnt 发表于 2007-1-8 15:27:50

上学期倒是学过并行计算的课程,但是没有具体用来做过东西,先收了。

waves 发表于 2007-1-9 05:02:08

谁能给我这个toolbox?我matlab7安装盘里没有......

stealthact 发表于 2007-2-8 10:43:24

原帖由 river6 于 2007-1-6 02:00 发表


请问为什么我一旦修改了登入形式后就不能启动engine服务了?换了几天机子都是这样. 只能在本地形式才能启动服务.


我这里 也是这个问题,很奇怪,!

frensel 发表于 2007-2-9 00:21:05

原帖由 river6 于 2007-1-6 02:00 发表


请问为什么我一旦修改了登入形式后就不能启动engine服务了?换了几天机子都是这样. 只能在本地形式才能启动服务.
我也不清楚,Windows这些服务我是一窍不通的,我这样设定的原理我自己都不是很清楚,但目的是为了让其他几个机能够读到client机中共享出来的程序文件。如果不这样设,其他机好像就读不了共享的映射网络驱动器。但你也可以试试使用set(job, 'FileDependencies', {'hp.m'})这种语句(看runDCT.m),把程序文件直接传给其他机。
页: [1] 2
查看完整版本: Matlab的Distributed Computing Toolbox初探