CNN-Speicherverbrauch


9

Ich möchte abschätzen können, ob ein vorgeschlagenes Modell klein genug ist, um auf einer GPU mit einer bestimmten Speichermenge trainiert zu werden

Wenn ich eine einfache CNN-Architektur wie diese habe:

  • Input: 50 x 50 x 3
  • C1: 32 3x3-Kernel mit Polsterung (ich denke in Wirklichkeit sind sie tatsächlich 3x3x3 angesichts der Eingabetiefe?)
  • P1: 2x2 mit Schritt 2
  • C2: 64 3x3-Kernel mit Polsterung
  • P2: 2x2 mit Schritt 2
  • FC: 500 Neuronen
  • Output: Softmax 10 Klassen
  • Mini-Chargengröße von 64

Wie berechnen Sie unter der Annahme von 32-Bit-Gleitkommawerten die Speicherkosten für jede Schicht des Netzwerks während des Trainings? und dann den Gesamtspeicher, der zum Trainieren eines solchen Modells benötigt wird?

Antworten:


6

Ich gehe davon aus durch C1, C2usw. Sie Faltungs Schichten bedeuten, und P1, P2Sie mittlere Pooling Schichten und FCMittel vollständig miteinander verbundenen Schichten.

Wir können den für einen Vorwärtsdurchlauf erforderlichen Speicher wie folgt berechnen:

Ein Bild

Wenn Sie mit float32-Werten arbeiten, folgen Sie dem oben von @Alexandru Burlacu bereitgestellten Link:

Input: 50 x 50 x 3 = 7.500 = 7,5 K.

C1: 50 x 50 x 32 = 80.000 = 80 K.

P1: 25 x 25 x 32 = 20.000 = 20 K.

C2: 25 x 25 x 64 = 40.000 = 40 K.

P2: 12x12x64 = 9,216 = 9,2K <- Dies ist ein Problem (und meine Annäherung ist hier eine sehr handgewellte Vermutung). Anstatt mit 50, 25, '12 .5 'zu arbeiten, wäre es sinnvoller, mit Vielfachen von 32 zu arbeiten. Ich habe gehört, dass die Arbeit mit Vielfachen von 32 auch unter dem Gesichtspunkt des Speichers effizienter ist. Der Grund, warum dies eine schlechte Idee ist, ist, dass 2x2-Pooling den Raum nicht richtig aufteilt, soweit ich das beurteilen kann. Fühlen Sie sich frei, mich zu korrigieren, wenn ich falsch liege.

FC: 1 × 500 = 500 = 0,5 K.

Output: 1 x 10 = 10 = 0,01 K (so gut wie nichts)

Gesamtspeicher: 7,5 KB + 80 KB + 20 KB + 40 KB + 0,5 KB = 157,2 KB * 4 Byte = 628,8 KB

Das ist für ein Bild.

Minibatch

Wenn Sie mit einer Minibatch-Größe von 64 arbeiten, lesen Sie 64 davon gleichzeitig in den Speicher und führen die Vorgänge alle zusammen aus, wobei Sie alles wie folgt skalieren:

Input: 64 x 50 x 50 x 3 = 480.000 = 480 K = 0,48 M.

C1: 64 x 50 x 50 x 32 = 5.120.000 = 5,12 M.

P1: 64 x 25 x 25 x 32 = 1.280.000 = 1,28 M.

C2: 64 x 25 x 25 x 64 = 2.560.000 = 2,56 M.

P2: 64 × 12 × 12 × 64 = 589.824 = 590 K = 0,59 M.

FC: 64 x 500 = 32.000 = 32 K = 0,032 M.

Output: 1x10x64 = 640 = 0,64K = 0,00064M (es ist uns egal, das ist winzig)

Gesamtspeicher: 10 MB x 4 Byte ~ 40 MB (ich sage ungefähr, weil die Website auch einen ungefähren Wert angibt)

EDIT: Ich habe die Website falsch gelesen, sorry.

Laut der Website erfordert ein Rückwärtsdurchlauf etwa das Dreifache, da Folgendes gespeichert werden muss:

  • die Aktivierungen und zugehörigen Gradienten für jedes Neuron - diese sind gleich groß;

  • die Gradienten der Gewichte (Parameter), die die gleiche Größe wie die Parameter haben;

  • der Wert des Impulses, wenn Sie ihn verwenden;

  • eine Art verschiedenes Gedächtnis (ich verstehe diesen Teil nicht)


Müssen wir auch den für Gewichte / Parameter erforderlichen Speicher berücksichtigen? Zum Beispiel für Ihren Layer C1oben, 50x50x32aber das wären nur die Werte für die Layer-Aktivierungskarten. Was ist mit den gelernten Werten ( 32x3x3) im Kernel selbst?
Simon

Ja, laut cs.stanford.edu/~quocle/tutorial2.pdf . Der Backprop-Algorithmus, der SGD verwendet, benötigt die vorherigen Werte der Gewichte. Aber mit Max Pooling (machen Sie Max Pooling?) Müssen Sie nicht den Gradienten in Bezug auf jede Verbindung verfolgen. Sie müssen verfolgen, von welcher Verbindung der Maximalwert stammt, und nur den Gradienten für diesen Zweig berechnen.
StatsSorceress

@StatsSorceress, danke für diese Antwort, aber eine Frage tauchte in meinem Kopf auf. Was passiert, wenn die Faltungsschichtgröße 11x11 statt 3x3 beträgt? und was passiert, wenn eine ReLU gefolgt von einer Faltungsschicht?
Saeed Masoomi

2

Vielleicht gibt Ihnen dieser Link eine Erklärung, wie Sie die Speichernutzung eines beliebigen neuronalen Netzwerks berechnen. Im folgenden Link wird die Speichernutzung des VGGNet-Modells erläutert. Klicken Sie hier und scrollen Sie etwas nach unten))


1

Während des Trainings eines convNet wird Folgendes benötigt:

  • Speicher für Parameter
  • Speicher für die Ausgabe von Zwischenschichten
  • Speicher für den Gradienten jedes Parameters
  • Zusätzlicher Speicher benötigt, wenn Sie Optimierer wie Momentum, RMSprop, Adams usw. Verwenden
  • Verschiedenes Gedächtnis für die Implementierung

Eine gute grobe Annäherung ist die Anzahl der Parameter x 3 x 4 (wenn Sie 32-Bit-Float verwenden) Bytes

Nun berechnen Sie die Anzahl der Parameter folgendermaßen:

  • Conv-Ebene: (Kernelbreite x Kernelhöhe) x Anzahl der Kanäle x Tiefe + Tiefe (Tiefe nur hinzufügen, wenn Vorspannung vorhanden ist)
  • FC-Schicht: Anzahl der Eingaben * Anzahl der Ausgaben + Ausgaben (die Ausgabe wird hinzugefügt, um die Anzahl der Vorspannungen einzuschließen)
  • Maximale Poolschicht: kein Parameter

Summieren Sie nun einfach die Anzahl aller Parameter und verwenden Sie die von mir erwähnte Formel.

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.