Eine Frage haben? Verbinden Sie sich mit der Community im TensorFlow Forum Visit Forum

Optimieren Sie die TensorFlow-Leistung mit dem Profiler

Verwenden Sie die mit dem Profiler verfügbaren Tools, um die Leistung Ihrer TensorFlow-Modelle zu verfolgen. Sehen Sie, wie Ihr Modell auf dem Host (CPU), dem Gerät (GPU) oder auf einer Kombination aus Host und Gerät (en) funktioniert.

Mithilfe der Profilerstellung können Sie den Hardwareressourcenverbrauch (Zeit und Speicher) der verschiedenen TensorFlow-Vorgänge (Ops) in Ihrem Modell verstehen, Leistungsengpässe beheben und letztendlich die Ausführung des Modells beschleunigen.

In diesem Handbuch erfahren Sie, wie Sie den Profiler installieren, welche Tools verfügbar sind, in welchen verschiedenen Modi der Profiler Leistungsdaten erfasst und welche bewährten Methoden zur Optimierung der Modellleistung empfohlen werden.

Informationen zum Profilieren der Modellleistung auf Cloud-TPUs finden Sie im Cloud-TPU-Handbuch .

Installieren Sie die Profiler- und GPU-Voraussetzungen

Installieren Sie den Profiler, indem Sie das Skript install_and_run.py aus dem GitHub-Repository herunterladen und install_and_run.py .

Um sich auf der GPU zu profilieren, müssen Sie:

  1. Erfüllen Sie die NVIDIA® GPU-Treiber und CUDA® Toolkit-Anforderungen, die in den Anforderungen der TensorFlow GPU-Support-Software aufgeführt sind .
  2. Stellen Sie sicher, dass CUPTI auf dem Pfad vorhanden ist:

    /sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH) | \
    grep libcupti
    

Wenn Sie CUPTI nicht im Pfad haben, stellen Sie das Installationsverzeichnis der Umgebungsvariablen $LD_LIBRARY_PATH , indem Sie $LD_LIBRARY_PATH :

export LD_LIBRARY_PATH=/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH

Führen Sie den ldconfig Befehl ldconfig erneut aus, um zu überprüfen, ob die CUPTI-Bibliothek gefunden wurde.

Beheben Sie Berechtigungsprobleme

Wenn Sie die Profilerstellung mit CUDA® Toolkit in einer Docker-Umgebung oder unter Linux ausführen, können Probleme im Zusammenhang mit unzureichenden CUPTI-Berechtigungen ( CUPTI_ERROR_INSUFFICIENT_PRIVILEGES ) auftreten. Weitere Informationen zum Beheben dieser Probleme unter Linux finden Sie in den NVIDIA Developer Docs .

Führen Sie Folgendes aus, um CUPTI-Berechtigungsprobleme in einer Docker-Umgebung zu beheben

docker run option '--privileged=true'

Profiler-Tools

Greifen Sie auf den Profiler über die Registerkarte Profil in TensorBoard zu, die erst angezeigt wird, nachdem Sie einige Modelldaten erfasst haben.

Der Profiler verfügt über eine Auswahl von Tools, die bei der Leistungsanalyse helfen:

  • Übersichtsseite
  • Pipeline-Analysator eingeben
  • TensorFlow-Statistiken
  • Trace-Viewer
  • GPU-Kernel-Statistiken
  • Speicherprofil-Tool
  • Pod Viewer

Übersichtsseite

Die Übersichtsseite bietet eine Top-Level-Ansicht der Leistung Ihres Modells während eines Profillaufs. Die Seite zeigt Ihnen eine aggregierte Übersichtsseite für Ihren Host und alle Geräte sowie einige Empfehlungen zur Verbesserung der Leistung Ihres Modelltrainings. Sie können auch einzelne Hosts in der Dropdown-Liste Host auswählen.

Auf der Übersichtsseite werden Daten wie folgt angezeigt:

Bild

  • Leistungsübersicht - Zeigt eine allgemeine Zusammenfassung Ihrer Modellleistung an. Die Leistungsübersicht besteht aus zwei Teilen:

    1. Aufschlüsselung der Schrittzeit - Unterteilt die durchschnittliche Schrittzeit in mehrere Kategorien, in denen Zeit verbracht wird:

      • Kompilierung - Zeitaufwand für das Kompilieren von Kerneln
      • Eingabe - Zeit, die zum Lesen der Eingabedaten aufgewendet wurde
      • Ausgabe - Zeit, die zum Lesen der Ausgabedaten aufgewendet wurde
      • Kernel-Start - Zeit, die der Host zum Starten von Kerneln benötigt
      • Rechenzeit des Hosts
      • Kommunikationszeit von Gerät zu Gerät
      • Rechenzeit auf dem Gerät
      • Alle anderen, einschließlich Python-Overhead
    2. Geräteberechnungsgenauigkeiten - Gibt den Prozentsatz der Geräteberechnungszeit an, für die 16- und 32-Bit-Berechnungen verwendet werden

  • Schrittzeitdiagramm - Zeigt ein Diagramm der Geräteschrittzeit (in Millisekunden) über alle abgetasteten Schritte an. Jeder Schritt ist in mehrere Kategorien (mit unterschiedlichen Farben) unterteilt, in denen Zeit verbracht wird. Der rote Bereich entspricht dem Teil der Schrittzeit, in der die Geräte im Leerlauf saßen und auf Eingabedaten vom Host warteten. Der grüne Bereich zeigt an, wie viel Zeit das Gerät tatsächlich gearbeitet hat

  • Top 10 TensorFlow-Vorgänge auf dem Gerät - Zeigt die Operationen auf dem Gerät an, die am längsten ausgeführt wurden.

    In jeder Zeile werden die Eigenzeit eines Ops (als Prozentsatz der von allen Operationen benötigten Zeit), die kumulierte Zeit, die Kategorie und der Name angezeigt.

  • Ausführungsumgebung - Zeigt eine allgemeine Zusammenfassung der Modellausführungsumgebung an, einschließlich:

    • Anzahl der verwendeten Hosts
    • Gerätetyp (GPU / TPU)
    • Anzahl der Gerätekerne
  • Empfehlung für die nächsten Schritte - Meldet, wenn ein Modell eingabegebunden ist, und empfiehlt Tools, mit denen Sie Engpässe bei der Modellleistung lokalisieren und beheben können

Pipeline-Analysator eingeben

Wenn ein TensorFlow-Programm Daten aus einer Datei liest, beginnt es am oberen Rand des TensorFlow-Diagramms in einer Pipeline-Weise. Der Lesevorgang ist in mehrere in Reihe geschaltete Datenverarbeitungsstufen unterteilt, wobei die Ausgabe einer Stufe die Eingabe der nächsten ist. Dieses System zum Lesen von Daten wird als Eingabepipeline bezeichnet .

Eine typische Pipeline zum Lesen von Datensätzen aus Dateien besteht aus folgenden Schritten:

  1. Datei lesen
  2. Dateivorverarbeitung (optional)
  3. Dateiübertragung vom Host zum Gerät

Eine ineffiziente Eingabepipeline kann Ihre Anwendung erheblich verlangsamen. Eine Anwendung gilt als eingabegebunden, wenn sie einen erheblichen Teil der Zeit in der Eingabepipeline verbringt. Verwenden Sie die vom Eingabepipeline-Analysator erhaltenen Erkenntnisse, um zu verstehen, wo die Eingabepipeline ineffizient ist.

Der Eingabepipeline-Analysator teilt Ihnen sofort mit, ob Ihr Programm eingabegebunden ist, und führt Sie durch die geräte- und hostseitige Analyse, um Leistungsengpässe in jeder Phase der Eingabepipeline zu beheben.

In den Anleitungen zur Leistung der Eingabe-Pipeline finden Sie empfohlene Best Practices zur Optimierung Ihrer Dateneingabe-Pipelines.

Eingabe-Pipeline-Dashboard

Um den Input Pipeline Analyzer zu öffnen, wählen Sie Profile und dann input_pipeline_analyzer aus der Dropdown- Liste Tools .

Bild

Das Dashboard enthält drei Abschnitte:

  1. Zusammenfassung - Fasst die gesamte Eingabe-Pipeline mit Informationen darüber zusammen, ob und um wie viel Ihre Anwendung eingabegebunden ist
  2. Geräteseitige Analyse - Zeigt detaillierte, geräteseitige Analyseergebnisse an, einschließlich der Geräteschrittzeit und des Bereichs der Gerätezeit, die für das Warten auf Eingabedaten über Kerne bei jedem Schritt aufgewendet wurde
  3. Host-seitige Analyse - Zeigt eine detaillierte Analyse auf der Host-Seite an, einschließlich einer Aufschlüsselung der Eingabeverarbeitungszeit auf dem Host

Zusammenfassung der Eingabe-Pipeline

In der Zusammenfassung wird angegeben, ob Ihr Programm eingabegebunden ist, indem der Prozentsatz der Gerätezeit angegeben wird, die für das Warten auf Eingaben vom Host aufgewendet wurde. Wenn Sie eine standardisierte Eingabe-Pipeline verwenden, die instrumentiert wurde, meldet das Tool, wo der größte Teil der Eingabeverarbeitungszeit verbracht wird.

Geräteseitige Analyse

Die geräteseitige Analyse bietet Einblicke in die auf dem Gerät verbrachte Zeit im Vergleich zum Host und in die Zeit, die für das Warten auf Eingabedaten vom Host aufgewendet wurde.

  1. Schrittzeit gegen Schrittnummer aufgetragen - Zeigt ein Diagramm der Geräteschrittzeit (in Millisekunden) über alle abgetasteten Schritte an. Jeder Schritt ist in mehrere Kategorien (mit unterschiedlichen Farben) unterteilt, in denen Zeit verbracht wird. Der rote Bereich entspricht dem Teil der Schrittzeit, in der die Geräte im Leerlauf saßen und auf Eingabedaten vom Host warteten. Der grüne Bereich zeigt an, wie viel Zeit das Gerät tatsächlich gearbeitet hat
  2. Schrittzeitstatistik - Gibt den Durchschnitt, die Standardabweichung und den Bereich ([Minimum, Maximum]) der Schrittzeit des Geräts an

Host-seitige Analyse

Die host-seitige Analyse gibt eine Aufschlüsselung der Eingabeverarbeitungszeit (die für tf.data API ops aufgewendete Zeit) auf dem Host in mehrere Kategorien an:

  • Lesen von Daten aus Dateien bei Bedarf - Zeitaufwand für das Lesen von Daten aus Dateien ohne Zwischenspeichern, Vorabrufen und Verschachteln
  • Lesen von Daten aus Dateien im Voraus - Zeitaufwand für das Lesen von Dateien, einschließlich Caching, Prefetching und Interleaving
  • Datenvorverarbeitung - Zeit, die für die Vorverarbeitung von Operationen aufgewendet wird, z. B. für die Bilddekomprimierung
  • Einreihen von Daten, die auf das Gerät übertragen werden sollen - Zeitaufwand für das Einfügen von Daten in eine Einspeisewarteschlange vor dem Übertragen der Daten auf das Gerät

Erweitern Sie die Input Op Statistics , um die Statistiken für einzelne Input Ops und deren Kategorien nach Ausführungszeit aufgeschlüsselt anzuzeigen.

Bild

Zu jedem Eintrag wird eine Quelldatentabelle mit den folgenden Informationen angezeigt:

  1. Input Op - Zeigt den TensorFlow Op-Namen des Input Op an
  2. Anzahl - Zeigt die Gesamtzahl der Instanzen der Op-Ausführung während des Profilierungszeitraums an
  3. Gesamtzeit (in ms) - Zeigt die kumulierte Zeit an, die für jede dieser Instanzen aufgewendet wurde
  4. Gesamtzeit% - Zeigt die Gesamtzeit an, die für eine Operation aufgewendet wurde, als Bruchteil der Gesamtzeit, die für die Eingabeverarbeitung aufgewendet wurde
  5. Gesamtselbstzeit (in ms) - Zeigt die kumulierte Summe der Selbstzeit an, die für jede dieser Instanzen aufgewendet wurde. Die Eigenzeit misst hier die Zeit, die im Funktionskörper verbracht wird, ausgenommen die Zeit, die in der aufgerufenen Funktion verbracht wird.
  6. Gesamte Selbstzeit% . Zeigt die gesamte Selbstzeit als Bruchteil der gesamten Zeit an, die für die Eingabeverarbeitung aufgewendet wurde
  7. Kategorie . Zeigt die Verarbeitungskategorie des Eingangs op

TensorFlow-Statistiken

Das TensorFlow-Statistik-Tool zeigt die Leistung aller TensorFlow-Operationen an, die während einer Profilerstellungssitzung auf dem Host oder Gerät ausgeführt werden.

Bild

Das Tool zeigt Leistungsinformationen in zwei Bereichen an:

  • Im oberen Bereich werden bis zu vier Kreisdiagramme angezeigt:

    1. Die Verteilung der Selbstausführungszeit jeder Operation auf dem Host
    2. Die Verteilung der Selbstausführungszeit jedes Op-Typs auf dem Host
    3. Die Verteilung der Selbstausführungszeit jeder Operation auf dem Gerät
    4. Die Verteilung der Selbstausführungszeit jedes Op-Typs auf dem Gerät
  • Der untere Bereich zeigt eine Tabelle mit Daten zu TensorFlow-Operationen mit einer Zeile für jede Operation und einer Spalte für jeden Datentyp (sortieren Sie die Spalten, indem Sie auf die Überschrift der Spalte klicken). Klicken Sie rechts im oberen Bereich auf die Schaltfläche Als CSV exportieren, um die Daten aus dieser Tabelle als CSV-Datei zu exportieren.

    Beachten Sie, dass:

    • Wenn irgendwelche Operationen Kinderoperationen haben:

      • Die gesamte "akkumulierte" Zeit einer Operation umfasst die Zeit, die innerhalb der Kinderoperationen verbracht wird

      • Die gesamte "Selbst" -Zeit einer Operation beinhaltet nicht die Zeit, die innerhalb der Kinderoperationen verbracht wird

    • Wenn eine Operation auf dem Host ausgeführt wird:

      • Der Prozentsatz der gesamten Selbstzeit auf dem Gerät, die durch die Operation anfällt, beträgt 0
      • Der kumulative Prozentsatz der gesamten Selbstzeit auf dem Gerät bis einschließlich dieser Operation beträgt 0
    • Wenn eine Operation auf dem Gerät ausgeführt wird:

      • Der Prozentsatz der gesamten Selbstzeit auf dem Host, die durch diese Operation entsteht, beträgt 0
      • Der kumulative Prozentsatz der gesamten Selbstzeit auf dem Host bis einschließlich dieser Operation beträgt 0

Sie können die Leerlaufzeit in die Kreisdiagramme und Tabellen ein- oder ausschließen.

Trace-Viewer

Der Trace-Viewer zeigt eine Zeitleiste an, die Folgendes anzeigt:

  • Dauer für die Operationen, die von Ihrem TensorFlow-Modell ausgeführt wurden
  • Welcher Teil des Systems (Host oder Gerät) hat eine Operation ausgeführt? In der Regel führt der Host Eingabeoperationen aus, verarbeitet Trainingsdaten vor und überträgt sie an das Gerät, während das Gerät das eigentliche Modelltraining ausführt

Mit dem Trace-Viewer können Sie Leistungsprobleme in Ihrem Modell identifizieren und anschließend Maßnahmen ergreifen, um diese zu beheben. Auf hoher Ebene können Sie beispielsweise feststellen, ob Input- oder Modelltraining die meiste Zeit in Anspruch nimmt. Im Drilldown können Sie ermitteln, welche Operationen am längsten ausgeführt werden. Beachten Sie, dass der Trace-Viewer auf 1 Million Ereignisse pro Gerät beschränkt ist.

Trace-Viewer-Oberfläche

Wenn Sie den Trace-Viewer öffnen, wird Ihr letzter Lauf angezeigt:

