@StatsSorceress TL; DR:
Ich gehe diese Aktivität durch, um zu sehen, ob ich den benötigten Speicher selbst berechnen kann:
Aktivierungen: 532.752 * 2 * 4 / (1024 ^ 2) = 4,06 MB
Parameter: 19.072.984 * 4 / (1024 ^ 2) * 3 = 218,27 MB
Verschiedenes: 128 * 9.000 * 4 / (1024 ^ 2) = 4,39 MB
Gesamtspeicher: (4,06 × 128 ) + 218,27 + 4,39 = 742,34 MB
( Bitte korrigieren Sie mich, wenn ich falsch liege. Zu Ihrer Information, Sie haben bereits Verschiedenes mit 128 multipliziert. Deshalb habe ich es oben nicht mit 128 multipliziert. )
Ich würde Sie auf diesen Artikel und das entsprechende Video verweisen . Sie haben mir geholfen zu verstehen, was viel besser läuft.
ANMERKUNG: Der für die Verwendung eines Netzwerks für Vorhersagen erforderliche Speicher ist aus zwei Gründen weitaus geringer als der für das Training erforderliche Speicher:
- Bei der Vorhersage senden wir ein Bild nur vorwärts über das Netzwerk und nicht rückwärts (daher multiplizieren wir den Speicher nicht mit X 3; siehe unten).
- Es gibt eine Vorhersage pro Bild (daher müssen wir den für ein Bild erforderlichen Speicher nicht mit einer Stapelgröße multiplizieren, da wir für die Vorhersage keine Stapel verwenden).
Prozess (Gedächtnis zu trainieren)
- Berechnen Sie den Speicher, der zum Trainieren eines Bildes erforderlich ist
- Multiplizieren Sie diese Zahl mit der Anzahl der Bilder in Ihrem Stapel
( ERINNERN SIE SICH: Mini-Batching besagt, dass wir eine Teilmenge unserer Daten nehmen, die Verläufe und Fehler für jedes Bild in der Teilmenge berechnen, diese dann mitteln und in Richtung des Durchschnitts voranschreiten. Bei Konvetten werden Gewichte und Verzerrungen geteilt, aber Die Anzahl der Aktivierungen wird durch die Anzahl der Bilder im Stapel multipliziert. ).
SCHRITT 1: Speicher für 1 Bild
Um ein Bild zu trainieren, müssen Sie Speicher reservieren für:
Modellparameter:
Die Gewichte und Vorspannungen an jeder Schicht, deren Verläufe und ihre Impulsvariablen (wenn Adam, Adagrad, RMSProp usw. Optimierer verwendet werden)
Um die Speicherkapazität hierfür zu schätzen, berechnen Sie die Speicherkapazität, die zum Speichern der Gewichte und Vorspannungen erforderlich ist, und multiplizieren Sie diese mit 3 (dh "mit 3"), da die Speicherkapazität, die zum Speichern der Gewichte und Vorspannungen erforderlich ist, (ungefähr) gleich ist das für die Steigungen und für die Impulsvariablen benötigt wird)
Gleichungen:
Faltungen:
Gewichte (n) = Tiefe (n) * (Kernel_Breite * Kernel_Höhe) * Tiefe (n-1)
Vorurteile (n) = Tiefe (n)
Vollständig verbundene (dichte) Schichten:
Gewichte (n) = Ausgänge (n) * Eingänge (n)
Vorspannungen (n) = Ausgänge (n)
Dabei ist n die aktuelle Schicht und n-1 die vorherige Schicht, und Ausgänge sind die Anzahl der Ausgänge aus der FC-Schicht und Eingänge sind die Anzahl der Eingänge in die FC-Schicht (wenn die vorherige Schicht keine vollständig verbundene Schicht ist, Die Anzahl der Eingaben entspricht der Größe dieser Ebene (abgeflacht).
HINWEIS: Der Speicher für die Gewichte und Vorspannungen allein sowie der Speicher für die Aktivierungen für ein Bild (siehe unten) ist die Gesamtmenge des Speichers, die Sie für Vorhersagen benötigen (mit Ausnahme eines gewissen Overheads für den Speicher für Faltungen und einige andere Dinge).
- Aktivierungen (das sind "Blobs" in Caffe):
(Ich benutze Begriffe hier locker, trage sie mit mir)
Jede Faltung in einer Faltungsebene erzeugt Aktivierungen " Anzahl der Pixel in Bild " (dh Sie durchlaufen ein Bild durch eine einzelne Faltung. Sie erhalten eine einzelne Feature-Map, die aus " m " Aktivierungen besteht, wobei " m " die Anzahl der Pixel von Ihnen ist Bild / Eingabe).
Bei vollständig verbundenen Layern entspricht die Anzahl der von Ihnen erzeugten Aktivierungen der Größe Ihrer Ausgabe.
Faltungen:
Aktivierungen (n) = image_width * image_height * image_num_channels
Vollständig verbundene (dichte) Schichten:
Aktivierungen (n) = Ausgänge (n)
Beachten Sie, dass Ihre Eingabe eigentlich nur ein Bild am Anfang des Netzwerks ist. Nach Faltungen verwandelt es sich in etwas anderes (Feature-Maps). Ersetzen Sie also "image_width", "image_height" und "image_num_channels" durch "input_width", "input_height" und "layer_depth", um genau zu sein. (Es fällt mir nur leichter, dieses Konzept in Bildern zu sehen.)
Da wir auch den Fehler für die Aktivierungen auf jeder Ebene speichern müssen (im Rückwärtsdurchlauf verwendet), multiplizieren wir die Anzahl der Aktivierungen mit 2, um die Gesamtanzahl der Entitäten zu erhalten, für die in unserem Speicherplatz Platz geschaffen werden muss. Die Anzahl der Aktivierungen nimmt mit der Anzahl der Bilder im Stapel zu, sodass Sie diese Anzahl mit der Stapelgröße multiplizieren.
SCHRITT 2: Memory to Train Batch
Summieren Sie die Anzahl der Gewichte und Vorspannungen (mal 3) und die Anzahl der Aktivierungen (mal 2 mal die Chargengröße). Multiplizieren Sie dies mit 4, und Sie erhalten die Anzahl der zum Trainieren des Stapels erforderlichen Bytes. Sie können durch 1024 ^ 2 dividieren, um die Antwort in GB zu erhalten.