Vorhersage des CPU- und GPU-Speicherbedarfs des DNN-Trainings

9

Angenommen, ich habe eine Modellarchitektur für tiefes Lernen sowie eine ausgewählte Mini-Batch-Größe. Wie leite ich daraus die erwarteten Speicheranforderungen für das Training dieses Modells ab?

Betrachten Sie als Beispiel ein (nicht wiederkehrendes) Modell mit einer Eingabe der Dimension 1000, 4 vollständig verbundenen verborgenen Schichten der Dimension 100 und einer zusätzlichen Ausgabeebene der Dimension 10. Die Mini-Batch-Größe beträgt 256 Beispiele. Wie bestimmt man den ungefähren Speicherbedarf (RAM) des Trainingsprozesses auf der CPU und der GPU? Wenn es einen Unterschied macht, nehmen wir an, dass das Modell auf einer GPU mit TensorFlow trainiert wird (also mit cuDNN).

Was?
quelle

Antworten:

2

Die Antwort von @ik_vision beschreibt, wie der zum Speichern der Gewichte benötigte Speicherplatz geschätzt wird. Sie müssen jedoch auch die Zwischenaktivierungen speichern, und insbesondere für Faltungsnetzwerke, die mit 3D-Daten arbeiten, ist dies der Hauptteil des benötigten Speichers.

So analysieren Sie Ihr Beispiel:

  1. Die Eingabe benötigt 1000 Elemente
  2. Nach den Ebenen 1 bis 4 haben Sie 100 Elemente, insgesamt 400
    1. Nach der letzten Ebene haben Sie 10 Elemente

Insgesamt benötigen Sie für 1 Probe 1410 Elemente für den Vorwärtsdurchlauf. Mit Ausnahme der Eingabe benötigen Sie für den Rückwärtsdurchlauf auch eine Gradienteninformation zu jedem von ihnen, dh 410 weitere, insgesamt 1820 Elemente pro Probe . Multiplizieren Sie mit der Chargengröße, um 465 920 zu erhalten.

Ich sagte "Elemente", weil die pro Element erforderliche Größe vom verwendeten Datentyp abhängt. Für eine einfache Genauigkeit sind float32es 4B, und der Gesamtspeicher, der zum Speichern der Datenblobs benötigt wird, beträgt ungefähr 1,8 MB.

Jan Kukacka
quelle
1

Ich sehe zwei Optionen:

  1. Das Netzwerk wird von der Festplatte geladen
  2. Das Netzwerk wird im laufenden Betrieb erstellt

In beiden Fällen muss die Größe des Speichers in der GPU mit der Stapelgröße multipliziert werden, da der größte Teil des Netzwerks für jedes Sample kopiert wird.

Faustregel beim Laden von der Festplatte: Wenn der DNN X MB auf der Festplatte benötigt, befindet sich das Netzwerk für Stapelgröße 1 2X im GPU-Speicher.

Das Netzwerk wird im laufenden Betrieb für Stapelgröße 1 erstellt: Zählen Sie den Parameter und multiplizieren Sie ihn mit 4 Byte (float32-Bit): Manuelles Zählen der Anzahl der Parameter: fc1: 1000x100 (Gewichte) + 100 (Verzerrungen) fc2: 100x100 (Gewichte) + 100 (Verzerrungen) fc3: 100x100 (Gewichte) + 100 (Verzerrungen) fc4: 100x100 (Gewichte) + 100 (Verzerrungen) Ausgabe: 100x10 (Gewichte) + 10 (Verzerrungen)

Zählen der Anzahl der Parameter mit Keras: model.count_params ()

ik_vision
quelle
3
Soweit ich das beurteilen kann, gibt dies die Speicheranforderungen für die Speicherung der Gewichte selbst an , ignoriert jedoch alle Speicher, die für die Speicherung aller für das Training erforderlichen Elemente vorgesehen sind , z. B. die Farbverläufe. Das Speichern der Gradienten ist beispielsweise zum Implementieren von Impulsen erforderlich. vermisse ich
Whaa
1
@Whaa das ist richtig, für normales Training benötigen Sie Speicher, um die Gewichte, die Aktivierungen im Vorwärtsdurchlauf und die Gradienten im Rückwärtsausbreitungsdurchlauf zu speichern (3x Speicher auch ohne Impuls).
mjul
@mjul meine Experimente zeigen die 4,5x Schätzung von ik_vision. Ich verstehe die Gründe für das 3x, bin mir aber nicht sicher, warum es in der Praxis 4.5x verwendet. Es muss andere Keras / TF-Overhead geben?
Wes