Bild

Dieser Bildschirm enthält die folgenden Hauptelemente:

  1. Zeitleistenfenster - Zeigt Operationen an, die das Gerät und der Host im Laufe der Zeit ausgeführt haben
  2. Detailbereich - Zeigt zusätzliche Informationen zu Operationen an, die im Zeitleistenbereich ausgewählt wurden

Der Zeitleistenbereich enthält die folgenden Elemente:

  1. Obere Leiste - Enthält verschiedene Zusatzsteuerungen
  2. Zeitachse - Zeigt die Zeit relativ zum Beginn der Ablaufverfolgung an
  3. Abschnitts- und Spurbezeichnungen - Jeder Abschnitt enthält mehrere Spuren und links ein Dreieck, auf das Sie klicken können, um den Abschnitt zu erweitern und zu reduzieren. Für jedes Verarbeitungselement im System gibt es einen Abschnitt
  4. Werkzeugauswahl - Enthält verschiedene Werkzeuge für die Interaktion mit dem Trace-Viewer, z. B. Zoom, Schwenken, Auswählen und Timing. Verwenden Sie das Timing-Tool, um ein Zeitintervall zu markieren.
  5. Ereignisse - Diese zeigen die Zeit an, während der eine Operation ausgeführt wurde, oder die Dauer von Metaereignissen, wie z. B. Trainingsschritten
Abschnitte und Tracks

Der Trace-Viewer enthält die folgenden Abschnitte:

  • Ein Abschnitt für jeden Geräteknoten , gekennzeichnet mit der Nummer des Gerätechips und des Geräteknotens innerhalb des Chips (z. B. /device:GPU:0 (pid 0) ). Jeder Geräteknotenabschnitt enthält die folgenden Spuren:
    • Schritt - Zeigt die Dauer der Trainingsschritte an, die auf dem Gerät ausgeführt wurden
    • TensorFlow Ops - . Zeigt die auf dem Gerät ausgeführten Operationen an
    • XLA- Operationen - Zeigt XLA- Operationen (Operationen) an, die auf dem Gerät ausgeführt wurden, wenn XLA der verwendete Compiler ist (jede TensorFlow-Operation wird in eine oder mehrere XLA-Operationen übersetzt. Der XLA-Compiler übersetzt die XLA-Operationen in Code, der auf dem Gerät ausgeführt wird).
  • Ein Abschnitt für Threads, die auf der CPU des Hostcomputers ausgeführt werden, mit der Bezeichnung "Host-Threads" . Der Abschnitt enthält eine Spur für jeden CPU-Thread. Beachten Sie, dass Sie die Informationen ignorieren können, die neben den Abschnittsbeschriftungen angezeigt werden.
Veranstaltungen

Ereignisse innerhalb der Zeitleiste werden in verschiedenen Farben angezeigt. Die Farben selbst haben keine spezifische Bedeutung.

Der Trace-Viewer kann auch Spuren von Python-Funktionsaufrufen in Ihrem TensorFlow-Programm anzeigen. Wenn Sie die API tf.profiler.experimental.start() , können Sie die Python-Ablaufverfolgung aktivieren, indem Sie beim Starten der ProfilerOptions die ProfilerOptions namenstuple verwenden. Wenn Sie alternativ den Stichprobenmodus für die Profilerstellung verwenden, können Sie die Ablaufverfolgungsstufe mithilfe der Dropdown-Optionen im Dialogfeld " Profil erfassen" auswählen.

Bild

GPU-Kernel-Statistiken

Dieses Tool zeigt Leistungsstatistiken und die ursprüngliche Operation für jeden GPU-beschleunigten Kernel an.

Bild

Das Tool zeigt Informationen in zwei Bereichen an:

  • Im oberen Bereich wird ein Kreisdiagramm angezeigt, in dem die CUDA-Kernel mit der höchsten verstrichenen Gesamtzeit aufgeführt sind

  • Im unteren Bereich wird eine Tabelle mit den folgenden Daten für jedes eindeutige Kernel-Op-Paar angezeigt:

    • Ein Rang in absteigender Reihenfolge der insgesamt verstrichenen GPU-Dauer, gruppiert nach Kernel-Op-Paar
    • Der Name des gestarteten Kernels
    • Die Anzahl der vom Kernel verwendeten GPU-Register
    • Die Gesamtgröße des gemeinsam genutzten (statischen + dynamischen gemeinsam genutzten) Speichers in Bytes
    • Die blockDim.x, blockDim.y, blockDim.z ausgedrückt als blockDim.x, blockDim.y, blockDim.z
    • Die gridDim.x, gridDim.y, gridDim.z ausgedrückt als gridDim.x, gridDim.y, gridDim.z
    • Gibt an, ob die Operation zur Verwendung von TensorCores berechtigt ist
    • Gibt an, ob der Kernel TensorCore-Anweisungen enthält
    • Der Name der Operation, die diesen Kernel gestartet hat
    • Die Anzahl der Vorkommen dieses Kernel-Op-Paares
    • Die insgesamt verstrichene GPU-Zeit in Mikrosekunden
    • Die durchschnittlich verstrichene GPU-Zeit in Mikrosekunden
    • Die minimale verstrichene GPU-Zeit in Mikrosekunden
    • Die maximal verstrichene GPU-Zeit in Mikrosekunden

Speicherprofil-Tool

