Wybór pomiędzy CPU a GPU do szkolenia sieci neuronowej

29

Widziałem dyskusje na temat „narzutu” GPU, a dla „małych” sieci trening może być szybszy na CPU (lub sieci CPU) niż na GPU.

Co oznacza „mały”?

Na przykład, czy jednowarstwowa MLP ze 100 ukrytymi jednostkami byłaby „mała”?

Czy nasza definicja „małej” zmienia się dla architektur cyklicznych?

Czy są jakieś inne kryteria, które należy wziąć pod uwagę przy podejmowaniu decyzji, czy trenować na CPU czy GPU?

EDYCJA 1:

Właśnie znalazłem wpis na blogu (być może nieaktualny? Pochodzi z 2014 r.):

„... Większość kart sieciowych działa tylko z pamięcią zarejestrowaną w CPU, więc transfer GPU do GPU między dwoma węzłami wyglądałby tak: GPU 1 do CPU 1 do karty sieciowej 1 do karty sieciowej 2 do procesora 2 do GPU 2. Oznacza to, że jeśli wybierzesz wolną kartę sieciową, może nie być przyspieszeń na jednym komputerze. Nawet w przypadku szybkich kart sieciowych, jeśli klaster jest duży, nie dostaje się nawet przyspieszeń z GPU w porównaniu do procesorów, ponieważ procesory graficzne po prostu działają zbyt szybko, aby karty sieciowe nadążały za nimi.

To jest powód, dla którego wiele dużych firm, takich jak Google i Microsoft, korzysta z procesorów zamiast klastrów GPU do szkolenia swoich dużych sieci neuronowych. „

W pewnym momencie, zgodnie z tym postem, użycie procesorów mogło być szybsze. Czy nadal tak jest?

EDYCJA 2: Tak, ten wpis na blogu może być bardzo nieaktualny, ponieważ:

