2012-02-12 11 views
13

Mam problem z podjęciem decyzji co do używania wieloprocesorowego pytona lub selera lub pp dla mojej aplikacji.Czy Seler jest równie wydajny w systemie lokalnym, jak w przypadku wieloprocesorowania Pythona?

Moja aplikacja jest bardzo obciążająca procesor, ale obecnie używa tylko jednego procesora, więc muszę rozłożyć go na wszystkie dostępne cpusy (co spowodowało, że zajrzałem do biblioteki wieloprocesorowej Pythona), ale przeczytałem, że ta biblioteka nie jest skalowalna do innych maszyny w razie potrzeby. W tej chwili nie jestem pewien, czy będę potrzebować więcej niż jednego serwera do uruchomienia mojego kodu, ale myślę o lokalnie uruchomieniu selera, a następnie skalowanie wymagałoby jedynie dodania nowych serwerów zamiast refaktoryzacji kodu (tak jak wtedy, gdybym użył multiprocessing).

Moje pytanie: czy ta logika jest poprawna? i czy jest jakaś negatywna (wydajność) lokalnie używanie selera (jeśli się okaże, że jeden serwer z wieloma rdzeniami może wykonać moje zadanie)? lub czy lepiej jest używać przetwarzania wieloprocesowego i wyrastać z niego w coś innego później?

Dzięki!

p.s. to jest dla osobistego projektu edukacyjnego, ale może pewnego dnia chciałbym pracować jako programista w firmie i chcę dowiedzieć się, jak robią to profesjonaliści.

+0

Co sprawia, że ​​wiele procesorów może pomóc w zastosowaniach IO-heavy? Jeśli twoja aplikacja jest związana z IO, potrzebujesz wielu kanałów IO, a nie procesorów. –

+0

Przeciwko błędnemu słowu ... jest to bardzo obciążające procesor. Zasadniczo jest to po prostu matematyka w dużej rekursji z dużą ilością danych wejściowych. Wydaje się, że jest to dobry proces do dystrybucji – Lostsoul

+0

Ah - w takim przypadku, kontynuuj :) Czy potrzebujesz odporności na uszkodzenia - np. Próbując używać komputerów ochotniczych rozproszonych w całym miejscu - czy też po prostu chcesz używać komputerów w laboratorium lub grupa? –

Odpowiedz

4

W rzeczywistości nigdy nie używałem Celery, ale użyłem przetwarzania wieloprocesowego.

Wydaje się, że Seler ma kilka sposobów przekazywania wiadomości (zadań), w tym sposobów, w jakie należy uruchamiać pracowników na różnych komputerach. Więc wadą może być to, że przekazywanie wiadomości może być wolniejsze niż w przypadku przetwarzania wieloprocesowego, ale z drugiej strony możesz rozłożyć obciążenie na inne maszyny.

Masz rację, że proces wieloprocesowy może działać tylko na jednym komputerze. Z drugiej jednak strony komunikacja między procesami może odbywać się bardzo szybko, na przykład przy użyciu pamięci współdzielonej. Ponadto, jeśli potrzebujesz przetwarzać bardzo duże ilości danych, możesz łatwo odczytać i zapisać dane z lokalnego dysku i po prostu przekazać nazwy plików między procesami.

Nie wiem, jak dobrze poradziłby sobie z niepowodzeniami zadań. Na przykład zadanie może nigdy nie zostać uruchomione lub może się zawiesić lub może być konieczne zabicie zadania, jeśli nie zakończyło się ono w określonym czasie. Nie wiem, jak trudno byłoby dodać wsparcie, jeśli go nie ma.

Procesor wieloprocesorowy nie jest dostarczany z tolerancją błędu po wyjęciu z pudełka, ale można go zbudować samodzielnie bez większych problemów.

+2

Seler ma rzeczywiście więcej narzutów niż użycie narzędzia wieloprocesorowego bezpośrednio, ze względu na obciążenie komunikacyjne. Seler bardzo dobrze radzi sobie z awariami zadań w dowolnej formie, obsługuje również limity czasowe i wiele, wiele więcej. Seler używa ulepszonej wersji puli wieloprocesowej (celery.concurrency.processes.pool.Pool), która obsługuje limity czasowe i naprawia wiele błędów związanych z uruchamianiem puli jako usługi (tj. Uruchamianiem na zawsze) i błędami związanymi z zamknięciem. Niektóre osoby używają wersji basenowej firmy Celery. – asksol

+0

Niektóre linki: http://docs.celeryproject.org/en/latest/userguide/workers.html#time-limits http://docs.celeryproject.org/en/latest/userguide/workers.html#revoking-tasks Opcje basenu: http://docs.celeryproject.org/en/latest/internals/reference/celery.concurrency.processes.pool.html#celery.concurrency.processes.pool.Pool http://docs.celeryproject.org/ pl/latest/internals/reference/celery.concurrency.processes.pool.html # selekcja.concurrency.processes.pool.Pool.apply_async – asksol

+2

Możesz również dystrybuować pracę na maszynach przy użyciu tylko wieloprocesowości, ale nie polecałbym tego. Osiągnięcie jakości produkcji wymagałoby prawdopodobnie dużego wysiłku, a Seler ma już społeczność, która rozwiązuje te problemy. – asksol

17

Właśnie skończyłem test, aby zdecydować, ile seler dodaje jako obciążenie ponad multiprocessing.Pool i wspólne tablice. Test uruchamia filtr parowania na macierzy (292, 353, 1652) uint16. Obie wersje używają tego samego fragmentowania (w przybliżeniu: dzielą 292 353 wymiary przez pierwiastek kwadratowy z liczby dostępnych procesorów). Wypróbowano dwie wersje selera: jedno rozwiązanie wysyła marynowane dane, drugie otwiera plik danych podstawowych w każdym z pracowników.

Wynik: na moim 16 rdzeniowym selerze procesora i7 zajmuje około 16s, multiprocessing.Pool ze wspólnymi tablicami około 15s. Ta różnica jest zaskakująco mała.

Zwiększenie ziarnistości zwiększa oczywiście różnicę (seler musi przekazać więcej wiadomości): seler zajmuje 15 s, multiprocessing.Pool trwa 12 sekund.

Weź pod uwagę, że pracownicy selera już pracowali na hoście, podczas gdy pracownicy basenu są rozwidleni przy każdym uruchomieniu.Nie jestem pewien, jak mogę zacząć wieloprocesorowe basen na początku od mijam współdzielonych tablic w inicjalizatorze:

with closing(Pool(processes=mp.cpu_count(), initializer=poolinit_gen, initargs=(sourcearrays, resarrays))) as p: 

i tylko resarrays są chronione przez blokowanie.

+1

Udało mi się oddzielić ustawienia basenu od pomiaru, ale to prawie nie zmieniło (zgodnie z oczekiwaniami, widelec jest tani). Próba z innym zestawem danych (276, 385, 3821): selerem selekcji za pomocą piklowanego transferu 38s, wieloprocesorowe.Pool 27s. Szczerze mówiąc uważam, że seler jest znacznie wygodniejszy w użyciu i może naturalnie przekazać przetwarzanie innym maszynom, jeśli czas przetwarzania jest naprawdę dłuższy niż czas transferu. Na jednej maszynie różnica wydajności jest zauważalna tylko dla dużych zestawów danych. –

Powiązane problemy