Guide des performances TensorFlow

Présentation

Pour profiler un modèle TensorFlow sur des Cloud TPU, utilisez TensorBoard et le plug-in TPU TensorBoard. TensorBoard est préinstallé sur les VM TPU. Pour en savoir plus sur l'installation du plug-in TPU TensorBoard et la capture d'un profil de performances, consultez la page Profiler votre modèle avec les outils TPU. Pour obtenir des informations générales sur les performances des TPU, consultez le guide des performances Cloud TPU.

Pour en savoir plus, consultez la section sur les rappels TensorBoard.

Remarques sur les performances de la fonction TensorFlow

Consultez la liste complète des opérations TensorFlow disponibles sur Cloud TPU.

tf.matmul

  • La transposition du résultat de l'un des opérandes est gratuite.
  • Notez que tf.matmul accepte la fusion dans son entrée et dans sa sortie. Ainsi, les fonctions d'activation ou les biais appliqués directement à la sortie de tf.matmul ont de faibles coûts.

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

  • Pour les activations, les dimensions de lot et de caractéristique sont complétées jusqu'à un multiple de 8 ou de 128.
    • Tout d'abord, XLA détecte la taille la plus courante de dimensions de lot pour les convolutions dans le module. Cette procédure permet de distinguer les convolutions avant, les convolutions de gradient d'activation et les convolutions de gradient du noyau.
    • Si la taille de lot la plus courante est supérieure ou égale à 64 :
      • Le lot est complété jusqu'à un multiple de 128, et la caractéristique jusqu'à un multiple de 8, pour les convolutions avant et arrière.
      • Le lot est complété jusqu'à un multiple de 128, et la caractéristique jusqu'à un multiple de 8, pour les convolutions de mise à jour du gradient.
    • Si la taille de lot la plus courante est inférieure à 64 :
      • Le lot est complété jusqu'à un multiple de 8, et la caractéristique jusqu'à un multiple de 128, pour les convolutions avant et arrière.
      • Le lot est complété jusqu'à un multiple de 128, et la caractéristique jusqu'à un multiple de 8, pour les convolutions de mise à jour du gradient.
      • La transposition des activations juste avant leur envoi à une convolution est gratuite, si la transposée ne permute que les dimensions de lot et de caractéristique d'entrée.
  • Pour le noyau, les dimensions de caractéristique d'entrée et de sortie sont complétées jusqu'à un multiple de 8 ou de 128. La détermination exacte est influencée par les émetteurs et les destinataires du noyau.
    • La transposition d'un noyau juste avant son envoi à une convolution est gratuite, si la transposée ne permute que les dimensions de caractéristique d'entrée et de sortie.
  • Pour le résultat, les dimensions de lot et de caractéristique sont complétées jusqu'à un multiple de 8 ou de 128.
    • La transposition du résultat d'une convolution est gratuite, si la transposée ne permute que les dimensions de lot et de caractéristique de sortie.
  • Notez que tf.nn.conv_n_d accepte la fusion dans son résultat, les activations et/ou le noyau. Ainsi, les fonctions d'activation ou les biais appliqués directement à la sortie ont de faibles coûts.

tf.nn.avg_pool tf.nn.max_pool

  • Les règles de remplissage s'appliquent : les dimensions spatiales sont plus importantes que les dimensions de lot et de caractéristique. Chaque lot et caractéristique peut être complété jusqu'à un multiple de 8 ou de 128.
  • En règle générale, la disposition d'une opération de pool correspond aux convolutions qui en découlent.
  • Le calcul du gradient pour tf.nn.max_pool peut être plus lent que pour son équivalent tf.nn.avg_pool. Envisagez de passer du pooling maximal au pooling moyen lorsque cela est possible.

tf.concat, tf.slice, tf.strided_slice

  • Évitez les tranches et les concaténations inutiles. Les tranches et les concaténations présentes dans une dimension ayant fait l'objet d'un remplissage sont considérablement plus onéreuses.
    • Le déplacement des données est réduit au minimum si la dimension de tranche n'entraîne pas de surcharge système due au remplissage.

tf.transpose

  • La transposition de l'un des opérandes d'une fonction tf.matmul ou de son résultat est gratuite.
  • La transposition des activations d'une fonction tf.conv_n_d est gratuite si elle permute les dimensions de lot et de caractéristique d'entrée.
  • La transposition du noyau d'une fonction tf.conv_n_d est gratuite si elle permute les dimensions de caractéristique d'entrée et de sortie.
  • La transposition du résultat d'une fonction tf.conv_n_d est gratuite si elle permute les dimensions de lot et de caractéristique de sortie.

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

  • Ces fonctions sont coûteuses, car elles impliquent le déplacement de données de dimensions avec remplissage vers des dimensions sans remplissage, et inversement.

tf.reshape

  • Le remodelage peut être coûteux sur Cloud TPU lors du déplacement de données dans une dimension avec remplissage.
  • Il peut être avantageux de remodeler les données en R1 sur l'hôte, puis de leur redonner la forme d'une dimension plus élevée sur l'appareil si le remplissage est important. Ce procédé peut rendre les transferts entre l'hôte et l'appareil plus efficaces.
    • Cela peut également être utile en cas de pic d'utilisation de la mémoire, car le paramètre compressé peut être décompressé à la demande.

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

  • La génération de nombres pseudo-aléatoires pour les distributions uniformes ou de Bernoulli est très rapide.
  • Les distributions normales sont légèrement plus coûteuses que les distributions uniformes ou de Bernoulli.
  • La génération de nombres pseudo-aléatoires pour les distributions catégorielles/multinomiales est considérablement plus onéreuse.

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

  • Plusieurs réductions ayant la même forme d'entrée et de sortie peuvent être effectuées en parallèle via la fusion.
    • Essayez de réécrire les chaînes séquentielles de réductions en chaînes parallèles, si possible.
  • Les réductions acceptent la fusion des opérations élément par élément dans leur entrée, mais pas dans leur sortie. Si possible, réécrivez les expressions de façon à promouvoir la fusion. Exemple :

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

    en :

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

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

  • Le compilateur XLA peut réduire efficacement les variantes fusionnées de la normalisation des lots de TensorFlow. Leur utilisation peut être considérablement plus efficace que l'alternative.
    • Préférez tf.nn.fused_batch_norm à tf.nn.batch_normalization.
    • Pour tf.layers.batch_normalization, définissez l'argument "fused" sur "vrai".