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.
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
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
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