因為我主機是8核且每台虛擬機器分配了四核,所以在mpi_config_file中輸入以下內容並儲存:
node1:4
node2:4
寫乙個指令碼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 mpi4py 安裝mpi4py
3) 使用mpiexec -n 4 python c:\users\yourname\documents\python\yourmpitest.py 測試一下安裝是否成功
物理伺服器集群和虛擬節點擊擇:我是用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檔案,開啟後有詳細的安裝步驟,這裡我簡要說明:
進入原始碼包解壓後的路徑,執行如下命令: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
在每個節點中安裝mpich,方法同上。建議每個節點中安裝路徑相同,統一命名(雖然安在不同的位置也可以,只要保證找到執行命令即可,但為了後期開發方便以及賞心悅目的原則,我們還是專業一點好)。
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 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免密登入可以免去操作中密碼的輸入。各節點生成私鑰和公鑰後需要認證,此時可以保證本機免密登入。將各個子節點的公鑰檔案傳送給主節點,然後分別加入到主節點的認證檔案中,此時可以保證主節點對各個子節點的免密登入。最後將認證檔案傳回到每個子節點,從而保證各個子節點對其他節點之間的免密登入。
建立和掛載nfs共享目錄的目的是保證主節點生成的可執行檔案和需要的資料其他節點可以訪問,這樣就可以保證多個節點之間的並行(如果不執行這一步的話,需要將執行檔案和需要的資料複製到每個節點的相同位置)。
因為我主機是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
分布式 集群
效能是乙個多方面綜合的結果,遵循短板理論。系統中任何乙個部分成為效能瓶頸,都會影響整個系統的效能表現 對於web應用,首先第一步是響應http請求,即使後端的效能再好,如果在這裡出現瓶頸,整個系統的效能也會很差,類似於乙個很大的水瓶,但是入水口很小。在這個環節,可以通過dns分流,負載均衡等方式改善...
分布式OR集群
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 分布式是相對中心化而來,強調的是任務在多個物理隔離的節點上進行。中心化帶來的主要問題是可靠性,若中心節點宕機則整個系統不可用,分布式除了解決...
分布式 集群
在談起集群,分布式之前,首先我們先從乙個簡單的小例子來講解下從單機到集群到分布式的乙個發展過程。需求 搭建乙個線上 服務。開始,開發人員比較少,整個公司的業務也剛起步,機器也只有幾台,為了能夠快速上線整個服務,我們開發人員選擇在一台機器上開發並上線,整個專案都是由單台伺服器提供。這也就是單機結構。後...