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?
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é? –
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