2016-11-03 4 views
4

나는 내 워크 스테이션에 3 개의 그래픽 카드를 가지고 있는데, 그 중 하나는 Quadro K620이고 다른 두 개는 Titan X입니다. 이제는 그래픽 카드 중 하나에서 내 tensorflow 코드를 실행하여 나머지를 유휴 상태로 둘 수 있습니다 다른 일을 위해서.Tensorflow 코드에서 gpu를 지정하십시오./gpu : 0이 항상 작동합니까?

그러나 또는 tf.device('/gpu:1') 설정에 관계없이 제 1 티타늄 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')을 설정하면

, 모니터는 말합니다 : 1 타이탄 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 | 
+-------------------------------+----------------------+----------------------+ 

두 타이탄 X 카드는 혼자가 아닌 2 타이탄 X를 작동하는지 보여주는.

그래서이 뒤에 어떤 이유로 gpu를 지정하려면 프로그램을 실행하고 싶습니까?

답변

1

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 option을 사용하는 것입니다. 이것은 TensorFlow가 실제로 사용하고있는 장치 (sess.graph_def, 프로그램에서 요청하는 장치 대신)를 나타내며 /gpu:0에서 실행중인 노드를 정확히 보여야합니다.

+0

나는 sess.graph_def를 인쇄했으며 실제로 장치 정보가없는 노드가 있음을 발견했습니다. 이 노드는 입력에 관한 것으로'tf.device ('/ gpu : 0')와 함께 코드 앞에 만들어야합니다. 그러나, tf.device ('/ gpu : 0')'를 사용하여 두 줄의 코드를 블록에 포함시킬 수는 없습니다. 이는 CPU에서만 작동하는 FIFO 큐를 섞는 작업을 포함하기 때문입니다. 그렇다면 전체 프로그램을 지정된 gpu로 완전히 매핑하는 방법은 무엇입니까? –

+0

가능한 옵션 중 하나는 데이터 세트 생성 코드 주위에'with tf.device ('/ gpu : 1') : 블록을 확장하고 세션을 생성 할 때 다음 옵션을 추가하는 것입니다 :'tf.Session (config = tf. ConfigProto (allow_soft_placement = True))'를 선택하십시오. 이렇게하면 TensorFlow가 CPU 전용 작업을 CPU로 옮기고 GPU 1에서는 다른 작업을 수행 할 수 있습니다. – mrry

관련 문제