前 言
本教程的目的是為讀者提供計算機集群組建及其在計算化學中的應用的入
門知識。我們將先講一些基本概念,然后以最快的速度進入實踐階段,使大家能
夠在最短的時間內(nèi)迅速建立起一個可以從事高性能計算的集群。
本教程的主要內(nèi)容是以普通的高端 PC,服務器,千兆網(wǎng)等多數(shù)實驗室所能
負擔的起的硬件為基礎(chǔ),介紹如何構(gòu)建一個具有完整文件共享,并行計算和作業(yè)
排隊與調(diào)度功能的高性能計算機集群。這個教程,可以為從來沒有組裝過集群的
讀者提供一些入門的知識,從而可以在組內(nèi)構(gòu)建自己的集群而免去在別的地方
“交錢”“排隊”的苦惱。
有人會問:自己組建的集群和付費購買機時的集群會不會性能有很大差異?
這個嚴格來說取決于讀者研究的體系。從單機計算的能力來看,高端 PC 已經(jīng)和
最好的單機相差不大,而并行方面,由于專業(yè)機構(gòu)有高水平的優(yōu)化工程師和性能
卓越的網(wǎng)絡硬件(當然這一切是以高成本為代價的),普通的研究組一般難以到
達它們的水平。但是,對于計算化學科研領(lǐng)域,大多數(shù)組需要計算的體系,即使
是很大蛋白質(zhì)的長時間動力學(如 100000 原子的 10ns 動力學這種任務),借助
本教程里面的技術(shù),即 MPI 并行+GPU 加速+自行編譯,有兩臺 8 核 CPU 高端
PC,就基本可以在 10 天以內(nèi)完成。因此,作者認為沒有必要再去追逐更昂貴的
硬件。畢竟,科研的靈魂是 idea,而不是比誰的體系大,誰的速度快。當然,對
于特別的領(lǐng)域,如神經(jīng)系統(tǒng)蛋白質(zhì)的模擬,需要 512CPU 并行的,本教程里的技
術(shù)就略顯不足了,不過依然可以作為一個入門來介紹。
本教程選取的軟件技術(shù)如 Debian,Torque,NFS 等都是比較簡單而實用的
軟件,都經(jīng)過作者測試。這些東西足以滿足大多數(shù)要求,而且網(wǎng)上的文章也很多,
遇到錯誤便于隨時查閱。專業(yè)大型集群的技術(shù)則更加高級,如我們使用 NFS 來
共享同步文件,而大型集群則會建立專門的“升級服務器”等來實現(xiàn)。這些技術(shù)讀者如有興趣可以參考這方面的資料。
在本教程的第三章還介紹了一些軟件安裝,編譯和編程環(huán)境的設(shè)置的知識。一些計算化學的初學者常常面對軟件的編譯無從下手(如某人曾經(jīng)半年也沒編譯
出 SAPT2008 來)。本來作者想將編譯過的全部軟件介紹一下,但是這樣會使本教程變?yōu)橐粋無聊的軟件集錦。所以這一章以 Gaussian,NAMD,Autodock 和
MKL 為例,分別介紹了四個類型的計算化學軟件的配置技術(shù)。通過這四個軟件
的配置的練習,再面對新的軟件,讀者就應該有足夠的經(jīng)驗來應對了。如果還有
困難,可以參考網(wǎng)上的文章,如作者的博客:http://hi.baidu.com/coolrainbow/home。
本書并沒有專門介紹 Linux,NIS,NFS 系統(tǒng)或者 Torque,Maui 軟件的知識,讀者可以參考相應的教材或者網(wǎng)上的資料,最重要的則是軟件本身的文檔,這個非常重要!
這個文檔最早寫成于 2009 年 5 月,曾在小范圍內(nèi)傳播過。后來在 2010 年左右因集群升級,添加了一些新技術(shù)。在 2011 年 5 月時再次重新整理并定稿。希望這個教程能夠為讀者提供一些幫助!如果讀者在教程中發(fā)現(xiàn)了錯誤并對作者進行指正,作者將不勝榮幸!
2011 年 5 月 29 日
第一章 緒論
§1.1 計算機集群的基本概念
正如題目所示,本教程的目的是為讀者提供計算機集群組建及其在計算化學
中的應用的入門知識?赡軐Υ蠖鄶(shù)讀者而言,“集群”什么的是一個全新的概
念——沒關(guān)系,萬丈高樓平地起,我們先講一些基本概念,然后將以最快的速度
進入實踐階段,使大家能夠在最短的時間內(nèi)迅速建立起一個可以從事高性能計算
的集群,為大家的科研提供幫助。
本教程主要面向從事計算化學的讀者(當然也包括其它有計算機集群需要的
讀者),相信大家知道,計算化學研究中常常需要巨大的計算量,無論對CPU速
度、存儲容量和總線帶寬都要很高的要求。例如,conventional SCF計算中,一個有 1000 個基函數(shù)的體系,所需要計算的雙電子積分量約為 1012個,按雙精度
存儲需要 1.8TB,對于計算速度和存取速度都是極大的負擔;在對神經(jīng)系統(tǒng)的分
子動力學模擬中,鉀通道動態(tài)工作的時間尺度為毫秒級,而即使利用 500 核的
Alpha機器,也只能達到每天 4 納秒的速度。這樣的速度是人們無法接受的。
解決這些計算問題的方法,從理論上應當發(fā)展新的更高效的算法,諸如量子
化學中的線性標度方法等等;從硬件角度說,需要發(fā)展更新的硬件,但由于物理
定律的限制,單個計算機的硬件能力已經(jīng)接近極限,例如 CPU 主頻的提高是以
發(fā)熱量的增加為代價的,而現(xiàn)代 CPU 的主頻已達到 4.00GHz 左右(實驗室產(chǎn)品),
更高的主頻由于發(fā)熱量巨大而難以實現(xiàn)。從計算機的角度上來說,可以通過使用
超級計算機來解決。但是,這類超級計算機,硬件研發(fā)費用昂貴,軟件投資更加
高居不下,開發(fā)出來的軟件無法移植,并且學習代價非常高,非一般研究組所能
負擔的起。
那么對于一般的研究組,如何才能突破計算瓶頸呢?答案就是本教程的核心
概念:計算機集群(computer cluster)!
相信很多實驗室內(nèi)部都有局域網(wǎng),即一大堆計算機通過路由器等連成一個整
體,大家可以通過路由器上外網(wǎng),而內(nèi)網(wǎng)中,大家可以通過網(wǎng)絡共享文件,如
Windows 下的“共享”。好了,既然局域網(wǎng)可以共享文件,為什么不可以共享計
第 1 頁
算能力呢?好了,我們學院派的定義一下計算機集群:通過一組松散集成的計算
機軟件和硬件連接起來高度緊密地協(xié)作完成計算工作的計算機系統(tǒng),可以被看作
是一臺計算機,這種系統(tǒng)就稱為計算機集群。也就是說,只要大家有幾臺計算機
(PC 或服務器),一個路由器,幾根網(wǎng)線,我們就可以把它們連接起來,通過
一些軟件,使它們的計算能力得以共享,實現(xiàn)并行計算(parallel computing),
不僅可以實現(xiàn)高速的計算,而且可以使計算工作規(guī)范化,從而大大的提升科研效
率!
如圖 1-1-1 所示,這是作者所在實驗室的組建的一個集群的實景(攝于 2009
年)。這個集群現(xiàn)在已擴充升級。
圖 1-1-1 集群系統(tǒng)實景圖(攝于 2009 年)
下面我們講幾個計算機集群中常用的術(shù)語和概念。這些概念可以為讀者組建
集群打下堅實的基礎(chǔ)。
節(jié)點(node)。集群中單獨的每一臺計算機稱為節(jié)點。這些計算機,既可以
是普通 PC 也可以是服務器。按照現(xiàn)在的發(fā)展(2011 年前后),高端 PC 和服務
器的計算能力已經(jīng)相差無幾,而 PC 的成本較低,不失為是個很好的選擇。服務
器的優(yōu)點在于可靠性高,即平均無故障時間長。比如,一個 500 臺計算機構(gòu)成的
集群連續(xù)運轉(zhuǎn)一年,若全部為服務器,一個月平均可能只有幾臺機器出故障,若
第 2 頁
全部為 PC,則可能平均每一天都會有機器崩潰。當然,對于普通研究組而言,
情況沒有那么夸張。讀者根據(jù)自己的需要決定是選擇 PC 還是服務器。
控制節(jié)點。集群中需要多臺計算機相互協(xié)作的完成任務,因此必須有一臺計
算機作為“核心”領(lǐng)導者,控制其它的計算機,為其它的計算機分配計算任務,
調(diào)整負載等等。這個節(jié)點習慣稱為控制節(jié)點。一般而言,控制節(jié)點可以選一臺
CPU、內(nèi)存一般(512MB 內(nèi)存足矣。┑臋C器以節(jié)約成本,但是必須有大容量
的硬盤來存儲用戶的文件,即使是很小的組也一般最好是 1TB 以上(貌似更小
容量的硬盤已經(jīng)沒有賣的了),根據(jù)本組的人員數(shù)量和科研任務決定,作者知道
某個分子動力學研究組每個月都會有幾個 TB 的軌跡文件產(chǎn)生。
計算節(jié)點。計算節(jié)點就是集群中直接進行計算任務的計算機,這是決定計算
機集群性能的最關(guān)鍵因素之一。自然,CPU 主頻越高,內(nèi)存越大,總線帶寬越
高,對計算就越有利。當然,具體的任務對這些硬件的要求不同。對于分子動力
學模擬計算,內(nèi)存的要求很低,一般 1~4GB 的內(nèi)存就可以,但是要求 CPU 具
有強大的計算能力,最好在 8 核(或雙 4 核)、主頻 2.5GHz 以上。對于量子化
學計算,除了要求有強勁的 CPU 外,還要求有高容量和高讀寫速度的內(nèi)存、硬
盤,因為量子化學計算常常需要大容量的緩存文件,如果存儲容量不夠,會對計
算速度帶來很大的影響。通常,內(nèi)存最好在 16GB 以上,如果經(jīng)常計算金屬有機
化合物,內(nèi)存 32GB 也不嫌多;硬盤最好在 1TB 以上,特別是需要大量相關(guān)方
法計算(如 MP2 或 CCSD(T)計算)時,硬盤的讀寫速度也十分重要。有些計算,
諸如分子對接這種計算,對計算機性能要求很低,普通的高端配置即可。
現(xiàn)代計算機有 32 位,64 位等多種架構(gòu)。64 位架構(gòu)的機器當然是最好,但是
大多數(shù)研究組可能無法承擔它的購買成本,F(xiàn)在的計算主流是選用虛擬 64 位的
機器,如 em64t 和 AMD64 等。本教程就是以虛擬 64 位機器為例介紹的,即所
謂 x86_64 或者 amd64 機器。
通信網(wǎng)絡。顧名思義,就是集群中連接各個節(jié)點的網(wǎng)絡。這是決定計算機集
群性能的另一個最關(guān)鍵因素。在進行并行計算時,網(wǎng)絡速度是整個計算速度的瓶
頸。這個網(wǎng)絡,當然可以選擇使用普通實驗室中的局域網(wǎng)連接即“寬帶網(wǎng)加路由
器”結(jié)構(gòu)。集群中,這個網(wǎng)的帶寬最低不能低于百兆,即至少在千兆以上,再低
的網(wǎng)在計算時可能會出顯各種由于網(wǎng)絡延時過長而導致的錯誤。如果讀者能使用
第 3 頁
高性能的集群專用網(wǎng)絡,如 Myrinet 或者 InfinitBand,那當然更好,這可以大大
地提升集群的并行效率!不過,這是要很高的成本的。
維護部件。這是維持集群能夠正常工作的部件,包括散熱系統(tǒng)如空調(diào)和電源、
機柜等。因為集群常常要長時間高功耗的工作,如果不能保持適當?shù)臏囟群头(wěn)定
的電源,計算機內(nèi)部出錯的概率就會大大的提高,輕則死機導致作業(yè)失敗,重則
燒毀硬件造成損失。特別是熱天,集群高速運轉(zhuǎn)時會有很高的溫度,一定要做好
降溫的工作;如果有斷電通知,記得事先將總插頭拔下,以免恢復供電時瞬時電
流的沖擊將機器燒毀。
好了,下面我們來討論一下構(gòu)建集群所需要的軟件基礎(chǔ)。
離開之前,我們必須聲明,本教程介紹的是面向科學計算用戶的“高性能集群(High
Performance Cluster,HPC)”,而不是面向企業(yè)的“高可用集群(High Availability Cluster,
HAC)”。后者常常用于建立企業(yè)網(wǎng)站,服務器,大型數(shù)據(jù)庫(如 Oracle 數(shù)據(jù)庫)。這兩
者,應該來說,完全不同!
§1.2 計算機集群的軟件結(jié)構(gòu)
有了硬件后,要真正實現(xiàn)集群,還必須有優(yōu)秀的軟件進行支持。集群的軟件結(jié)構(gòu)包括以下幾部分:
操作系統(tǒng)。雖然世界 top100 的集群中確實有 Windows 集群,但是我們強烈
推薦讀者使用 Linux 操作系統(tǒng)。Linux 免費,方便,最重要的是效率高,很多計
算化學軟件都是專門為 Linux 編寫的,而且 Linux 非常適合于程序開發(fā)和批量處
理,這都是 Windows 難以實現(xiàn)的,即使能,往往也比較臃腫。
Linux 操作系統(tǒng)也有很多不同的分支。比較常見的就是 RedHat 系列,但是
本教程不使用它。我們選擇 Debian 操作系統(tǒng),與 RedHat 相比它有很多優(yōu)點,最
大的優(yōu)點是體積小,安裝完系統(tǒng)后只有不到 100MB,并且隨時可以擴充新的功
能,沒有冗余的文件,因此非常適合于科學計算。關(guān)于 Debian 可以在網(wǎng)上找到
很多信息。本教程不會直接講解 Linux 或者 Debian 的使用方法,對 Linux 不熟
悉的讀者可以參考:
王旭。Debian 標準教程。北京:人民郵電出版社,2009
關(guān)于哪個版本的 Linux 更適合組裝集群是一個老掉牙的問題,和“C 和 C++哪個好”一
第 4 頁
樣,作者認為這是一個特別主觀的問題。有很多人推薦過別的 Linux,如:
OpenSuse。這個系統(tǒng)很好用,但是作者不喜歡,因為它的系統(tǒng)太臃腫。
RedHat。“正統(tǒng)”的 Linux,而且?guī)в?/FONT> Cluster Tool。但是作者認為那個 Cluster Tool 不
適合做 HPC,僅僅適合 HAC。
Rocks。這個系統(tǒng)非常適合做生物計算的集群,但是因為種種原因,作者后來沒有使用
它,還是因為它太大了!
當然,如果讀者的個人偏好和作者不同,也沒有關(guān)系。大多數(shù)操作在各個 Linux 間是兼
容的。
網(wǎng)絡通信系統(tǒng)。這是集群得以成為“集群”的核心系統(tǒng)。沒有這個系統(tǒng),集
群只是幾臺互不相干的計算機組成的“機群”。這里的網(wǎng)絡通信系統(tǒng),不止是
TCP/IP 協(xié)議等網(wǎng)絡連接功能,還包括文件共享系統(tǒng)、遠程登錄系統(tǒng)、信息管理
系統(tǒng)等,只有這樣才能使集群中的計算機成為一個相互協(xié)作的整體。這些功能可
以直接使用 Debian 操作系統(tǒng)的組件完成。
并行計算系統(tǒng)。這是實現(xiàn)高性能計算的平臺。并行計算系統(tǒng)是實現(xiàn)某種并行
計算協(xié)議的軟件,各種并行計算的程序都要調(diào)用并行計算的函數(shù)和庫才能運行,
例如量子化學軟件 GAMESS,NWChem 和分子動力學軟件 NAMD,Gromacs,
Amber 等。它本質(zhì)上是一種通信協(xié)議。本教程將使用 MPICH2 作為并行計算系
統(tǒng)。
作業(yè)管理系統(tǒng)。這是管理集群的工具。它負責計算作業(yè)的提交、管理、控制,
集群資源的分配、調(diào)度,用戶權(quán)限的分配、區(qū)分等,對于管理、維護特別是使用
集群具有重要的意義。本教程使用免費軟件 TORQUE 和 Maui 實現(xiàn)。
應用軟件。這是集群的實用部分,比如 Gaussian,NAMD 和各種編譯器等
等。
本教程涉及到的軟件,除了 Windows 操作系統(tǒng)和 Gaussian 等以外,所有軟
件均為免費軟件!
在繼續(xù)之前,有一些話需要交代給讀者。Linux 系列的軟件和其它免費學術(shù)
類軟件都是自由開發(fā)的,因此,它們的不同版本之間可能有某些不兼容情形,一
些安裝時候發(fā)生的狀況和本教程所描述的可能有很大的不同。作者曾經(jīng)幫人裝過
NWChem,因為作者本人安裝過 NWChem5.2,沒有遇到過什么問題。可是別人
第 5 頁
安裝的是 6.0 版本,在安裝的時候碰到了無數(shù)編譯錯誤,最后通過作者手動修改
了 NWChem6.0 的源碼才得以解決(有經(jīng)驗的讀者應該意識到這是編譯器版本的問題)。讀者在繼續(xù)之前,應該意識到在組建集群的過程中可能會遇到巨大的困難。這時,可以在網(wǎng)上搜索或咨詢身邊有經(jīng)驗的人。不要灰心,一旦集群組建完成,讀者的計算機水平會有質(zhì)的飛躍!
好了,現(xiàn)在說一下本教程的集群的各種信息:1 個控制節(jié)點,8 個計算節(jié)點,千兆局域網(wǎng),安裝 Debian6 系統(tǒng),安裝有;Gaussian, Gamess, NWChem, NAMD, Gromacs, Autodock,以及 GNU 和 intel 編譯器等等,這個集群可以實現(xiàn)各種計算
化學軟件的運行,并提供完整的編程開發(fā)功能!
說了那么多,讀者讀完本教程并搭建完成了一個計算機集群后,對于使用集
群的人,集群無非是這樣一個東西:
“……他裝了個集群,在隔壁房間里,好像是好多臺計算機,有啥計算節(jié)點控制節(jié)點的,
好像還裝得神馬 Linux,我也不懂。我就知道,我每天在我的實驗室,打開 Win7,用 putty
登陸到集群,輸入命令 qstat,我發(fā)現(xiàn)有兩個 Gaussian 和一個 NAMD 任務在運行。哦,我前
天算的那個 NAMD 的任務已經(jīng)結(jié)束了,算了七天可算完了,把輸出文件下下來看看。我這
有還個 gjf,傳上去,好,算上了。現(xiàn)在關(guān)了 putty,分析分析 NAMD 的軌跡吧……”
好了,概念性的東西到此結(jié)束,下面,我們組建集群的激動人心的過程就開始了!
第 6 頁
第二章 集群的系統(tǒng)配置
§2.1 操作系統(tǒng)的安裝
到 2011 年 5 月時,Debian 的最新版本為 6.0,可以在 Debian 社區(qū)的網(wǎng)站 http://cdimage.debian.org 上獲得其 DVD 鏡像文件。根據(jù)讀者的機器架構(gòu)下載
到相應的鏡像,由于我們的機器是 amd64 架構(gòu),只需要下載第一個:
debian-6.0.1a-amd64-CD-1.iso
當然,完整的鏡像包括 50 多個 iso 文件,但出于我們組建集群的目的只需
要第一個就可以。如果讀者有興趣可以全部下載下來。
將第一個 iso 刻錄為 DVD 光盤,利用光盤進行安裝。注意,安裝操作系統(tǒng)
的過程中,一定要保證外網(wǎng)的連通,因為安裝過程需要在外網(wǎng)下載一些組件。安
裝操作系統(tǒng)的步驟對控制節(jié)點和全部計算節(jié)點基本一致,敘述如下。
注意:讀者在初學時,可以只裝兩臺機器:一臺 compuchem,一臺 node021,等把全部
細節(jié)弄懂之后,再根據(jù)自己的需要擴充新的節(jié)點。事實上,如果讀者的計算節(jié)點的硬件完全
相同的話,完全可以在配置好一臺計算節(jié)點以后,用 Ghost 軟件拷貝到其它所有機器上,然
后將其 IP(修改/etc/network/interface)和主機名(修改/etc/hostname)修改成正確的即可。
當然,逐臺計算機修改 IP 和主機名也可以使用 shell 腳本在控制節(jié)點上輕松的實現(xiàn),因此,
工作量不是問題。下面提到的“在全部計算節(jié)點上……”是為了讓讀者明確的知道,哪些操
作只在控制節(jié)點上做,哪些只在計算節(jié)點上做,哪些在全部節(jié)點上做。
1. 將 Debian 6.0 的光盤插入光驅(qū),在 BIOS 中選擇光盤啟動,啟動計算機。
2. 如啟動成功,屏幕出現(xiàn) Debian 的 logo,選擇 text mode 按 Enter 鍵開始
安裝。
3. 語言選擇 American,后面的選項根據(jù)具體情況選擇,這里選擇默認選項。
4. 進入 Network 設(shè)置界面時,選擇 Cancle 取消 DHCP,選擇手動安裝網(wǎng)絡,在隨后將出現(xiàn)一系列對話框,分別設(shè)置 IP 地址、子網(wǎng)掩碼、默認網(wǎng)關(guān)、DNS 服務器、主機名、域名。其中 IP 地址、主機名設(shè)置如表 2-1-1。其它選項根據(jù)實驗室的實際情況設(shè)定。
第 7 頁
表 2-1-1 集群的主機名 IP 地址設(shè)置
節(jié)點 |
主機名 |
IP 地址 |
|
|
|
控制節(jié)點 |
compuchem |
192.168.1.100 |
|
|
|
計算機點 |
node021 ~ node029 |
192.168.1.121 ~ 192.168.1.129 |
|
|
|
當然,IP 和主機名可以根據(jù)讀者的喜好來定義。
5. 設(shè)置完網(wǎng)絡后,會進入分區(qū)設(shè)置。對于計算節(jié)點,可以直接使用默認設(shè)置,整體劃分為一個區(qū),沒有關(guān)系。對于控制節(jié)點,建議至少劃分兩個區(qū),一個
用于掛載根目錄“/”,一個用于掛載家目錄“/home”,這個目錄作為今后集群用戶的工作目錄,應該劃分的很大,如 500GB 以上。
6. 在用戶設(shè)定的界面,為 root 定制一個密碼,密碼最好包含有大小寫字母、
數(shù)字、符號等,這樣可增加系統(tǒng)的安全性。對于普通用戶,要定義一個合法的用
戶名(以下以 coolrainbow 為例)以及一個安全的密碼(以下假設(shè)為 123456)。
7. 分區(qū)完成后,繼續(xù)安裝,在選擇組件的地方,只選擇“Base System”,安裝最基本的系統(tǒng)。注意,選了這個選項,我們就安裝了一個最小的 Debian 操作系統(tǒng),并且沒有圖形界面。
8. 系統(tǒng)會請求選擇安裝的源(source)。所謂源就是 Linux 在安裝時候下載
更新文件的地址。這個源非常重要,我們要反復用到,建議選擇 Taiwan 或者Japanese,它們的速度比較快。
9. 稍微等待后,安裝即可完成,重啟計算機。
至此,系統(tǒng)安裝完成。這個過程與網(wǎng)速有關(guān),可能需要不到 20 分鐘,也可
能需要 1 個小時。
現(xiàn)在需要對所有的節(jié)點做些準備工作:
1. 添加域名解析地址。打開/etc/hosts 文件,添加如下信息:
compuchem 192.168.1.100
node021 192.168.1.121
node022 192.168.1.122
node023 192.168.1.123
node024 192.168.1.124
node025 192.168.1.125
node026 192.168.1.126
node027 192.168.1.127
node028 192.168.1.128
node029 192.168.1.129
第 8 頁
這樣就建立了相應的解析關(guān)系。如 ping node023 就相當于執(zhí)行 ping 192.
168.1.123。
2. 將所有計算節(jié)點的普通用戶及其家目錄刪除。也就是說,刪除掉 node021
~ node029 節(jié)點上的 coolrainbow 用戶及其家目錄/home/coolrainbow,使用命令:
# userdel –r coolrainbow
注意不要刪除控制節(jié)點的 coolrainbow!
好了,操作系統(tǒng)的安裝結(jié)束,現(xiàn)在開始安裝網(wǎng)絡通信系統(tǒng)!
§2.2 網(wǎng)絡通信系統(tǒng)的建立
至此,所建立的機器還是互不相干的九臺計算機“機群”,而不是相互協(xié)作
的“集群”。現(xiàn)在的任務是將它們連成一體,成為一個有組織的系統(tǒng)。下面把這
個問題詳細的說明一下。這部分是整個集群技術(shù)的核心!
這一節(jié)可能會很羅嗦,對于 Linux 系統(tǒng)原理很熟悉的讀者,可以跳過某些解釋的部分,
直接閱讀具體的配置步驟,相信讀者一看就會明白集群的組建思想,也許能設(shè)計出比作者的
配置更簡單更高效的方法:如果這樣,作者將非常高興。如果讀者對 Linux 原理不熟(比如,
不知道/etc/fstab 是什么東西),可以一邊操作,一邊搜索其中的知識(如,google 一下 fstab),
這樣才能進步。
前面說過,控制節(jié)點用來操作計算節(jié)點。前面說了,compuchem 是控制節(jié)
點,node021 ~ node029 是計算節(jié)點。實際上,對于用戶(而不是像讀者一樣的
集群構(gòu)建者),控制節(jié)點起到了一個黑箱的作用。比如讀者的實驗室有兩個人將
要使用集群,名叫 coolrainbow 和 bingtear。當用戶 coolrainbow 使用控制節(jié)點(比
如在 Windows7 下遠程登錄到控制節(jié)點)時,只要告訴控制節(jié)點:“在 node023
上用 8 個 CPU 拿 Gaussian 算我這個 C60.gjf”,控制節(jié)點就會執(zhí)行這個任務,用
戶完全不需要知道任何關(guān)于這個過程如何實現(xiàn)的細節(jié)。事實上,背后的細節(jié)是這
樣的:
coolrainbow 登錄到控制節(jié)點 compuchem,并發(fā)出了上述指令時,控制節(jié)點
首先檢查 node023 是否可用,如果不可用(比如已經(jīng)運行了別的任務,或者
coolrainbow 沒有權(quán)限使用 node023,或者 node023 已經(jīng)關(guān)機,或者根本不存在,)則拒絕執(zhí)行;如果可用,使用 coolrainbow 的用戶名登錄到 node023,在 node023
第 9 頁
上面執(zhí)行 Gaussian 算 C60.gjf 的任務。當然,C60.gjf 文件在 compuchem 的硬盤
上,控制節(jié)點必須把 compuchem 上的 C60.gjf 以某種方式讓 node023 得到并運行,
且監(jiān)控這個任務。一旦算完,控制節(jié)點就會報告任務結(jié)束,并使C60.out 和C60.chk
出現(xiàn)在 compuchem 的硬盤上。node023 重新進入了可用狀態(tài)。Done!
好吧,這個過程看著容易,實際做起來似乎并不那么簡單。比如,要想
coolrainbow 能登錄各個節(jié)點,我們必須從 compuchem 到 node029 挨個建立一個
叫 coolrainbow 的相同用戶,密碼還得全部知道;要執(zhí)行 Gaussian,還得從 node021 ~ node029 全部安裝 Gaussian,路經(jīng)、配置還得完全一樣(不然并行計算會出毛。贿得設(shè)計套拷貝文件的系統(tǒng),讓機器自動把 C60.gjf 拷貝到 node023 上面,算完了再把 C60.out 和 C60.chk 拷貝回來……這個過程太可怕了,倘若集群要把 Gaussian 從 03 升級到 09,那就得 9 臺全部重新來了。如果讀者的組里面很有錢,有 100 臺機器讓你升級,嘿嘿……
作者的老師曾經(jīng)說過一句話:只要有一件事情用計算機辦是很繁瑣的,那么肯定有一種技術(shù)你沒有學會。沒錯,無數(shù)天才的程序員已經(jīng)開發(fā)了很多優(yōu)秀的程序來完美的解決上述問題,下面作者將逐步給出解決方法。再次強調(diào):這部分是整個集群技術(shù)的核心!
§2.2.1 SSH:主機間無密碼的遠程登錄
第一步,要實現(xiàn) coolrainbow 在各個節(jié)點間自由登錄。注意,在§2.1 最后,
我們已經(jīng)在全部計算節(jié)點中刪除了 coolrainbow,因此 coolrainbow 不能登錄到計
算節(jié)點上。沒關(guān)系,首先,安裝 ssh。
ssh 的英文全稱是 secure shell。它能夠?qū)崿F(xiàn)計算機間的遠程登錄,ssh 把所有
傳輸?shù)臄?shù)據(jù)進行加密,能夠防止數(shù)據(jù)泄密、DNS 和 IP 欺騙,所以是“secure”,
還有一個額外的好處就是傳輸?shù)臄?shù)據(jù)是經(jīng)過壓縮的,所以可以加快傳輸?shù)乃俣取?/FONT>
最初 ssh 是由芬蘭的一家公司開發(fā)的。但是因為受版權(quán)和加密算法的限制,現(xiàn)在
很多人都轉(zhuǎn)而使用 OpenSSH。OpenSSH 是 ssh 的替代軟件,而且是免費的,可
以預計將來會有越來越多的人使用它而不是 ssh。
安裝 OpenSSH,在控制節(jié)點和全部計算節(jié)點執(zhí)行:
# aptitude install ssh
第 10 頁
這里,aptitude 是 Debian 下安裝程序的命令,此時 Debian 會自動在它的網(wǎng)上的源中搜索 ssh 并安裝,因此要保持外網(wǎng)通暢。
強烈建議讀者搜索一下 aptitude 的用法!我們會反復用到。
如果讀者用過舊的 Debian,可能更喜歡 apt-get,沒有關(guān)系,但是千萬不要 aptitude 和
apt-get 同時使用,這會使依賴關(guān)系變得混亂!
如果讀者就是喜歡用 RedHat 的話,上述命令就得改為 yum install 之類。
有了 ssh 后,現(xiàn)在配置無密碼登錄,以后 coolrainbow 用 ssh 登陸節(jié)點時就
不用輸入密碼了。
在控制節(jié)點,以 coolrainbow 身份(不能是 root。﹫(zhí)行:
$ ssh-keygen –t dsa
$ cd /home/coolrainbow/.ssh
$ cat id_dsa.pub >> authorized_keys
它的原理:假設(shè)要想實現(xiàn)從機器 A 無密碼登錄到 B,A 和 B 雙方必須互相
有一個的密鑰。第一個命令即是產(chǎn)生密鑰,自動生成在家目錄的.ssh 文件夾。然
后密鑰另一方必須也擁有,這個文件名叫 authorized_keys,因此執(zhí)行最后一行
命令,將密鑰導入這個文件中。只要 A 機器的 authorized_keys 和 B 的.ssh/中
的內(nèi)容匹配,就可以無密碼的登錄。
現(xiàn)在 ssh 本機:
$ ssh compuchem
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
RSA key fingerprint is e4:05:08:65:e4:b8:a0:88:cd:be:16:c8:9e:4b:96:87.
Are you sure you want to continue connecting (yes/no)?
回答 yes,即可。這樣本機到本機便可實現(xiàn)無密碼 ssh 登錄,以后再次登陸
時,就不會出現(xiàn)上面的問題了,也不需要密碼了。
有人問:自己到自己 ssh 有什么用,跟計算節(jié)點有什么關(guān)系?沒事,馬上就
有關(guān)系了。
§2.2.2 NFS:主機間的文件共享
第二步,配置文件共享。coolrainbow 要想在 node023 上面運行 Gaussian,
首先 node023 上面得有 Gaussian,還得有要運行的文件 C60.gjf 等等。保持這些
文件的同步是個很困難的事情。解決辦法就是事用 NFS 系統(tǒng)。
第 11 頁
NFS(Network File System)即網(wǎng)絡文件系統(tǒng),是一種在網(wǎng)絡上的機器間共
享文件的方法,文件就如同位于客戶的本地硬盤驅(qū)動器上一樣。NFS 服務器可以
把文件系統(tǒng)導入給其它系統(tǒng),NFS 客戶端可以掛載從其它機器上導出的文件系
統(tǒng)。如果上面的描述看不懂,沒關(guān)系,我們先把它安裝上,然后詳細解釋。
在控制節(jié)點上安裝 NFS 服務器:
# aptitude install nfs-kernel-server
現(xiàn)在,打開/etc/exportfs 文件,這個文件專門用來配置要共享的文件系統(tǒng)。
現(xiàn)在在此文件里添加如下內(nèi)容:
/home 192.168.1.0/255.255.255.0(rw,sync,no_root_squash,subtree_check)
/opt 192.168.1.0/255.255.255.0(rw,sync,no_root_squash,subtree_check)
/usr/local 192.168.1.0/255.255.255.0(rw,sync,no_root_squash,subtree_check)
這個 exportfs 文件,就是我們要共享文件的配置文件,控制節(jié)點 compuchem
會按照這個文件里面的內(nèi)容,給計算節(jié)點共享文件。以第一行為例,解釋其中的
含義:
/home:要導出的目錄。/home 是用戶的家目錄,必須要共享計算節(jié)點,這
樣我們的文件才能被計算節(jié)點獲取。我們還共享了另外兩個目錄:/opt 和
/usr/local。前者是為了共享后面將要安裝的 intel 編譯器;后者,習慣上,Linux
下的應用軟件都安裝到這一目錄(相當于 Windows 下的 C:\Program Files),整
個集群的計算化學軟件如 Gaussian 等都會裝到這個目錄下,因此也要共享出去。
192.168.1.0/255.255.255.0:可以掛載的 IP 范圍,這個設(shè)置用了一個掩碼,
表示共享給所有 192.168.1.X 的 IP,我們的計算節(jié)點的 IP 是 192.168.0.021 ~ 030,
所以計算節(jié)點可以共享到。
(rw,sync,no_root_squash,subtree_check):掛載的配置。這里表示可讀可
寫,同步執(zhí)行,若 NFS 主機使用分享目錄的使用者,如果是 root 的話,那么對
于這個分享的目錄來說,他就具有 root 的權(quán)限,強制 NFS 檢查父目錄的權(quán)限。
重啟 NFS 服務:
# /etc/init.d/nfs-kernel-server restart
現(xiàn)在,這些目錄就被掛載出去。但是,計算節(jié)點還沒有“接手”這些目錄,
現(xiàn)在,讓計算節(jié)點將這些目錄掛載。打開所有計算節(jié)點的/etc/fstab 文件,在文
件下面添加:
compuchem:/home |
/home |
nfs |
rw,defaults |
0 |
0 |
compuchem:/opt |
/opt |
nfs |
rw,defaults |
0 |
0 |
第 12 頁
compuchem:/usr/local /usr/local nfs rw,defaults 0 0
以第一行為例解釋一下這個文件的含義:
compuchem:/home /home:表示把 compuchem 主機的/home 目錄掛載到
本地的/home 目錄上。通俗的說,就是當讀者在計算節(jié)點上訪問/home 時,實際
上訪問的是控制節(jié)點上的/home。這和 Windows 下的共享是類似的。后面幾個參
數(shù)照抄就可以。
然后重啟網(wǎng)絡服務:
# /etc/init.d/networking restart
這樣子節(jié)點就把服務器共享的文件掛載了。例如,在 node021 上,執(zhí)行如下命令就可以看到.
# df |
|
|
|
|
|
Filesystem |
1K-blocks |
Used |
Available Use% Mounted on |
/dev/sda1 |
151225248 |
714456 142828916 |
1% |
/ |
tmpfs |
1037944 |
0 |
1037944 |
0% |
/lib/init/rw |
udev |
10240 |
40 |
10200 |
1% |
/dev |
tmpfs |
037944 |
0 |
1037944 |
0% |
/dev/shm |
compuchem:/home |
480719072 |
452384 455847488 |
1% |
/home |
compuchem:/opt |
151225248 |
1533472 142009888 |
2% |
/opt |
compuchem:/usr/local 151225248 |
1533472 142009888 |
2% /usr/local |
看到最后三行了嗎?我們已經(jīng)成功的共享了目錄!比如,當我們在控制節(jié)點
上在/usr/local 下安裝了一個 Gaussian03C 時,所有的計算節(jié)點都可以通過
/usr/local 找到完全相同的 Gaussian ,因為它們實際上是通過網(wǎng)絡訪問的
compuchem 上的/usr/local。NFS 的作用,就是把這些操作屏蔽起來,使計算節(jié)
點在訪問網(wǎng)絡上的文件時如同訪問本地一樣。
好了,coolrainbow 的目錄已經(jīng)通過NFS 共享到計算節(jié)點了,但是coolrainbow
要想登陸計算節(jié)點,計算節(jié)點上必須有 coolrainbow 才行。好,現(xiàn)在就來這最后
一步!
§2.2.3 NIS:主機間的用戶同步
第三步,配置用戶信息。這里就要用 NIS。NIS(Network Information Service)
即網(wǎng)絡信息服務,是集中控制幾個系統(tǒng)管理數(shù)據(jù)庫的網(wǎng)絡用品。NIS 簡化了 UNIX
和 LINUX 用戶的管理工作,客戶端利用它可以使用 NIS 服務器的管理文件,無
第 13 頁
需建立他們自己的/etc/passwd,只簡單的使用和維護在 NIS 服務器的文件即可。
1. 在所有機器上安裝 NIS:
# aptitude install nis
安裝過程中會要求輸入 NIS 的域名,這里必須輸入控制節(jié)點 compuchem。
配置 NIS 端。以下操作在控制節(jié)點上:
2. 確認域名。打開/etc/defaultdomain(這是包含 NIS 域名的文件),確認里
面有一行:
compuchem
如果沒有則添上;
3. 打開/etc/default/nis,修改 NISSERVER=master,NISCLIENT=true,這
樣本機便成為 NIS 服務器;
4. 配置 NIS 主機。打開/etc/yp.conf,寫入:
ypserver compuchem
5. 重啟 NIS 服務:
# /etc/init.d/nis restart
6. 編譯用戶數(shù)據(jù)庫:
# cd /var/yp
# make
注意:以后無論控制節(jié)點對 passwd,group,shadow 文件做了任何修改,
都必須進入/var/yp 重新 make,才能保證服務器和客戶端的用戶信息同步。
以下操作在計算節(jié)點上:
6. 確認域名。打開/etc/defaultdomain(這是包含 NIS 域名的文件),確認里
面有一行:
compuchem
如果沒有則添上;
7. 打開/etc/default/nis,修改 NISSERVER=false,NISCLIENT=true,這樣
本機便成為 NIS 客戶端;
8. 打開/etc/yp.conf,通過寫入 ypserver compuchem 配置 NIS 主機名;
9. 寫入“偽用戶”信息,即:
打開/etc/passwd,最后一行寫入字符串:+::::::(一個“+”六個“:”);
打開/etc/group,最后一行寫入字符串:+:::(一個“+”三個“:”);
打開/etc/shadow,最后一行寫入字符串:+::::::::(一個“+”八個“:”);
第 14 頁
10. 打開/etc/nsswitch 文件,將
hosts files dns
改為
hosts files nis dns
11. 重啟 nis 服務:
# /etc/init.d/nis restart
這樣整個集群的 NIS 服務都打通了。那么 NIS 究竟有什么用呢?我們知道,
控制節(jié)點 compuchem 已經(jīng)有了 coolrainbow 的用戶信息,而計算節(jié)點如 node021
沒有。node021 開啟了 NIS,那么它就會自動尋找 NIS 服務器即 compuchem,此
時 compuchem 所有的用戶信息:用戶名,密碼,組信息等就都會被 node021 所接受,這樣在 NIS 的幫助下,coolrainbow 就成為了 node021 的合法用戶,就可以登陸了。
到此為止,本節(jié)開頭所指出的問題徹底的解決了。用戶信息、文件系統(tǒng)都已
經(jīng)在整個集群間共享,并且,ssh 可以在整個集群間無密碼登陸了——為什么?
很簡單,當 coolrainbow 通過 ssh 連接 node021 時(命令:ssh node021),由于
NIS,coolrainbow 成為了 node021 的合法用戶,所以有資格登陸;登陸后,系統(tǒng)
自動搜索家目錄,由于 NFS,這個家目錄實際就是 compuchem 上的家目錄;而
在§2.2.1 中,我們已經(jīng)在./ssh 中生成了 authorized_keys,所以登陸就不需要密
碼了(當然,第一次登陸時會遇到提問,只要回答一次 yes 以后就不用了,所以
現(xiàn)在最好把所有的計算節(jié)點都 ssh 一下,這樣 ssh 無密碼的問題就解決了)。
我們發(fā)現(xiàn),通過 ssh,NFS 和 NIS 這三個相互關(guān)聯(lián)的技術(shù),我們徹底的解決
了集群通信的問題。下一步,我們就可以開始安裝軟件了!
§2.3 編譯器的安裝
編譯器是 Linux 下最重要的軟件之一,幾乎所有的軟件都可以在 Linux 下重
新編譯,從而達到最高的效率。在本教程中,需要兩種編譯器:GNU 編譯器和
intel 編譯器。
§2.3.1 GNU 編譯器
我們需要兩種編譯器,Fortran 和 C 的。非常簡單:
第 15 頁
# aptitude install gcc-4.3 g++-4.3 gfortran
此時將安裝 C,C++和 Fortran95 的編譯器。
§2.3.2 intel 編譯器
intel 編譯器是 intel 公司專門為其處理器量身打造的編譯器,對于 intel 處理
器具有非常高的性能。本教程使用的機器就是 intel 芯片的,因此將會大量使用
intel 編譯器以獲取最高性能。如果讀者使用 AMD 處理器,便可以略去安裝。
這個編譯器可以在 intel 主頁申請非商業(yè)版,利用郵箱注冊即可,可以下載
到 intel 的 Fortran 和 C 編譯器 11.1 版,注意申請 64 位版,因為我們選用 AMD64
機器:
l_cproc_p_11.1.069_intel64.tgz
l_cprof_p_11.1.069_intel64.tgz
intel 編譯器是有最新版的,但是可能不穩(wěn)定,這個 11.1 是經(jīng)過作者測試的,至少在我
的集群上沒有問題。
intel 編譯器本身安裝非常簡單,但是它有幾個依賴的庫比較討厭:第一,盡
管我們確實安裝 64 位編譯器,但是必須要裝全套的 32 位的庫才行;第二,現(xiàn)在
的 Linux 上的 libstdc++.so 都是 6 版本,但是 intel 編譯器需要 5 版本;第三,要裝 intel 編譯器必須先裝 GNU 編譯器。
這些問題都很容易解決。GNU 編譯器已經(jīng)裝好,首先解決 libstdc++的問題。
1. 在 http://packages.debian.org/lenny/libstdc++5 上下載 amd64 架構(gòu)的 libstdc++.so.5 的庫,這個文件為 libstdc++5_3.3.6-18_amd64.deb。
2. 下載后,在全部節(jié)點上執(zhí)行:
# dpkg –I libstdc++5_3.3.6-18_amd64.deb
這樣 libstdc++.so.5 就有了,現(xiàn)在安裝 32 位庫,全部節(jié)點執(zhí)行一個命令:
# aptitude install ia32-lib
好了,現(xiàn)在正式安裝 intel 編譯器,以 C 編譯器為例,在控制節(jié)點上進行。
3. 解壓,進入文件夾,安裝:
# tar –xvzf l_cproc_p_11.1.069_intel64.tgz
# cd l_cproc_p_11.1.069_intel64/
# ./install.sh
下面的工作就是一路默認安裝,注意中間輸入 intel 公司的授權(quán)號。安裝完
第 16 頁
成后,在/opt 下會出現(xiàn) intel 文件夾。用同樣的方法安裝 Fortran 編譯器即可。
此時,intel 的命令還不在命令路徑中,我們解決它,在所有節(jié)點上打開
/etc/profile,將 PATH 改為:
if [ "`id -u`" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/maui/bin:/usr/lo
cal/maui/sbin:/opt/intel/Compiler/11.1/069/bin/intel64:/usr/local/mpich2/bin:/usr/local/mpich2/s
bin "
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/local/maui/bin:/opt/intel/Compiler/11.1/
069/bin/intel64:/usr/local/mpich2/bin"
fi
并且最后一行添加上 intel 編譯器的庫路徑:
export LD_LIBRARY_PATH=/opt/intel/Compiler/11.1/069/lib/intel64:/opt/intel/Compiler/ 11.1/069/mkl/lib/em64t
這樣,intel 編譯器就可以使用了!如果讀者選取了不同的安裝路徑,注意按
照正確的路徑修改。注意:上面的 PATH 中還有一些新加的 mpich2 之類,將在
下一節(jié)用到。
§2.4 并行計算環(huán)境的配置
既然要并行計算,就得有并行環(huán)境。目前比較流行的并行計算環(huán)境被稱為
MPI(Message Passing Interface)即消息傳遞接口,是一種并行計算的標準或規(guī)
范,迄今為止,所有的并行計算機制造商都提供對 MPI 的支持,可以在網(wǎng)上免
費得到 MPI 在不同并行計算機上的實現(xiàn),一個正確的 MPI 程序可以不加修改地
在所有的并行機上運行。標準 MPI 雖然很龐大,但是它的最終目的是服務于進
程間通信這一目標。
MPI 的實現(xiàn)有多種,這里選用 MPICH2。它是免費軟件,可以從 http://www.
mcs.anl.gov/research/projects/mpich2/downloads/index.php?s=downloads 上
得到。這里要下載源碼,得到 mpich2-1.3.1p1.tar.tar。
注意:不要選擇 MPICH1,它有很多缺點!
第 17 頁
可以開始編譯 MPICH2。這個過程只需要在控制節(jié)點完成。
1. 解壓:
# tar –xvf mpich2-1.3.1p1.tar.tar
# cd mpich2-1.3.1p1
2. 設(shè)置編譯選項。我們要把 mpich2 裝到/usr/local 下,可以實現(xiàn)全部集群共
享,不妨建立一個 mpich2 的文件夾,裝 MPICH2 并且配置 configure:
# mkdir /usr/local/mpich2
#./configure --prefix=/usr/local/mpich2 --enable-cxx --enable-f90 --enable-threads =multiple
這幾項的含義:--prefix 設(shè)置安裝的路徑;--enable-cxx 和--enable-f90 使 MPICH2 支持 C,C++和 FORTRAN 語言;--enable-threads=multiple 表示支持線程,這樣可以更好的利用共享內(nèi)存,前提是機器上必須有多個 CPU。
3. 設(shè)置編譯器。如果使用 GNU 編譯器:
# export CC=gcc
如果使用 intel 編譯器:
# export CC=icc
如果讀者的機器是 intel CPU,強烈建議使用 intel 編譯器。
4. 編譯和安裝:執(zhí)行:
# make
# make install
完成后,在/usr/local/mpich2/bin 中就會出現(xiàn)很多命令,如 mpicc,mpif90
等等,都是并行的 C、Fortran 編譯器。這些命令應該加入 PATH,一般來說,/bin
的命令對普通用戶和 root 都需要加入,而/sbin 則最好只加入到 root 的 PATH。
這就是上一節(jié)中 PATH 加入的 mpich2 之類的含義,當然,如果讀者的命令路徑
不一樣,需要轉(zhuǎn)換。
要運行并行計算,還需要進行一些配置,告訴 MPICH2 哪些機器能進行并
行計算。對我們來說,當然就是計算節(jié)點 node021 ~ node029,配置方法:在控
制節(jié)點 compuchem 的/root 下,建立一個文件:mpd.hosts,里面寫入:
node021
node022
node023
node024
node025
node026
第 18 頁
node027
node028
node029
到此為止,我們的 MPICH2 已經(jīng)配置完成了。本來我們現(xiàn)在應該測試一下
MPICH2,但是由于我們建立的是集群,我們希望并行的任務更加的有條理,因
此,我們暫時先把 MPICH2 放一放,現(xiàn)在的任務是建立集群的作業(yè)管理系統(tǒng)。
§2.5 作業(yè)系統(tǒng)的建立
計算機集群的任務調(diào)度是一項非常重要的工作。要想充分發(fā)揮集群的硬件和
軟件威力,必須將資源合理的分配給所運行的作業(yè),使得整個集群的使用效率達
到最大。因此,必須選用一個自動化的作業(yè)管理系統(tǒng)來進行作業(yè)的調(diào)度。
舉例來說,如果 coolrainbow 想“在 node023 上用 8 個 CPU 拿 Gaussian 算我這個 C60.gjf”
的話,只需要在控制節(jié)點上發(fā)出這個指令就行了;如果 bingtears 想“用 node021 ~ node025
并行運行 NAMD”的話,也只需要在控制節(jié)點上發(fā)出這個指令就行了;如果 coolrainbow 已
經(jīng)占用了 node023,那么 bingtears 的任務顯然不能運行了,那么作業(yè)管理系統(tǒng)就會對任務“排
隊”,等待 coolrainbow 的 node023 使用完畢(也許是三天以后),自動將 bingtears 的任務提
交,運行 NAMD。每個任務運行完后,作業(yè)系統(tǒng)會自動報告該任務占用的資源數(shù)量和運行
時間。這個系統(tǒng)還應具有權(quán)限分配功能。比如,某組在你的集群中花錢獨占了 node025 的一
個月的使用權(quán),那么可以對作業(yè)系統(tǒng)進行設(shè)置,使沒有花錢的用戶不能在 node025 上發(fā)作
業(yè)……
作業(yè)管理軟件有很多,如 OpenPBS 等等。這里,我們選用一套作者認為最
穩(wěn)定的組合:Torque+Maui+mpiexec。這三個都是免費軟件。
Torque:最主要的作業(yè)分配工具。
Maui:Torque 的輔助工具。前面提到的限制權(quán)限的功能,單獨用 Torque 無
法實現(xiàn),必須加上這個軟件。
Mpiexec:Torque 與 MPICH2 連接的工具。它有什么用呢?如果我們直接使
用 Torque,比如,分配 node021 和 node022 給 MPICH2 讓它并行運行,運行的結(jié)果,可能 MPICH2 根本就不是使用的 node021 和 node022,而是隨機使用的節(jié)點。mpiexec 的功能,就是使用 Torque 分配的節(jié)點來執(zhí)行 MPICH2 的任務,使得兩者之間無縫結(jié)合。
第 19 頁
注意:MPICH2 的可執(zhí)行文件中也有一個 mpiexec(位于/usr/local/mpich2/bin 下),這
個與我們上面提到的 mpiexec 名稱確實完全相同,但是兩者完全不是一個東西!千萬不要混
淆!
下面開始構(gòu)造這個系統(tǒng)。
§2.5.1 Torque 的安裝
到 2011 年 5 月時,Torque 的最新版本為 3.0,作者選用較為穩(wěn)定的 2.4.6。
可以從 http://clusterresources.com/downloads/torque 下載其安裝文件 torque-2.4.6.tar.gz。
Torque 的安裝十分簡單。在控制節(jié)點上依次執(zhí)行下列命令即可:
# tar -xvzf torque-2.4.6.tar.gz
# cd torque-2.4.6
# ./configure --with-scp CC=icc
# make
# make install
注意:如果不使用 intel 編譯器,上面第三行的命令把 CC=icc 去掉。
這就完成了控制節(jié)點的安裝。此時 compuchem 已經(jīng)成為了一個 PBS 服務器。
現(xiàn)在執(zhí)行:
# make packages
這時會生成一些.sh 文件,其中兩個重要文件:torque-package-mom- linux-
i686.sh 和 torque-package-client-linux-i686.sh 將用來安裝計算節(jié)點。在計算節(jié)
點上,執(zhí)行:
# ./torque-package-mom-linux-i686.sh --install
# ./torque-package-client-linux-i686.sh --install
至此,Torque 安裝結(jié)束。
§2.5.2 Maui 的安裝
現(xiàn)在安裝Maui。這個軟件需要在http://clusterresources.com 注冊才能下載,
這里選用穩(wěn)定的版本 3.3,下載后得到文件 maui-3.3.tar.gz,它的安裝也很簡單,
只要在控制節(jié)點執(zhí)行即可:
# tar -xvzf maui-3.3.tar.gz
# cd maui-3.3
第 20 頁
# ./configure CC=icc
# make
# make install
注意:如果不使用 intel 編譯器,上面第三行的命令把 CC=icc 去掉。
§2.5.3 Torque 和 Maui 的配置
Torque 和 Maui 需要進行許多配置才能正常工作。在控制節(jié)點:
1. Torque 必須配置一位普通用戶的管理員,這就需要在剛才的安裝目錄即
torque-2.4.6 中,執(zhí)行:
# ./torque-setup coolrainbow
這就選擇了 coolrainbow 作為 Torque 的普通管理員。注意:如果不設(shè)普通用戶的管理員就無法運行程序。
2. 進入/var/spool/torque/server_priv,建立名為 nodes 的文件,寫入
node021 np=8
node022 np=8
node023 np=8
node024 np=8
node025 np=8
node026 np=8
node027 np=8
node028 np=8
node029 np=8
這就是 Torque 計算節(jié)點的列表,np 代表 CPU 個數(shù)。
3. 重啟 pbs 服務。方法:
# ps –A | grep pbs # 得到 pbs 的進程號,如 2798
# kill 2798
# pbs_server
# pbs_sched
4. 使 PBS 服務器開機自動啟動。進入/etc/init.d,建立一個文件如 pbsserver,
寫入:
/usr/local/sbin/pbs_server
/usr/local/maui/sbin/maui
第一行是啟動 PBS 服務器;第二行,本來應該是/usr/local/sbin/pbs_sched,
這個是 Torque 的任務調(diào)度系統(tǒng),但是我們已經(jīng)裝了 Maui,就不需要它,而是啟
動更高級的 Maui 任務調(diào)度系統(tǒng)。
第 21 頁
這個文件建立好后,執(zhí)行:
# chmod 755 pbsserver
# update-rc.d pbsserver start 30 2 3 4 5 . stop 30 1 6 0 .
最后的命令調(diào)用了 update-rc.d,這樣以后重啟時,PBS 服務就會自動啟動,而不用手動啟動。
對 update-rc.d 不熟悉的讀者可以搜索下它的用法。
下面進行計算節(jié)點的配置,以下操作在計算節(jié)點上進行。
5. 進入/var/spool/torque/mom_priv,建立名為 config 的文件,寫入:
$pbsserver compuchem
$logevent 255
$usecp *:/home /home
6. 設(shè)置自動啟動。進入/etc/init.d,建立一個文件如 pbsmom,寫入:
/usr/local/sbin/pbs_mom
然后,運行:
# chmod 755 pbsmom
# update-rc.d pbsmom start 30 2 3 4 5 . stop 30 1 6 0 .
這樣以后重啟時,PBS 客戶端就會自動啟動。
此時配置已經(jīng)基本完成。
激動人心的時刻到了!當所有的 PBS 服務器和客戶端都啟動好后,可以執(zhí)
行命令 pbsnodes(這個命令顯示所有的節(jié)點的情況)查看節(jié)點的情況;
# pbsnodes
…
node025 state = free np = 8 ntype = cluster
status = opsys=linux,uname=Linux node025 2.6.18-6-686 #1 SMP Sun Feb 10 22:11:31
UTC 2008 i686, sessions=2839, nsessions=1, nusers=1, idletime=197844, totmem=4726576kb, availmem=4685196kb, physmem=2075892kb, ncpus=8, loadave=0.00, netload=1043928615, state=free, jobs=, varattr=, rectime=1238950166
node026
state = free
np = 8
ntype = cluster
status = opsys=linux,uname=Linux node025 2.6.18-6-686 #1 SMP Sun Feb 10 22:11:31 UTC 2008 i686, sessions=2839, nsessions=1, nusers=1, idletime=197844, totmem=4726576kb, availmem=4685196kb, physmem=2075892kb, ncpus=8, loadave=0.00, netload=1043928615, state=free, jobs=, varattr=, rectime=1238950166
第 22 頁
…
也就是說,作業(yè)管理系統(tǒng)已經(jīng)找到了我們的計算節(jié)點了!現(xiàn)在,整個集群的作業(yè)管理系統(tǒng)已經(jīng)接近完成!現(xiàn)在就差 mpiexec 了!
§2.5.4 mpiexec 的安裝
好了,現(xiàn)在安裝 mpiexec。它的最新版本為 0.84,可在 http://www.osc.edu/
~djohnson/mpiexec/index.php 下載到 mpiexec-0.84.gz。在上面安裝 Torque 和
Maui 時,沒有指定安裝路徑,對于它,我們有必要指定一個,比如下面的路徑:
# mkdir /usr/local/mpitorque
下面安裝。在控制節(jié)點上執(zhí)行:
# tar –xvzf mpiexec-0.84.gz
# cd mpiexec-0.84
# ./configuration --prefix=/usr/local/mpitorque --with-pbs=/usr/local --with-default-comm =mpich-p4
這一行,--prefix 配置安裝路徑,--with-pbs 指定 Torque 的鏈接庫、頭文件的上級路徑,--with-default-comm 指定 MPICH2 的類型。
然后編譯安裝即可:
# make
# make install
此時,mpiexec 安裝到了/usr/local/mpitorque 中。以后所有的并行任務將由
它執(zhí)行。
OK!集群到此就全部安裝完畢!現(xiàn)在可以試運行一個任務了!
§2.6 第一次運行集群
切換為普通用戶比如 coolrainbow。當然,我們的集群上還沒有沒有任何軟
件,但是有編譯器,我們將用編譯器編一個并行程序,并通過作業(yè)管理系統(tǒng)運行。
比如,在家目錄下,用 vi 編輯一個并行的 Fortran 程序,叫 hellocluster.f95,
見腳本 2-6-1。
編譯這個程序(注意全部工作要以普通用戶的身份執(zhí)行):
$ mpif90 hellocluster.f90 -o hellocluster
腳本 2-6-1 并行的 Fortran 程序
第 23 頁
! hellocluster.f95
program main
Include 'mpif.h'
implicit none
character*(MPI_MAX_PROCESSOR_NAME) processor_name integer id, nprocs, namelen, rc,ierr
call MPI_INIT( ierr )
call MPI_COMM_RANK( MPI_COMM_WORLD, id, ierr )
call MPI_COMM_SIZE( MPI_COMM_WORLD, nprocs, ierr )
call MPI_GET_PROCESSOR_NAME(processor_name, namelen, ierr)
write(*,1100) id,nprocs,processor_name
call MPI_FINALIZE(rc)
1100 FORMAT('Hello Cluster! Process ',I2,' of ',I1,' on ', 20A)
end
現(xiàn)在得到了可執(zhí)行文件 hellocluster。我們調(diào)用作業(yè)管理系統(tǒng)來執(zhí)行它。
建立一個叫做 submit.pbs 的文件(也可以是你喜歡的任何名字),寫入如下
內(nèi)容:
腳本 2-6-2 作業(yè)提交腳本
#!/bin/sh
#PBS -l nodes=node023:ppn=8+node027:ppn=8
#PBS -q batch
#PBS -j oe
#PBS -N first_task
cd /home/coolrainbow
/usr/local/mpitorque/bin/mpiexec ./hellocluster > result
這個腳本,是提交作業(yè)的標準腳本,所有的用戶都應該通過 Torque 使用提
交作業(yè)的腳本執(zhí)行任務,這是一切集群(從我們這個學術(shù)用小集群到上千臺計算
機的超級集群)執(zhí)行任務的標準。
當然,商業(yè)或更高級的集群是不使用 Torque 這個免費的作業(yè)管理系統(tǒng)的,它們往往使
用一些商業(yè)軟件(價格常常相當昂貴),但是都是要通過某些腳本提交作業(yè)的。
在腳本 2-6-2 中,以#PBS 開頭的都是與 Torque 有關(guān)的選項,其他的命令(如
6,7 行)則是要執(zhí)行的任務。這在第四章會詳細介紹 。這里,只介紹幾個:第 2
行,我們了分配 node023 的 8 個 CPU 和 node027 的 8 個 CPU 給我們的任務;第
5 行,是給我們的任務隨便起的一個名字;第 7 行,調(diào)用 mpiexec 并行執(zhí)行
第 24 頁
hellocluster,并將輸出重定向到一個叫 result 的文件里。
mpiexec 會自動根據(jù) Torque 分配的資源并行執(zhí)行 hellocluser。如果這里使用 MPICH2
自帶的那個 mpiexec 的話,不僅步驟繁瑣(需要啟動 mpd 守護者進程之類),而且不能保證
我們并行的任務是在 node023 和 node027 上執(zhí)行的。
有這個腳本后,提交作業(yè):
$ qsub submit.pbs
不久,會生成一個叫 first_task.o0 的文件,注意與我們的任務名相同,當然
這個文件里面是空的。還生成一個 result 文件,里面應該是我們的結(jié)果,打開看
看:
Hello Cluster! Process 5 of 16 on node023
Hello Cluster! Process 12 of 16 on node023
Hello Cluster! Process 0 of 16 on node027
……
Hello Cluster! Process 1 of 16 on node027
沒錯,兩臺機器 16 個 CPU 并行執(zhí)行了 16 個進程(process)!我們的集群成功了!
到此,我們的集群就全部組裝完畢了!相信讀者可以喘口氣了,休息一下,哈哈!
上面的作業(yè)提交太簡單了,不能滿足要求。我們將在第四章討論更有用的 Torque 的操作。下面,我們先裝幾個計算化學軟件吧。
第 25 頁
第三章 集群的計算化學軟件配置
計算化學的軟件,據(jù)說現(xiàn)在已經(jīng)超過 20 種。這里不可能全部介紹安裝的方
法。但是考慮到集群的需要,讀者如果沒有什么 Linux 基礎(chǔ),面對計算化學軟件
的源碼常常只能望而卻步,因此這里作者挑選幾種以“難編譯”出名的軟件介紹,
相信讀者即使沒有編譯軟件的基礎(chǔ),在讀完本章后,對大多數(shù)計算化學的軟件的
編譯就沒有問題了。
這里的軟件安裝,如無特殊聲明,只要在控制節(jié)點上操作即可。
§3.1 Gaussian03 安裝與配置
§3.1.1 Gaussian03 的安裝
Gaussian03 是最著名的計算化學軟件,通過商業(yè)途徑可以購買到這個軟件。
這里以其光盤鏡像 G03.ISO 來安裝。同時,Gaussian03 的版權(quán)控制非常嚴格,只
允許一定的用戶使用,這要求管理員必須在系統(tǒng)中設(shè)定一個專門的組來運行
Gaussian03,不妨就叫 gaussian 組:
# groupadd gaussian
然后將 Gaussian03 的光盤鏡像加載:
# mount –t iso9660 –o loop /root/G03.ISO /mnt
現(xiàn)在開始安裝:
1. Gaussian03 必須用 C shell 安裝:
# csh
如果沒有 C shell,安裝:
# aptitude install csh
2. 設(shè)定環(huán)境變量:
# setenv mntpnt "/mnt”
# seten g03root “/usr/local/chemsoft”
這兩個環(huán)境變量的含義:mntpnt 表示光盤鏡像掛載的路徑;g03root 表示
g03 目錄安裝的路徑。注意,這里在/usr/local 里建立了一個 chemsoft 的文件夾,
以后所有的計算化學軟件都裝到 chemsoft 里。
第 26 頁
3. 進入安裝目錄并解壓安裝文件:
# cd $g03root
# cat $mntpnt/tar/*.taz | zcat | tar xvf –
4. 現(xiàn)在,將會生成一個 g03 目錄,將它的組改為 gaussian:
# chgrp –R gaussian g03
# cd g03
5. 執(zhí)行安裝腳本:
# ./bsd/install
6. 將 g03 目錄及所有文件的權(quán)限改為 750:
# chmod –R 750 g03
現(xiàn)在只要把需要運行 Gaussian03 的用戶加入 gaussian 組,用戶就可以運行 gaussian 了。如修改/etc/group:
gaussian:x:1001:coolrainbow
這樣coolrainbow 就具有了運行 Gaussian 的權(quán)限。注意要重新 make 一下NIS數(shù)據(jù)庫。
§3.1.2 Gaussian03 的單機配置
每次運行 Gaussian03,還需要設(shè)置一些環(huán)境變量。這里不采用通常的方法即
在用戶的.bashrc 中聲明這些變量(作者的觀點是既然有了集群,就把與具體任
務有關(guān)的東西全部限制在作業(yè)腳本中,做到“影響極小化”),而是建立相應的
PBS 腳本,在提交作業(yè)前做這些處理。所設(shè)計的腳本可見腳本 3-1:
腳本 3-1-1 Gaussian03 的作業(yè)提交腳本
#!/bin/sh
#PBS -l nodes=node023:ppn=8
#PBS -q parallel
#PBS -j oe
#PBS -N UF4
export g03root="/usr/local/chemsoft"
mkdir /tmp/${PBS_JOBID}
export GAUSS_SCRDIR=/tmp/${PBS_JOBID}
source $g03root/g03/bsd/g03.profile
cd /home/coolrainbow
g03 < UF4.gjf > UF4.out
rm -rf /tmp/${PBS_JOBID}
解釋下這個腳本含義。以#PBS 開頭的行是 Torque 的設(shè)置內(nèi)容,以后介紹;
第 27 頁
6 行導出 Gaussian03 所在的路徑變量;7 行建立計算所需的緩存文件目錄(最好
使用本地目錄),位于/tmp,其名稱為該作業(yè)的編號(PBS_JOBID 是 Torque 內(nèi)
部設(shè)定的變量,后面會介紹);8 行導出緩存文件目錄;9 行執(zhí)行 Gaussian03 的
一個腳本;10 行進入 gjf 文件所在的目錄,根據(jù)情況修改;11 行正式運行
Gaussian03,UF4.gjf 就是要運行的文件,UF4.out 是輸出文件;12 行在任務結(jié)束后刪除緩存文件目錄。
這樣,這個腳本可以給任何屬于 gaussian 組的普通用戶運行 Gaussian03。只要修改相應的路徑和輸入輸出文件名后,運行(假設(shè)腳本名稱為
g03_submit.pbs):
$ qsub g03_submit.pbs
即可運行。至此單機的 Gaussian03 就配置完畢。
如果安裝 Gaussian09,完全可以參照上述步驟運行,Gaussian09 的環(huán)境變量照樣寫入作業(yè)提交腳本中(這也看出了不寫入.bashrc 的優(yōu)點,至少防止
GAUSS_SCRDIR 沖突)。
§3.2 NAMD 安裝與配置
NAMD 是并行效率極高的分子動力學軟件,特別適合超大規(guī)模體系的處理,
常常用來進行生物大分子研究和大規(guī)模的分子動力學模擬。
NAMD 的使用比較簡單,直接運行可執(zhí)行文件即可,但是 NAMD 的安裝非
常復雜,配置文件繁多,有一點兒錯誤就無法安裝,因此這里將安裝過程詳細介
紹。
需要說明的是:對于不同的軟件和硬件,安裝的配置是有一定差別的,但是只要掌握了本節(jié)中例子,其差別就不言自明。
到 2011 年 5 月 NAMD 的最新版本為 2.8,但這是測試版,不穩(wěn)定(如已經(jīng)
發(fā) 現(xiàn) 2.8b1 存在 bug ),這里我們會講解 2.7 的編譯方法。可以從 http://www.ks.uiuc.edu 上下載到其源碼文件 NAMD_2.7_Source.tar.gz。
在本節(jié)中,我們主要講解 NAMD 多機并行版本的編譯方法,相信這個版本
掌握后,再編譯別的版本(如單機多核版)時基本不會遇到太大困難。另外,最新的 GPU 加速版將在§5.2 節(jié)單獨介紹。
第 28 頁
如果讀者掌握了這個軟件的編譯方法,基本任何 Linux 軟件的編譯都不在話下。作者正
是當初在初學 Linux 摸索 NAMD 的編譯時,學到了大量的知識,現(xiàn)在基本可以沒有任何困
難的編譯各種 Linux 軟件。
§3.2.1 組件安裝
首先要安裝一些組件。NAMD 需要兩個組件支持:TCL 語言的模塊 tcl8.4
和快速 Fourier 變換模塊 fftw。要安裝這兩個組件,只要在所有節(jié)點上執(zhí)行(注
意:這些組件會自動安裝到/usr 下的某些目錄,不在共享的目錄下,所以要全部
安裝):
# aptitude install fftw3 fftw3-dev sfftw-dev sfftw2 tcl8.4 tcl8.4-dev
如果讀者有自己的高效的 fftw 庫,也可以自行編譯安裝,過程很簡單,就不重復了。至于 TCL,使用 aptitude 安裝的比較可靠。
§3.2.2 charm++安裝
編譯 NAMD 只要在控制節(jié)點進行即可。首先要編譯 charm++。
1. 解壓并進入相應目錄:
# tar –xvzf NAMD_2.7_Source.tar.gz
# cd NAMD_2.7_Source
# tar –xvf charm-6.1.3.tar
# cd charm-6.1.3
2. 配置。要安裝的 NAMD 必須支持并行,因此要給 charm++指明并行并行
庫,首先給出 mpi-linux 告訴編譯器要編譯并行,然后要通過--bashdir 參數(shù)給出
MPI 庫的位置,因為前面 MPICH 安裝到了 usr/local/mpich2 下,MPI 庫這位于
這個目錄下的 lib 中,故給出 MPICH 的安裝路徑(不需要加/lib!)就可以。同時,
給出所用的編譯器和優(yōu)化級別。charm++表示對 charm++只做基本安裝。
下面是一個非常需要注意的問題。如果讀者使用 GNU 編譯器編譯了
MPICH2,在 build 后面加上“cc”選項,表示用 GNU C 編譯器編譯 charm++:
# ./build charm++ mpi-linux --basedir=/usr/local/mpich2 cc -O
如果讀者已經(jīng)使用 intel 編譯器編譯了 MPICH2,并且打算使用 intel 編譯器編譯 charm++的話,一定不要在命令行中指定任何編譯器!即正確的方法:
# ./build charm++ mpi-linux --basedir=/usr/local/mpich2 -O
第 29 頁
上面的命令會自動用 intel 編譯器實現(xiàn) charm++。
如果讀者使用下面的命令:
# ./build charm++ mpi-linux --basedir=/usr/local/mpich2 icc -O
就會遇到 MPICH2 函數(shù)符號不能識別的情形,即下面的錯誤:
`CmiNotifyIdle':
machine.c:(.text+0x202): undefined reference to `MPI_Recv'
machine.c:(.text+0x232): undefined reference to `MPI_Get_count'
./../../bin/../lib/libconv-cplus-y.a(machine.o): In function `CmiAsyncSendFn_':
machine.c:(.text+0xe82): undefined reference to `MPI_Isend'
./../../bin/../lib/libconv-cplus-y.a(machine.o): In function
`CmiAsyncBroadcastAllFn':
machine.c:(.text+0x11c2): undefined reference to `MPI_Test'
> > ./../../bin/../lib/libconv-cplus-y.a(machine.o): In function `CmiAsyncBroadcastFn':
machine.c:(.text+0x1622): undefined reference to `MPI_Test'
./../../bin/../lib/libconv-cplus-y.a(machine.o): In function `CmiReleaseSentMessages': machine.c:(.text+0x2702): undefined reference to `MPI_Test'
./../../bin/../lib/libconv-cplus-y.a(machine.o): In function `PumpMsgs':
machine.c:(.text+0x28f2): undefined reference to `MPI_Iprobe'
machine.c:(.text+0x2942): undefined reference to `MPI_Get_count'
machine.c:(.text+0x2992): undefined reference to `MPI_Recv'
./../../bin/../lib/libconv-cplus-y.a(machine.o): In function `CmiAsyncMsgSent':
machine.c:(.text+0x2e52): undefined reference to `MPI_Test'
./../../bin/../lib/libconv-cplus-y.a(machine.o): In function `CmiBarrierZero':
machine.c:(.text+0x3182): undefined reference to `MPI_Recv'
machine.c:(.text+0x3232): undefined reference to `MPI_Send'
第 30 頁
../../../bin/../lib/libconv-cplus-y.a(machine.o): In function
CmiCpuTimer':
machine.c:(.text+0x32d2): undefined reference to `MPI_Wtime'
./../../bin/../lib/libconv-cplus-y.a(machine.o): In function `CmiWallTimer':
machine.c:(.text+0x3352): undefined reference to `MPI_Wtime'
./../../bin/../lib/libconv-cplus-y.a(machine.o): In function `CmiTimer':
machine.c:(.text+0x33d2): undefined reference to `MPI_Wtime'
./../../bin/../lib/libconv-cplus-y.a(machine.o): In function
因此不能在命令行中指定 icc。這個錯誤作者曾經(jīng)遇到過,是 charm++的編寫者給出的
這個解決方法。
完成后,如果看到如下字樣:
-------------------------------------------------
charm++ built successfully.
Next, try out a sample program like tests/charm++/simplearrayhello
就表明編譯成功!
§3.2.3 NAMD 編譯
編譯 NAMD 修改需要很多參數(shù),因為其默認的參數(shù)很多無法符合集群的要
求。
1. 首先要保證機器上必須有 C shell;
2. 指向 charm++。修改 NAMD_2.7_Source/Make.charm,將 CHARMBASE
一行改為:
CHARMBASE = .rootdir/charm-6.1.3
這里.rootdir 是一個指向安裝路徑的符號鏈接,在隨后的安裝中會自動生成。
3. 然后進入 NAMD_2.7_Source/arch,由于我們要編譯 MPI 版本,故根據(jù)機器的硬件架構(gòu)選擇 Linux-<architecture of the machine>-MPI.arch 文件,如本教程中使用 x86_64 架構(gòu),故打開 Linux-x86_64-MPI-icc.arch,將 CHARMACH
一行改為:
CHARMACH = mpi-linux-x86_64-smp
如果使用 gcc 編譯,則打開 Linux-x86_64-MPI-g++.arch 做相應修改。
第 31 頁
4. 給出 tcl 和 fftw 的庫的路徑。同樣根據(jù)機器選擇適當?shù)奈募,如本組機器,
打開 NAMD_2.7_Source/arch/Linux-x 86_64.tcl,將前幾行改為如下內(nèi)容:
TCLDIR=/usr
TCLINCL=-I$(TCLDIR)/include -I$(HOME)/tcl/include -I/usr/include/tcl8.4/
TCLLIB=-L$(TCLDIR)/lib -L$(HOME)/tcl/lib -ltcl8.4 -ldl
第一行給出了 tcl 庫所在的目錄,第二行最后的-I/usr/include/tcl8.4/同前;
第三行則給出了 tcl 庫的版本。
打開 NAMD_2.7_Source/arch/Linux-x86_64.fftw,修改第一行以給出 fftw
庫所在的位置:
FFTWDIR = /usr
如果讀者的 tcl 和 fftw 在別的位置,或者版本不同(比如讀者使用了 tcl8.5
或者使用 intel MKL 的 fftw 庫),則需要對上述選項做修改。這個可以由讀者自
己完成。
5. 編譯 NAMD。配置并編譯:
# ./config tcl fftw Linux-x86_64-MPI-icc
# cd Linux-x86_64-MPI-icc
# make
至此,NAMD 終于編譯完畢。
7. 移動 NAMD。在/usr/local/chemsoft 中建立 namd2.7/bin 文件夾,將生成的可執(zhí)行文件 namd2,psfgen,charmrun(位于 Linux-x86_64-MPI-icc 中)等移動到該文件夾里,這樣 namd 就可以為整個集群共享,現(xiàn)在就可以實現(xiàn)并行計算了。
§3.2.4 NAMD 運行
通過 PBS 腳本運行 NAMD 是很容易的事。對于并行運行的 NAMD, 可以
像腳本 2-6-1 那樣運行這個程序。
下面給出一個腳本的范例:
第 32 頁
腳本 3-2-1 NAMD 的作業(yè)提交腳本
#!/bin/sh
#PBS -l nodes=node023:ppn=8+node027:ppn=8
#PBS -q batch
#PBS -j oe
#PBS -N namd
cd /home/coolrainbow
/usr/local/mpitorque/bin/mpiexec /usr/local/chemsoft/namd2.7/namd2 ubq.conf > ubq.log
這個腳本比較好理解。
§3.3 Autodock 的安裝與配置
Autodock 是一個非常著名的分子對接程序?梢詮钠渚W(wǎng)站 http://autodock.
scripps.edu/上下載到其最新版本 4.2 的壓縮包 autodocksuite-4.2-src.tar.tar。 Autodock 的安裝十分容易。在主節(jié)點上建立文件夾/usr/local/chemsoft/
autocock4.2 以便于安裝軟件的執(zhí)行文件,然后依次執(zhí)行:
# tar -xvf autodocksuite-4.2-src.tar.tar
# cd autodocksuite-4.2
# cd autocock
# ./configure --prefix=/usr/local/chemsoft/autocock4.2
# make
# make install
# cd ../autogrid
# ./configure --prefix=/usr/local/chemsoft/autocock4.2
# make
# make install
安裝完畢。運行腳本也非常容易:
腳本 3-3-1 Autodock 的作業(yè)提交腳本
#!/bin/sh
#PBS -l nodes=1:ppn=8
#PBS -q parallel
#PBS -j oe
#PBS -N heme
cd /home/coolrainbown
/usr/local/chemsoft/autodock4.2/bin/autodock4 -p heme.dpf -l heme.dlg
這個編譯步驟非常典型,大部分 Linux 軟件的編譯都是
configure——make——make install
第 33 頁
這個流程。configure 中的一些選項在不同 Linux 軟件中意義都是一致的。比如,“--prefix”
都是設(shè)定安裝路徑的,“--help”都是顯示幫助信息的,“CC”設(shè)定 C 編譯器,“CXX”設(shè)定
C++編譯器,“COPT”設(shè)定 C 編譯器的選項,等等。建議讀者,拿到一個新的 Linux 軟件
時,首先尋找含有 README,INSTALL,GUIDE 字眼的文件,里面通常就有編譯的步驟,
然后./configure --help 查看一下需要注意的事項,然后 configure,make,make install。通
常,大部分 Linux 軟件都可以順利編譯了。
我們關(guān)于軟件編譯的東西就講到這。有些軟件,如 NWCHEM,GAMESS 等,它們的
編譯相當復雜(特別是生成高效的源碼),這里就不重復詳細的步驟了。網(wǎng)上有很多這方面的文章,比如,作者的博客(廣告 :P)。
§3.4 MKL 編程環(huán)境的構(gòu)建
前面已經(jīng)介紹了很多計算化學軟件的使用,如果還需要安裝其他的軟件可以
依照前面的經(jīng)驗通過軟件文檔和自己摸索完成。
Linux操作系統(tǒng)是一個非常適合進行開發(fā)工作的系統(tǒng),當需要自己編程完成
一些工作時,可以利用系統(tǒng)自帶的make,vi等完成,這些內(nèi)容可以參考相關(guān)的
技術(shù)文檔,本文不介紹。由于涉及到了intel編譯器,這里將MKL程序的鏈接方法
介紹以下。
作者曾經(jīng)在集群上開發(fā)過C,Fortran,Python和PHP+MySQL的程序(大多3000行以下),
深感結(jié)合make,vi,grep,awk,shell腳本等精巧而強大的工具,開發(fā)程序原來可以變得那
么簡單!這些操作在Windows下是無法想象的。
經(jīng)驗表明,第一次做MKL程序編譯時,大多數(shù)人都會走很多彎路,編譯幾
個小時也不成功。其實這個原因很簡單,就是:懶于閱讀技術(shù)文檔!事實上,作
者當時就是這樣,看到3000多頁的MKL手冊頭都大了,于是在編譯時就“跟著
感覺走”,弄得找不到庫或者函數(shù)錯誤。其實,花一個小時讀下文檔,絕對比自
己瞎折騰要強的多,這里把編譯MKL的一些經(jīng)驗與大家分享下,作為快速入門。
真正深入的話,還是那句:讀文檔!這里以Lapack庫的鏈接為例。
1. MKL的環(huán)境變量
安裝好MKL后,需要設(shè)置一些環(huán)境變量,這樣才能找到所需要的庫,這可以通過/opt/intel/Compiler/11.1/064/mkl/lib/tools/enviroments/mklvars {your-
第 34 頁
architecutre} .{sh|csh}實現(xiàn)。如果需要的話,可以加入到/etc/profile或你的.bashrc
中。在程序編譯或運行時,如果發(fā)生can not find libXXX之類,記得導出相應的
LD_LIBRARY_PATH。如:
can not find libmkl_intel_thread: cannot open shared object file ...
什么?不知道什么是LD_LIBRARY_PATH?Google it!
如果你的這個庫位于/opt/intel/Compiler/11.1/064/mkl/lib/em64t,那么執(zhí)行命令即可:
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/intel/Compiler/11.1/064/mkl/lib/ em64t
2. 函數(shù)選擇:Lapack
MKL提供了3000多頁的技術(shù)文檔,對每一個函數(shù)進行了詳細的介紹。這里
僅對Lapack系列做一些介紹。
初學Lapack的讀者可能會問:我怎么知道哪個函數(shù)是做向量點積的,哪個函
數(shù)是做奇異值分解的。問的最多的是:有沒有什么書可以參考的?答案:至少作
者沒見過哪個書像講MFC或PHP那樣詳細的把Lapack的每一個函數(shù)講解的書。那
么唯一的途徑就是閱讀技術(shù)文檔。不要頭疼,那個文檔沒有中文版的。好好學英
文吧。
Lapack中的函數(shù)的名稱都是XYYZZZ形式(BLAS類似)的,
X:精度。如s表示單精度(對應于Fortran中的real(kink = 4),C中的float)等。
YY:對應的矩陣類型和存儲方式。如:
ge:為一般的矩陣,存儲方式full。
所謂full就是說,矩陣A的元素aij以數(shù)組a(i, j)或a[i][j]的形式存儲于計算機中。
這是最簡單的方法,但是對稀疏矩陣或元素有一定相關(guān)性的矩陣效率較低
sy:對稱矩陣,以full方式存儲
sp:對稱矩陣,以pack方式存儲
pack方式對symmetric matrix采用了一維數(shù)組優(yōu)化存儲的方法,可以減小內(nèi)存
的使用。有兩種存儲方法,在Lapack程序中分別用'U' 'L'表示,對于“U”,簡單
的說:aij位于a(i+j*(j-1/2)當i <j時。“V”類似。
還有其他的類型,請參考技術(shù)文檔。
ZZZ:任務類型。就是你要干什么。如dot表示點積,trd表示三對角化等等
第 35 頁
知道了這個命名規(guī)則后,找函數(shù)就方便多了。
3. 函數(shù)參數(shù):Lapack
Lapack中的每一個函數(shù)都有很長的參數(shù),常常把初學者嚇倒。并不是說對矩
陣A,B求乘法,只要簡單的輸入A,B就可以了。還有一些輔助空間,任務類型
之類的,都要輸入,如矩陣乘法:
call dgemm('n','n',N,M,K,a,x,N,y,K,b,z,N)
執(zhí)行矩陣乘法z=xy,但還有一些character*1的'n','n'以及integer的N,K等等,這些含義一定要仔細弄清,不然可能會使任務執(zhí)行錯誤!
4. 編譯連接
這是最頭痛的問題。MKL的連接選項比較長,最好使用make工具,作者常用的一個模板如下:
腳本 3-4-4 MKL 程序編譯 Makefile 模板
mkllib=/opt/intel/Compiler/11.1/064/mkl/lib/em64t
mklinc=/opt/intel/Compiler/11.1/064/mkl/include
mkllnk= -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lmkl_lapack95_lp64 -liomp5 -lpthread foo: foo.o
ifort -o foo foo.o -I$(mklinc) -L$(mkllib) $(mkllnk)
在連接MKL程序時,要在每一個“LAYER”中選擇一個庫,
1. interface layer:提供程序接口,即libmkl_intel{lp64},其中lp64是對em64t
或ia64版本。
2. threading layer:線程接口。一般都是libmkl_intel_thread。注意,有了它
后,一定要加上iomp5和pthread庫,不然會出現(xiàn)連接錯誤。
3. computational layer,計算接口,即libmkl_core和你所需要的,如lapack的libmkl_lapack95_lp64或者線性方程組的libmkl_solver_lp64等等。
4. RTL接口,即pthread等等。
這樣才可以連接成功。
看一個實例:
現(xiàn)在以一個實例完成。想算一個矩陣乘法,矩陣用雙精度,一般存儲模式,
則選用dge???函數(shù),查文檔得知?gemm做矩陣乘法,于是選用dgemm,這個算矩
陣乘法的程序代碼見腳本3-4-2,編譯用的Makefile見腳本3-4-3。
編譯完成后,一個叫foo的可執(zhí)行文件出現(xiàn)了。它將會調(diào)用MKL運行矩陣乘
第 36 頁
法程序。
腳本 3-4-2 MKL 程序?qū)嵗?/FONT>
! foo.f90 program main
integer,parameter::N=3000 integer,parameter::M=2000 integer,parameter::K=4000 real(kind=8) a,b real(kind=8),pointer::x(:,:) real(kind=8),pointer::y(:,:) real(kind=8),pointer::z(:,:)
a=1.0
b=0.0
allocate(x(N,K))
allocate(y(K,M))
allocate(z(N,M))
x=10.0
y=20.0
z=0.0
write (*,*) "Performing matrix multiplication by MKL..."
call dgemm('n','n',N,M,K,a,x,N,y,K,b,z,N)
write (*,*) "DONE!"
deallocate(x)
deallocate(y)
deallocate(z)
end
腳本 3-4-3 腳本 3-4-2 的 Makefile 模板
mkllib=/opt/intel/Compiler/11.1/064/mkl/lib/em64t
mklinc=/opt/intel/Compiler/11.1/064/mkl/include
mkllnk= -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lmkl_lapack95_lp64 -liomp5 -lpthread foo: foo.o
ifort -o foo foo.o -I$(mklinc) -L$(mkllib) $(mkllnk)
foo.o: foo.f90
ifort foo.f90 -c -g
至此,整個計算化學平臺已經(jīng)搭建完畢,已經(jīng)可以投入使用。下面將討論一些與集群相關(guān)的管理技巧。
第 37 頁
第四章 集群的管理技巧
§4.1 用戶管理
§4.1.1 用戶權(quán)限
讀者建立的集群可能要給組里的所有人使用,也許是兩三個人,也許是二三
十個人。對于這種規(guī)格的集群,在建立用戶時候,一定要有條理,對每個用戶的
權(quán)限都要把握適當,不然,不僅會使集群混亂,管理不便,而且有可能破壞集群,
甚至帶來法律問題。
例如,如果讀者的組里有 VASP,則每個用戶對 VASP 的權(quán)限要嚴格控制。如果用戶不再 VASP 的使用者列表上而具有 VASP 的運行權(quán)限,則可能給讀者的組里惹來麻煩。
下面討論一下集群用戶建立的經(jīng)驗。
1. 用戶名的設(shè)置一定要有條理。在作者本組的集群中,除了 root 和一個普通管理帳戶外,所有使用者一律以“userXX”命名(如 user01,user02 等)。當
然,如果讀者想使用別的命名原則也可以。
2. 設(shè)置好適當?shù)慕M。有些軟件對組的要求是必須的,如 Gaussian,必須要有一個組專門運行 Gaussian。另外有些組的設(shè)置與集群的權(quán)限有關(guān)。比如有的用
戶只允許發(fā)實驗性的小作業(yè)(如最多連續(xù)運行 1 個 CPU 小時),而有的用戶允許
運行大型作業(yè)(如連續(xù)幾天的大作業(yè)),可以分別設(shè)置兩個組 trail 和 large,并對
Torque 進行設(shè)置,這樣就可以對不同用戶做精確的權(quán)限限制。
注意每個用戶可以同時加入很多組。
§4.1.2 高效的管理
對于前面提到的 coolrainbow,它的各種通信都已經(jīng)設(shè)計完備,這些東西的
實現(xiàn)是通過其家目錄下的文件夾.ssh 實現(xiàn),并且,由于 coolrainbow 已經(jīng)與所有
的節(jié)點進行過通信(這只要在各個節(jié)點上 ssh 本機即可實現(xiàn)),它
的.ssh/knownhost 里已經(jīng)記載了全部信任主機的主機名,即通信時不會再詢問
第 38 頁
“Are you sure you want to continue connecting (yes/no)?”這樣的問題。而且,
由于所有的用戶都將使用計算軟件,故將 coolrainbow 的 PBS 腳本(如
g03_submit.pbs 等)給所有用戶共享也是個不錯的選擇。因此,如果在建立新
用戶時能夠?qū)⑼ㄐ盼募湍_本文件自動加到新用戶的家目錄下,就可以大大提高
工作效率。
這十分容易實現(xiàn)。/etc/skel 文件夾是個系統(tǒng)文件夾,新用戶建立時 skel 里的
所有文件會自動拷貝到新用戶的家目錄下。因此,可將/home/coolrainbow 下
的.ssh,*.pbs 全部拷貝到 skel 目錄下,新用戶建立后便可直接實現(xiàn)無密碼 SSH
通信并且自動獲得大量腳本,省去了許多配置。
當然,添加完新用戶后,一定要在/var/yp 下 make 一下,以更新 NIS 數(shù)據(jù)
庫。同時還要設(shè)置其 group。這一系列工作可以通過一個 shell 腳本即腳本 4-1-1 實現(xiàn):
腳本 4-1-1 集群添加用戶的腳本
#!/bin/sh
username = $1
password = $2
useradd -m $username
echo $username:$password | chpasswd
cd /var/yp
make
假設(shè)這個腳本叫 useradd2cluster,要添加一個名為 user01、密碼為 123456 的用戶,只要執(zhí)行:
# ./useradd2cluster user01 123456
當集群需要批量添加用戶時,可以用循環(huán)的方式執(zhí)行上述腳本。
刪除用戶非常簡單,例如要刪除 user01 及其家目錄下的所有文件:
# usedel -r user01
# cd /var/yp
# make
§4.2 作業(yè)管理
Torque 的作業(yè)管理是以“隊列”的形式實現(xiàn)的。一個隊列是指具有某種權(quán)限
的用戶的集合。例如,可以設(shè)置一個 big32 的隊列,凡是這個隊列的用戶可以最
多同時用 32 個 CPU;而一個 trail 隊列的用戶只能用 1 個 CPU 最多算一個小時。
第 39 頁
作業(yè)的管理分為管理員和普通用戶管理兩部分。
§4.2.1 管理員管理
這里的管理員即可以是 root,也可以是配置過程中的配置的普通用戶管理員。管理員通常不提交作業(yè),只用來管理。
1. 管理隊列
集群建立后,用戶要想通過 Torque 提交作業(yè),必須以一定的隊列的身份提
交。Torque 在安裝時已經(jīng)創(chuàng)建了一個默認隊列 batch,要創(chuàng)建一個新隊列,需要
使用 qmgr 命令行提交一系列命令,可以創(chuàng)建一個 shell 腳本來實現(xiàn)這個功能,
這個腳本中,“qmgr -c”表示要調(diào)用 Torque 的 qmgr 命令進行工作,第四行
用表示創(chuàng)建一個名為 queue_name 變量值的隊列,剩下的每一行“set queue”
分別代表設(shè)定隊列的某一種屬性。以后再添加新隊列的時候,只要修改相應的隊
列的屬性值即可。常見屬性的含義見表 4-2-1。
2. 管理服務器端
Torque 安裝完成后,服務器端的默認配置基本能滿足要求。要修改可以采用
命令格式為“qmgr -c “set server attribute = values””,重要的內(nèi)容可以參見表
4-2-2。
3. prologue 和 epilogue 文件
這兩個文件夾位于/var/spool/torque/mom_priv 內(nèi),它們都是一般的 shell 腳
本,只能由管理員修改,它們分別在 PBS 腳本之前和之后執(zhí)行,在本集群的設(shè)
計中用來添加一些對作業(yè)的提示,這些東西輸入到作業(yè)的結(jié)束文件中如
gaussian.o112 中。
這兩個文件在執(zhí)行時,系統(tǒng)將會自動為其添加一寫命令行參數(shù),這些命令行
參數(shù)的意義可以參見表 4-2-3。
下面給出本集群中使用的 prologue 和 epilogue 文件。它要在所有的客戶端
的/var/spool/torque/mom_priv 中添加,權(quán)限為 755,可以參見腳本 4-2-2 和腳本
4-2-3。
第 40 頁
腳本 4-2-1 建立隊列的 shell 腳本
#!/bin/sh
queue_name="paralle"
# Then you can modify the following items. qmgr -c "create queue $queue_name "
qmgr -c "set queue $queue_name queue_type = Execution" qmgr -c "set queue $queue_name Priority = 70"
qmgr -c "set queue $queue_name max_running = 8"
qmgr -c "set queue $queue_name resources_max.cput = 5000:00:00" qmgr -c "set queue $queue_name resources_min.cput = 00:00:01" qmgr -c "set queue $queue_name resources_default.cput = 5000:00:00" qmgr -c "set queue $queue_name resources_default.walltime = 5000:00:00" qmgr -c "set queue $queue_name max_user_run = 8"
qmgr -c "set queue $queue_name keep_completed = 0" qmgr -c "set queue $queue_name enabled = True" qmgr -c "set queue $queue_name started = True"
表 4-2-1 隊列常用屬性及其含義
屬性值 |
含義 |
|
|
queue_type |
隊列類型,一般為 execution(執(zhí)行) |
Prioty |
作業(yè)優(yōu)先級 |
max_running |
做多提交作業(yè)數(shù) |
resources_max.cput |
允許最大占用資源 |
resources_min.cput |
最小使用資源 |
resources_default.cput |
默認分配資源 |
resources_default.walltime |
默認作業(yè)最長時間 |
max_user_run |
每個用戶最多運行的作業(yè)數(shù) |
keep_completed |
完成后,查詢?nèi)蝿諘r延遲的時間 |
enabled |
隊列是否可用 |
started |
隊列是否啟動 |
表 4-2-2 服務器端管理常用屬性及其含義
屬性值 含義
default_queue 默認的隊列
max_running 同時最多運行的作業(yè)數(shù) max_user_run 每個用戶最多運行的作業(yè)數(shù) query_other_jobs 允許用戶查詢其他用戶的作業(yè)
表 4-2-3 prologue 和 epilogue 文件的名令行參數(shù)含義
參數(shù) 含義
$1 任務號
$2 用戶名
第 41 頁
$3 |
用戶組名 |
$4 |
任務名 |
$5 |
活動號 |
$6 |
請求資源清單 |
$7 |
用過的資源清單 |
$8 |
隊列 |
腳本 4-2-2 prologue 腳本示例
#!/bin/sh
echo "Job ID: $1"
echo "Job username: $2"
echo "Job group: $3"
echo
echo "The job begins at `date`"
exit 0
腳本 4-2-3 epilogue 腳本示例
#!/bin/sh
echo "The job ends at `date`"
echo -n "Nodes for use are: "
for i in $(sort /var/spool/torque/aux/$1 | uniq)
do
echo -n "$i " |
|
done |
|
echo -e "\nJob ID: |
$1" |
echo "Job username: |
$2" |
echo "Job group: |
$3" |
echo "Job name: |
$4" |
echo "Job session: |
$5" |
echo "Job queue: |
$8" |
echo "Request Resource: |
$6" |
echo "Available Resource: |
$7" |
exit 0 |
|
運行這個腳本后,任務的結(jié)束報告單上會打印出類似下面的字樣:
Job ID: 168.compuchem
Job username: user02
Job group: user02
The job begins at Tue May 12 14:43:33 EDT 2011 <<<…用戶軟件的輸出(實際為 stdout 的重定位)…>>> The job ends at Tue May 12 14:43:35 EDT 2011
第 42 頁
|
第四章 集群的管理技巧 |
|
|
Nodes for use are: |
node022 |
Job ID: |
168.compuchem |
Job username: |
user02 |
Job group: |
user02 |
Job name: |
H2 |
Job session: |
2874 |
Job queue: |
parallel |
Request Resource: cput=5000:00:00, neednodes=1: ppn=8, nodes=1: ppn=8, walltime=5000:00:00
Available Resource: cput=00:00:00,mem=0kb,vmem=0kb,walltime=00:00:02
這對管理作業(yè)非常有幫助。
管理員還可以刪除用戶的作業(yè),見下節(jié)。
§4.2.2 普通用戶管理
普通用戶的管理任務比較簡單,常用的只有三個:
1. 提交作業(yè):qsub
最簡單的例子,提交一個 PBS 腳本(普通用戶):
$ qsub submit.pbs
以腳本 2-6-2 為例,最重要的幾個參數(shù)如下:
#PBS -l nodes=node023:ppn=8+node027:ppn=8
這是表明要使用節(jié)點的個數(shù)及每個節(jié)點所要使用的 CPU 數(shù)。通過下面的表 4-2-4 說明它的用法。
表 4-2-4 Torque 的資源分配方法舉例
nodes=3:ppn=4 |
Torque將給本作業(yè)分配3個節(jié)點(由Torque自動選擇), |
|
每個節(jié)點使用4個CPU。3個節(jié)點將有Torque自動選擇。 |
|
|
|
nodes=node021:ppn=8+node025 |
Torque將給本作業(yè)分配到節(jié)點node021和node025,分別 |
|
:ppn=8 |
使用8個CPU。 |
|
#PBS -q batch
表示用戶要提交的隊列,這里是“batch”。
#PBS -N first_task
表示用戶的作業(yè)名稱,這里是“first_task”。它不能以數(shù)字開頭。這個名稱
最好具有一定的意義以便于識別。
其它的選項較少用,就不提了。
2. 查看作業(yè):qstat
這個選項比較豐富。直接查看作業(yè)可以:
第 43 頁
$ qstat
則會顯示當前正在運行和排隊的作業(yè):
Job id Name User Time Use S Queue
------------------------------- -------------------------- ------------------------------ ----- --------
57.compuchem |
pc2-I |
user03 |
32:17:33 |
R |
parallel |
64.compuchem |
graphite_hf_opt |
user02 |
7:45:49 |
R |
parallel |
從左到右依次為作業(yè)號、作業(yè)名、提交作業(yè)的用戶、作業(yè)已消耗的時間、作
業(yè)狀態(tài)、作業(yè)所屬隊列。對于狀態(tài),R 表示正在運行,Q 表示等待排隊中。
加上參數(shù)-n 則可以顯示作業(yè)占用資源的詳細情況。
$ qstat -n
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
----------------------------------------------------------------------------------------------------------------
57.compuchem user03 parallel pc2-I 15995 1 -- -- 5000: R 32:46 node023/7+node023/6+node023/5+node023/4+node023/3+node023/2+node023/1 +node023/0
64.compuchem user02 parallel graphite_hf_opt 6359 1 -- -- 5000: R 7:15 node026/7+node026/6+node026/5+node026/4+node026/3+node026/2+node026/1 +node026/0
3. 刪除作業(yè):qdel
例如要刪除作業(yè)號為 123 的作業(yè),只需:
$ qdel 123
可以同時刪除多個作業(yè)。如要刪除作業(yè)號為 97、98 兩個作業(yè),可以:
$ qdel 97 98
一般用戶只能刪除自己的作業(yè),管理員則可以刪除所有人的作業(yè)。
第 44 頁
第五章 GPU 在集群上的應用
§5.1 GPU/CUDA 的安裝配置
GPU計算是現(xiàn)代計算機發(fā)展的一個非常有趣的新方向。它利用GPU中超大規(guī)
模的計算單元來優(yōu)化科學領(lǐng)域中的計算任務,F(xiàn)在,這個領(lǐng)域一直在蓬勃發(fā)展,
蒸蒸日上。很多最新的超級計算機,如天河一號,都在硬件中加入了GPU以提高
速度。至2011年5月,大量的分子動力學軟件,如Gromacs,NAMD等,和量子
化學軟件TeraChem都已經(jīng)提供了GPU計算的功能。因此,本教程在最后有必要
提供一些與GPU和CUDA配置有關(guān)的東西。
這里,將以GeForce GTX 460為例進行安裝。
§5.1.1 驅(qū)動程序的安裝
讀者有了GPU的硬件后,需要將其配置在操作系統(tǒng)中。Linux(這里是Debian)必須事先裝好圖形界面。
其實也可以不裝,但是這樣的話實現(xiàn)方法就會變相當麻煩,這里就不講了。
GPU安裝非常容易。要安裝GPU的驅(qū)動,首先停止掉X,然后在nVIDIA的官
網(wǎng)下載其驅(qū)動devdriver_3.2_linux_64_260.19.21.run,執(zhí)行即可。不用重啟,執(zhí)
行startx就可以看到新的圖形界面?梢栽Linux的菜單System/Preference/中可以
找到nVIDIA的配置菜單,見圖5-1-1。
§5.1.2 程序開發(fā)環(huán)境
要利用GPU進行計算和編程,還需要安裝toolkit和SDK,它們的安裝非常簡
單,在nVIDIA的官方網(wǎng)站可以下載到符合系統(tǒng)名稱的文件,直接安裝即可。
我們的系統(tǒng)是Debian,在nVIDIA下沒有專門適應Debian的,我們選擇Ubuntu
的即可,安裝文件為:cudatoolkit_3.2.16_linux_64_ubuntu10.04.run和gpucom putingsdk_3.2.16_linux.run。這兩個文件直接執(zhí)行,即可,一般不會有什么錯誤。
圖5-1-1 GPU驅(qū)動程序安裝成功效果圖
§5.1.3 CUDA 編程測試
CUDA編程所需的編譯器命令為nvcc,我們通過一個程序來調(diào)試一下,見腳
本5-1-1。這個腳本的功能是計算機器中GPU硬件的數(shù)量,并列出每一個GPU的
名稱。這個程序命名為firstcuda.cu,編譯:
$ nvcc firstcuda.cu -o firstcuda
如果編譯無誤,執(zhí)行后輸出為:
There are 1 devices supporting CUDA!
Device 1: "GeForce GTX 460"
§5.2 NAMD CUDA 版本的安裝
NAMD2.7增加了對CUDA的支持。這里講一下NAMD CUDA版的編譯方法。
其實和§3.2的步驟類似,但是要注意:在CUDA 3.0版本之前,NAMD CUDA
版本不能用intel編譯器編譯,因為nVIDIA在Linux下目前只支持gcc,不支持icc。
作者的經(jīng)驗表明,如果用icc編譯,可以通過,但是運行NAMD后會出現(xiàn)一些莫
名奇妙的內(nèi)存訪問錯誤,如Signal: segmentation violation。而且在編譯與CUDA
相關(guān)的文件時候,可能會有成員函數(shù)不識別的情況。
如果讀者拿到這份文檔時,nVIDIA和intel公司已經(jīng)達成了合作,那么,沒準CUDA版的NAMD就可以用intel編譯器順利編了。
腳本 5-1-5 CUDA 程序示例
/ firstcuda.cu #include <stdio.h> #include <stdlib.h>
#include <cuda_runtime_api.h>
int main(int argc, char** argv)
{
int count;
int i;
cudaDeviceProp devprop;
if(cudaGetDeviceCount(&count) != cudaSuccess)
{
printf("Error: CUDA test failed!\n");
exit(1);
}
printf("There are %d devices supporting CUDA!\n", count);
for(i = 0; i < count; i++)
{
if(cudaGetDeviceProperties(&devprop, i) == cudaSuccess)
printf("Device %d: \"%s\"\n", count, devprop.name)
else
{
printf("Error: Get CUDA properties failed!\n");
exit(1);
}
}
return 0;
}
如果要編譯CUDA,只要修改相應的arch/Linux-<your arch>.cuda即可,將CUDADIR改成你安裝CUDA的路徑。特別注意
LIBCUDARTSO=libcudart.so.2
這一行,如果你安裝的是CUDA3,需要把它改成
LIBCUDARTSO=libcudart.so.3
如果是CUDA4,自然要改成LIBCUDARTSO=libcudart.so.4。
然后在文件夾下,選擇編譯選項:
# ./config tcl fftw --with-cuda Linux-x86_64-g++-cuda
就可以編譯了。
NAMD的CUDA和MPI并行是不矛盾的。執(zhí)行NAMD-CUDA,需要對namd2
后面加上一些參數(shù):+idlepoll以及+devices 0(如果讀者有多個GPU)等等。如
腳本3-2-1的第7行改為:
/usr/local/mpitorque/bin/mpiexec /usr/local/chemsoft/namd2.7/namd2 +idlepoll ubq.conf > ubq.log
好了,我們的集群成功的使用了GPU加速!根據(jù)作者的實驗表明,一個GPU至少相當于12個CPU(比如,12個2.83GHz的Q9550)的速度!
繼續(xù)前進!
如果讀者在教程中還有不清楚的地方,可以參考一下資料。
一些與科學計算集群有關(guān)的網(wǎng)站:
大名鼎鼎的China Unix:
中國集群網(wǎng),formal的信息:
Debian Cluster,專門介紹以Debian為基礎(chǔ)的集群構(gòu)建:
小木蟲論壇的計算模擬版,有一些與計算軟件配置的信息:
作者博客:
以及兩個你應該時刻不離手的:
一些科學計算集群相關(guān)的書籍。
一本非常實用的書籍,講集群組建技術(shù)的:
車靜光. 微機集群組建、優(yōu)化和管理. 北京:機械工業(yè)出版社,2004.
MIT出的一本介紹集群的非常全面的書,從硬件,軟件配置到MPI編程都有
所介紹:
Thomas Sterling. Beowulf Cluster Computing with Linux. MIT Press. 2001.
第 49 頁
到此,一個功能完整的集群就建立完畢了。
讀者也可以歇口氣了。我們這個山寨,便宜,精巧的集群已經(jīng)具備了一個一
般集群所有的性質(zhì)。當然,這里沒有介紹集群的更高級技術(shù),比如專業(yè)的集群會
使用專門的文件系統(tǒng)如Lustre,專業(yè)的作業(yè)調(diào)度軟件Slurm,高級的網(wǎng)絡如
InfiniBand等,某些IP轉(zhuǎn)發(fā)、虛擬主機等技術(shù)也會應用。本教程只是起到了一個
入門的作用。好吧,如果讀者有興趣繼續(xù)研究集群,那么就來研究這些更高級的
技術(shù)吧!加油! |