2016-03-06 4 views
3

У меня есть сверточная нейронная сеть с двумя различными выходными потоками:TensorFlow: одна сеть, два графических процессора?

      input 
          | 
         (...) <-- several convolutional layers 
          | 
         _________ 
    (several layers) |  | (several layers) 
    fully-connected |  | fully-connected 
    output stream 1 -> |  | <- output stream 2 

Я хотел бы вычислить поток 1 на /gpu:0 и поток 2 на /gpu:1. К сожалению, я не смог правильно настроить его.

Эта попытка:

...placeholders... 
...conv layers... 

with tf.device("/gpu:0"): 
    ...stream 1 layers... 
    nn_out_1 = tf.matmul(...) 

with tf.device("/gpu:1"): 
    ...stream 2 layers... 
    nn_out_2 = tf.matmul(...) 

Запускает мертв медленно (медленнее, чем обучение на 1 GPU исключительно), а иногда выдает значения NaN на выходе. Я думал, что это может быть потому, что операторы with могут не синхронизироваться должным образом. Поэтому я добавил control_dependencies и поместил CONV слои на /gpu:0 явно:

...placeholders... # x -> input, y -> labels 

with tf.device("/gpu:0"): 
    with tf.control_dependencies([x, y]): 
     ...conv layers... 
     h_conv_flat = tf.reshape(h_conv_last, ...) 

with tf.device("/gpu:0"): 
    with tf.control_dependencies([h_conv_flat]): 
     ...stream 1 layers... 
     nn_out_1 = tf.matmul(...) 

with tf.device("/gpu:1"): 
    with tf.control_dependencies([h_conv_flat]): 
     ...stream 2 layers... 
     nn_out_2 = tf.matmul(...) 

... но при таком подходе сеть даже не работает. Независимо от того, что я пытался, он не жаловался на вход не инициализирован:

tensorflow.python.framework.errors.InvalidArgumentError: 
    You must feed a value for placeholder tensor 'x' 
    with dtype float 
    [[Node: x = Placeholder[dtype=DT_FLOAT, shape=[], 
    _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

Без with заявления сеть не является обучение только /gpu:0 и работает отлично - тренирует разумные вещи, без ошибок.

Что я делаю неправильно? TensorFlow не может разделить разные потоки слоев в одной сети на разные графические процессоры? Всегда ли я должен раскол полный сеть в разных башнях?

+0

Это может зависеть от многих различных факторов. Это тот же самый gpus? насколько велики ваши данные? – fabrizioM

+0

Да, два графических процессора одинаковы, они находятся на одной карте. Это карта Dual K80 Tesla от NVIDIA [ссылка] (http://www.nvidia.com/object/tesla-k80.html). Он имеет 24 ГБ VRAM, и данные полностью вписываются в VRAM одного GPU (12 ГБ). – daniel451

+0

Вы уверены, что узким местом является скорость GPU для этих вычислений? Для узкого места довольно часто встречается * пропускная способность * в/из графического процессора, а не фактический расчет; и если вы отправляете большой тензор на другой графический процессор, то в этом случае это только ухудшит ситуацию. – Peteris

ответ

2

Есть пример того, как использовать многие gpus в одной сети https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/image/cifar10/cifar10_multi_gpu_train.py Возможно, вы можете скопировать код. Также можно получить что-то вроде этого

# Creates a graph. 
c = [] 
for d in ['/gpu:2', '/gpu:3']: 
with tf.device(d): 
    a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3]) 
    b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2]) 
    c.append(tf.matmul(a, b)) 
with tf.device('/cpu:0'): 
sum = tf.add_n(c) 
# Creates a session with log_device_placement set to True. 
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) 
# Runs the op. 
print sess.run(sum) 

Глядя на: https://www.tensorflow.org/versions/r0.7/how_tos/using_gpu/index.html#using-multiple-gpus

С наилучшими пожеланиями

Смежные вопросы