Gaussian03的Linda并行設置與VMware的虛擬集群
Gaussian03的Linda并行設置與VMware的虛擬集群
文/Sobereva @北京科音
First release: 2009-Sep-13 Last update: 2014-Sep-8
文/Sobereva @北京科音
First release: 2009-Sep-13 Last update: 2014-Sep-8
網上也有一些關于高斯linda并行設置的文章,也有討論使用虛擬機模擬的集群跑高斯+linda的,但是說明都不甚具體,各種linux發行版本差異也不小,拿到手的高斯程序也有所不同,其設置方法往往不能直接套用。最近也有人問配置Linda的問題,故撰此文詳細說明一下,只要使用與本文相同的軟件環境,嚴格按照本文步驟,一定可以順利地設置成功。另外對于vmware虛擬機虛擬集群跑g03+linda的效率也進行一些討論。
本文使用的是Gaussian03 C.02,壓縮包自帶用Linda程序7.1版,無需另行下載任何程序。在linda-exe子目錄包含了已編譯好的.exel后綴的專用于linda并行的高斯子程序。壓縮包可以在這里下載http://pan.baidu.com/s/1qWyKTmG。
由于條件窘迫沒有實際的節點配置相仿佛的集群環境,只有四核單機,故用vmware 6.0.1做兩個相同的雙核虛擬機來組集群介紹Linda設置。兩虛擬機內存皆500MB,主機操作系統WinXP SP2,虛擬機操作系統使用我認為最經典、最好用的Fedora7-64bit,都使用root賬戶(密碼可以不一致),使用bash。主機CPU為Q6600(oc 3.0)。如果已有多個實際主機,則只看本文第二部分就行了。
關于Gaussian的并行模式這里說一下。Gaussian的并行是通過openmp來實現的,但是openmp只適合共享內存架構。Gaussian的跨節點運算并不是通過科學計算軟件常用的MPI實現,而是通過ACSI的Linda軟件。Linda提供了一個虛擬的共享內存(VSM)環境,它將集群中的主機結合起來,獲得一個全局的邏輯的共享內存,原始程序依靠這個環境實現跨節點并行運算只需要添加簡單的指令來控制數據的交換即可。這樣使用openmp并行方式的Gaussian就可以很容易地在集群環境中并行運行了。
1 配置虛擬機集群環境
安裝vmware,會自動給系統里增加一堆服務,都允許啟動,并且會看到網絡連接里多出VMnet1和VMnet8。之后啟動vmware新建個虛擬機,configuration用custom,操作系統選Linux,version用Other Linux 2.6.x kernel 64bit,虛擬機名稱設f71,Network connection設Use host-only networking,其它設置都隨意,視情況而定。新建好虛擬機后找一個Fedora7-64bit安裝盤或鏡像文件。虛擬機名稱點右鍵選setting,CD-ROM里面加載fedora7鏡像文件,或者直接使用物理光驅讀主機光驅里的fedora7光盤。之后照常安裝系統,選擇要安裝的應用程序時將Software Development大類也選上,安裝中提示的防火墻和selinux配置都關掉避免影響網絡連接。裝好后在虛擬機列表對應名稱上點右鍵選Install VMware tools,之后Vmware tools的光盤應當被加載進了虛擬機的光驅里(/media/VMware Tools),進去將VMwareTools-6.0.1-55017.tar.gz解壓到某處,進入其目錄運行vmware-install.pl,只需要一直按回車就行了,最后設合適的分辨率。這樣虛擬機就支持文件直接從主機拖放進去,可以在主機和虛擬機之間直接復制文本,也可以共享主機目錄,方便使用。對系統根據自己使用習慣進行一些設置后關閉f71虛擬機。
用vmware克隆功能將f71克隆(full clone方式)出一個名為f72的主機。建議此時將f71和f72都分別用take snapshot功能制作一個鏡像,方便以后恢復到當前狀態。
察看vmware程序的Edit-Virtual Network Editor,Summary里面列表中會有個Host-only項,在我這里是VMnet1,相應的subnet顯示的是192.168.153.0。這種情況下虛擬機IP地址應當設為192.168.153.x,但不能與實際主機的網絡連接里VMnet1的IP地址一致(默認是通過DHCP分配的,我這里被分配為192.168.153.1)。
現在以斷網的方式啟動f72,即啟動f72后馬上雙擊vmware右下角網卡圖標后把connect對鉤去掉,并且選擇host-only。將f72的網絡配置界面(圖形界面的System-Administration-Network)中的所有網卡刪掉,添加個新的網卡以避免MAC地址與f71的沖突,IP地址添192.168.153.4,子網掩碼255.255.255.0,DNS標簽頁的Hostname填f72,其它留空。保存后重啟,在剛剛出現vmware的logo時雙擊網卡圖標把connect再鉤上。
f72啟動后啟動f71,網絡配置界面里IP地址添192.168.153.3,子網掩碼255.255.255.0,DNS標簽頁的Hostname填f71,其它留空,重啟f71。
此時,實際主機、f71虛擬機、f72虛擬機這三臺計算機就組成了一個虛擬的內部的局域網,互相應該都能ping通了。這就是vmware的Host-only模式。
2 設置G03+Linda并行運行環境
現在我們就可以看作有了兩臺實際的計算機,主機名分別為f71和f72,IP分別為192.168.153.3和192.168.153.4。(如果有兩臺真實主機,網絡配置界面也應按上述虛擬機的進行設置,并關掉防火墻和selinux)f71和f72都作如下設置:
修改/etc/hosts,添加IP地址與主機名的對應關系,刪掉默認設的內容,都改為
192.168.153.3 f71
192.168.153.4 f72
之后重啟。
把高斯壓縮包解壓到/sob/g03,并建立/sob/g03/scratch目錄作為臨時文件目錄。跨節點計算必須每個節點上都有相同程序在相同位置,如果不想每個節點都存一份程序,可以用NFS方式共享,設置方法見附錄。
添加以下內容至/root/.bashrc
export g03root=/sob
source /sob/g03/bsd/g03.profile
export GAUSS_SCRDIR=/sob/g03/scratch
export GAUSS_LFLAGS='-vv -nodelist "f71 f72"'
(這里-nodelist指定并行運算的節點,-vv代表very verbose輸出,便于監控。我們也可以通過節點列表文件來指定使用哪些節點,比如創建一個/sob/a.txt文件,里面寫兩行,內容分別為f71和f72,然后export GAUSS_LFLAGS='-vv -nodefile /sob/a.txt',效果是等價的。)
之后在/sob/g03、/sob/g03/bsd、/sob/g03/linda-exe、/sob/g03/linda7.1/intel-linux2.4-rh8/bin文件夾下使用chmod 700 *來設定權限。
改/sob/g03/ntsnet里面的/haydn/s0/scratch/frisch/g03/linda7.1/intel-linux2.4-rh8/為自己的路徑/sob/g03/linda7.1/intel-linux2.4-rh8/
(此文件里的TSNET_PATH環境變量路徑我們不用理會,因為Gaussian03的Linda并行運行過程中不會用到它)
改/sob/g03/linda7.1/intel-linux2.4-rh8/bin/LindaLauncher里面的/haydn/s0/scratch/frisch/g03/linda7.1/intel-linux2.4-rh8/為自己的路徑/sob/g03/linda7.1/intel-linux2.4-rh8/
Linda支持rsh(默認)和ssh方式連接不同節點,rsh和ssh實際速度經測試沒有太大差異,而fedora7要想打開rsh步驟比較繁瑣,所以這里用ssh。跨節點運行默認設置文件即global config file是/sob/g03/linda7.1/common/lib/tsnet.config。如果需要自定義參數,可以直接修改此文件,也可以創建并修改當前用戶主目錄下的.tsnet.config(這里即/root/.tsnet.config),里面的設置將會把默認配置文件的相應條目覆蓋。我們這里直接修改默認參數文件/sob/g03/linda7.1/common/lib/tsnet.config,將里面的Tsnet.Node.lindarsharg后面的rsh改為ssh,其它不用改。(其它參數的意義可以下載http://www.lindaspaces.com/downloads/lindamanual.pdf查看第三章)
接下來要使得f71與f72之間可以不需要密碼直接通過ssh運行指令。
在f71中:
運行ssh-keygen -t rsa 全都按回車用默認,生成了RSA密鑰
cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
在f72中:
運行ssh-keygen -t rsa 全都按回車用默認
把f71中的/root/.ssh/下全部文件復制到f72中/root/.ssh/進行覆蓋
運行chmod 700 /root/.ssh/* 把.ssh內的文件設為root專用
運行ssh f71 回答yes
在f71中:運行ssh f72,回答yes
為了測試ssh是否設好,在f71輸入ssh f72 date,以及在f72輸入ssh f71 date,如果都不需要密碼并且顯示了日期,就說明無密碼ssh設置成功了。這樣Linda就可調用ssh在遠程節點上直接執行指令了。
(如果有特殊原因必須用rsh,則不需要改tsnet.config文件,也不必進行上面ssh的設置。但需要節點間可以通過rsh和rlogin以無密碼方式連接。在Fedora7下面設置rsh的方法見附錄)
此時準備工作已全部完成。Linda并行的Gaussian03輸入文件中,%NprocLinda=n,%Nprocshared=m代表用n個節點,每個節點用m個核心運行,即總共n*m個核心運行。運行時單機的g03命令就換成g03l,如g03l < ltwd.gjf |tee a.out。現在在f71或f72上啟動一個linda并行的計算任務,如果運行到支持linda并行的子程序時,其它節點上看到了高斯的并行子程序已啟動并且有較高CPU占用率,說明已配置成功!如果想利用更多實際節點或虛擬更多節點,都使用類似上述配置f72的方法配置,GAUSS_LFLAGS環境變量中-nodelist后添加更多節點名就行了。
G03中絕大部分支持單機SMP方式并行的功能也支持Linda方式并行,但值得注意的是FMM(Fast Multipole method),這是一種加快電子積分的計算的方法,但加快并不多。FMM在體系原子數高于某個值后就自動開啟,例如對沒有對稱性的體系原子數等于或大于60就開啟。FMM支持SMP方式并行但是不支持Linda并行,開啟了FMM后的任務即使使用Linda方式并行,在其它節點機上雖然也有L502子程序啟動,但是不會有CPU占用率,運算更不會因此加速。可以用NoFMM關鍵字關閉它,使得Linda方式的并行運算在這部分計算中能切實發揮加速作用。在高斯09 B01版本及以后Linda方式并行也支持FMM了,就不再需要用NoFMM關閉它。
3 VMware虛擬機下的并行效率
這里列出了vmware虛擬機用Linda和SMP方式并行及真實主機SMP方式并行在相同Fedora7操作系統下的運算效率,都是用C.02。用HF/Aug-cc-PV5Z算CH4單點,%mem=300MB,目的在于使計算集中在支持linda并行的L502。f71+f72 %NprocLinda=2,%Nprocshared=2
181.486s
f71+f72 %NprocLinda=2,%Nprocshared=1
434.970s
f71 %Nproc=2
316.976s
實際主機 %Nproc=2 //用時過長,估計和其它因素有關
401.394s
實際主機 %Nproc=4
169.368s
可以看到,用兩臺雙核虛擬機Linda并行并不比在實際操作系統中用4核SMP方式并行慢多少(181s vs 169s),比單虛擬機雙核運行快了近一倍(181s vs 316s),并行效率較高。而雙核SMP并行甚至比實際操作系統中還快(316s vs 401s),雖然這很怪,但至少可以說虛擬機里面運行絕不比實際運行慢多少,以我的經驗,如果不跨節點,各種計算化學程序差不多都只慢10%。而跨節點的兩顆核心運行顯然比單節點雙核慢得多(434s vs 316s)。但畢竟是虛擬機集群,其結果與物理以太網組的集群還是欠缺一些可比性的,而且單一測試任務結論并不具有普遍性。
所以我鼓勵充分利用虛擬機,在效能上不會有多少損失,vmware支持四核的虛擬機也是早晚的事(目前只能用雙核雙虛擬機模擬),屆時就更方便了。盡管vmware虛擬機內存不是動態分配,會占不少內存,但對于當前內存行情來說這已不是什么問題。用vmware虛擬機的好處是可以隨時中斷計算;可以隨時將虛擬機拷到別的機子上繼續運行,那臺機子只要裝了vmware就可以而不需要裝計算化學軟件;可以隨時很方便地恢復到原來機子的狀態,可以大膽地進行各種操作不再擔心系統崩潰;可以在windows平臺下做linux下計算而不影響windows下程序運行,只需要將虛擬機CPU優先級調低即可,充分利用CPU資源;甚至可以在多臺WinXP平臺的機子上,每臺機子弄個linux虛擬機,利用虛擬機的Bridged網絡模式(每個虛擬機都等價于一個物理主機連到真實的交換機上),將這些windows機子組成linux集群。等等......我以后會專門做更詳細的討論。
附錄1:用NFS共享高斯程序的設置方法
例如要把f71的/sob/g03目錄掛到f72的相同位置,首先確認NFS服務和rpcbind服務(以前叫portmap)已經開啟,可以在圖形界面的System-Administration-Server settings-Services里面察看二者的狀態是否為running,以及前面是否有對鉤,即是否每次以當前level啟動系統時都能自動開啟。若為stopped或沒有對鉤就手動令其啟動并加上對鉤。然后在f71的/etc/exports里面加入:
/sob/g03 192.168.153.4(rw,no_root_squash)
之后重新啟動NFS服務,這樣就允許f72以可讀寫方式共享f71的/sob/g03目錄,在f72上執行showmount -e f71察看f71的可共享目錄時應該能顯示出這個目錄。在f72上建立/sob/g03文件夾,之后運行掛載命令mount f71:/sob/g03 /sob/g03即可,兩臺機子/sob/g03目錄已經實時同步,此時f72機子上應該已能照常跑高斯程序。如果想每次開機自動掛載,可以把掛載命令加在f72的/etc/profile里。直接在每個節點上儲存一份高斯程序與NFS方式共享高斯程序一般不會對計算速度有明顯影響。
附錄2:Fedora7開啟無需密碼的rsh、rcp、rlogin設置方法
假設/etc/hosts已經按正文進行了設置。
下載xinetd-2.3.14-12.fc7.x86_64.rpm和rsh-server-0.17-44.fc8.x86_64.rpm
在f71和f72上都進行下列操作:
裝xinetd-2.3.14-12.fc7.x86_64.rpm(圖形界面直接雙擊即可)
裝rsh-server-0.17-44.fc8.x86_64.rpm(圖形界面直接雙擊即可)
運行setup命令,在其中的系統服務里打開rsh和rlogin和rexec
在/etc/securetty后面加三行,內容分別是rsh、rlogin、rexec
/root下面創建.rhosts,加上一行192.168.153.4 root和一行192.168.153.3 root
運行service xinetd restart
此時運行netstat -an |grep 514應該顯示listen了
此時rsh、rcp、rlogin都應該能用了。f71上運行rsh f72 ls或rlogin f72或使用rcp向另外節點復制文件應該都不需要密碼了,這樣就設置完畢了。(若rcp復制被拒,到/etc/pam.d/目錄下,可以試試把rsh文件中的auth required /lib/security/pam_securetty.so一行用“#”封掉)。
針對Gaussian09的補充說明:
按照手冊的說法,G09中不建議依靠GAUSS_LFLAGS來指定linda計算時的節點列表,也不建議用%NProcLinda來指定linda計算時的節點數。而應該直接用這種方式寫明哪些名稱的節點被用于linda計算:%LindaWorkers=f71,f72,f73...比如一共寫進去了7個,那么這7個節點都會被用于linda計算。并且GAUSS_LFLAGS不用來定義節點列表了,但依然可以用來控制輸出的冗余度,如export GAUSS_LFLAGS='-vv'