Das Speicherprofil-Tool überwacht die Speichernutzung Ihres Geräts während des Profilierungsintervalls. Mit diesem Tool können Sie:

  • Debuggen von OOM-Problemen (Out of Memory), indem die maximale Speichernutzung und die entsprechende Speicherzuordnung für TensorFlow-Operationen ermittelt werden. Sie können debuggen OOM Probleme auch ergeben, die beim Ausführen von Multi-Tenancy - Inferenz
  • Debuggen von Speicherfragmentierungsproblemen

Das Speicherprofil-Tool zeigt Daten in drei Abschnitten an:

  1. Zusammenfassung des Speicherprofils
  2. Speicher-Zeitleisten-Diagramm
  3. Speicheraufschlüsselungstabelle

Zusammenfassung des Speicherprofils

In diesem Abschnitt wird eine allgemeine Zusammenfassung des Speicherprofils Ihres TensorFlow-Programms angezeigt (siehe unten):

Die Zusammenfassung des Speicherprofils enthält sechs Felder:

  1. Speicher-ID - Dropdown-Liste, in der alle verfügbaren Gerätespeichersysteme aufgelistet sind. Wählen Sie aus der Dropdown-Liste das Speichersystem aus, das Sie anzeigen möchten
  2. #Allocation - Die Anzahl der Speicherzuweisungen, die während des Profilierungsintervalls vorgenommen wurden
  3. #Deallocation - Die Anzahl der Speicherfreigaben im Profilierungsintervall
  4. Speicherkapazität - Die Gesamtkapazität (in GiBs) des von Ihnen ausgewählten Speichersystems
  5. Peak Heap Usage - Die maximale Speichernutzung (in GiBs) seit dem Start des Modells
  6. Spitzenspeicherauslastung - Die Spitzenspeicherauslastung (in GiBs) im Profilierungsintervall. Dieses Feld enthält die folgenden Unterfelder:
    1. Zeitstempel - Der Zeitstempel, zu dem die maximale Speichernutzung im Timeline-Diagramm aufgetreten ist
    2. Stapelreservierung - Auf dem Stapel reservierter Speicherplatz (in GiBs)
    3. Heap-Zuordnung - Auf dem Heap zugewiesene Speichermenge (in GiBs)
    4. Freier Speicher - Menge an freiem Speicher (in GiBs). Die Speicherkapazität ist die Gesamtsumme aus Stapelreservierung, Heap-Zuordnung und freiem Speicher
    5. Fragmentierung - Der Prozentsatz der Fragmentierung (niedriger ist besser). Es wird als Prozentsatz von (1 - Größe des größten Teils des freien Speichers / Gesamtfreier Speicher) berechnet.

Speicherzeitleisten-Diagramm

Dieser Abschnitt zeigt eine grafische Darstellung der Speichernutzung (in GiBs) und des Prozentsatzes der Fragmentierung gegenüber der Zeit (in ms).

Bild

Die X-Achse repräsentiert die Zeitachse (in ms) des Profilierungsintervalls. Die Y-Achse links repräsentiert die Speichernutzung (in GiBs) und die Y-Achse rechts repräsentiert den Prozentsatz der Fragmentierung. Zu jedem Zeitpunkt auf der X-Achse wird der Gesamtspeicher in drei Kategorien unterteilt: Stapel (in Rot), Heap (in Orange) und Frei (in Grün). Bewegen Sie den Mauszeiger über einen bestimmten Zeitstempel, um die Details zu den Speicherzuweisungs- / Freigabeereignissen an diesem Punkt wie folgt anzuzeigen:

Bild

Das Popup-Fenster zeigt die folgenden Informationen an:

  • Zeitstempel (ms) - Der Ort des ausgewählten Ereignisses auf der Zeitachse
  • Ereignis - Die Art des Ereignisses (Zuweisung oder Freigabe)
  • request_size (GiBs) - Die angeforderte Speichermenge. Dies ist eine negative Zahl für Freigabeereignisse
  • Zuordnungsgröße (GiBs) - Die tatsächlich zugewiesene Speichermenge. Dies ist eine negative Zahl für Freigabeereignisse
  • tf_op - Der TensorFlow Op, der die Zuweisung / Freigabe anfordert
  • step_id - Der Trainingsschritt, in dem dieses Ereignis aufgetreten ist
  • region_type - Der Datenentitätstyp, für den dieser zugewiesene Speicher bestimmt ist. Mögliche Werte sind temp für temporäre Werte, output für Aktivierungen und Verläufe und persist / dynamic für Gewichte und Konstanten
  • data_type - Der Tensorelementtyp (z. B. uint8 für 8-Bit-Ganzzahlen ohne Vorzeichen)
  • tensor_shape - Die Form des Tensors, der zugewiesen / freigegeben wird
  • memory_in_use (GiBs) - Der zu diesem Zeitpunkt verwendete Gesamtspeicher

Speicheraufschlüsselungstabelle

Diese Tabelle zeigt die aktiven Speicherzuordnungen zum Zeitpunkt der maximalen Speichernutzung im Profilierungsintervall.

Bild

Es gibt eine Zeile für jeden TensorFlow Op und jede Zeile enthält die folgenden Spalten:

  • Op Name - Der Name des TensorFlow op
  • Allocation Size (GiBs) - Die Gesamtmenge an Speicher, die dieser Operation zugewiesen ist
  • Angeforderte Größe (GiBs) - Die Gesamtmenge an Speicher, die für diese Operation angefordert wurde
  • Vorkommen - Die Anzahl der Zuweisungen für diese Operation
  • Regionstyp - Der Datenentitätstyp, für den dieser zugewiesene Speicher bestimmt ist. Mögliche Werte sind temp für temporäre Werte, output für Aktivierungen und Verläufe und persist / dynamic für Gewichte und Konstanten
  • Datentyp - Der Tensorelementtyp
  • Form - Die Form der zugewiesenen Tensoren

