2016-11-03 5 views
4

私のワークステーションには3枚のグラフィックスカードがあり、そのうちの1枚はQuadro K620で、残りの2枚はTitan Xです。今度はテンソルフローコードをグラフィックカードの1枚で動かして、別の仕事のために。Tensorflowコードにgpuを指定してください:/ gpu:0は常に動作していますか?

しかし、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')を設定した場合

は、モニターは言う:第一タイタンXカードが動作して示す

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

。私は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 | 
+-------------------------------+----------------------+----------------------+ 

2タイタンXカードだけではなく、第二タイタンXを働いていることを示します。

これの背後に何らかの理由があり、どのようにgpuを指定するには私のプログラムを実行したいのですか?

答えて

1

minimize()を呼び出すときにtf.train.Optimizerオブジェクト(これは、私がnet.training(loss)で作成されると予想される)のデフォルトの動作はcolocate_gradients_with_ops=Falseです。これにより、デフォルトのデバイス上に配置されたバックプロパゲーション操作が行われます(/gpu:0)。これが起こっている場合、あなたはsess.graph_defを反復し、NodeDef.deviceフィールドに/gpu:0を持っているいずれかのノードを探し、または(彼らはデフォルトで/gpu:0の上に置かれる場合には)空deviceフィールドを持つことができます動作するように

どのデバイスが使用されているかを確認する別のオプションは、ステップ実行時にoutput_partition_graphs=True optionを使用することです。これは、TensorFlowが実際に使用しているデバイス(sess.graph_defでは、プログラムが要求しているデバイスではなく)を示し、/gpu:0で実行されているノードを正確に表示する必要があります。

+0

私はsess.graph_defを印刷しましたが、実際にはデバイス情報のないノードがあります。これらのノードは入力に関するもので、コード 'tf.device( '/ gpu:0')で作成する必要があります。しかし、ブロックにtf.device( '/ gpu:0')を置く前にコードの2行を含めることはできません。なぜなら、FIFOキューをシャッフルする操作がCPU内でのみ動作するからです。だから、どのように私は完全に指定されたGPUにプログラム全体をマップすることができますか? –

+0

可能なオプションの1つは、データセット作成コードの周りに 'with tf.device( '/ gpu:1'):ブロックを拡張し、セッションを作成するときに次のオプションを追加することです:' tf.Session(config = tf。 ConfigProto(allow_soft_placement = True)) 'です。これにより、TensorFlowはCPUのみの操作をCPUに戻し、GPU 1には他のすべてを配置することができます。 – mrry

関連する問題