1. 程式人生 > >Ubuntu下MPI叢集環境的搭建

Ubuntu下MPI叢集環境的搭建

Ubuntu下MPI叢集環境的搭建

我們要並行地跑MPI程式,需要將幾臺計算機連在一塊,搭建成一個叢集,使得相互之間的訊息傳遞沒有阻礙,下面以Ubuntu系統為例,談MPI叢集環境的搭建過程。

Ubuntu和MPICH的安裝

Ubuntu的安裝可以說是傻瓜式的,可以在windows下通過虛擬機器安裝,也可以直接安裝到本機(可以使雙系統),建議雙系統。
mpich的安裝在有網的情況下,可以使用sudo apt-get install mpich進行安裝。為了後期不出現問題,以及有足夠的例子可以測試,建議自己去官網下載個壓縮包,解壓安裝,詳見這篇文章

安裝SSH,設定ssh免密登入

設定ssh免密登入的基本原理就是在我們系統的~/.ssh/資料夾下生成一個公鑰檔案id_rsa.pub ,以及利用公鑰檔案(自己的和別人的),做成一個私鑰檔案authorized_keys,散發給每個使用者。所謂的公鑰,相當於自家系統的一個身份標識,是公開的。所謂的私鑰,相當於一個認證檔案,本質上書寫了允許哪些機器對你進行免密訪問。簡單一點理解,當別人訪問你時,你得拿出你的私鑰,看看別人的公鑰是不是寫在你的私鑰中,如果是,那麼它就可以免密登入。反之,當你訪問別人時,你得拿出你的公鑰,看看是不是獲得了別人的認可。事實上,這個過程還比較曲折,如下圖所示(以A登入B為例):
在這裡插入圖片描述

具體操作如下:

  • 給區域網中所有的節點ip配置別名:通過ifconfig
    檢視本機ip,通過sudo vim /etc/hosts 修改hosts檔案,所有機器的hosts檔案均新增以下內容,其中的ip是各機器通過ifconfig查到的ip。
192.168.36.145 node1 
192.168.36.146 node2 
  • 通過ping node1的方式確認別的機器可以ping通。

  • 各節點安裝ssh服務(遠端登入服務):sudo apt-get install ssh

  • 各節點生成公鑰和私鑰:
    1、ssh-keygen -t rsa // 生成的鑰匙檔案在 ~/.ssh/下。
    2、cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys

    ,認證,使計算機對自己可以免密登入。認證後,使用形如ssh 賬戶名@node1方式進行測試,這裡的node1指的是自己的節點編號。

cat file1 >> file2,這個命令,是說,把 file1 的內容拿出來,放到 file2裡面,如果file2存在,就加到其末尾;如果不存在,就建立。

  • 在一個節點上製作對局域網裡所有節點都給予認證的私鑰檔案,並分發給每個節點。
    1、通過scp id_rsa.pub 賬戶名@node1:~/.ssh/id_rsa.pub.node2的方式,將每個節點上的公鑰檔案,傳到一個節點上。這裡的scp的用法,和cp用法是一樣的,只不過目標路徑前要加上賬戶名@node1,這裡表示將node2的公鑰傳到node1上,並重命名為id_rsa.pub.node2,重新命名是為了不覆蓋原來的node1的公鑰。
    2、在主節點(不妨是node1)上通過別人傳過來的公鑰,製作完整的私鑰檔案(認證)。這裡以node2作為一個例子,將node2的公鑰傳到node1,加入到認證檔案,再將認證檔案傳回node2。
cat ~/.ssh/id_rsa.pub.node2 >> ~/.ssh/authorized_keys//公鑰加入到認證檔案 
scp authorized_keys 節點2賬戶名@node2:~/.ssh/authorized_keys//將認證檔案傳回每個子節點

這步如果發現搞錯了,比如別人傳過來的公鑰檔案忘記重新命名,把自己的覆蓋了,而自己的還沒來得及備份,可以刪光了.ssh下的檔案重新做這一步。不需要重新安裝ssh,注意使用ssh-add命令。

設定SSH免密登入可以免去操作中密碼的輸入,避免在命令執行時,因密碼問題造成的通訊障礙。上面是用rsa演算法的公鑰/私鑰對,當然也可以用dsa(對應的檔案是id_dsa,id_dsa.pub)。

設定NFS共享目錄

在執行MPI程式的過程中,我們需要在每個節點上將.c檔案進行編譯連結成可執行.o檔案,在這之後,才能在主節點上開啟執行MPI並行程式。這個過程中,首先需要保證每個節點在相同目錄中都生成可執行檔案,我們可以在每個節點上單獨編譯,該操作方式比較繁瑣,為解決該問題,我們可以採用建立共享目錄的方案。所謂的共享目錄,就是設定一個相同路徑的目錄,任意節點在該目錄下新增檔案、刪除檔案等,都會同步到其他節點上。具體操作如下:

  • 每臺機子都登入相同名字的一個賬戶,不妨叫做user1。如果沒有user1,可以新建一個user1,我的建議是直接將當前賬戶的名稱修改成user1,這樣可以省不少事。不少新手總是忘記了這一點,給後續的工作造成了不少麻煩。打三個感嘆號,一定要修改成相同的使用者名稱。具體可以參見看更改使用者名稱部分,主機名先不改
  • 在所有的節點都建立相同的一個目錄,譬如:mkdir /home/mpi_share。如果下面的過程中出現問題,有可能是使用者對mpi_share資料夾許可權不夠,可以使用chmod命令加點許可權。
  • 安裝NFS以及相關的依賴:
sudo apt-get install nfs-kernel-server
sudo apt-get install portmap或者rpcbind
  • 選取一個節點作為伺服器,不妨為node1,其他節點為NFS客戶端。其他節點為NFS客戶端。修改主節點exports檔案,sudo gedit /etc/exports,開啟檔案後,在檔案的最後附上所有同步的客戶端的虛擬機器的ip和許可權,如下:
/home/mpi_share 192.168.36.145(rw,sync,no_root_squash,no_subtree_check) 
/home/mpi_share 192.168.36.146(rw,sync,no_root_squash,no_subtree_check) 

注意,這裡的ip地址後是沒有空格的。其中/home/mpi_share是共享目錄,ip地址是所有的客戶端(其它節點)的地址,包括本機的,後面括號中的是許可權,具體含義可上網查閱(rw即讀寫許可權)

  • 重啟NFS使用如下命令:sudo /etc/init.d/nfs-kernel-server restart

  • 配置其它NFS客戶端,使其能共享NFS伺服器的共享目錄:sudo mount -t nfs 192.168.36.145:/home/mpi_share /home/mpi_share,ip為主節點地址,冒號後跟的是主節點共享目錄,最後的路徑是該節點的共享目錄。這裡的mount就是用來掛載目錄的命令。如果掛載不成功,可以檢查一下網路。

每次節點啟動時都需重新執行掛載命令,如果想開機自動掛載:把上述指令sudo mount -t nfs 192.168.36.145:/home/mpi_share /home/mpi_share 寫到 /etc/rc.local 檔案中。

  • 測試:在主節點(伺服器端)共享目錄下新建檔案,看看子節點會不會產生該檔案。

設定NFS共享目錄是為了能在一臺機器上作業,如果不執行這一步的話,需要將執行檔案和需要的資料複製到每個節點的相同位置,或者想辦法在每個節點上產生相同的檔案。

MPI程式的執行

  • 在共享目錄下新建檔案mpi_config,鍵入如下內容(假設現在有兩個節點),後面的4表示節點的核數。
node1:4 
node2:4 
  • 找個mpi程式,建議找到安裝包裡的例子的cpi程式,將其複製到共享目錄下。在主節點上,使用mpicc編譯後,執行mpiexec -n 8 -f ./mpi_config ./cpi來執行mpi程式,結果可以看到在哪個節點上跑了哪個程序。這裡的配置檔案如果寫在了別的地方,那麼對應的路徑也要做相應的更改。

如果mpiexec使用本機跑mpi程式碼可以執行,而使用上其他節點不行,那麼大概是其他節點出問題了,比如說mpi出問題了,比如說版本問題。可以上其他節點check一下,例如,可以使用mpirun -Version檢視mpi版本,儘量保持差距不是太大。言而總之,就是聯機跑程式出問題了,先用mpiexec在單擊上跑,看看行不行,不行說明單臺機器上mpi出問題啦,得修。

配置過程中出錯,很有可能是前面的步驟做錯了,多一個空格少一個空格,甚至逗號寫成英文句點等等,都會引發不可知的錯誤。這時候,應該靜下心,回到前面去,細細的檢查一番。

出現問題了,不要一股腦忙著百度,認真看報錯資訊,看不懂也硬著頭皮一行一行看,有時候出問題了,它往往提供了一些解決的方法;另外,聽話照做,如果它讓你輸yes就輸yes不要輸個y或者就一路猛回車;學會重啟機器來解決一些問題,比如說掛載不上,可以重啟一下試試。
再有就是,如果發現程式在各自的機子上能跑,但是連起來就不能跑了,提示缺什麼檔案之類,可以使用mpichversion命令看看兩個mpich的版本是否差距太大,以及自己使用解壓包方式安裝的mpich有沒有被正確識別。如果發現自己的用解壓縮方式安裝的mpich版本和mpichversion查到的版本不同,有可能是你的機子上安裝了其他版本的mpi,比如說,你是否使用了apt直接安裝了mpich。如果是這種情況,應該把其他版本的mpich解除安裝乾淨,以避免不必要的麻煩。
清除apt版本mpi的相關東西,可以使用apt remove xxx命令,它可以給你自動補全你有哪些相關的東西可以解除安裝。比如說lib和mpi打頭的檔案,有沒有和mpi相關的,統統卸掉。通過用which命令,檢視是否有其他的mpiexec、mpirun、mpicc等干擾你想用的mpi當前版本的使用,干擾檔案可以找個資料夾兜起來。另外,得看看你的環境變數是否正確配置,比如說把安裝檔案下的bin資料夾加到路徑中。如何新增環境變數,可以參見我的另一篇文章