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.
źródło
Odpowiedzi:
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ć.
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.
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.
źródło
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.
źródło
Najpierw odwołam się do cytatów z podobnych pytań:
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.
źródło