在Tensorflow code中指定gpu: /gpu:0总是有效的



我的工作站有3个显卡,其中一个是Quadro K620,另外两个是Titan x。现在我想在其中一个显卡上运行我的tensorflow代码,这样我就可以让其他显卡空闲用于另一个任务。

然而,无论设置tf.device('/gpu:0')tf.device('/gpu:1'),我发现第一个Titan X显卡总是工作,我不知道为什么。

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()

关于行" <=== THIS LINE:"

如果我设置tf.device('/gpu:0'),监视器显示:

|-------------------------------+----------------------+----------------------+
| 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 |
+-------------------------------+----------------------+----------------------+

显示第一个泰坦X卡工作

如果我设置tf.device('/gpu:1'),监视器显示:

|-------------------------------+----------------------+----------------------+
| 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 |
+-------------------------------+----------------------+----------------------+

显示两个Titan X卡正在工作,而不是单独的第二个Titan X。

所以这背后有什么原因,以及如何指定我想让我的程序运行的gpu ?

只是猜测,但是当您调用minimize()时,tf.train.Optimizer对象(我期望在net.training(loss)中创建)的默认行为是colocate_gradients_with_ops=False。这可能导致反向传播操作被放置在默认设备上,该设备将是/gpu:0

要确定是否发生这种情况,您可以遍历sess.graph_def并查找在NodeDef.device字段中具有/gpu:0的节点,或者在device字段中具有空的节点(在这种情况下,它们将默认放置在/gpu:0上)。

检查正在使用的设备的另一个选项是在运行步骤时使用output_partition_graphs=True选项。这显示了TensorFlow实际使用的设备(而不是在sess.graph_def中,您的程序正在请求的设备),并且应该准确显示在/gpu:0上运行的节点。

相关内容

  • 没有找到相关文章

最新更新