【Python-分散式】MPI叢集環境搭建

NO IMAGE

【我的筆記】

1. 準備

用which mpicc和which mpiexec檢查是否安裝MPICC。

在一臺機器ping另一臺機器,看是否連通。

2.執行MPI檔案:

在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 

3. hello mpi

寫一個指令碼hello_mpi.py,裡面包含以下程式碼:

from mpi4py import MPI
print("hello world'', end = ",")
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
print("my rank is: %d" % rank)

然後我們在命令列通過以下方式執行:

mpiexec -n 5 -f /home/mpi_config_file python hello_mpi.py 

或者

mpirun –np 5 python hello_mpi.py

-np5 指定啟動5個mpi程序來執行後面的程式。相當於對指令碼拷貝了5份,每個程序執行一份,互不干擾。在執行的時候程式碼裡面唯一的不同,就是各自的rank也就是ID不一樣。所以這個程式碼就會列印5個hello world和5個不同的rank值,從0到4.

4. Windows下安裝mpi4py 

1) 要下一個Microsoft MPI,將其Bin資料夾所在路徑添入環境變數path 
2) 使用conda install –channel https://conda.anaconda.org/dhirschfeld mpi4py 安裝mpi4py 
3) 使用mpiexec -n 4 python C:\Users\YourName\Documents\Python\YourMPItest.py 測試一下安裝是否成功

=============================================================================

我在前面兩篇部落格中簡要介紹了為什麼要平行計算以及MPI的一些學習心得,接下來我們正式開始MPI的學習之路。我們知道MPI是分散式記憶體程式設計,所以這篇部落格會詳細講解MPI叢集環境的搭建過程。

一、準備工作

  1. 選擇Linux版本:這裡我選擇的是Ubuntu14.04,其他Linux版本如CentOS、Fedora等操作類似,一些命令和配置檔案路徑會有一些差別。
  2. 物理伺服器叢集和虛擬節點選擇:我是用VMware建立多個虛擬機器來進行叢集模擬,後期我會把環境部署到實驗室的伺服器叢集上,基本操作應該是一樣的,如果有需要注意的地方,我會在後續的部落格中進行說明。
  3. 在VMware中安裝Ubuntu14.04,實驗模擬安裝兩個節點即可。建議初始設定時使用者名稱取一樣的,因為後面每個虛擬機器節點之間免密登入時需要保證使用者名稱一致,這樣可以避免出現未知的問題。

二、安裝MPICH

到MPICH官網下載原始碼包,解壓、配置、編譯、安裝即可。 
我的安裝檔案
上圖是我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檔案,開啟後有詳細的安裝步驟,這裡我簡要說明:

  • 為避免錯誤,在安裝MPICH之前,分別執行以下命令:sudo apt-get update(保證安裝的源最新)、sudo apt-get install gcc(安裝gcc編譯器,用於編譯C語言)、sudo apt-get install g (安裝g 編譯器,用於編譯C )、sudo apt-get install gfortran(安裝gfortran編譯器,用於編譯fortran語言)。
  • 進入原始碼包解壓後的路徑,執行如下命令:cat /etc/shells。 
    (1)如果顯示為:/bin/sh 和 /bin/bash,則配置、編譯和安裝命令分別為: 
    配置: 
    ./configure 2>&1 | tee c.txt 
    編譯: 
    make 2>&1 | tee m.txt 
    安裝: 
    make install |& tee mi.txt 
    配置和編譯時間較長,安裝路徑及一些配置可以設定,不清楚的可以參考linux下軟體的不同安裝方式,可以參考以下部落格:linux下軟體安裝。 
    (2)如果顯示為:/bin/csh 和 /bin/tcsh,則配置、編譯和安裝命令分別為: 
    配置: 
    ./configure |& tee c.txt 
    編譯: 
    make |& tee m.txt 
    安裝: 
    make install |& tee mi.txt

安裝結束後,用which mpicc和which mpiexec檢查安裝是否成功,如果有這兩個可執行程式的路徑顯示,則表示安裝成功。注意:如果自行選擇安裝路徑的話,記得設定環境變數,具體README文件中有詳細說明。這裡希望大家注意一個問題,如果設定環境變數的話,~/.bashrc配置檔案下的環境變數和切換sudo執行時的環境變數不同,sudo執行時會找不到命令。關於配置檔案的介紹,可以參考下面文章:linux環境變數配置檔案區別。 

在每個節點中安裝MPICH,方法同上。建議每個節點中安裝路徑相同,統一命名(雖然安在不同的位置也可以,只要保證找到執行命令即可,但為了後期開發方便以及賞心悅目的原則,我們還是專業一點好)。

