本文譯自樹莓派雜誌87期(MagPi issue 87),原文標題為Build a Raspberry Pi cluster computer(插圖來源取自雜誌內頁)。本篇與原文同樣使用CC 3.0 BY-NC-SA授權,歡迎標註原作者轉載,若有任何不妥與指教敬請告知。

樹莓派電腦以便宜著稱,而且適合用它做一些小專案來玩,是吧? 這個嘛…有時候是。

事實上樹莓派擁有強大的運算能力,而且當你讓許多樹莓派一起工作時,將會發生神奇的事情。

「電腦叢集(computer cluster)」的概念(將許多小電腦集合成一整台電腦)並不新奇,但當你有像樹莓派一樣經濟實惠的設備時,就能夠藉由同時使用並列處理和其他昂貴的系統競爭。在這裡,我們將學習如何製作由許多小電腦製作出叢集電腦。

你將會需要:

  • 樹莓派4 x4
  • 放置叢集電腦的外殼
  • 網路交換器
  • 多個USB輸出埠的電源供應器
  • USB Type-C電源線 x4
  • 網路線 x4

組裝叢集

樹莓派叢集電腦可以從2台到好幾百台Pi組成,在這次的專案中,我們會使用到4台樹莓派,每一台都稱為「節點(node)」,他們並行工作,各自完成一部分的任務,處理的速度將會比單個節點的電腦還要快上許多。

我們先將樹莓派裝進叢集外殼中,許多配置都是可以調整的,包含冷卻風扇。

像這樣物美價廉的叢集外殼可以有多樣化的配置。

電源

考量到叢集電腦的電源需求,對我們的電腦來說,使用四顆電源供應器驅動並不是理想的做法,不僅看起來不美觀,也不夠有效率。

相反的,我們需要尋找一顆高品質且輸出強而有力的多孔USB電源供應器,提供足夠的電力,然後再用幾條電源線將他們連接起來。要特別注意樹莓派4代有更高的電力需求。

使用多輸出孔的USB充電器為多個裝置供電,但請確保它能提供足夠的輸出電流

節點間的溝通

叢集的組成會有一個「主人(master node)」負責管理叢集,其他工人則是被告知任務並回傳結果。為此,我們需要在專用的網路上使用有線網路連接。這樣的做法不是必需的,但對於需要密集存取資料的應用程式來說,會建議叢集有自己專用網路以便交換指令,而不受無線網路或其他的網路流量影響。所以,除了無線網路之外,我們還將每個節點連接到獨立的Gigabit Ethernet交換器上。

一個專用的網路交換器可以加速叢集電腦的溝通,樹莓派4代可以支援到Gigabit等級的網路頻寬。

設定Raspbian

我們將使用無線網路存取每個節點,使有線網路孔能夠用於叢集工作。在每個節點上,燒錄Raspbian Buster Lite到microSD記憶卡,啟動並在終端機輸入

sudo apt -y update && sudo apt -y upgrade,確保系統處在最新的狀態。

輸入sudo raspi-config,然後執行以下步驟:

更改預設密碼'pi’

在「網路」下更改主機名稱為nodeX,使用唯一的編號代替X(例如:node1、node2...等),node1將會成為主節點。

開啟Wi-Fi,如果需要的話

出現提示時離開並重新啟動

設定網路

有線網路的連接被稱為叢集的骨幹網路,當沒有DHCP伺服器幫忙時,你需要手動啟動骨幹網路。我們將使用10.0.0.0的子網路,如果你平常使用的是這個網段,就使用其他的網段,如192.168.10.0。在主節點上開啟終端機,輸入以下指令編輯網路配置:

sudo nano /etc/dhcpcd.conf

在文件最下方新增:

interface eth0

static ip_address=10.0.0.1/24

其他的節點也是進行相同的操作,但需要替換最後一位IP位址:10.0.0.2、10.0.0.3,以此類推。

重新啟動每個節點,並試著使用ping指令測試。

舉例來說,在10.0.0.1上輸入:ping 10.0.0.2

產生新的金鑰

為了使叢集正常工作,每個工作節點都需要在不輸入密碼登入的狀況下和主節點對話,為此,我們使用SSH金鑰,過程會有些繁瑣,但只需要設定一次。在每個節點上輸入:ssh-keygen -t rsa

