Auswahl zwischen CPU und GPU zum Trainieren eines neuronalen Netzwerks


28

Ich habe Diskussionen über den 'Overhead' einer GPU gesehen, und dass es für 'kleine' Netzwerke möglicherweise schneller ist, auf einer CPU (oder einem Netzwerk von CPUs) zu trainieren als auf einer GPU.

Was ist mit "klein" gemeint?

Wäre beispielsweise ein einschichtiger MLP mit 100 versteckten Einheiten "klein"?

Ändert sich unsere Definition von "klein" für wiederkehrende Architekturen?

Gibt es andere Kriterien, die bei der Entscheidung, ob auf CPU oder GPU trainiert werden soll, berücksichtigt werden sollten?

EDIT 1:

Ich habe gerade einen Blog-Beitrag gefunden (möglicherweise veraltet? Es ist aus dem Jahr 2014):

"... Die meisten Netzwerkkarten funktionieren nur mit Arbeitsspeicher, der bei der CPU registriert ist, und daher würde die GPU-zu-GPU-Übertragung zwischen zwei Knoten folgendermaßen aussehen: GPU 1 zu CPU 1 zu Netzwerkkarte 1 zu Netzwerkkarte 2 zu CPU 2 bis GPU 2. Dies bedeutet, wenn man eine langsame Netzwerkkarte auswählt, kann es zu keinen Beschleunigungen über einen einzelnen Computer kommen. Selbst bei schnellen Netzwerkkarten, wenn der Cluster groß ist, werden im Vergleich nicht einmal Beschleunigungen von GPUs erzielt für CPUs, da die GPUs einfach zu schnell arbeiten, als dass die Netzwerkkarten mithalten könnten.

Dies ist der Grund, warum viele große Unternehmen wie Google und Microsoft CPU-Cluster anstelle von GPU-Clustern verwenden, um ihre großen neuronalen Netze zu trainieren. "

Irgendwann hätte es laut diesem Beitrag also schneller gehen können, CPUs zu verwenden. Ist das noch der Fall?

EDIT 2: Ja, dieser Blog-Beitrag ist möglicherweise veraltet, weil:

Nun scheinen die GPUs innerhalb eines Knotens über einen PCIe-Bus verbunden zu sein, sodass die Kommunikation mit etwa 6 Gb / s erfolgen kann. (Zum Beispiel: https://www.youtube.com/watch?v=el1iSlP1uOs , ungefähr 35 Minuten in). Der Lautsprecher impliziert, dass dies schneller ist als der Übergang von GPU1 zu CPU zu GPU2. Dies würde bedeuten, dass die Netzwerkkarte nicht länger der Engpass ist.


Der Typ mit seinem Blogbeitrag bringt gute Punkte. Ich habe nicht alle seine Rechtfertigungen verstanden. Die Tatsache, dass Google, Facebook, Twitter und alle führenden Deep-Learning-Gruppen in der Wissenschaft ihre Codes hauptsächlich auf GPUs ausführen, legt nahe, dass dies eine gute Idee ist. Obwohl voreingenommen: nvidia.com/content/events/geoInt2015/LBrown_DL.pdf
JahKnows

Antworten:


27

Im Gegensatz zu einigen anderen Antworten würde ich dringend davon abraten, immer auf GPUs zu trainieren, ohne darüber nachzudenken. Dies wird durch die Verwendung von Deep-Learning-Methoden für Bilder und Texte vorangetrieben, bei denen die Daten sehr umfangreich sind (z. B. viele Pixel = viele Variablen) und das Modell in ähnlicher Weise viele Millionen Parameter aufweist. Für andere Domänen ist dies möglicherweise nicht der Fall.

Was ist mit "klein" gemeint? Wäre beispielsweise ein einschichtiger MLP mit 100 versteckten Einheiten "klein"?

Ja, das ist für moderne Verhältnisse definitiv sehr klein. Wenn Sie nicht über eine GPU verfügen, die perfekt für das Training geeignet ist (z. B. NVIDIA 1080 oder NVIDIA Titan), würde es mich nicht überraschen, dass Ihre CPU schneller ist.

Beachten Sie, dass die Komplexität Ihres neuronalen Netzwerks auch von der Anzahl der Eingabe-Features abhängt, nicht nur von der Anzahl der Einheiten in Ihrer verborgenen Ebene. Wenn Ihre verborgene Ebene 100 Einheiten hat und jede Beobachtung in Ihrem Datensatz 4 Eingabefunktionen hat, ist Ihr Netzwerk winzig (~ 400 Parameter). Wenn jede Beobachtung stattdessen über 1 Million Eingabefunktionen verfügt, wie dies in einigen medizinischen / biotechnologischen Kontexten der Fall ist, ist Ihr Netzwerk in Bezug auf die Anzahl der Parameter ziemlich groß. Für den Rest meiner Antwort gehe ich davon aus, dass Sie ziemlich wenige Eingabefunktionen haben. Überwachung.

Ein gutes Beispiel für den Vergleich der CPU- mit der GPU-Leistung war das Training eines Poker-Bots mit dem Erlernen von Verstärkung. Zum Erlernen der Verstärkung möchten Sie oft nicht so viele Schichten in Ihrem neuronalen Netzwerk und wir haben festgestellt, dass wir nur wenige Schichten mit wenigen Parametern benötigen. Darüber hinaus war die Anzahl der Eingabemerkmale recht gering. Anfangs habe ich auf einer GPU (NVIDIA Titan) trainiert, aber es hat lange gedauert, da das Erlernen der Verstärkung viele Iterationen erfordert. Glücklicherweise stellte ich fest, dass das Training auf meiner CPU stattdessen das 10-fache meiner Trainingsgeschwindigkeit betrug! Dies ist nur um zu sagen, dass CPUs manchmal besser für das Training sein können.

Gibt es andere Kriterien, die bei der Entscheidung, ob auf CPU oder GPU trainiert werden soll, berücksichtigt werden sollten?

Es ist wichtig zu beachten, dass Sie auf einer GPU immer den gesamten GPU-Speicher füllen möchten, indem Sie die Stapelgröße erhöhen, was auf der CPU nicht der Fall ist. Auf der CPU verlängert eine Erhöhung der Stapelgröße die Zeit pr. Stapel. Daher kann es von Vorteil sein, eine GPU zu verwenden, wenn Sie eine sehr große Stapelgröße benötigen (z. B. aufgrund eines sehr verrauschten Signals). In der Praxis habe ich das allerdings nicht erlebt und normalerweise werden kleine Losgrößen bevorzugt.


Vielen Dank @pir! Haben Sie spezielle Referenzen, wo ich mehr lesen kann?
StatsSorceress

Sie können leicht die Anzahl der zu vergleichenden Parameter von z. B. VGG ermitteln und feststellen, dass Ihr Netzwerk im Vergleich winzig ist.
Pir

3
Ich habe nicht viele CPU / GPU-Vergleiche in winzigen Netzwerken gesehen, weil die großen Unternehmen und Forschungslabors nicht daran interessiert sind.
pir

@StatsSorceress Wenn Sie es selbst testen möchten, warum nicht einfach ein einfaches Keras-MLP einrichten und die Leistung auf der GPU im Vergleich zur CPU testen? Siehe auch meine aktualisierte Antwort wrt. die Größe Ihres Netzwerks.
Pir

5

Die CPU ist der Manager der Niederlassung, er kann von allem ein bisschen, aber er kann nicht viel, außer Aufgaben zu delegieren. Die GPU ist jedoch ein engagierter Mathematiker, der sich in Ihrer Maschine versteckt. Wenn Sie mathematisch anspruchsvolle Prozesse ausführen, sollten Sie Ihre GPU verwenden. Immer.

Wenn Sie eine gängige Programmiersprache für maschinelles Lernen wie Python oder MATLAB verwenden, wird Ihrem Computer durch eine einzige Codezeile mitgeteilt, dass die Vorgänge auf Ihrer GPU ausgeführt werden sollen.

Sie sollten auch sicherstellen, dass Sie alle Kerne Ihres Computers verwenden. Dies bedeutet paralleles Rechnen. Insbesondere bei neuronalen Netzen, bei denen Operationen unabhängig voneinander ausgeführt werden können, wird dies Ihre Geschwindigkeit erheblich erhöhen.


4
Ich habe festgestellt, dass manchmal der Overhead beim Übertragen von Daten zur und von der GPU die Geschwindigkeitserhöhung aufgrund der Parallelität vollständig auslöscht. Es ist nicht immer eine gute Idee, zur GPU zu gehen.
Adrian Keister

1
Dies hängt von der Komplexität Ihres Modells ab. Wenn Sie ein einfaches K-NN trainieren, lohnt es sich vielleicht nicht. Wenn Sie jedoch ein Modell trainieren, das eine inverse Matrix oder ein neuronales Netzwerk erfordert, das viele nachfolgende Matrixoperationen benötigt, ist es immer eine gute Idee, sich für die GPU zu entscheiden.
JahKnows

1
@AdrianKeister Ich stimme zu. Darauf wollte ich in meiner Antwort eingehen. Für das von OP erwähnte Netzwerk wäre dies wahrscheinlich der Engpass.
Pir

1
100 versteckte Einheiten sind auf der GPU mit meinem Computer schneller. Ich würde eine sehr kleine Anzahl versteckter Einheiten benötigen, damit die CPU schneller ist. Außerdem neige ich immer dazu, mein Training in Gruppen durchzuführen. In diesem Fall bezweifle ich, dass eine CPU der Engpass sein wird, wenn man bedenkt, dass die Daten dicht genug sind.
JahKnows

3

Ich beziehe mich zunächst auf einige Zitate aus ähnlichen Fragen:

Wenn es um Matrix-Operationen geht, überlegen Sie nicht lange, sondern entscheiden sich immer für GPUs. Quelle

Die parallele Architektur in einer GPU eignet sich gut für Vektor- und Matrixoperationen. Quelle

Wenn Sie sich diese Fragen durchlesen, werden Sie feststellen, dass sie unabhängig vom Einzelfall die Verwendung einer GPU empfehlen. es wird immer eine Verbesserung bringen.

Der Grund, warum Sie vielleicht gelesen haben, dass 'kleine' Netzwerke mit CPU trainiert werden sollten, ist, dass das Implementieren des GPU-Trainings für nur ein kleines Netzwerk möglicherweise mehr Zeit in Anspruch nimmt als nur das Training mit CPU - das bedeutet nicht, dass die GPU langsamer sein wird.

Ein Netzwerk mit 100 versteckten Einheiten ist ein bisschen klein , ich würde es ein kleines Netzwerk im Vergleich zu den großen, tiefen Netzwerken da draußen nennen. Wiederkehrende Architekturen haben (meistens) mehr Synapsen als Feedforward-Netzwerke, daher ist ein RNN mit 100 verborgenen Einheiten "größer" als ein FFN mit 100 verborgenen Einheiten.


Stimmt es nicht, dass ein MLP mit einer einzelnen ausgeblendeten Schicht von 100 Einheiten aufgrund der Gewichtsverteilung dieselbe Anzahl von Parametern aufweist wie ein Standard-RNN mit 100 ausgeblendeten Einheiten? Es hat mehr "Synapsen" - mehr "Aktivierungen" - aber die gleiche Anzahl von Parametern, oder?
StatsSorceress

ich kenne den begriff 'weight sharing' nicht. Es hat die gleiche Anzahl von Aktivierungen, aber mehr Verbindungen, so mehr Parameter ...
Thomas W

Gewichtsverteilung bedeutet, dass die Gewichtsmatrix von einer verborgenen Schicht in der RNN zur nächsten verborgenen Schicht dieselbe ist. Es ist dieselbe 'U'-Matrix, die über die Zeit repliziert wird. Außerdem sind die Gewichte von der Eingabe zur ausgeblendeten Ebene über die Zeit hinweg gleich.
StatsSorceress

@StatsSorceress Ich bin nicht vertraut mit der Arbeit mit Matrizen. Ja, die Gewichtsmatrix von einer verborgenen Schicht zur nächsten ist dieselbe. Insgesamt gibt es jedoch mehr Verbindungen (da eine Ebene auch mit der PREVIOUS-Ebene verbunden werden kann). Ich bin nicht sicher, wie ich das erklären kann, aber eine RNN wird immer mehr Parameter haben, da es mehr verbundene Schichten gibt.
Thomas W

Ja, ich verstehe, dass es physikalisch mehr Parameter gibt, aber viele dieser Parameter nehmen denselben Wert an, was bedeutet, dass die effektive Anzahl von Parametern in einem MLP und einer RNN mit derselben Anzahl von Eingabedimensionen und derselben Anzahl von verborgenen Dimensionen die ist gleich.
StatsSorceress
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.