2012-09-02 14 views
8

Rozwijam małą sieć neuronową, której parametry wymagają dużo optymalizacji, a więc dużo czasu przetwarzania. Profilowałem mój skrypt z cProfile, a to, co zajmuje 80% czasu procesora, to funkcja NumPy dot, reszta to inwersja macierzy z funkcją numpy.linalg.solve. Moja aktualna wersja numpy używa blas, lub jest tym, czym wydaje się, ponieważ numpy.core._dotblas.dot pojawia się jako funkcja, która zajmuje 80% całkowitego czasu przetwarzania.Jak przyspieszyć multiplikacje macierzy w Pythonie?

Ponieważ jest to rdzeń mojej sieci neuronowej i muszę go często uruchamiać, każde niewielkie zwiększenie prędkości może zaoszczędzić mi wiele czasu na licznych powtarzających się optymalizacjach parametrów.

Więcej szczegółów: mnożenie macierzy odbywa się na macierzach o kształcie od minimum 100 * 100 do 500 * 500. Mam komputer z 12 rdzeniami i używam ich do tej pory do równoległej optymalizacji różnych parametrów sieci neuronowych, ale może mnożenie macierzy może odbywać się równolegle?

Dziękuję za poświęcony czas!

Odpowiedź:

Spędziłem kilka dni testowania oraz instalowania bibliotek odinstalowaniem ... Oto wynik co testowałem: domyślnie w mojej wersji Ubuntu (12.04) i zainstalowane respository wersja NumPy The Biblioteki BLAS są bibliotekami ATLAS. Zrobiłem kilka testów, które odzwierciedlają poprawę SPECYFICZNIE w obliczeniach, które mnie interesują, więc te wyniki nie mogą być interpretowane jako ostateczna odpowiedź. Te obliczenia obejmują mnożenie macierzy (produkt punktowy) w pętli iteracji 55000, z macierzą 500 * 500 i 1000 * 1000. Używam stacji roboczej HP Z800 z Xeon X5675 @ 3.07GHZ z 12 rdzeniami. Wszystkie wyniki (w procentach) są porównaniem między opisanym warunkiem a referencją, która jest tutaj dołączoną biblioteką ATLAS.

  • Scipy.sparse module: Nie wiem, czy mogę ustawić go poprawnie, ale z 10% rozproszenie, przy użyciu tego modułu staje się użyteczny począwszy od 1500 * 1500 matrycach z OpenBLAS i MKL. Jeśli masz sugestie, jak prawidłowo ich używać, jestem zainteresowany!
  • Z OpenBlas uzyskuję zwiększenie prędkości o 33% dla macierzy 500 * 500, ale 160% dla 1000 * 1000. Ale dzięki OpenBLAS moduł scipy.sparse nie działa lepiej, ale gorzej.
  • Wielkim zwycięzcą są biblioteki MKL. Przyspieszenie wzrasta do 230% dzięki 1000 * 1000 macierzy z oryginalnych bibliotek ATLAS! W przypadku macierzy 500 * 500 przyspieszenie jest skromniejsze (100%), ale nadal jest bardzo dobre. Co więcej, dzięki kompilacji z OpenMP, multiplikacje macierzy mogą działać na moich 12 procesorach i tutaj jest dwa razy szybszy niż na jednym procesorze z bibliotekami MKL. Jest to jednak marnowanie mocy obliczeniowej, znacznie wydajniejsze jest wykorzystywanie modułów wieloprocesorowych do równoległego uruchamiania skryptów/multiplikacji macierzy.

Odpowiedz

7

Jeśli nie masz już, można spróbować łącząc numpy do bardzo zoptymalizowane biblioteki BLAS jak Intel MKL (co jest free-as-in-beer for non-commercial use lub discounted for academic use, która najwyraźniej nie liczy się jako niekomercyjny; instructions from Intel for using it with numpy) lub OpenBLAS (za darmo -w-mowie). Jest też Enthought Python Distribution, który jest wstępnie połączony z MKL i free-as-in-beer dla nauczycieli akademickich. To może automatycznie zrównoleglować twoje macierzowe multiplikacje i może być znacznie szybsze niż typowa referencyjna instalacja BLAS/ATLAS na większości dystrybucji Linuksa lub cokolwiek innego, z czego korzystasz.