這將為電腦產生獨一無二的數位「身份」,以及一對密鑰。你將被詢問幾個問題,只要按下ENTER,並且注意不要產生新的密碼。接下來在每個節點上執行指令:ssh-copy-id 10.0.0.1告訴主節點金鑰(node1, 在我們的設定中是10.0.0.1)。最後,在主節點上重複剛才的步驟,並將它產生的金鑰複製到其他節點上。

安裝MPI

MPI(Message Passing Interface,訊息傳遞界面)是能讓叢集工作的魔法,這個協議能讓多台電腦之間委派任務並回傳結果。我們將在叢集的每個節點上安裝MPI,同時安裝Python bindings使我們能夠利用這個神奇的力量。

在每個節點執行以下指令:sudo apt install mpich python3-mpi4py

完成後,測試MPI是否在每個節點上運作:mpiexec -n 1 hostname

你應該會得到回應的節點名稱,-n代表要再幾個節點上執行,1代表在本機(local machiine)執行。

開始運作吧

是時候讓我們的叢集運作了,從node1發出指令:

mpiexec -n 4 --hosts 10.0.0.1,10.0.0.2,10.0.0.2,10.0.0.4 hostname

我們要求主管理程序mpiexec,啟動四個程序(-n 4),每個主機上各被分配到一個。如果你不是用4台主機,或是使用不一樣的IP位址則需要修改指令。指令上的hostname只是讓節點回傳名稱,因此,如果一切正常,你就會得到叢集中的成員清單。恭喜,你剛剛完成了簡單的平行計算!

叢集中的單一節點也能運算嗎?

現在確定叢集可以運作了,我們來讓它做一些事。prime.py程式是一個簡單的腳本,用來偵測質數的數量,輸入下方的程式碼,或在這裡下載,將腳本儲存在node1中。

這個程式碼只接受一個參數,即停止前要達到的最大數量,並回傳在執行過程中找到的質數。首先在主節點上對其進行測試:mpiexec -n 1 python3 prime.py 1000

這行指令的意思是:在本地端的節點(local node)上執行一個物件實例(instance)prime.py測試1000以內的質數數量。這應該運行得很快,大概在一秒鐘內就可以找到168個質數。

 

我們的叢集透過分配主節點工作,主節點將任務分配給其成員節點,並等待它們報告結果。

 多工處理

為了使叢集正常工作,每個節點都需要在相同的位置擁有欲運行腳本的副本。因此,我們要將相同的腳本複製到每個節點。假設該文件位於您的主目錄中,執行此操作的快速方法是(來自node1):scp ~/prime.py 10.0.0.x:

將x替換為所需節點的編號,scp(secure copy指令)會將腳本複製到每個節點。你可以透過在每個節點執行的相同的指令來檢查此方法是否有效。完成後,我們準備開始一些真實的叢集計算。

運算!

要啟動超級電腦,請從node1執行以下命令:

mpiexec -n 4 --host 10.0.0.1,10.0.0.2,10.0.0.3,10.0.0.4 python3 prime.py 100000

每個節點都有一個「等級(rank)」:唯一的ID, 主節點始終為0。在腳本中用來分配每個節點處理的數字範圍,因此沒有節點會檢查到相同的質數。

完成後,每個節點將向主節點報告,詳細列出找到的質數。這就是所謂的「蒐集」。完成後,主節點將所有資料收集在一起並報告結果。在更高階的應用中,主節點可以將不同的資料集合分配給節點(’scattering’)。

最終成績

你可能已經注意到,在上一個範例中,我們要求提供所有不超過1000的質數。這不是一個很好的測試,因為完成的很快。 100,000需要一點時間。在我們的測試中,我們看到單個節點花了238.35秒,但是四個節點的叢集卻只花了49.58秒,幾乎快了五倍!

叢集運算不僅是處理數字,容錯和負載平衡也是值得研究的概念。有些類型的叢集也可以當作一個網頁伺服器獨立工作,即使你將其他樹莓派從骨幹網路中移除,他仍然可以維持工作狀態。

重要提示:負載平衡

叢集作為單個網頁伺服器和共享流量也很好用,例如Mythic Beast的樹莓派網站伺服器。

重要提示:容錯

某些群集類型(例如Docker Swarm或Kubernetes)允許單個節點發生故障而不會中斷服務。

叢集中的每個樹莓派都被稱為節點,並且與其他樹莓派並行工作以產生比單獨速度更快的結果