TensorFlow-Leistung mit XProf optimieren

In dieser Anleitung wird gezeigt, wie Sie mit den in XProf verfügbaren Tools die Leistung Ihrer TensorFlow-Modelle auf dem Host (CPU), dem Gerät (GPU) oder auf einer Kombination aus Host und Gerät(en) verfolgen können.

Durch das Profiling können Sie den Hardware-Ressourcenverbrauch (Zeit und Speicher) der verschiedenen TensorFlow-Operationen (Ops) in Ihrem Modell nachvollziehen, Leistungsengpässe beheben und letztendlich die Ausführung des Modells beschleunigen.

In diesem Leitfaden erfahren Sie, wie Sie die verschiedenen verfügbaren Tools verwenden und wie der Profiler Leistungsdaten erfasst.

Wenn Sie die Leistung Ihres Modells auf Cloud TPUs analysieren möchten, lesen Sie den Cloud TPU-Leitfaden.

Leistungsdaten erheben

XProf erfasst Hostaktivitäten und GPU-Traces Ihres TensorFlow-Modells. Sie können XProf so konfigurieren, dass Leistungsdaten entweder im programmatischen Modus oder im Sampling-Modus erfasst werden.

Profiling-APIs

Sie können die folgenden APIs für das Profiling verwenden.

  • 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 tf.profiler Function API

    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
    
  • Sampling-Modus: Führen Sie die Profilerstellung bei Bedarf durch, indem Sie tf.profiler.experimental.server.start verwenden, um einen gRPC-Server mit Ihrem TensorFlow-Modelllauf zu starten. Nachdem Sie den gRPC-Server gestartet und Ihr Modell ausgeführt haben, können Sie ein Profil über die Schaltfläche Capture Profile (Profil erfassen) in XProf erfassen. Verwenden Sie das Skript im Abschnitt „Profiler installieren“ oben, um eine TensorBoard-Instanz zu starten, falls sie noch nicht ausgeführt wird.

    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 das Profiling mehrerer Worker:

    # 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)
    

Dialogfeld „Aufnahmeprofil“

Im Dialogfeld Profil erfassen können Sie Folgendes angeben:

  • Eine durch Kommas getrennte Liste mit Profildienst-URLs oder TPU-Namen.
  • Eine Profilerstellungsdauer.
  • Die Ebene der Ablaufverfolgung von Geräte-, Host- und Python-Funktionsaufrufen.
  • Gibt an, wie oft der Profiler versuchen soll, Profile zu erfassen, wenn dies beim ersten Mal nicht gelingt.

Benutzerdefinierte Trainingsschleifen profilieren

Wenn Sie benutzerdefinierte Trainingsschleifen in Ihrem TensorFlow-Code profilieren möchten, instrumentieren Sie die Trainingsschleife mit der tf.profiler.experimental.Trace API, um die Schrittgrenzen für XProf zu markieren.

Das Argument name wird als Präfix für die Schrittnamen verwendet, das Schlüsselwortargument step_num wird an die Schrittnamen angehängt und das Schlüsselwortargument _r bewirkt, dass dieses Ablaufverfolgungsereignis von XProf als Schrittereignis verarbeitet wird.

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 schrittbasierte Leistungsanalyse von XProf aktiviert und die Schrittereignisse werden im Trace Viewer angezeigt.

Achten Sie darauf, dass Sie den Dataset-Iterator in den tf.profiler.experimental.Trace-Kontext einfügen, um die Eingabepipeline genau zu analysieren.

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)

Anwendungsfälle für Profilerstellung

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

  • Lokales und Remote-Profiling: Dies sind zwei gängige Methoden zum Einrichten Ihrer Profiling-Umgebung. Beim lokalen Profiling wird die Profiling API auf demselben Computer aufgerufen, auf dem Ihr Modell ausgeführt wird, z. B. auf einer lokalen Workstation mit GPUs. Beim Remote-Profiling wird die Profiling-API auf einem anderen Computer aufgerufen als dem, auf dem Ihr Modell ausgeführt wird, z. B. auf einer Cloud TPU.
  • Mehrere Worker profilieren: Wenn Sie die Funktionen für verteiltes Training von TensorFlow verwenden, können Sie mehrere Maschinen profilieren.
  • Hardwareplattform: CPUs, GPUs und TPUs profilieren.

Die folgende Tabelle bietet einen kurzen Überblick über die oben genannten von TensorFlow unterstützten Anwendungsfälle:

Profiler API Lokal Remote Mehrere Worker Hardwareplattformen
TensorBoard Keras-Callback Unterstützt Nicht unterstützt Nicht unterstützt CPU, GPU
tf.profiler.experimental Starten/Beenden der 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
Context Manager API Unterstützt Nicht unterstützt Nicht unterstützt CPU, GPU

Zusätzliche Ressourcen