Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

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 sich Ihr Modell auf dem Host (CPU), dem Gerät (GPU) oder auf einer Kombination aus Host und Gerät (en) verhält.

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 zur Verfügung stehen, 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. Installieren Sie CUDA® Toolkit 10.1 oder höher . CUDA® Toolkit 10.1 unterstützt nur die Erstellung einzelner GPU-Profile. Informationen zum Profilieren mehrerer GPUs finden Sie unter Profilieren mehrerer GPUs . Stellen Sie sicher, dass die von Ihnen installierte CUDA®-Treiberversion mindestens 440,33 für Linux oder 441,22 für Windows ist.
  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.

Profilieren Sie mehrere GPUs

TensorFlow unterstützt derzeit mehrere GPU-Profile nur für einzelne Hostsysteme. Die Erstellung mehrerer GPU-Profile für Systeme mit mehreren Hosts wird derzeit nicht unterstützt. Installieren Sie CUDA® Toolkit 10.2 oder höher, um mehrere GPUs zu profilieren. Da TensorFlow CUDA® Toolkit-Versionen nur bis 10.1 unterstützt, 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

Um GPU-Konfigurationen für mehrere Worker zu profilieren, müssen Sie einzelne Worker unabhängig voneinander profilieren.

Beheben Sie Berechtigungsprobleme

Wenn Sie die Profilerstellung mit CUDA® Toolkit 10.1 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 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

Übersichtsseite

Die Übersichtsseite bietet eine Ansicht der obersten Ebene über die 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 Ihrer Modellschulungsleistung. 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, die 16- und 32-Bit-Berechnungen verwendet

  • 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.

    Jede Zeile zeigt die Eigenzeit eines Ops (als Prozentsatz der von allen Operationen benötigten Zeit), die kumulierte Zeit, die Kategorie und den Namen an.

  • 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 Input-Pipeline-Analysator erhaltenen Erkenntnisse, um zu verstehen, wo die Input-Pipeline 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 anschließend 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 - Zeitaufwand für die Vorverarbeitung von Operationen, z. B. 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. Gesamte Selbstzeit (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 für die Eingabeverarbeitung aufgewendeten Gesamtzeit an
  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
  • Im unteren Bereich wird eine Tabelle angezeigt, in der Daten zu TensorFlow-Operationen mit einer Zeile für jede Operation und einer Spalte für jeden Datentyp angezeigt werden (Spalten sortieren, 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 zur Behebung dieser Probleme ergreifen. 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 den im Zeitleistenbereich ausgewählten Operationen an

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 , der mit der Nummer des Gerätechips und des Geräteknotens innerhalb des Chips gekennzeichnet ist (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 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 Zeitleisten-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 eine vorzeichenlose 8-Bit-Ganzzahl)
  • 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

Leistungsdaten sammeln

Der TensorFlow Profiler sammelt Host-Aktivitä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.

# 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
# Start a gRPC server at port 6009
tf.profiler.experimental.server.start(6009)
# ... TensorFlow program ...

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

  • Die Profildienst-URL oder der TPU-Name
  • Die 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 2.3 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.experimental.profiler Funktions-API Unterstützt Nicht unterstützt Nicht unterstützt CPU, GPU
Kontextmanager-API Unterstützt Nicht unterstützt Nicht unterstützt CPU, GPU
On-Demand-API Nicht unterstützt Unterstützt Eingeschränkter Support CPU, GPU, TPU

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. Betrachten Sie die folgende Best Practices beinhaltet , wie detailliert hier , um Ihre Daten Eingang Pipeline effizienter zu machen:

  • Daten vorab abrufen
  • Datenextraktion parallelisieren
  • Datenumwandlung 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