Pod Viewer

Das Pod Viewer-Tool zeigt die Aufteilung eines Schulungsschritts auf alle Mitarbeiter.

Bild

  • Der obere Bereich verfügt über einen Schieberegler zur Auswahl der Schrittnummer.
  • Im unteren Bereich wird ein gestapeltes Säulendiagramm angezeigt. Dies ist eine allgemeine Ansicht der übereinander angeordneten aufgeschlüsselten Schrittzeitkategorien. Jede gestapelte Spalte repräsentiert einen eindeutigen Arbeiter.
  • Wenn Sie mit der Maus über eine gestapelte Spalte fahren, werden auf der Karte auf der linken Seite weitere Details zur Aufschlüsselung der Schritte angezeigt.

tf.data Engpassanalyse

Die tf.data-Engpassanalyse erkennt automatisch Engpässe in tf.data-Eingabe-Pipelines in Ihrem Programm und gibt Empfehlungen zur Behebung dieser Engpässe. Es funktioniert mit jedem Programm, das tf.data verwendet, unabhängig von der Plattform (CPU / GPU / TPU) oder dem Framework (TensorFlow / JAX). Die Analyse und Empfehlungen basieren auf diesem Leitfaden .

Es erkennt einen Engpass, indem es die folgenden Schritte ausführt:

  1. Finden Sie den am meisten eingabegebundenen Host.
  2. Finden Sie die langsamste Ausführung der tf.data-Eingabepipeline.
  3. Rekonstruieren Sie das Eingabe-Pipeline-Diagramm aus dem Profiler-Trace.
  4. Suchen Sie den kritischen Pfad im Eingabe-Pipeline-Diagramm.
  5. Identifizieren Sie die langsamste Transformation auf dem kritischen Pfad als Engpass.

Die Benutzeroberfläche ist in drei Abschnitte unterteilt: Zusammenfassung der Leistungsanalyse, Zusammenfassung aller Eingabepipelines und Diagramm der Eingabepipelines.

Zusammenfassung der Leistungsanalyse

Bild

Dieser Abschnitt enthält eine Zusammenfassung der Analyse. Hier erfahren Sie, ob im Profil eine langsame tf.data-Eingabepipeline erkannt wird. In diesem Fall werden der am meisten eingabegebundene Host und die langsamste Eingabepipeline mit der maximalen Latenz angezeigt. Und am wichtigsten ist, dass angegeben wird, welcher Teil der Eingabepipeline der Engpass ist und wie dieser behoben werden kann. Die Engpassinformationen werden mit dem Iteratortyp und seinem langen Namen bereitgestellt.

Lesen des langen Namens des tf.data-Iterators

Ein langer Name wird als Iterator::<Dataset_1>::...::<Dataset_n> . Im <Dataset_n> stimmt <Dataset_n> mit dem Iteratortyp <Dataset_n> und die anderen Datensätze im <Dataset_n> repräsentieren nachgeschaltete Transformationen.

Betrachten Sie beispielsweise den folgenden Eingabepipeline-Datensatz:

dataset = tf.data.Dataset.range(10).map(lambda x: x).repeat(2).batch(5)

Die langen Namen für die Iteratoren aus dem obigen Datensatz lauten:

Iteratortyp Langer Name
Reichweite Iterator :: Batch :: Repeat :: Map :: Range
Karte Iterator :: Batch :: Repeat :: Map
Wiederholen Iterator :: Batch :: Repeat
Stapel Iterator :: Batch

Zusammenfassung aller Eingabepipelines

Bild

Dieser Abschnitt enthält eine Zusammenfassung aller Eingabe-Pipelines auf allen Hosts. Normalerweise gibt es eine Eingabepipeline. Bei Verwendung der Verteilungsstrategie gibt es eine Host-Eingabe-Pipeline, in der der tf.data-Code des Programms ausgeführt wird, und mehrere Geräte-Eingabe-Pipelines, die Daten aus der Host-Eingabe-Pipeline abrufen und auf die Geräte übertragen.

Für jede Eingabepipeline werden die Statistiken ihrer Ausführungszeit angezeigt. Ein Anruf wird als langsam gezählt, wenn er länger als 50 μs dauert.

Eingabe-Pipeline-Diagramm

Bild

Dieser Abschnitt zeigt das Eingabe-Pipeline-Diagramm mit den Ausführungszeitinformationen. Mit "Host" und "Input Pipeline" können Sie auswählen, welcher Host und welche Input Pipeline angezeigt werden sollen. Die Ausführungen der Eingabepipeline werden nach der Ausführungszeit in absteigender Reihenfolge sortiert, die Sie mit "Rang" auswählen können.

Bild

Die Knoten auf dem kritischen Pfad haben fette Umrisse. Der Engpassknoten, der der Knoten mit der längsten Selbstzeit auf dem kritischen Pfad ist, hat einen roten Umriss. Die anderen unkritischen Knoten haben grau gestrichelte Umrisse.