Teraz wydaje się, że procesory graficzne w węźle są połączone za pośrednictwem magistrali PCIe, więc komunikacja może odbywać się z prędkością około 6 GiB / s. (Na przykład: https://www.youtube.com/watch?v=el1iSlP1uOs , około 35 minut). Mówca sugeruje, że jest to szybsze niż przejście z GPU1 na CPU na GPU2. Oznaczałoby to, że karta sieciowa nie stanowi już wąskiego gardła.

StatsSorceress
źródło
Ten facet ze swoim postem na blogu przynosi dobre punkty. Nie zrozumiałem wszystkich jego uzasadnień. Jednak fakt, że Google, Facebook, Twitter i wszystkie wiodące grupy głębokiego uczenia się w środowisku akademickim stosują swoje kody głównie na procesorach graficznych, sugeruje, że to dobry pomysł. Chociaż stronniczy: nvidia.com/content/events/geoInt2015/LBrown_DL.pdf
JahKnows

Odpowiedzi:

28

W przeciwieństwie do niektórych innych odpowiedzi, odradzałbym zawsze trening na GPU bez zastanowienia. Wynika to z zastosowania metod głębokiego uczenia się na obrazach i tekstach, w których dane są bardzo bogate (np. Wiele pikseli = wiele zmiennych), a model podobnie ma wiele milionów parametrów. W przypadku innych domen może tak nie być.

Co oznacza „mały”? Na przykład, czy jednowarstwowa MLP ze 100 ukrytymi jednostkami byłaby „mała”?

Tak, to zdecydowanie bardzo małe jak na współczesne standardy. Jeśli nie masz procesora graficznego doskonale nadającego się do treningu (np. NVIDIA 1080 lub NVIDIA Titan), nie zdziwiłbym się, gdy zobaczysz, że twój procesor był szybszy.

Pamiętaj, że złożoność sieci neuronowej zależy również od liczby funkcji wejściowych, a nie tylko od liczby jednostek w ukrytej warstwie. Jeśli Twoja ukryta warstwa ma 100 jednostek, a każda obserwacja w zbiorze danych ma 4 funkcje wejściowe, twoja sieć jest niewielka (~ 400 parametrów). Jeśli zamiast tego każda obserwacja ma funkcje wejściowe 1M, jak w niektórych kontekstach medycznych / biotechnologicznych, twoja sieć jest dość duża pod względem liczby parametrów. W pozostałej części mojej odpowiedzi zakładam, że masz dość mało funkcji wejściowych pr. obserwacja.

Dobrym przykładem, jaki znalazłem, porównując wydajność procesora z GPU, było wyszkolenie bota pokerowego z wykorzystaniem uczenia wzmacniającego. Do nauki wzmacniania często nie potrzebujesz tak wielu warstw w swojej sieci neuronowej i stwierdziliśmy, że potrzebowaliśmy tylko kilku warstw z kilkoma parametrami. Ponadto liczba funkcji wejściowych była dość niska. Początkowo trenowałem na GPU (NVIDIA Titan), ale zajęło to dużo czasu, ponieważ uczenie się na temat wzmacniania wymaga wielu iteracji. Na szczęście odkryłem, że trening na moim procesorze sprawił, że mój trening był 10 razy szybszy! To po prostu powiedzieć, że procesory mogą czasem być lepsze do treningu.

Czy są jakieś inne kryteria, które należy wziąć pod uwagę przy podejmowaniu decyzji, czy trenować na CPU czy GPU?

Ważne jest, aby pamiętać, że będąc na GPU, zawsze będziesz chciał zapełnić całą pamięć GPU poprzez zwiększenie wielkości partii, co nie dzieje się w przypadku procesora. Na CPU wzrost wielkości partii zwiększy czas pr. partia. Dlatego jeśli ważne jest, aby mieć bardzo duży rozmiar partii (np. Z powodu bardzo głośnego sygnału), może być korzystne użycie GPU. Nie doświadczyłem tego jednak w praktyce i zwykle preferowane są małe rozmiary partii.

pir
źródło
Dziękuję @pir! Czy masz jakieś konkretne referencje, w których mogę przeczytać więcej?
StatsSorceress
Możesz łatwo znaleźć liczbę parametrów np. VGG do porównania i zobaczyć, że twoja sieć jest niewielka w porównaniu.
pir
3
Nie widziałem wielu porównań CPU / GPU w małych sieciach, ponieważ nie są to zainteresowane dużymi firmami i laboratoriami badawczymi.
pir
@StatsSorceress Jeśli chcesz go przetestować samodzielnie, dlaczego nie po prostu skonfigurować prostego MLP Keras i przetestować wydajność GPU w porównaniu z procesorem? Zobacz także moją zaktualizowaną odpowiedź wrt. rozmiar twojej sieci.
pir
5

CPU jest kierownikiem oddziału, może zrobić wszystko po trochu, ale nie jest świetny w niczym oprócz delegowania zadań. GPU jest jednak oddanym matematykiem ukrywającym się w twoim komputerze. Jeśli wykonujesz jakieś matematyczne procesy, powinieneś użyć swojego GPU. Zawsze.

Jeśli używasz popularnego języka programowania do uczenia maszynowego, takiego jak Python lub MATLAB, jest to jednowierszowy kod informujący komputer, że operacje mają przebiegać na twoim GPU.

Powinieneś także upewnić się, że używasz wszystkich rdzeni swojej maszyny. Oznacza to wykorzystanie przetwarzania równoległego. Zwłaszcza w przypadku sieci neuronowych, w których operacje można wykonywać niezależnie, spowoduje to znaczne zwiększenie prędkości.

JahKnows
źródło
4
Odkryłem, że czasami narzut związany z przesyłaniem danych do i z GPU całkowicie niweczy wzrost prędkości z równoległości. Przejście na GPU nie zawsze jest dobrym pomysłem.
Adrian Keister
1
To zależy od złożoności twojego modelu. Jeśli trenujesz prosty K-NN, być może nie warto. Jeśli jednak trenujesz dowolny model, który wymaga macierzy odwrotnej lub sieci neuronowej, która wymaga wielu kolejnych operacji macierzy, zawsze warto wybrać GPU.
JahKnows
1
@AdrianKeister Zgadzam się. Do tego chciałem dojść w swojej odpowiedzi. W przypadku sieci wspomnianej przez PO prawdopodobnie byłoby to wąskie gardło.
pir
1
100 ukrytych jednostek jest szybszych na GPU przy użyciu mojej maszyny. Potrzebowałbym bardzo małej liczby ukrytych jednostek, aby procesor był szybszy. Co więcej, zawsze trenuję partiami. W tym przypadku wątpię, aby procesor był wąskim gardłem, biorąc pod uwagę wystarczająco gęstą ilość danych.
JahKnows
3

Najpierw odwołam się do cytatów z podobnych pytań:

Jeśli chodzi o operacje macierzowe, nie zastanawiasz się dwa razy, zawsze wybierasz układy GPU. źródło

Architektura równoległa w GPU jest dobrze przystosowana do operacji wektorowych i macierzowych. źródło

Jeśli więc przeczytasz te pytania, zobaczysz, że radzą używać GPU niezależnie od przypadku; zawsze zapewni pewną poprawę.

Być może przeczytałeś, że „małe” sieci powinny być szkolone z procesorem, ponieważ wdrożenie uczenia GPU tylko dla małej sieci może zająć więcej czasu niż zwykłe szkolenie z procesorem - to nie znaczy, że procesor graficzny będzie wolniejszy.

Sieć z 100 ukrytymi jednostkami jest trochę mała , nazwałbym to małą siecią w stosunku do dużych sieci głębokich. Architektura cykliczna (głównie) ma więcej synaps niż sieci przesyłające dalej, więc RNN o 100 ukrytych jednostkach jest „większy” niż FFN o 100 ukrytych jednostkach.

Thomas W.
źródło
Czy nie jest prawdą, że jeśli masz MLP z jedną ukrytą warstwą 100 jednostek, ma taką samą liczbę parametrów jak standardowy RNN ze 100 ukrytymi jednostkami z powodu podziału masy? Ma więcej „synaps” - więcej „aktywacji” - ale taką samą liczbę parametrów, prawda?
StatsSorceress
nie znam terminu „dzielenie wagi”. Ma taką samą liczbę aktywacji, ale więcej połączeń, więc więcej parametrów ...
Thomas W.
Podział ciężaru oznacza, że ​​macierz ciężaru od jednej ukrytej warstwy w RNN do następnej ukrytej warstwy jest taka sama; to ta sama macierz „U”, powielana w czasie. Ponadto wagi od wejścia do warstwy ukrytej są takie same w czasie.
StatsSorceress
@StatsSorceress Nie jestem zaznajomiony z pracą z macierzami. Tak, macierz wagi od ukrytej warstwy do następnej jest taka sama. Łącznie jest jednak więcej połączeń (ponieważ warstwa może się również połączyć z POPRZEDNĄ warstwą). Nie jestem pewien, jak mogę to wyjaśnić, ale RNN zawsze będzie miał więcej parametrów, ponieważ jest więcej połączonych warstw ..
Thomas W
Tak, rozumiem, że fizycznie jest więcej parametrów, ale wiele z tych parametrów przyjmuje tę samą wartość, co oznacza, że efektywna liczba parametrów w MLP i RNN o tej samej liczbie wymiarów wejściowych i takiej samej liczbie wymiarów ukrytych będzie podobnie.
StatsSorceress