我在前面兩篇部落格中簡要介紹了為什麼要平行計算以及mpi的一些學習心得,接下來我們正式開始mpi的學習之路。我們知道mpi是分布式記憶體程式設計,所以這篇部落格會詳細講解mpi集群環境的搭建過程。
選擇linux版本:這裡我選擇的是ubuntu14.04,其他linux版本如centos、fedora等操作類似,一些命令和配置檔案路徑會有一些差別。
物理伺服器集群和虛擬節點擊擇:我是用vmware建立多個虛擬機器來進行集群模擬,後期我會把環境部署到實驗室的伺服器集群上,基本操作應該是一樣的,如果有需要注意的地方,我會在後續的部落格中進行說明。
在vmware中安裝ubuntu14.04,實驗模擬安裝兩個節點即可。建議初始設定時使用者名稱取一樣的,因為後面每個虛擬機器節點之間免密登入時需要保證使用者名稱一致,這樣可以避免出現未知的問題。
上圖是我vmware的一些資料夾的命名,受電腦配置限制,我建立了兩個節點,如圖左邊所示,節點名稱是node1和node2。我將mpich-3.2.tar.gz壓縮包放在了mpi_install路徑下,mpi_share是節點之間的共享目錄,後面會說明。
首先,解壓mpich-3.2.tar.gz:tar -zxvf ./mpich-3.2.tar.gz。
解壓後的資料夾中有個readme檔案,開啟後有詳細的安裝步驟,這裡我簡要說明:
安裝結束後,用which mpicc和which mpiexec檢查安裝是否成功,如果有這兩個可執行程式的路徑顯示,則表示安裝成功。注意:如果自行選擇安裝路徑的話,記得設定環境變數,具體readme文件中有詳細說明。這裡希望大家注意乙個問題,如果設定環境變數的話,~/.bashrc配置檔案下的環境變數和切換sudo執行時的環境變數不同,sudo執行時會找不到命令。關於配置檔案的介紹,可以參考下面文章:linux環境變數配置檔案區別。
在每個節點中安裝mpich,方法同上。建議每個節點中安裝路徑相同,統一命名(雖然安在不同的位置也可以,只要保證找到執行命令即可,但為了後期開發方便以及賞心悅目的原則,我們還是專業一點好)。
1.網路環境配置(網路搭建和ip位址設定)
分別配置兩台機器的hosts檔案,在此之前先通過ip addr show或ifconfig命令檢視兩台機器的ip位址,我的ip位址為:
node1:192.168.36.145
node2:192.168.36.146
然後修改hosts檔案:
sudo gedit /etc/hosts
192.168.36.146 node2
此時,兩個節點間應該可以互相ping通(node1 ping node2)。
注意:虛擬機器中每個機器的ip會自動分配發生變化,我們可以手動設定為固定ip(ubuntu可以參考以下文章:ubuntu固定ip)。
2.ssh免密登入
(1)在每個節點安裝ssh服務(遠端登入服務):sudo apt-get install ssh(有些版本ubuntu安裝過程中可能會出現問題,安裝錯誤提示一步一步搜尋即可解決問題)。
(2)各節點生成私鑰和公鑰
ssh-keygen -t rsa// 生成的鑰匙檔案在 ~/.ssh/下,其他linux版本如centos路徑會有所不同
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys//認證(執行該步後可以保證本機免密登入,使用ssh node1進行測試)
(3)把各子節點的 id_rsa.pub 傳到主節點
scp id_rsa.pub lw@node1:~/.ssh/id_rsa.pub.node2(這裡我們把node1看作主節點,將node2節點的鑰匙檔案傳到node1上)
(4)在主節點上操作
cat ~/.ssh/id_rsa.pub.node2 >> ~/.ssh/authorized_keys//認證
scp authorized_keys lw@node2:~/.ssh/authorized_keys//將認證檔案傳回每個子節點
(5)驗證無密碼登入
在node1節點上執行:ssh node2
關於ssh免密登入談談我的個人理解:因為mpi是分布式記憶體程式設計,在後面的開發中涉及節點間資訊的傳遞,往往資料和程式是在乙個節點上,所以需要保證執行命令時各節點之間資訊的交換。設定ssh免密登入可以免去操作中密碼的輸入。各節點生成私鑰和公鑰後需要認證,此時可以保證本機免密登入。將各個子節點的公鑰檔案傳送給主節點,然後分別加入到主節點的認證檔案中,此時可以保證主節點對各個子節點的免密登入。最後將認證檔案傳回到每個子節點,從而保證各個子節點對其他節點之間的免密登入。
(1)新建配置檔案:
在home根目錄(也可以是其他目錄)下新建乙個檔案:mpi_config_file。mpi_config_file是在執行mpi程式時參考的配置檔案,它顯式註明每台機器各有幾個cpu核。
編輯mpi_config_file(這個檔案在後面執行程式時會作為引數包括在命令中):
sudo gedit mpi_config_file
因為我主機是8核且每台虛擬機器分配了四核,所以在mpi_config_file中輸入以下內容並儲存:
node1:4
node2:4
(2)編寫mpi程式:
這裡我們選取案例程式進行測試,在我們之前解壓的mpich-3.2資料夾下的examples目錄下就有現成的可執行程式cpi,我們執行它即可。
(3)執行可執行程式:
將可執行檔案cpi複製到共享目錄/home/mpi_share/中,保證每個節點都可以訪問該可執行檔案(如果不安裝nfs服務的話,需要將可執行檔案放到每台機器的相同目錄下)。
切換到共享目錄:cd /home/mpi_share/
執行指令:mpiexec -n 8 -f /home/mpi_config_file ./cpi(mpiexec 表示執行該mpi程式,-n 8表示開8個程序,引數-f /home/mpi_config_file 表示執行過程參考配置檔案mpi_config_file,./cpi是當前目錄下的執行檔名)。執行成功後結果如下:
lw@node1:/home/mpi_share$mpiexec -n 8 -f /home/mpi_config_file ./cpi
process 2 of 8 is on node2
process 5 of 8 is on node1
process 7 of 8 is on node2
process 4 of 8 is on node1
process 3 of 8 is on node2
process 1 of 8 is on node1
process 6 of 8 is on node2
process 0 of 8 is on node1
Ubuntu下MPI集群環境的搭建
我們要並行地跑mpi程式,需要將幾台計算機連在一塊,搭建成乙個集群,使得相互之間的訊息傳遞沒有阻礙,下面以ubuntu系統為例,談mpi集群環境的搭建過程。ubuntu和mpich的安裝 安裝ssh,設定ssh免密登入 設定ssh免密登入的基本原理就是在我們系統的 ssh 資料夾下生成乙個公鑰檔案i...
MPI集群搭建指南
由於有時需要使用到mpi集群來進行迭代運算,就嘗試著自己去搭建著mpi集群。不過這也是到去年工作的事情了。我現在憑我的記憶去把它回憶出來。從零開始,搭建mpi集群是一件很費周折的事情。mpi是一種程式設計模型,業界有很多種實現,其中開源版本就有好幾個版本。對比過openfabrics公司提供的ofe...
Python 分布式 MPI集群環境搭建
因為我主機是8核且每台虛擬機器分配了四核,所以在mpi config file中輸入以下內容並儲存 node1 4 node2 4 寫乙個指令碼hello mpi.py,裡面包含以下 from mpi4py import mpi print hello world end comm mpi.comm...