Teile diesen Beitrag:

Hej Leute,

heute geht es um die Unterschiede zwischen CPU und GPU, denn aktuell ist die Verwendung von GPUs für Maschinelles Lernen in aller Munde. Aber was ist eigentlich eine GPU und warum sind die GPUs für Deep Learning so gut geeignet?

Dazu klären wir erstmal, was eine CPU, eine GPU und auch eine TPU sind. Danach ist klarer, warum die GPUs einen so großen Vorteil in der KI haben.

Was ist der Unterschied zwischen CPU, GPU und TPU?

Die CPU ist der Hauptprozessor eines Rechners und für allgemeine Aufgaben ausgelegt. Die GPU ist ein für 3D-Grafik optimierter Grafikprozessor. Und die TPU ist ein Spezialprozessor von Google, der für Tensorflow optimiert wurde.

Die CPU im Detail

CPU ist der Hauptprozessor eines Computers (CPU = central processing unit = zentrale Verarbeitungseinheit). Die CPU besteht heutzutage aus mehreren Prozessorkernen, die im Wesentlichen eigenständige CPUs sind.

Eine CPU setzt sich hauptsächlich aus einem Steuerwerk und einem Rechenwerk zusammen. Daneben sind üblicherweise noch weitere Teile wie zum Beispiel eine Gleitkomma-Recheneinheit vorhanden. Zudem ist die CPU über einen Daten-Bus mit den anderen Komponenten des Rechners verbunden

Das Steuerwerk (engl. control unit) ist für die Befehlsverarbeitung zuständig. Dazu holt es sich einen Befehl einen Befehl aus dem Speicher, dekodiert ihn, führt ihn aus und schreibt das Ergebnis in den Speicher.

Das Rechenwerk besteht aus einer oder mehreren ALUs (arithmetic-logic unit) und mehreren Registern. Die ALU kann zwei Binärwerte miteinander verrechnen. Dabei sind mindestens die Basisbefehle ADD (Addition), NOT (Invertieren) und AND (logische Und-Verknüpfung) vorhanden, meist aber noch weitere wie OR, XOR, MUL, SUB, die aber auch durch die ersten drei abgebildet werden können.

Die GPU besticht durch Matrixberechnungen

Mit GPU bezeichnet man einen Grafikprozessor (graphical processing unit), also einen Prozessor, der auf die Berechnung von Befehlen, die für die Grafikdarstellung benötigt werden, optimiert ist. Eine oder mehrere GPUs können in der CPU, onboard (auf der Hauptplatine), auf einer internen Grafikkarte oder in externen Erweiterungsboxen (eGPU) sein.

Die GPU ist für 3D-Berechnungen ausgelegt. Typische Aufgaben sind geometrische Berechnungen (Transformation, Rotation), Texture Mapping, Shading oder Interpolations-Techniken. Dafür sind vor allem Matrix- und Vektorberechnungen (Lineare Algebra) notwendig. Zudem sind GPUs hochgradig parallelisiert, sie können also mehrere Datenblöcke gleichzeitig verarbeiten.

Die Kombination aus Parallelisierung und Matrix-Rechnung machen GPUs so effektiv für moderne KI-Methoden wie Neuronale Netze. Dazu weiter unten mehr.

Die TPU ist ein Spezialprozessor

TPU steht für Tensor Processing Unit und ist ein Prozessor, der von Google speziell für die Berechnungen von Neuronalen Netzen entwickelt wurde. Genauer gesagt für das Neuronale Netze-Framework Tensorflow. Im Gegensatz zu GPUs sind die TPUs auf ein hohes Volumen von Berechnungen mit niedriger Genauigkeit, z.B. 8-Bit. GPUs hingegen sind auf 32-/64-Bit-Operationen optimiert.

Warum brauchen wir GPUs in der KI?

Abstrakt gesehen brauchen wir die GPUs nicht, denn natürlich kann auch das Rechenwerk einer CPU die entsprechenden Berechnungen ausführen. Aber praktisch gesehen brauchen wir die GPUs aus Geschwindigkeitsgründen. Denn die GPU ist optimiert auf Vektor- und Matrixberechnungen. Und die Architektur der GPU ist auf parallele Verarbeitung ausgelegt. Beides sind Eigenschaften, die für KI-Algorithmen, insbesondere für Neuronale Netze von enormer Bedeutung sind.

Was haben Neuronale Netze mit Matrixrechnung zu tun?

Neuronale Netze basieren ganz Wesentlich auf Matrixberechnungen. Zum Beispiel brauchen wir diese, um den Output eines Netzwerks schnell zu berechnen. Achtung, jetzt wird es mathematisch:

  • w_{jk}^l bezeichnet das Gewicht der Verbindung vom k-ten Neurons der Schicht (l-1) zum j-ten Neuron in der Schicht l,
  • b_j^l den Bias des j-ten Neurons in der Schicht l,
  • a_j^l die Aktivierung des j-ten Neurons in der Schicht l
  • \sigma die Aktivierungsfunktion

Dann wird die Aktivierung der l-ten Schicht so berechnet

a_j^l ='' \sigma(\sum_k w_{jk}^l a_k^{l-1} + b_j^l )

In Matrixschreibweise sieht das dann so aus:

a^l ='' \sigma(w^l a^{l-1} + b^l )

Optimierung der Gewichte mittels Gradient Descent und Backpropagation

Um ein neuronales Netz zu trainieren, füttern wir es mit einer Unzahl an Beispielen, so dass es die Gewichte der Verbindungen und den Bias optimiert. Dafür wird meistens eine Variation des sogenannten Gradient Descent-Algorithmus verwendet. Grob gesprochen geht es darum, dass die Fehlerfunktion (loss function) möglichst klein. Es werden in jedem Schritt die Gewichte also so angepasst, dass die Verbesserung der Fehlerfunktion maximal wird. Dafür müssen wir wissen, wo die Funktion am steilsten bergab geht (descent = Abstieg). Das wiederum hängt an der Ableitung (gradient), wissen die Mathematiker.

Ein Spezialfall des Gradient Descent ist Backpropagation, welches auf dem mittleren quadratischen Fehler basiert. Den mittleren quadratischen Fehler kennen viele vermutlich schon von der linearen Regression. Backpropagation ist kurz für „backward propagation of errors“ und das backward kommt daher, dass das Neuronale Netzwerk rückwärts durchlaufen wird, also vom Output Layer her.

Die genauen Formeln würden hier etwas zu weit führen, aber im Wesentlichen sind es jede Menge Matrixmultiplikationen. Und dafür sind wieder besonders geeignet: GPUs.

Parallelisierung in Neuronalen Netzen

Daten-Parallelisierung

Wir gruppieren die (Trainings-)Daten in sogenannte Mini-Batches. Ein Mini-Batch wird dann parallel in der GPU optimiert (gradient descent) und anschließend werden die Ergebnisse gemittelt.

Parallelisierung durch Split der Trainingsbeispiele

Modell-Parallelisierung

Hier wird die Gewichtsmatrix in mehrere Untermatrizen aufgeteilt, so dass diese dann parallel optimiert werden können. Haben wir zum Beispiel eine Matrix mit 1000×1000 Einträgen, können wir diese in vier 1000×250 Matrizen splitten und diese dann an vier GPUs gleichzeitig zur Optimierung schicken.

Parallelisierung durch Split der Gewichtsmatrix

Happy Coding, Euer Holger

Teile diesen Beitrag: