Profila i carichi di lavoro TensorFlow

Per profilare un modello TensorFlow sulle Cloud TPU, utilizza TensorBoard e plug-in TPU TensorBoard. TensorBoard è preinstallato sulle VM TPU. Per informazioni su come installare si collega con TPU TensorBoard e acquisiscono un profilo delle prestazioni, consulta Profila il tuo modello con gli strumenti di Cloud TPU. Per informazioni generali sulle prestazioni di Cloud TPU, consulta Guida alle prestazioni di Cloud TPU.

.

Per saperne di più, vedi Chiamate di TensorFlow.

Note sulle prestazioni della funzione TensorFlow

Consulta l'elenco completo delle operazioni di TensorFlow disponibili su Cloud TPU.

tf.matmul

  • La trasposizione del risultato di uno degli operandi è effettivamente libera.
  • Tieni presente che tf.matmul supporta l'unione nei suoi input e output. Ciò significa le funzioni di attivazione o i bias applicati direttamente all'output tf.matmul ha un overhead basso.

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

  • Per le attivazioni, le dimensioni del batch e delle funzionalità vengono riempite fino a un moltiplo di 8 o 128.
    • La prima XLA traccia la dimensione più comune delle dimensioni del batch per convoluzioni in questo modulo. Questo aiuta a distinguere tra convoluzioni, convoluzioni del gradiente di attivazione e gradiente kernel convoluzioni.
    • Se la dimensione del batch più comune è maggiore o uguale a 64:
      • Il Batch è riempito a un multiplo di 128 e la caratteristica è riempito a multiplo di 8 per le convoluzioni avanti e indietro.
      • Il Batch è riempito in un multiplo di 8 e la caratteristica è riempito in un multiplo di 128 per le convoluzioni di aggiornamento del gradiente.
    • Se la dimensione del batch più comune è inferiore a 64:
      • Il batch viene riempito fino a un multiplo di 8 e le funzionalità vengono riempite fino a un multiplo di 128 per le convolute in avanti e all'indietro.
      • Il Batch è riempito a un multiplo di 128 e la caratteristica è riempito a multiplo di 8 per le convoluzioni di aggiornamento del gradiente.
      • La trasposizione delle attivazioni appena prima dell'invio a una convoluzione è gratuita se la trasposizione scambia solo le dimensioni della funzionalità di input e del batch.
  • Per il kernel, le dimensioni della caratteristica di input e di output sono riempite in un multiplo di 8 o 128. La determinazione esatta dipende i producer e gli altri consumer del kernel.
    • La trasposizione di un kernel subito prima di inviarlo a una convoluzione è gratuita se la trasposizione scambia solo le dimensioni delle caratteristiche di input e output.
  • Per ottenere il risultato, le dimensioni del batch e della caratteristica sono riempite in un multiplo di 8 o 128.
    • La trasposizione del risultato di una convezione è gratuita se la trasposizione scambia solo le dimensioni delle funzionalità di batch e di output.
  • Tieni presente che tf.nn.conv_n_d supporta l'unione nel suo risultato, le attivazioni e/o il kernel. Ciò significa che le funzioni di attivazione o i bias applicati direttamente all'output hanno un overhead ridotto.

tf.nn.avg_pool, tf.nn.max_pool

  • Vengono applicate le regole di spaziatura: le dimensioni spaziali sono più importanti di batch e funzionalità. Ogni batch e caratteristica può essere riempita in un multiplo di 8 o 128.
  • Di solito, il layout di un'operazione di pool corrisponde alle convoluzioni che fluiscono dentro o fuori.
  • Il calcolo del gradiente per tf.nn.max_pool potrebbe essere più lento del relativo Equivalente tf.nn.avg_pool. Valuta la possibilità di passare da max-pooling a media-pooling quando possibile.

tf.concat, tf.slice, tf.strided_slice

  • Evita sezioni e concatenazioni non necessarie. Le sezioni e le concatenazioni in una dimensione con spaziatura interna sono notevolmente più costose.
    • Lo spostamento dei dati viene ridotto al minimo se la dimensione del segmento di traffico non ha un overhead per il riempimento.

tf.transpose

  • La trasposizione di uno qualsiasi degli operandi di un tf.matmul o del suo risultato è gratuita.
  • La trasposizione delle attivazioni di un tf.conv_n_d è gratuita se scambia il batch e dimensioni delle caratteristiche di input.
  • La trasposizione del kernel di un tf.conv_n_d è gratuita se scambia le dimensioni delle funzionalità di input e di output.
  • La trasposizione del risultato di un tf.conv_n_d è gratuita se scambia il batch e le dimensioni delle caratteristiche di output.

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

  • Sono costosi perché comportano lo spostamento dei dati da padding a non padding dimensioni e viceversa.

tf.reshape

  • Il rimodellamento può essere costoso su Cloud TPU durante lo spostamento dei dati in una dimensione riempita.
  • Può essere utile rimodellare i dati in R1 sull'host e rimodellarli a una forma di dimensione più alta sul dispositivo, se presenta spaziatura interna. In questo modo i trasferimenti tra host e dispositivo possono essere più efficienti.
    • Può anche essere utile per il picco di utilizzo della memoria, può essere decompresso on demand.

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

  • La generazione di pseudo numeri casuali per le distribuzioni uniformi o di Bernoulli è molto rapidamente.
  • Le distribuzioni normali sono leggermente più costose rispetto alle distribuzioni uniformi o di Bernoulli.
  • La generazione di numeri pseudo casuali per le distribuzioni categoriche e multinomiali è notevolmente più costosa.

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

  • È possibile eseguire riduzioni multiple con la stessa forma di input e output usando Operation Fusion.
    • Prova a riscrivere le catene sequenziali di riduzioni in catene parallele, se possibile.
  • Le riduzioni supportano l'unione di operazioni elementari nell'input, ma non il loro output. Se possibile, riscrivi le espressioni per favorire la fusione. Ad esempio:

        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

  • Il compilatore XLA può ridurre in modo efficiente le varianti fuse di TensorFlow della normalizzazione batch. Il loro utilizzo può essere notevolmente più efficiente l'alternativa.

    • Preferisci tf.nn.fused_batch_norm rispetto a tf.nn.batch_normalization.
    • Per tf.layers.batch_normalization, imposta il valore "fused" su true.