TensorFlow-Leistungsleitfaden

Übersicht

Zur Profilerstellung für ein TensorFlow-Modell auf Cloud TPUs verwenden Sie TensorBoard und das TPU-TensorBoard-Plug-in. TensorBoard ist auf TPU-VMs vorinstalliert. Informationen zur Installation des TPU TensorBoard-Plug-ins und zur Erfassung eines Leistungsprofils finden Sie unter Profil mit TPU-Tools erstellen. Allgemeine Informationen zur TPU-Leistung finden Sie in der Cloud TPU-Leistungsanleitung.

Weitere Informationen zu TensorBoard-Callbacks

Leistungshinweise für TensorFlow-Funktionen

Sehen Sie sich die vollständige Liste der TensorFlow-Operationen an, die auf Cloud TPU verfügbar sind.

tf.matmul

  • Das Transponieren des Ergebnisses eines der Operanden ist praktisch kostenlos.
  • Beachten Sie, dass tf.matmul die Integration in die Ein- und Ausgabe unterstützt. Dies bedeutet, dass Aktivierungsfunktionen oder Verzerrungen, die direkt auf die Ausgabe von tf.matmul angewendet werden, einen geringen Overhead haben.

tf.nn.conv_n_d, tf.nn.depthwise_conv2d, tf.nn.separable_conv2d

  • Bei den Aktivierungen werden die Batch- und Featuredimensionen auf ein Vielfaches von 8 oder 128 aufgefüllt.
    • XLA verfolgt zuerst die gängigste Größe von Batchdimensionen für Faltungen im Modul. Dies erleichtert die Unterscheidung zwischen Vorwärtsfaltungen, Faltungen von Aktivierungsgradienten und Faltungen von Kernel-Gradienten.
    • Wenn die gängigste Batchgröße größer oder gleich 64 ist, gehen Sie so vor:
      • Der Batch wird für Vorwärts- und Rückwärtsfaltungen auf ein Vielfaches von 128 und das Feature auf ein Vielfaches von 8 aufgefüllt.
      • Der Batch wird für Faltungen einer Gradientenaktualisierung auf ein Vielfaches von 8 und das Feature auf ein Vielfaches von 128 aufgefüllt.
    • Wenn die häufigste Batchgröße kleiner als 64 ist:
      • Der Batch wird für Vorwärts- und Rückwärtsfaltungen auf ein Vielfaches von 8 und das Feature auf ein Vielfaches von 128 aufgefüllt.
      • Der Batch wird für Faltungen einer Gradientenaktualisierung auf ein Vielfaches von 128 und das Feature auf ein Vielfaches von 8 aufgefüllt.
      • Das Transponieren der Aktivierungen direkt vor dem Senden an eine Faltung ist kostenlos, wenn dabei nur die Eingabefeature- und Batchdimensionen ausgetauscht werden.
  • Für den Kernel werden die Eingabe- und die Ausgabefeature-Dimensionen auf ein Vielfaches von 8 oder 128 aufgefüllt. Die genaue Bestimmung wird von den Produzenten und anderen Konsumenten des Kernels beeinflusst.
    • Das Transponieren eines Kernels direkt vor dem Senden an eine Faltung ist kostenlos, wenn dabei nur die Eingabe- und Ausgabefeature-Dimensionen ausgetauscht werden.
  • Für das Ergebnis werden die Batch- und Featuredimensionen auf ein Vielfaches von 8 oder 128 aufgefüllt.
    • Das Transponieren des Ergebnisses einer Faltung ist kostenlos, wenn dabei nur die Batch- und Ausgabefeature-Dimensionen ausgetauscht werden.
  • Beachten Sie, dass tf.nn.conv_n_d die Integration in das Ergebnis, die Aktivierungen und/oder den Kernel unterstützt. Dies bedeutet, dass Aktivierungsfunktionen oder Verzerrungen, die direkt auf die Ausgabe angewendet werden, mit geringem Aufwand verbunden sind.

