分布式Matlab计算集群建立方法与Demo
文章來源:http://hi.baidu.com/modelren/item/6a9d09ff178db405d99e7220
? ? 我的實(shí)驗(yàn)室有五臺雙核Pentium D 925計(jì)算機(jī),這正適合用來做分布式或并行式計(jì)算。我打算只調(diào)用那些計(jì)算機(jī)中的一個核參與計(jì)算,留下一個核可以讓其他人正常地使用該計(jì)算機(jī)。我們在這里將會介紹Matlab中Distributed Computing Toolbox的基本使用方法,目標(biāo)是實(shí)現(xiàn)簡單的分布式計(jì)算。
? ? Distributed Computing Toolbox就是分布式計(jì)算工具箱,簡稱DCT,其可以在多臺計(jì)算機(jī)組成的Cluster中實(shí)現(xiàn)分布式或并行式計(jì)算。簡單來說,我們是把一個很繁重的工作,分解成許多小任務(wù),然后分給不同的計(jì)算機(jī)去處理,最后把計(jì)算結(jié)果匯總,以達(dá)到提高計(jì)算效率的目的。? ? Matlab的做法是這樣的:在每臺參與計(jì)算的計(jì)算機(jī)中啟動一個叫Matlab Distributed Computing Engine的服務(wù),該服務(wù)能啟動參與計(jì)算的worker的Matlab session和管理各臺計(jì)算機(jī)workers的job manager。 Job manager對workers進(jìn)行管理 , 給workers分配計(jì)算任務(wù) , 接收workers計(jì)算后的結(jié)果 。而你 本人就是client ,你要把你的工作分解為多個任務(wù),然后把任務(wù)給job manager。job manager就會根據(jù)workers的多少和空閑情況,適當(dāng)?shù)匕讶蝿?wù)分配給workers去做。workers完成任務(wù)后,會把結(jié)果返回給job manager。當(dāng)所有workers都完成任務(wù)后,你,即是 client,便可以從job manager里取回結(jié)果 。
具體的概念可以參考Matlab的幫助,我們也不能說得很準(zhǔn)確。我們在這里只想給出使用Matlab實(shí)現(xiàn)分布式計(jì)算的簡單步驟,以便初學(xué)者快速入門。
1、局域網(wǎng)IP地址分配與配置
? ? 首先第一步要做的,就是令每臺要參與計(jì)算的計(jì)算機(jī)組成局域網(wǎng)。比如我有三臺計(jì)算機(jī),其IP地址分別為192.168.1.101-192.168.1.103,以下簡稱計(jì)算機(jī)名為101,102和103。
2、分布式計(jì)算引擎服務(wù)的啟動
? ? 在三臺計(jì)算機(jī)中安裝Matlab Distributed Computing Engine(mdce)服務(wù)。
? ? 安裝方法為:如Matlab的安裝地址為C:\Program Files\MATLAB\R2006b,則Start->Run->cmd到命令行窗口,進(jìn)入C:\Program Files\MATLAB\R2006b\toolbox\distcomp\bin目錄,運(yùn)行mdce install(在Matlab2012下沒找到此命令)命令安裝mdce服務(wù)。接著去控制臺->管理工具->服務(wù),查看Matlab Distributed Computing Engine的屬性。
? ? 進(jìn)入登錄頁,選擇“此帳戶”,輸入NT AUTHORITY\NetworkService,刪除下面的密碼,讓該服務(wù)以NetworkService的形式登入,以便該服務(wù)存取共享的映射網(wǎng)絡(luò)驅(qū)動器中的原程序文件。接著便可以啟動該服務(wù)了。注意以后重新開機(jī),該服務(wù)都會啟動,當(dāng)然你可以設(shè)置讓它手動啟動。
3、啟動job manager。
任一臺計(jì)算機(jī)都可以啟動job manager,只要mdce服務(wù)啟動了即可。比如使用計(jì)算機(jī)101,在C:\Program Files\MATLAB\R2006b\toolbox\distcomp\bin目錄下,運(yùn)行以下命令:復(fù)制內(nèi)容到剪貼板代碼:startjobmanager -name frenseljobm該命令啟動jobmanager,其名字叫frenseljobm,啟動地點(diǎn)為計(jì)算機(jī)101。
4、啟動workers。任一臺計(jì)算機(jī)都可以啟動workers,只要mdce服務(wù)啟動了即可。比如使用計(jì)算機(jī)101,在C:\Program Files\MATLAB\R2006b\toolbox\distcomp\bin目錄下,運(yùn)行以下命令:復(fù)制內(nèi)容到剪貼板代碼:startworker -jobmanagerhost 192.168.1.101 -jobmanager frenseljobm -name worker1此命令指明在計(jì)算機(jī)192.168.1.101中,啟動名為worker1的worker,而該worker受名為frenseljobm的jobmanager管理。就是說來自鄉(xiāng)下101的可憐工人worker1,成為萬惡的監(jiān)工frenseljobm的“馬仔”了。接著,監(jiān)工frenseljobm要在不同村102和103中雇用更多的工人worker2、worker3。運(yùn)行如下的命令:復(fù)制內(nèi)容到剪貼板代碼:startworker -jobmanagerhost 192.168.1.101 -jobmanager frenseljobm -name worker2 -remotehost 192.168.1.102即可在102計(jì)算機(jī)中啟動一個新的,名為worker2的worker,如此類推啟動103計(jì)算機(jī)的worker3。使用nodestatus命令可以查看節(jié)點(diǎn)的狀態(tài),加上-remotehost可以查看其他節(jié)點(diǎn)的狀態(tài)。
5、共享設(shè)置
? ? 如令計(jì)算機(jī)101為client,即我們的程序在這里編寫的。設(shè)程序文件位于D:\Matlab_code\testDCT中。共享出文件夾Matlab_code,在文件夾中按工具->映射網(wǎng)絡(luò)驅(qū)動器->令盤符為Z:->文件夾里填\\192.168.1.101\Matlab_code。于是Z:\testDCT便成為放置你程序的地方了。以同樣的方法,讓計(jì)算機(jī)102和103都建立映射網(wǎng)絡(luò)驅(qū)動器,令盤符為Z:,文件夾里填\\192.168.1.101\Matlab_code。這時三臺機(jī)都可以通過Z:\testDCT訪問原程序文件。
6、測試
這里給出測試的代碼。首先寫一個函數(shù),模擬我們實(shí)際的工作。復(fù)制內(nèi)容到剪貼板代碼:% hp.m
function f = hp(m, n)
H1 = zeros(n);
H2 = zeros(n);
for i = 1 : m
H = H1 + H2;
end
f = H;
end
H1 = zeros(n);
H2 = zeros(n);
for i = 1 : m
H = H1 + H2;
end
f = H;
end 將此程序hp.m放在D:\Matlab_code\testDCT中。此函數(shù)計(jì)算n維隨機(jī)矩陣的加法m次。接著建立另一個m文件,做具體的分布式計(jì)算。復(fù)制內(nèi)容到剪貼板代碼: % runDCT.m
tic
% 尋找資源,比如jobmanager在什么地方,叫什么名字。
jm = findResource('scheduler', 'type', 'jobmanager', 'name',...
'frenseljobm', 'LookupURL', '192.168.1.101');
% 使用剛才找到的資源建立一個工作
job = createJob(jm);
% 設(shè)置該工作的文件關(guān)聯(lián),讓所有workers都可以找到原程序文件。
set(job, 'PathDependencies', {'Z:\testDCT'})
% 另一種方法,把用到的原程序文件傳給所有workers。
% set(job, 'FileDependencies', {'hp.m'})
N = 100;
M = 1000000;
% 建立三個任務(wù),每任務(wù)都是算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都把任務(wù)做完。
waitForState(job, 'finished')
% 取出計(jì)算結(jié)果。
results = getAllOutputArguments(job);
toc 同樣地,該程序runDCT.m也是放在D:\Matlab_code\testDCT中。該程序計(jì)算了三次100維矩陣的加法1000000次,即算了100維矩陣的加法3000000次。如果在單機(jī)上運(yùn)行:復(fù)制內(nèi)容到剪貼板代碼: >> tic, a = hp(3000000, 100); toc
Elapsed time is 63.096369 seconds. 而使用三臺機(jī)作分布式計(jì)算時:復(fù)制內(nèi)容到剪貼板代碼: >> runDCT
Elapsed time is 24.323556 seconds.
效率有明顯的提升。但注意到,當(dāng)?shù)谝淮芜M(jìn)行分布式計(jì)算時,其他幾臺機(jī)要從Z:\testDCT中讀取原程序文件,會使得計(jì)算速度降低。
總結(jié)來說,Matlab的Distributed Computing Toolbox為我們提供了一種簡便的分布式或并行式計(jì)算的實(shí)現(xiàn)方法。以上所寫的是為了對DCT具體做法的整個過程做一次簡單的介紹,我也是初學(xué)使用這個工具箱,文章可能很粗糙和存在許多謬誤,敬請指正。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結(jié)
以上是生活随笔為你收集整理的分布式Matlab计算集群建立方法与Demo的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab集群搭建问题
- 下一篇: 局域网共享问题全方位解决