1

Ich versuche, einen groben Griff auf der GPU Speicherbedarf meines TensorFlow tief Lernmodelle zu bekommen, und auf a heuristic I've found verlasse mich mit schon sagt:Wie kann ich den GPU-Footprint meines TensorFlow-Modells schätzen?

bewusst sein

Der größte Engpass bei ConvNet Konstruktion Architekturen der Speicherengpass. Viele moderne GPUs haben ein Limit von 3/4/6GB Speicher, mit den besten GPUs mit etwa 12 GB Speicher. Es gibt drei Hauptquellen der Speicher im Auge zu behalten:

  • Aus den Zwischenvolumengrößen: Dies sind die rohen Anzahl der Aktivierungen auf jeder Ebene des ConvNet sind, sowie deren Gradienten (von gleicher Größe). Üblicherweise sind die meisten Aktivierungen auf den früheren Schichten eines ConvNet (d. H. Ersten Conv Layers). Diese werden um gehalten, weil sie für Backpropagation benötigt werden, aber eine clevere Implementierung, die ein ConvNet nur zur Testzeit laufen lässt, könnte in Prinzip dies um eine riesige Menge reduzieren, indem nur die aktuellen Aktivierungen auf jeder Schicht gespeichert und die vorherige verworfen werden Aktivierungen auf Schichten darunter.

  • Aus den Parametergrößen: Dies sind die Zahlen, die die Netzwerkparameter, deren Gradienten während backpropagation halten, und häufig einen Schritt Cache auch wenn die Optimierung Dynamik unter Verwendung, Adagrad oder RMSProp. Daher muss der Speicher zum Speichern des Parameters Vektor allein in der Regel mit einem Faktor von mindestens 3 oder so multipliziert werden.

  • Jede ConvNet Implementierung hat verschiedene Speicher zu halten, wie die Bilddaten Chargen, vielleicht ihre Augmented-Versionen usw.

Sobald Sie eine grobe Schätzung der Gesamtzahl der Werte (für Aktivierungen, Farbverläufe und misc), die Zahl sollte in Größe in GB konvertiert werden. Nehmen Sie die Anzahl der Werte, multiplizieren Sie mit 4, um die rohe Anzahl der Bytes zu erhalten (da jedes Fließkomma 4 Bytes ist, oder vielleicht 8 für doppelte Genauigkeit), und teilen Sie dann durch 1024 mehrere Male, um die Menge an Speicher zu erhalten in KB, MB und schließlich GB. Wenn Ihr Netzwerk nicht passt, ist eine übliche Heuristik, um es fit zu machen, um die Batch-Größe zu verringern, da der Großteil des Speichers in der Regel durch die Aktivierungen verbraucht wird.

Aber ich bin nicht sicher, ein paar Dinge:

  1. Was ist die Rolle der Chargengröße bei dieser Berechnung? Es scheint, dass es nur Aktivierungen betrifft (das heißt, ich sollte die Aktivierungen mit der Batch-Größe multiplizieren). Ist das korrekt?
  2. Woher weiß ich, welche dieser Dinge auf meiner GPU (mit 12GiB) sitzt und welche auf meinem CPU-RAM (in TensorFlow)? Im Allgemeinen befinden sich diese auf der GPU?
  3. Wo soll ich nach "Verschiedenes" suchen? Die Eingangsdaten sind die Hauptquelle dafür. Und wenn ja, zähle ich eine einzelne Menge solcher Daten oder alles zusammen?

Antwort

0
  1. Sie haben ein einziges Modell, das Chargen von Proben unter Verwendung trainiert. Ein einzelner Stapel besteht aus mehreren Eingaben. Diese Eingänge werden unter Verwendung des Modells parallel verarbeitet. Wenn Ihr Stapel also eine bestimmte Anzahl von Elementen enthält, wird jedes Element von der CPU (wo die Eingabewarteschlangen sind) zur GPU übertragen. Die GPU berechnet daher unter Verwendung des Modells mit dem Status t (denken Sie über dieses Modell als das Modell mit seinen zum Zeitpunkt t eingefrorenen Parametern nach) den Vorwärtsdurchlauf für jedes einzelne Element des Eingabebatchs. Dann werden die Netzwerkergebnisse in einem Vektor akkumuliert und nun wird der Backpropagation-Schritt berechnet. Die Gradienten werden somit für jedes einzelne Element der Charge unter Verwendung des Modells zum Zeitpunkt t (wieder) berechnet, berechnet (Rückwärtsdurchlauf), in einem Vektor akkumuliert und gemittelt. Mit diesem Mittelwert werden die Modellparameter aktualisiert und das Modell tritt in den Zustand t+1 ein.

  2. Als Faustregel gilt, dass alles, was von Natur aus sequenziell ist, auf der CPU liegt (denken Sie an Eingabe-Threads, Warteschlange, Verarbeitung einzelner Eingabewerte, ...). Aber alles, was das Netzwerk verarbeiten sollte, wird dann von der CPU auf die GPU übertragen.

  3. Der sonstige Teil ist ein wenig verwirrend. Ich denke, der Autor spricht über die Datenerweiterung und die Tatsache, dass eine einzelne Eingabe unendlich erweitert werden kann. Daher müssen Sie berücksichtigen, dass, wenn Sie Transformationen auf einen Batch von Eingaben anwenden (z. B. zufällige Helligkeit auf einen ganzen Stapel von Bildern), diese zu berechnenden Transformationen von der CPU auf die GPU und die erweiterten Versionen übertragen werden müssen sollte vor der Verarbeitung im GPU-Speicher gespeichert werden. der Übertragungsvorgang würde das jedoch auch getan werden, Sie einige Rechenzeit nur lose (für das preprocesing natürlich), wird der zugewiesene Speicher die die gleichen

+0

Können Sie das in die Fragen übersetzen 1-3 wie sie sich auf die Interpretation des Originaltextes beziehen? – orome

+0

Es gibt 3 verschiedene Absätze, einen pro Punkt. Ich werde jedoch bearbeiten – nessuno

Verwandte Themen