Profilare 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ù, consulta Callback di TensorBoard.

Note sul rendimento delle funzioni TensorFlow

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

tf.matmul

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

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

  • Per le attivazioni, le dimensioni di batch e funzionalità sono riempite multiplo 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 viene riempito fino a un multiplo di 128 e le funzionalità vengono riempite fino a un multiple di 8 per le convoluzioni in 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.
      • Trasposizione delle attivazioni subito prima di inviarle a una convoluzione è gratuito se la trasposizione scambia solo la caratteristica di input e il batch dimensioni.
  • Per il kernel, le dimensioni della caratteristica di input e di output sono riempite in un multiplo di 8 o 128. La determinazione esatta è influenzata dai produttori e da altri consumatori del kernel.
    • La trasposizione di un kernel subito prima di inviarlo a una convezione è gratuita se la trasposizione scambia solo le dimensioni delle funzionalità di input e output.
  • Per il risultato, le dimensioni del batch e degli elementi vengono riempite fino a 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.
  • In genere, il layout di un'operazione di pool corrisponde alle convoluzioni che vi confluiscono o da cui fuoriescono.
  • Il calcolo del gradiente per tf.nn.max_pool potrebbe essere più lento rispetto all'equivalente tf.nn.avg_pool. Valuta la possibilità di passare dalla somma massima alla media, se possibile.

tf.concat, tf.slice, tf.strided_slice

  • Evita slice e concatenazioni non necessarie. Sezioni e concatenazioni in un riempita è notevolmente più costosa.
    • Lo spostamento dei dati è ridotto al minimo se la dimensione della sezione non ha spaziatura interna overhead.

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

  • La trasformazione potrebbe essere costosa su Cloud TPU quando si spostano i dati in una dimensione con spaziatura interna.
  • 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ò essere utile anche per l'utilizzo della memoria di picco perché il parametro imballato può essere simballato on demand.

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

  • La generazione di numeri pseudo casuali per distribuzioni uniformi o di Bernoulli è molto rapida.
  • Le distribuzioni normali sono leggermente più costose di quelle uniformi o di Bernoulli. distribuibili.
  • Generazione di pseudo numeri casuali per categoriche e multinomiali distribuzioni è notevolmente più costoso.

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

  • È possibile eseguire più riduzioni con la stessa forma di input e output in parallelo utilizzando la fusione delle operazioni.
    • Se possibile, prova a riscrivere le catene sequenziali di riduzioni in catene parallele.
  • Le riduzioni supportano l'unione di operazioni elementari nell'input, ma non nell'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.

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