In jedem Knoten gibt "Startzeit" die Startzeit der Ausführung an. Derselbe Knoten kann beispielsweise mehrmals ausgeführt werden, wenn sich in der Eingabepipeline ein Stapel befindet. Wenn es mehrmals ausgeführt wird, ist dies die Startzeit der ersten Ausführung.

"Gesamtdauer" ist die Wandzeit der Ausführung. Wenn es mehrmals ausgeführt wird, ist es die Summe der Wandzeiten aller Ausführungen.

"Self Time" ist "Total Time" ohne die überlappende Zeit mit ihren unmittelbaren untergeordneten Knoten.

"# Calls" gibt an, wie oft die Eingabepipeline ausgeführt wird.

Leistungsdaten sammeln

Der TensorFlow Profiler sammelt Hostaktivitäten und GPU-Traces Ihres TensorFlow-Modells. Sie können den Profiler so konfigurieren, dass Leistungsdaten entweder im Programmiermodus oder im Stichprobenmodus erfasst werden.

Profiling-APIs

Sie können die folgenden APIs verwenden, um die Profilerstellung durchzuführen.

  • Programmatischer Modus mit dem TensorBoard Keras Callback ( tf.keras.callbacks.TensorBoard )

    # Profile from batches 10 to 15
    tb_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir,
                                                 profile_batch='10, 15')
    
    # Train the model and use the TensorBoard Keras callback to collect
    # performance profiling data
    model.fit(train_data,
              steps_per_epoch=20,
              epochs=5,
              callbacks=[tb_callback])
    
  • Programmatischer Modus mit der Funktions-API tf.profiler

    tf.profiler.experimental.start('logdir')
    # Train the model here
    tf.profiler.experimental.stop()
    
  • Programmatischer Modus mit dem Kontextmanager

    with tf.profiler.experimental.Profile('logdir'):
        # Train the model here
        pass
    

  • tf.profiler.experimental.server.start() - Führen Sie eine On-Demand-Profilerstellung mit tf.profiler.experimental.server.start() , um einen gRPC-Server mit Ihrem TensorFlow- tf.profiler.experimental.server.start() zu starten. Nachdem Sie den gRPC-Server gestartet und Ihr Modell ausgeführt haben, können Sie ein Profil über die Schaltfläche Profil erfassen im TensorBoard-Profil-Plugin erfassen. Verwenden Sie das Skript im obigen Abschnitt Profiler installieren, um eine TensorBoard-Instanz zu starten, falls sie noch nicht ausgeführt wird.

    Als Beispiel,

    # Start a profiler server before your model runs.
    tf.profiler.experimental.server.start(6009)
    # (Model code goes here).
    #  Send a request to the profiler server to collect a trace of your model.
    tf.profiler.experimental.client.trace('grpc://localhost:6009',
                                          'gs://your_tb_logdir', 2000)
    

    Ein Beispiel für die Profilerstellung mehrerer Mitarbeiter:

    # E.g. your worker IP addresses are 10.0.0.2, 10.0.0.3, 10.0.0.4, and you
    # would like to profile for a duration of 2 seconds.
    tf.profiler.experimental.client.trace(
        'grpc://10.0.0.2:8466,grpc://10.0.0.3:8466,grpc://10.0.0.4:8466',
        'gs://your_tb_logdir',
        2000)
    

Verwenden Sie das Dialogfeld " Profil erfassen", um Folgendes anzugeben:

  • Eine durch Kommas getrennte Liste von Profildienst-URLs oder TPU-Namen.
  • Eine Profildauer.
  • Die Ebene der Geräte-, Host- und Python-Funktionsaufrufverfolgung.
  • Wie oft soll der Profiler die Erfassung von Profilen wiederholen, wenn dies zunächst nicht erfolgreich ist.

Profilerstellung für benutzerdefinierte Trainingsschleifen

Um benutzerdefinierte Trainingsschleifen in Ihrem TensorFlow-Code zu profilieren, instrumentieren Sie die Trainingsschleife mit der API tf.profiler.experimental.Trace , um die Schrittgrenzen für den Profiler zu markieren. Das Argument name wird als Präfix für die step_num verwendet, das Schlüsselwortargument step_num wird an die step_num angehängt, und das Schlüsselwortargument _r step_num , dass dieses Ablaufverfolgungsereignis vom Profiler als Schrittereignis verarbeitet wird.

Als Beispiel,

for step in range(NUM_STEPS):
    with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
        train_data = next(dataset)
        train_step(train_data)

Dadurch wird die schrittweise Leistungsanalyse des Profilers aktiviert und die Schrittereignisse werden im Trace-Viewer angezeigt.

Stellen Sie sicher, dass Sie den Dataset-Iterator in den Kontext tf.profiler.experimental.Trace um eine genaue Analyse der Eingabepipeline zu erhalten.

Das folgende Code-Snippet ist ein Anti-Pattern:

for step, train_data in enumerate(dataset):
    with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
        train_step(train_data)

Profiling-Anwendungsfälle

