2016-07-04 2 views
1

Dans le tensorflow multi-gpu CIFAR 10 example, pour chaque GPU, ils calculent la perte (lignes 174-180)exemple multi-GPU CIFAR10 en tensorflow: agrégée perte

for i in xrange(FLAGS.num_gpus): 
    with tf.device('/gpu:%d' % i): 
    with tf.name_scope('%s_%d' % (cifar10.TOWER_NAME, i)) as scope: 
     loss = tower_loss(scope) 

Quand quelques lignes ci-dessous (ligne 246 ), ils évaluent loss avec

_, loss_value = sess.run([train_op, loss]) 

quelle perte est exactement calculée?

J'ai regardé la fonction tower_loss, mais je ne vois aucune agrégation incrémentale sur tous les GPU (tours). Je comprends que tout le graphique est en cours d'exécution (sur tous les GPU), mais quelle valeur de la perte sera retournée? Seul le loss sur le dernier GPU? Je ne vois aucune agrégation sur la variable loss réelle.

Répondre

2

Le loss calculé est en effet seulement la perte sur le dernier GPU. Dans le code, ils utilisent une variable Python loss pour accéder au Tenseur.

Vous pouvez également le valider facilement en imprimant la variable Python représentant ce tenseur. Par exemple. ajoutant print(loss) sur ligne 244 (avec une configuration 2-GPU), sera de retour:

Tensor("tower_1/total_loss_1:0", shape=(), dtype=float32, device=/device:GPU:1) 
0

Je pense que le gradient calculé à partir de la perte de chaque tour de GPU est ajouté par la liste des tower_grads, et les moyennes de fonctions average_grad toutes gradients. Je ne comprends pas très bien la question ici, car la fonction tower_loss() se trouve dans un GPU, l'agrégation et la synchronisation de toutes les sorties du GPU en sont collectées. La réponse imprimée précédente imprimera définitivement le dernier résultat du GPU, car il s'agit de la dernière sortie de la boucle for de toutes les exécutions GPU, mais cela ne signifie pas que seule la dernière perte est collectée.