三、SSH免密登入

1.網路環境配置(網路搭建和ip地址設定) 
分別配置兩臺機器的hosts檔案,在此之前先通過ip addr show或ifconfig命令檢視兩臺機器的IP地址,我的IP地址為: 
node1:192.168.36.145 
node2:192.168.36.146 
然後修改hosts檔案: 
sudo gedit /etc/hosts 
根據以上查得的IP地址,在兩臺機器的hosts檔案中均輸入以下內容並儲存: 
192.168.36.145 node1 
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 [email protected]:~/.ssh/id_rsa.pub.node2(這裡我們把node1看作主節點,將node2節點的鑰匙檔案傳到node1上) 
(4)在主節點上操作 
cat ~/.ssh/id_rsa.pub.node2 >> ~/.ssh/authorized_keys//認證 
scp authorized_keys [email protected]:~/.ssh/authorized_keys//將認證檔案傳回每個子節點 
(5)驗證無密碼登入 
在node1節點上執行:ssh node2 

關於SSH免密登入談談我的個人理解:因為MPI是分散式記憶體程式設計,在後面的開發中涉及節點間資訊的傳遞,往往資料和程式是在一個節點上,所以需要保證執行命令時各節點之間資訊的交換。設定SSH免密登入可以免去操作中密碼的輸入。各節點生成私鑰和公鑰後需要認證,此時可以保證本機免密登入。將各個子節點的公鑰檔案傳送給主節點,然後分別加入到主節點的認證檔案中,此時可以保證主節點對各個子節點的免密登入。最後將認證檔案傳回到每個子節點,從而保證各個子節點對其他節點之間的免密登入。

四、建立和掛載NFS共享目錄

前面幾步我們安裝了MPICH和實現了SSH免密登入,如果要執行程式的話,需要保證每個節點的相同目錄中都生成可執行檔案,該操作方式比較繁瑣,為解決該問題,我們可以採用建立共享目錄的方案。 
(1)在所有節點中建立相同路徑下的相同目錄:mkdir /home/mpi_share。 
(2)安裝NFS,不同的Linux安裝和啟動NFS的命令可能不同,在ubuntu14.04中,命令為:sudo apt-get install nfs-kernel-server,另外還需要安裝sudo apt-get install portmap或sudo apt-get install rpcbind(這裡安裝如果出現問題的話,根據提示搜尋可以解決問題)。 
(3)設定NFS伺服器,選取一個節點作為伺服器,即編寫程式的虛擬機器,當在此臺虛擬機器的共享目錄編寫程式並編譯後會將共享目錄中的所有檔案同步到其它虛擬機器中(NFS客戶端):sudo vi /etc/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) 
其中/home/mpi_share是共享目錄,ip地址是所有的客戶端(其它節點)的地址,包括本機的,後面括號中的是許可權,具體含義可上網查閱(rw即讀寫許可權)。 
(4)重啟NFS,sudo /etc/init.d/nfs-kernel-server restart,此時,NFS伺服器虛擬機器配置完畢。 
(5)接下來需要配置其它NFS客戶端虛擬機器,使其能共享NFS伺服器的共享目錄:在其他節點中執行sudo mount -t nfs 192.168.36.145:/home/mpi_share /home/mpi_share,其中ip為NFS伺服器的地址,:後面跟的是伺服器的共享目錄,在後面跟的是本機(客戶端)的共享同步目錄。此時,所有的共享目錄便配置完畢了(每次節點啟動時都需重新執行掛載命令,如果想開機自動掛載:把上述指令sudo mount -t nfs 192.168.36.145:/home/mpi_share /home/mpi_share 寫到 /etc/rc.local 檔案中)。 
(6)測試:在NFS伺服器端的共享目錄建立一個檔案gedit test.c並儲存,幾秒鐘後檢查其他節點中是否在共享目錄中產生了該檔案,若產生則配置成功。 

建立和掛載NFS共享目錄的目的是保證主節點生成的可執行檔案和需要的資料其他節點可以訪問,這樣就可以保證多個節點之間的並行(如果不執行這一步的話,需要將執行檔案和需要的資料複製到每個節點的相同位置)。

五、叢集環境執行MPI程式

(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是當前目錄下的執行檔名)。執行成功後結果如下: 
[email protected]:/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

接下來我會持續更新該系列部落格,並結合自己MPI程式例項分析MPI中的通訊函式和並行設計策略。以下是我的郵箱:[email protected],如有問題,歡迎討論。

轉自:https://blog.csdn.net/secyb/article/details/78697976