tf.nn.avg_pool, tf.nn.max_pool

  • Es gelten die Padding-Regeln: Räumliche Dimensionen sind wichtiger als Batch- und Featuredimensionen. Jeder Batch und jedes Feature kann auf ein Vielfaches von 8 oder 128 aufgefüllt werden.
  • In der Regel entspricht das Layout einer Pooloperation den Faltungen, die hinein- oder herausfließen.
  • Die Gradientenberechnung für tf.nn.max _ Pool kann langsamer sein als ihr tf.nn.avg_pool Äquivalent. Versuchen Sie möglichst, von Max-Pooling auf Average-Pooling umzustellen.

tf.concat, tf.slice, tf.strided_slice

  • Vermeiden Sie unnötige Slices und Verkettungen. Slices und Verkettungen in einer aufgefüllten Dimension sind erheblich teurer.
    • Die Datenverschiebung wird bei einer Slice-Dimension ohne Padding-Aufwand minimiert.

tf.transpose

  • Die Transponierung eines der Operanden eines tf.matmul oder seines Ergebnisses ist kostenlos.
  • Das Tippen der Aktivierungen eines tf.conv_n_d ist kostenlos, wenn die Batch- und Eingabe-Feature-Dimensionen vertauscht werden.
  • Das Tippen des Kernels eines tf.conv_n_d ist kostenlos, wenn die Eingabe- und Ausgabefeaturedimensionen vertauscht werden.
  • Das Umsetzen des Ergebnisses eines tf.conv_n_d ist kostenlos, wenn die Batch- und Ausgabe-Feature-Dimensionen vertauscht werden.

tf.batch_to_space, tf.space_to_batch, tf.space_to_depth, tf.depth_to_space

  • Diese sind kostspielig, da sie das Verschieben von Daten von aufgefüllten zu nicht aufgefüllten Dimensionen und umgekehrt beinhalten.

tf.reshape

  • Das Umformen kann in Cloud TPU kostspielig sein, wenn Daten in einer aufgefüllten Dimension verschoben werden.
  • Bei einem umfangreichen Padding kann es von Vorteil sein, Daten auf dem Host in R1 umzuformen und diese anschließend wieder in eine höhere Dimensionsform auf dem Gerät umzuformen. Dies ermöglicht effizientere Übertragungen zwischen Host und Gerät.
    • Bei einer maximalen Arbeitsspeicherauslastung kann es ebenfalls nützlich sein, da der gepackte Parameter bei Bedarf entpackt werden kann.

tf.random_uniform, tf.distributions.Bernoulli, tf.random_normal, tf.multinomial

  • Die Pseudogenerierung zufälliger Zahlen für gleichmäßige oder Bernoulli-Verteilungen ist sehr schnell.
  • Normale Verteilungen sind etwas teurer als einheitliche oder Bernoulli-Verteilungen.
  • Die Pseudogenerierung zufälliger Zahlen für kategoriale/multinomiale Verteilungen ist erheblich kostspieliger.

tf.reduce_all, tf.reduce_any, tf.reduce_logsumexp, tf.reduce_max, tf.reduce_min, tf.reduce_prod, tf.reduce_sum

  • Mehrere Reduzierungen mit der gleichen Eingabe- und Ausgabeform können parallel über eine Fusion durchgeführt werden.
    • Versuchen Sie, sequenzielle Reduktionsketten in parallele umzuschreiben, sofern dies möglich ist.
  • Reduktionen unterstützen die Fusion elementweiser Operationen in ihre Eingabe, nicht aber in ihre Ausgabe. Schreiben Sie Ausdrücke nach Möglichkeit um, um die Fusion zu fördern. Beispiel:

        tf.multiply(tf.reduce_sum(x), y)
    

    In:

        tf.reduce_sum(tf.multiply(x, y))
    

tf.nn.batch_normalization, tf.nn.fused_batch_norm, tf.layers.batch_normalization

  • Der XLA-Compiler kann die zusammengeführten TensorFlow-Varianten der Batchnormalisierung effizient reduzieren. Ihre Verwendung kann wesentlich effizienter sein als die Alternative.
    • tf.nn.fused_batch_norm wird gegenüber tf.nn.batch_normalization bevorzugt.
    • Setzen Sie für tf.layers.batch_normalization das Argument "fundiert" auf "true".