2016-11-03 1 views
4

J'ai 3 cartes graphiques sur mon poste de travail, l'une est Quadro K620, et les deux autres sont Titan X. Maintenant, je voudrais exécuter mon code tensorflow dans l'une des cartes graphiques, de sorte que je peux laisser les autres inactifs pour une autre tâche.Spécifiez gpu dans le code Tensorflow:/gpu: 0 fonctionne toujours?

Cependant, indépendamment du réglage tf.device('/gpu:0') ou tf.device('/gpu:1'), j'ai trouvé que la 1ère carte graphique Titan X fonctionne toujours, je ne sais pas pourquoi.

import argparse 
import os 
import time 
import tensorflow as tf 
import numpy as np 
import cv2 

from Dataset import Dataset 
from Net import Net 

FLAGS = None 

if __name__ == "__main__": 
    parser = argparse.ArgumentParser() 
    parser.add_argument('--foldername', type=str, default='./data-large/') 
    parser.add_argument('--batch_size', type=int, default=100) 
    parser.add_argument('--num_epoches', type=int, default=100) 
    parser.add_argument('--learning_rate', type=float, default=0.5) 

    FLAGS = parser.parse_args() 
    net = Net(FLAGS.batch_size, FLAGS.learning_rate) 

    with tf.Graph().as_default(): 
     # Dataset is a class for encapsulate the input pipeline 
     dataset = Dataset(foldername=FLAGS.foldername, 
           batch_size=FLAGS.batch_size, 
           num_epoches=FLAGS.num_epoches) 

     images, labels = dataset.samples_train 

     ## The following code defines the network and train 
     with tf.device('/gpu:0'): # <==== THIS LINE 
      logits = net.inference(images) 
      loss = net.loss(logits, labels) 
      train_op = net.training(loss) 

      init_op = tf.group(tf.initialize_all_variables(), tf.initialize_local_variables()) 
      sess = tf.Session() 
      sess.run(init_op) 
      coord = tf.train.Coordinator() 
      threads = tf.train.start_queue_runners(sess=sess, coord=coord) 
      start_time = time.time() 
      try: 
       step = 0 
       while not coord.should_stop(): 
        _, loss_value = sess.run([train_op, loss]) 
        step = step + 1 
        if step % 100 == 0: 
         format_str = ('step %d, loss = %.2f, time: %.2f seconds') 
         print(format_str % (step, loss_value, (time.time() - start_time))) 
         start_time = time.time() 
      except tf.errors.OutOfRangeError: 
       print('done') 
      finally: 
       coord.request_stop() 

      coord.join(threads) 
      sess.close() 

En ce qui concerne la ligne "<=== THIS LINE:"

Si je mets tf.device('/gpu:0'), le moniteur dit:

|-------------------------------+----------------------+----------------------+ 
| GPU Name  Persistence-M| Bus-Id  Disp.A | Volatile Uncorr. ECC | 
| Fan Temp Perf Pwr:Usage/Cap|   Memory-Usage | GPU-Util Compute M. | 
|===============================+======================+======================| 
| 0 Quadro K620   Off | 0000:03:00.0  On |     N/A | 
| 34% 45C P0  2W/30W | 404MiB/1993MiB |  5%  Default | 
+-------------------------------+----------------------+----------------------+ 
| 1 GeForce GTX TIT... Off | 0000:04:00.0  Off |     N/A | 
| 22% 39C P2 100W/250W | 11691MiB/12206MiB |  8%  Default | 
+-------------------------------+----------------------+----------------------+ 
| 2 GeForce GTX TIT... Off | 0000:81:00.0  Off |     N/A | 
| 22% 43C P2 71W/250W | 111MiB/12206MiB |  0%  Default | 
+-------------------------------+----------------------+----------------------+ 

montrant la 1ère carte Titan X fonctionne.

Si je mets tf.device('/gpu:1'), le moniteur dit:

|-------------------------------+----------------------+----------------------+ 
| GPU Name  Persistence-M| Bus-Id  Disp.A | Volatile Uncorr. ECC | 
| Fan Temp Perf Pwr:Usage/Cap|   Memory-Usage | GPU-Util Compute M. | 
|===============================+======================+======================| 
| 0 Quadro K620   Off | 0000:03:00.0  On |     N/A | 
| 34% 45C P0  2W/30W | 411MiB/1993MiB |  3%  Default | 
+-------------------------------+----------------------+----------------------+ 
| 1 GeForce GTX TIT... Off | 0000:04:00.0  Off |     N/A | 
| 22% 52C P2 73W/250W | 11628MiB/12206MiB |  12%  Default | 
+-------------------------------+----------------------+----------------------+ 
| 2 GeForce GTX TIT... Off | 0000:81:00.0  Off |     N/A | 
| 22% 42C P2 71W/250W | 11628MiB/12206MiB |  0%  Default | 
+-------------------------------+----------------------+----------------------+ 

montrant que les deux cartes Titan X travaillent, pas le 2e Titan X seul.

Donc, quelle que soit la raison derrière cela et comment spécifier le GPU, je veux que mon programme fonctionne?

Répondre

1

Juste une supposition, mais le comportement par défaut pour un objet tf.train.Optimizer (que je pense est créé dans net.training(loss)) lorsque vous appelez minimize() est colocate_gradients_with_ops=False. Cela peut conduire à placer les opérations de rétropropagation sur le périphérique par défaut, qui sera /gpu:0.

Pour travailler si cela se produit, vous pouvez itérer sur sess.graph_def et rechercher des noeuds qui ont soit /gpu:0 dans le domaine NodeDef.device, ou ont un champ device vide (auquel cas ils seront placés sur /gpu:0 par défaut).

Une autre option pour vérifier quels périphériques sont utilisés est d'utiliser le output_partition_graphs=True option lors de l'exécution de votre étape. Cela montre quels périphériques sont actuellement utilisés par TensorFlow (au lieu de, dans sess.graph_def, quels périphériques votre programme demande), et devrait indiquer exactement quels nœuds sont en cours d'exécution sur /gpu:0.

+0

J'ai imprimé sess.graph_def, et trouvé en effet il y a des nœuds sans informations sur le périphérique. Ces nœuds concernent les entrées, qui doivent être créées avant le code 'avec tf.device ('/ gpu: 0')'. Cependant, je ne peux pas impliquer les deux lignes de code avant 'avec tf.device ('/ gpu: 0')' dans le bloc, car il contient des opérations sur le mélange de FIFOqueue, qui ne semble fonctionner que dans la CPU. Alors, comment puis-je entièrement mapper l'ensemble du programme dans un GPU spécifié? –

+0

Une option possible est d'étendre le bloc 'with with tf.device ('/ gpu: 1'):' autour du code de création de dataset, et d'ajouter l'option suivante lors de la création de votre session: 'tf.Session (config = tf. ConfigProto (allow_soft_placement = True)) '. Ceci permettra à TensorFlow de ramener toutes les opérations CPU vers le CPU, tout en plaçant tout le reste sur le GPU 1. – mrry