2017-07-12 11 views
1

Voici un exemple pour clarifier ce que je veux dire:
Première session.run():
First run of a TensorFlow sessionPremière tf.session.run() effectue dramatiquement différent des exécutions ultérieures. Pourquoi?

plus tard session.run():
Later runs of a TensorFlow session

Je comprends tensorflow fait une initialisation ici , mais j'aimerais savoir où cela se manifeste dans la source. Cela se produit sur le processeur et sur le GPU, mais l'effet est plus important sur le GPU. Par exemple, dans le cas d'une opération Conv2D explicite, la première exécution a une quantité beaucoup plus grande d'opérations Conv2D dans le flux GPU. En fait, si je change la taille d'entrée du Conv2D, cela peut aller de dizaines à des centaines d'opérations Conv2D. Dans les exécutions ultérieures, cependant, il n'y a toujours que cinq opérations Conv2D dans le flux GPU (quelle que soit la taille de l'entrée). Lors de l'exécution sur CPU, nous conservons la même liste d'opérations dans la première exécution par rapport aux exécutions ultérieures, mais nous constatons la même différence de temps.

Quelle partie de la source TensorFlow est responsable de ce comportement? Où sont les opérations GPU "split"?

Merci pour l'aide!

Répondre

1

Le tf.nn.conv_2d() op prend beaucoup plus de temps à courir le premier appel tf.Session.run() parce — par défaut — tensorflow utilise les installations de mise au point automatique de cuDNN choisir comment exécuter les circonvolutions suivantes aussi vite que possible. Vous pouvez voir l'invocation de l'autocalibrage here.

Il existe un undocumented environment variable que vous pouvez utiliser pour désactiver l'autocalibrage. Définissez TF_CUDNN_USE_AUTOTUNE=0 lorsque vous démarrez le processus exécutant TensorFlow (par exemple l'interpréteur python) pour désactiver son utilisation.

+0

Merci, cela aide beaucoup! À partir de là, je supposerais tous les cas où une opération régulière est divisée en plusieurs opérations de flux lorsqu'elle est exécutée sur GPU en raison de cuDNN et/ou cuBLAS? –

+0

Je ne suis pas sûr à 100%, mais je pense qu'il y a aussi des cas où les noyaux implémentés par Eigen génèrent plusieurs opérations de flux (par exemple plusieurs petites opérations memcpy). Cependant, la plupart des noyaux critiques pour les performances utilisent cuDNN/cuBLAS. – mrry