Równoległe opcje we / wy, w szczególności równoległe HDF5

20

Mam aplikację, która może być trywialnie zrównoleglona, ​​ale jej działanie jest w dużej mierze zależne od operacji we / wy. Aplikacja odczytuje pojedynczą tablicę wejściową przechowywaną w pliku, który zwykle ma rozmiar 2-5 GB (ale spodziewam się, że liczba ta wzrośnie w przyszłości). Typowe obliczenia stosują tę samą operację do każdego wiersza lub kolumny tej tablicy. W przypadku operacji o dużym obciążeniu procesora uzyskuję bardzo dobre skalowanie do około 100 procesorów, ale w przypadku wolniejszych operacji dominują operacje we / wy i związana z nimi komunikacja (dostęp do systemu plików NFS) i nie mogę efektywnie używać więcej niż kilku procesorów.

Jakie są wydajne i przenośne (najlepiej przenośne) opcje w takiej sytuacji? Równoległy HDF5 wydaje się obiecujący. Czy ktoś ma z tym prawdziwe doświadczenie?

Czy MPI-I / O byłoby czymś wartym uwagi? Czy może efektywnie współpracować z danym układem plików, czy też muszę wszystko dostosowywać?

Khinsen
źródło
4
Świetne pytanie. Mamy ten sam problem i naszym prymitywnym rozwiązaniem jest zapis / odczyt tablicy zdekomponowanej domeny do / z N plików, dla N procesorów. Nie podoba mi się to, ale to proste. Byłbym zainteresowany widzeniem odpowiedzi, które również dotyczą złożoności różnych interfejsów bibliotecznych ....
Yann
Jak rozkładasz tablicę na procesory? Czego teraz używasz do równoległości? Czy piszesz do plików przez NFS jako formę komunikacji?
Dan
2
Być może nie będziesz musiał zbytnio przerabiać swojego kodu; Miałem kiedyś taki problem i byłem w stanie uzyskać lepsze przyspieszenie, unikając IO niż go optymalizując.
Dan
1
Czy używasz systemu kolejek, takiego jak PBS lub Torque? Jeśli tak, istnieją polecenia, aby „wprowadzić” plik do jakiegoś katalogu podczas uruchamiania zadania. Nie wiem, czy to znacznie przyspieszy, ale może warto spróbować.
Dan
1
@ Dan: tak, używam PBS i mogę go używać do umieszczania mojego pliku gdziekolwiek chcę. Ale ponieważ mój klaster nie ma lokalnych dysków węzłów, nie ma nic lepszego niż udostępniony wolumin NFS.
khinsen,

Odpowiedzi:

6

Równoległe operacje we / wy mogą ci w tym pomóc, ale jeśli używasz (z natury dość seryjnego) NFS do obsługi plików, to nie będzie to miało pełnego efektu, jaki możesz chcieć - będzie szeregowe wąskie gardło na serwer plików i posiadanie setek procesów wysyłających żądania do pojedynczego serwera nie da ci czynników przyspieszających setki robienia tego za pomocą jednego procesu. Może to jednak pomóc w tym, że wydaje się, że wąskim gardłem jest czytanie, a nie pisanie, i będzie to znaczna poprawa, jeśli twój system zostanie uaktualniony do w pełni równoległego systemu plików.

MPI-IO ma bardzo niski poziom; warto coś o tym wiedzieć, aby wiedzieć, co się dzieje „pod maską” z równoległymi HDF5, NetCDF4 lub ADIOS , ale używanie go samemu jest naprawdę odpowiednie tylko dla surowych danych binarnych, gdzie struktura jest dobrze znana w czasie kompilacji. HDF5 i NetCDF4 są znacznie bardziej elastyczne.

Zauważ, że jeśli twoje dane są stosunkowo proste - np. Struktury dużych zbiorów danych to głównie n-wymiarowe tablice lub wektory - zalecam NetCDF4 (który jest również równoległy i oparty na HDF5) niż HDF5; jest znacznie łatwiejszy w użyciu. HDF5 jest bardziej skomplikowany, aw zamian za tę złożoność pozwala na bardzo skomplikowane modele danych. Ale jeśli jest to funkcja, której nie potrzebujesz, rozpoczęcie pracy w NetCDF4 jest szybsze.

W naszym centrum mamy popołudniową i całodniową klasę na temat równoległych operacji we / wy, gdzie rozmawiamy o podstawowych koncepcjach, MPI-IO, HDF5 i NetCDF4; slajdy można znaleźć tutaj .


źródło
5

Otrzymujemy dobre skalowanie do całego XT6 w ORNL przy użyciu MPI / IO do wektorów wyjściowych. Oto kod . Podsystemy We / Wy dla wielu maszyn nie są zaprojektowane do masowej równoległości, więc myślę, że @Dan ma rację, że starałbym się zminimalizować We / Wy tylko pisząc co kilka kroków lub inną strategię aglomeracji.

O ile elastycznie zapisuję dane wyjściowe w skalowalny sposób, mam doświadczenie z XDMF , co można uzyskać dzięki dużym równoległym zapisom binarnym za pomocą HDF5 (jak PETSc VecView ) w połączeniu z niewielką ilością kodu XML napisanego szeregowo, aby opisać układ. Można to odczytać za pomocą pakietów wizualizacji, takich jak Paraview lub MayaVi2 . Innym sposobem na to jest użycie formatu VTK z dołączonymi danymi binarnymi, jednak wymaga to znajomości wszystkiego, co chcesz napisać z góry.

Matt Knepley
źródło
XDMF wygląda interesująco, ale chodzi raczej o porządkowanie danych niż o efektywny dostęp do tego, co XDMF nazywa „ciężkimi” danymi. Czego używasz do tego aspektu?
khinsen
Używamy XDMF do wskazywania na HDF5. W ten sposób możesz napisać cały binarny HDF5, ale odczytać go w większości silników wizualizacyjnych.
Matt Knepley,
1

Zakładam, że twój problem ze skalowalnością jest związany z danymi wyjściowymi, a nie danymi wejściowymi. Równoległe wprowadzanie danych jest raczej proste - to, co robię, polega na tym, że każdy procesor otwiera wejściowy plik NetCDF i odczytuje część tablicy należącą do jego kafelka (może istnieć ograniczenie liczby czytników, którzy mogą otworzyć ten sam plik NetCDF, ale nie jestem pewien ). Wyjścia równoległe są bardziej problematyczne.

To, co robię obecnie, nie jest do końca optymalne, ale na razie działa. Zbieram całość na jednym procesorze i robię wyjście szeregowe. W międzyczasie inni gracze czekają, aż pisarz skończy. Działa to dla mnie dobrze, ponieważ udało mi się utrzymać dość wysoki stosunek obliczeń do wydajności - więc skalowalność byłaby dobra dla ponad 200 procesorów. Ale to nie jest rozwiązanie, którego szukasz.

Innym rozwiązaniem jest to, co zasugerował Yann - zapisywanie szeregowo do plików N i procesor drona montuje kafelki w jeden kawałek - jeśli pozwala na to pamięć RAM.

Oprócz równoległych bibliotek we / wy sugerowanych w poprzednich odpowiedziach, możesz również zajrzeć do Parallel NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdf , ponieważ już dobrze znasz NetCDF i MPI. Nie użyłem tego w praktyce, ale planuję iść w tym kierunku, kiedy uderzę w ścianę zbieraniem + szeregowymi I / O.

milancurcic
źródło
To dane wejściowe tworzą mój problem ze skalowalnością. Przypuszczam, że wszystkie przychodzące żądania z wielu węzłów przeciążają serwer NFS, ale nie mam pojęcia, jak zweryfikować tę hipotezę.
Khinsen
@ khinsen Aby przetestować swoją hipotezę, przeczytaj plik z niewielką liczbą procesorów, powiedzmy od 1 do 8, i rozrzuć dane do reszty. Wykonaj profilowanie, zobacz, ile czasu spędzasz na we / wy, a ile na rozproszeniu. Zmieniaj liczbę czytników procesorów i zobacz, co zapewnia najlepszą wydajność.
milancurcic
Dobry pomysł! To będzie trochę pracy, ponieważ oznacza to przepisanie kodu, ale prawdopodobnie warto.
khinsen,