W przeciwnym razie jedyne co wiem o tym, że można zrobić, to matematyczne sztuczki, które nie będą wymagały obliczania tylu multiplikacji/rozwiązań.Nie wiedząc dokładnie, co robisz, trudno jest podać sugestie.

Zakładam, że twoje macierze są gęste, ponieważ zwykle są w sieciach neuronowych, ale jeśli robisz coś niezwykłego, to scipy.sparse może również pomóc.

+0

Openblas jest prawdopodobnie dobrą darmową opcją, która może znacznie przyspieszyć działanie. Powinien być dość łatwo dostępny na przykład w większości systemów Linux. – seberg

+0

Nie zdawałem sobie sprawy, że MKL nie jest wolny (jak w piwie); [OpenBLAS] (http://xianyi.github.com/OpenBLAS/) jest prawdopodobnie dobrą alternatywą. EPD jest jednak bezpłatne dla pracowników akademickich. – Dougal

+0

Moja sieć neuronowa jest rzeczywiście rzadka (10% łączności), otrzymuję 20% przyspieszenia, co nie jest dużo lepsze niż nic. Mówisz o OpenBLAS, czy będzie działać szybciej niż moja aktualna wersja numpy, która już używa wersji BLAS? – PierreE

4

Numpy używa bardzo szybkich wewnętrznych algorytmów i reprezentacji opartych na bibliotekach firm trzecich (takich jak BLAS, jak to nazwałeś) już wykorzystujących między innymi optymalizacje SSE. Ponieważ oryginalny BLAS jest odrobinę wolny (ponieważ ma być implementacją referencyjną, koncentrującą się na precyzji, a nie na wydajności), możesz chcieć użyć innego smaku skoncentrowanego na wydajności, takiego jak OpenBLAS. Aby użyć OpenBLAS, musisz albo znaleźć gotowy pakiet Numpy z obsługą OpenBLAS, albo przekompilować wersję połączoną z OpenBLAS. Kiedy używasz wydajnej implementacji BLAS, nie znajdziesz lepszej opcji przyspieszenia w czystym pythonie, chyba że napiszesz bibliotekę w C i zajmie to dużo czasu, aby ją zoptymalizować.

Z drugiej strony można sprawdzić, czy biblioteka Numpy i BLAS została skompilowana tak wydajnie, jak to możliwe w architekturze. Na przykład, jeśli możesz aktywować bibliotekę OpenMP w kompilacji Numpy, to pozwoliłoby to wielu rdzeniom pracować nad twoim problemem przy użyciu paralelizmu na poziomie danych. Może to być znaczącym źródłem przyspieszenia, jeśli masz wiele rdzeni na komputerze, a twoje obliczenia są związane z procesorem. Jeśli twój problem na to pozwala, możesz nawet użyć opartej na zadaniach biblioteki programowania równoległego (SCOOP [Disclamer: I wrote it], Celery, itp.), Aby propagować twoją pracę na wielu komputerach.

W ostateczności inną możliwością byłoby zakup nowego sprzętu. Dzięki temu oprogramowanie może działać szybciej bez zmiany pojedynczej linii kodu.

+0

Dzięki, sprawdzę, która wersja Blasa jest zainstalowana i spróbuję skompilować z uruchomionym OpenMP. Jak skomplikowane jest to? – PierreE

+0

@pierotiste: Nie powinno to być takie trudne w systemie opartym na * nix. Powinien polegać na rekompilacji Numpy podczas łączenia z nowymi bibliotekami i/lub flagami. Powinieneś sprawdzić online na blogach lub w instrukcji Numpy, aby uzyskać więcej szczegółów. W zależności od wybranych bibliotek, może zmienić wymagane kroki. – Soravux