Klaster i mapowanie obszaru #1

Jeden z ostatnich dodanych postów zakończyłem wzmianką o projekcie realizowanym z pomocą firmy RS Components, oficjalnego dystrybutora komputerów Raspberry Pi (i wielu innych sprzętów) w Polsce. Ostatnie dwa miesiące wypełniały mi przygotowania do matury, które skutecznie uniemożliwiały mi pisanie czegokolwiek tutaj, jak i opóźniały zakończenie projektu.

Ale do rzeczy. W październiku ubiegłego roku zacząłem interesować się tematyką obliczeń równoległych, a co za tym idzie – klastrami obliczeniowymi. Zbudowanie takowego z pełnoprawnych komputerów klasy PC było zdecydowanie poza moim zasięgiem, ale wtedy przypomniałem sobie o projekcie na który natrafiłem przeglądając któryś z portali newsowych o elektronice.

Raspberry Pi wydało mi się dobrą platformą do budowy niewielkiego, 4-węzłowego klastra, który dziś z dumą mogę postawić obok biurka. Rzecz jasna nie był to cel sam w sobie, ale o tym do czego zaprzęgnąłem klaster opowiem w kolejnym wpisie. Za wstęp do tematu klastrów i wszystkiego co z nimi związane może posłużyć moja seria wpisów o obliczeniach równoległych.

Jeśli chodzi o samą konstrukcję klastra, nie jest to nic specjalnego. Wszystkie cztery Raspberry skręciłem ze sobą za pomocą metalowych tulejek z gwintem M2.5. Wbrew obiegowej opinii gwint o średnicy 3mm. niekoniecznie musi się zmieścić w otwory montażowe na płytce, a wolałem uniknąć rozwiercania ich. Całość umieściłem na polakierowanym skrawku płyty MDF, na której zamontowałem też (za pomocą kątowników) wentylator na 12V.

Po jakimś czasie zabawy z klastrem doszedłem do wniosku, że mógłbym spróbować wycisnąć z Maliny trochę więcej niż domyślne 1.2GHz. Tak też zrobiłem, dodając uprzednio radiatory na układy scalone. Po podkręceniu taktowania wszystkich węzłów klastra do 1.4GHz (oraz pamięci RAM z 400 na 500MHz), okazało się to całkiem uzasadnione – jak wiadomo Maliny w wersji trzeciej mają tendencję do dość mocnego nagrzewania się, a w klastrze gdzie 4 egzemplarze są blisko siebie jest to dość odczuwalne.

Wszystkie Raspberry zasilane są z pomocą oryginalnych zasilaczy – może i nie jest to najbardziej eleganckie rozwiązanie pod względem wizualnym, ale z pewnością najbardziej pewne i stabilne. Nawet jeśli chciałbym zasilać wszystkie węzły z jednego huba USB, dostanie u nas takiego który zapewniłby odpowiednią wydajność prądową graniczy z cudem. Do spięcia wszystkich węzłów w sieć lokalną posłużył mi 8-portowy switch TP-Link TL-SG108, który okazał się więcej niż wystarczającym rozwiązaniem.

Konfiguracja całości sprowadziła się do kilku mało skomplikowanych kroków. Pierwszym z nich było wygenerowanie klucza RSA na głównym węźle i dodanie go do autoryzowanych kluczy na każdym z podrzędnych węzłów. Umożliwia to logowanie się na “roboczych” węzłach klastra przez SSH bez konieczności podawania hasła. Kolejną rzeczą było skonfigurowanie nazw hosta na każdym węźle (użyłem nazw od rpi0 dla głównego węzła, do rpi3 dla trzech pozostałych), przypisanie w moim domowym routerze lokalnych adresów IP “na sztywno” dla wszystkich węzłów i powiązanie lokalnych nazw hostów z IP w sieci lokalnej poprzez plik /etc/hosts. Wszystko to może brzmieć skomplikowanie, ale w praktyce sprowadza się do mechanicznego wklepywania komend w okno terminala.

Po takiej wstępnej konfiguracji można przejść do meritum całego przedsięwzięcia, instalacji pakietu MPICH3. Jest to nic innego jak jedna z kilku implementacji standardu MPI, o którym wspominałem w pierwszym wpisie o obliczeniach równoległych. Pakiet należy oczywiście zainstalować na wszystkich węzłach, oraz stworzyć plik machinefile, który określa pod jakimi adresami IP kryją się wszystkie węzły, i ile wątków mogą one obsłużyć.

Ze względu na to, że ścieżka do pliku wykonywalnego uruchamianego na klastrze musi być taka sama na każdym z węzłów, zdecydowałem się dodatkowo na skonfigurowanie Network File System. Zdecydowanie ułatwia to pracę na klastrze, i pozwala zaoszczędzić sporo czasu na kopiowaniu skompilowanego pliku do każdego Raspberry osobno.

Voilà! Możemy już przejść do skompilowania przykładowego pliku z kodem (całkiem sporo takowych jest dostarczane razem z pakietem MPICH) za pomocą kompilatora mpicc, wrzucić skompilowany plik do folderu współdzielonego przez węzły za pomocą NFS, i uruchomić go za pomocą polecenia mpiexec. O ile przykładowe kody działają raczej bezproblemowo, tak napisanie czegoś swojego to już inna bajka 😉 O tym jednak porozmawiamy w drugim wpisie, gdzie zamierzam pokazać trochę własnego kodu w akcji.

Konfiguracja NFS była dla mnie chyba najbardziej uciążliwym zadaniem ze wszystkich, głównie ze względu na mało precyzyjne, często nieaktualne poradniki krążące w sieci. Jeśli uda mi się znaleźć jakiś wolny wieczór, postaram się napisać na ten temat coś więcej. Choćby po to, aby zaoszczędzić czasu i nerwów czytelnikom, którzy się na to porwą 😉

Jeśli ktoś zechciałby dowiedzieć się więcej na temat konfiguracji klastra, a przy okazji przeczytać ciekawy artykuł na temat którym zajmuję się od jakiegoś czasu, odsyłam go do świetnego tekstu autorstwa Marcina Karbowniczka z Elektroniki Praktycznej. Był to chyba najbardziej kompleksowy i wnikliwy przewodnik jaki udało mi się znaleźć dotyczący klastrów opartych o Raspberry Pi (a przeczytałem ich naprawdę sporo).

Na koniec wpisu chcę podziękować firmie RS Components za wsparcie – bez nich ten projekt zapewne nigdy by nie powstał.

5!

Leave a Reply

Your email address will not be published. Required fields are marked *