Guida alle prestazioni di TensorFlow

Panoramica

Per profilare un modello TensorFlow su Cloud TPU, utilizza TensorBoard e il plug-in TensorBoard in TPU. TensorBoard è preinstallato sulle VM TPU. Per informazioni su come installare il plug-in TensorBoard di TPU e acquisire un profilo di prestazioni, consulta la pagina Profilo del modello con strumenti TPU. Per informazioni generali sulle prestazioni delle TPU, consulta la guida alle prestazioni di Cloud TPU.

Per ulteriori informazioni, consulta la sezione callout di TensorBoard.

Note sulle prestazioni delle funzioni TensorFlow

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

tf.matmul

  • La trasposizione del risultato di uno degli operandi è effettivamente gratuita.
  • Tieni presente che tf.matmul supporta l'unione in ingresso e in uscita. Ciò significa che le funzioni di attivazione o i bias applicati direttamente all'output di tf.matmul hanno 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 aggiunte a un multiplo di 8 o 128.
    • La prima XLA monitora la dimensione più comune delle dimensioni del batch per le convoluzioni nel modulo. In questo modo è possibile distinguere le convoluzioni dei gradienti di forwarding, di attivazione e di gradiente del kernel.
    • Se la dimensione del batch più comune è maggiore o uguale a 64:
      • Il batch è aggiunto a un multiplo di 128 e la funzionalità è aggiunta a un multiplo di 8 per le convoluzioni di avanti e indietro.
      • Il batch è stato aggiunto a un multiplo di 8 e la funzionalità è aggiunta a un multiplo di 128 per le convoluzioni degli aggiornamenti di gradiente.
    • Se le dimensioni dei batch più comuni sono inferiori a 64:
      • Il batch è imbottito a un multiplo di 8 e la caratteristica è aggiunta a un multiplo di 128 per le convoluzioni avanti e indietro.
      • Il batch è stato aggiunto a un multiplo di 128 e ha una funzionalità aggiunta a un multiplo di 8 per le convoluzioni degli aggiornamenti di gradiente.
      • La trasposizione delle attivazioni subito prima di inviarla a una convoluzione è gratuita se la trasposizione cambia solo la funzione di input e le dimensioni del batch.
  • Per il kernel, le dimensioni della funzionalità di input e di output vengono aggiunte a un multiplo di 8 o 128. L'esatta determinazione è influenzata dai produttori e dagli altri consumatori del kernel.
    • La trasposizione di un kernel subito prima di inviarlo a una convoluzione è gratuita se la trasposizione cambia solo le dimensioni della funzionalità di input e di output.
  • Di conseguenza, le dimensioni del batch e delle funzionalità vengono aggiunte a un multiplo di 8 o 128.
    • La trasposizione del risultato di una convoluzione è gratuita se la trasposizione scambia solo le dimensioni della funzionalità batch e di output.
  • Tieni presente che tf.nn.conv_n_d supporta la fusione 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 basso.

tf.nn.avg_pool, tf.nn.max_pool

  • Si applicano le regole di spaziatura interna: le dimensioni spaziali sono più importanti del batch e delle funzionalità. Ogni batch e funzionalità può essere aggiunto a un multiplo di 8 o 128.
  • In genere, il layout di un'operazione di pool corrisponde alle convoluzioni che lo attraversano.
  • Il calcolo del gradiente per tf.nn.max_pool potrebbe essere più lento dell'equivalente di tf.nn.avg_pool. Considera la possibilità di passare dal pool massimo a un pool medio quando possibile.

tf.concat, tf.slice, tf.strided_slice

  • Evita fette e concatenazioni inutili. Sezioni e concatenazioni in una dimensione aggiunta, sono notevolmente più costose.
    • Lo spostamento dei dati è ridotto al minimo se la dimensione della sezione non ha una overhead di spaziatura interna.

tf.transpose

  • La trasposizione di qualsiasi operando di un tf.matmul o del suo risultato è gratuita.
  • La trasposizione delle attivazioni di un tf.conv_n_d è gratuita se scambia le dimensioni dei batch e delle funzionalità 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 elemento tf.conv_n_d è gratuita se scambia le dimensioni delle funzionalità batch e di output.

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

  • Queste sono costose, perché prevedono lo spostamento dei dati da dimensioni imbottite a dimensioni non imbottite e viceversa.

tf.reshape

  • Il rimodellamento può essere costoso sul Cloud TPU quando si spostano i dati in una dimensione imbottita.
  • Può essere utile rimodellare i dati in R1 sull'host e riportarli in una forma di dimensione maggiore sul dispositivo se c'è una spaziatura interna sostanziale. Questo può rendere più efficienti i trasferimenti tra host e dispositivo.
    • Può anche aiutare a utilizzare al massimo l'utilizzo della memoria perché il parametro pacchettizzato può essere decompresso on demand.

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

  • La pseudo-generazione di numeri casuali per le distribuzioni uniformi o di Bernoulli è molto rapida.
  • Le distribuzioni normali sono leggermente più costose delle distribuzioni uniformi o di Bernoulli.
  • La generazione di pseudo-numeri casuali per le distribuzioni categoriche/Multinomiali è notevolmente più costosa.

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

  • Più riduzioni con la stessa forma di input e di output possono essere eseguite in parallelo tramite fusione.
    • Cerca di riscrivere le catene sequenziali di riduzioni in quelle parallele, se possibile.
  • Le riduzioni supportano l'fusione di operazioni Elementuali nel loro input, ma non nell'output. Quando possibile, riscrivi le espressioni per promuovere 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 normalizzazione batch di TensorFlow. Il loro utilizzo può essere notevolmente più efficiente dell'alternativa.
    • Preferenza: tf.nn.fused_batch_norm rispetto a tf.nn.batch_normalization
    • Per tf.layers.batch_normalization, imposta l'argomento "fused" su vero.