Profil für TensorFlow-Arbeitslasten erstellen
Wenn Sie ein TensorFlow-Modell auf Cloud TPUs profilieren möchten, verwenden Sie TensorBoard und das TPU TensorBoard-Plug-in. TensorBoard ist auf TPU-VMs vorinstalliert. Informationen zur Installation des TPU TensorBoard-Plug-in hinzufügen und Leistungsprofil erfassen, siehe Modell mit Cloud TPU-Tools erstellen Für allgemeine Informationen zur Cloud TPU-Leistung finden Sie unter Leistungsleitfaden für Cloud TPU
Weitere Informationen finden Sie unter TensorBoard-Callbacks.
Hinweise zur Leistung von 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 vontf.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 als oder gleich 64 ist:
- 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 gängigste 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 ihrtf.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.
- Pseudogenerierung zufälliger Zahlen für kategoriale und multinomiale Zwecke erheblich teurer ist.
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 fusionierte Varianten der Batchnormalisierung von TensorFlow effizient reduzieren. Ihre Verwendung kann wesentlich effizienter sein als die Alternative.
tf.nn.fused_batch_norm
wird gegenübertf.nn.batch_normalization
bevorzugt.- Setzen Sie für
tf.layers.batch_normalization
das Argument "fundiert" auf "true".