Der Profiler deckt eine Reihe von Anwendungsfällen entlang vier verschiedener Achsen ab. Einige der Kombinationen werden derzeit unterstützt, andere werden in Zukunft hinzugefügt. Einige der Anwendungsfälle sind:

  • Lokale oder Remote-Profilerstellung: Dies sind zwei gängige Methoden zum Einrichten Ihrer Profilerstellungsumgebung. Bei der lokalen Profilerstellung wird die Profilerstellungs-API auf demselben Computer aufgerufen, auf dem Ihr Modell ausgeführt wird, z. B. auf einer lokalen Workstation mit GPUs. Bei der Remote-Profilerstellung wird die Profiling-API auf einem anderen Computer aufgerufen, auf dem Ihr Modell beispielsweise auf einer Cloud-TPU ausgeführt wird.
  • Profilerstellung für mehrere Mitarbeiter: Sie können mehrere Computer profilieren, wenn Sie die verteilten Schulungsfunktionen von TensorFlow verwenden.
  • Hardwareplattform: Profil-CPUs, GPUs und TPUs.

Die folgende Tabelle gibt einen schnellen Überblick darüber, welche der oben genannten Anwendungsfälle von den verschiedenen Profilierungs-APIs in TensorFlow unterstützt werden:

Profiling API Lokal Fernbedienung Mehrere Arbeiter Hardware-Plattformen
TensorBoard Keras Rückruf Unterstützt Nicht unterstützt Nicht unterstützt CPU, GPU
tf.profiler.experimental Start / Stopp- API Unterstützt Nicht unterstützt Nicht unterstützt CPU, GPU
tf.profiler.experimental client.trace API Unterstützt Unterstützt Unterstützt CPU, GPU, TPU
Kontextmanager-API Unterstützt Nicht unterstützt Nicht unterstützt CPU, GPU

Best Practices für eine optimale Modellleistung

Verwenden Sie die folgenden Empfehlungen für Ihre TensorFlow-Modelle, um eine optimale Leistung zu erzielen.

Führen Sie im Allgemeinen alle Transformationen auf dem Gerät durch und stellen Sie sicher, dass Sie die neueste kompatible Version von Bibliotheken wie cuDNN und Intel MKL für Ihre Plattform verwenden.

Optimieren Sie die Eingabedaten-Pipeline

Eine effiziente Dateneingabepipeline kann die Geschwindigkeit der Modellausführung drastisch verbessern, indem die Leerlaufzeit des Geräts verkürzt wird. Ziehen Sie in Betracht, die folgenden Best Practices wie hier beschrieben zu integrieren, um Ihre Dateneingabepipeline effizienter zu gestalten:

  • Daten vorab abrufen
  • Datenextraktion parallelisieren
  • Datentransformation parallelisieren
  • Daten im Speicher zwischenspeichern
  • Benutzerdefinierte Funktionen vektorisieren
  • Reduzieren Sie die Speichernutzung beim Anwenden von Transformationen

Versuchen Sie außerdem, Ihr Modell mit synthetischen Daten auszuführen, um zu überprüfen, ob die Eingabepipeline einen Leistungsengpass darstellt.

Verbessern Sie die Geräteleistung

  • Erhöhen Sie die Größe des Mini-Batch-Trainings (Anzahl der pro Gerät verwendeten Trainingsmuster in einer Iteration der Trainingsschleife).
  • Verwenden Sie TF-Statistiken, um herauszufinden, wie effizient Operationen auf dem Gerät ausgeführt werden
  • Verwenden Sie tf.function , um Berechnungen durchzuführen, und aktivieren Sie optional das Flag experimental_compile
  • Minimieren Sie die Python-Operationen des Hosts zwischen den Schritten und reduzieren Sie Rückrufe. Berechnen Sie Metriken alle paar Schritte anstatt bei jedem Schritt
  • Halten Sie die Gerätecomputereinheiten beschäftigt
  • Senden Sie Daten parallel an mehrere Geräte
  • Optimieren Sie das Datenlayout, um zuerst Kanäle zu bevorzugen (z. B. NCHW gegenüber NHWC). Bestimmte GPUs wie die NVIDIA® V100 arbeiten mit einem NHWC-Datenlayout besser.
  • fp16 Sie die Verwendung von numerischen 16-Bit-Darstellungen wie fp16 , das von IEEE angegebene Gleitkommaformat mit halber Genauigkeit oder das Gleitkommaformat bfloat16 von Brain
  • Erwägen Sie die Verwendung der Keras-API mit gemischter Genauigkeit
  • Verwenden Sie beim Training auf GPUs den TensorCore. GPU-Kernel verwenden den TensorCore, wenn die Genauigkeit fp16 beträgt und die Eingabe- / Ausgabedimensionen durch 8 oder 16 teilbar sind (für int8).

Zusätzliche Ressourcen

Bekannte Einschränkungen

Profilerstellung für mehrere GPUs in TensorFlow 2.2 und TensorFlow 2.3

TensorFlow 2.2 und 2.3 unterstützen mehrere GPU-Profile nur für einzelne Hostsysteme. Die Erstellung mehrerer GPU-Profile für Systeme mit mehreren Hosts wird nicht unterstützt. Um GPU-Konfigurationen für mehrere Worker zu profilieren, muss jeder Worker unabhängig profiliert werden. In TensorFlow 2.4 können mehrere Worker mithilfe der API tf.profiler.experimental.trace profiliert werden.

CUDA® Toolkit 10.2 oder höher ist erforderlich, um mehrere GPUs zu profilieren. Da TensorFlow 2.2 und 2.3 nur CUDA® Toolkit-Versionen bis 10.1 unterstützen, erstellen Sie symbolische Links zu libcudart.so.10.1 und libcupti.so.10.1 .

sudo ln -s /usr/local/cuda/lib64/libcudart.so.10.2 /usr/local/cuda/lib64/libcudart.so.10.1
sudo ln -s /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.2 /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.1