У меня есть сверточная нейронная сеть с двумя различными выходными потоками: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 не может разделить разные потоки слоев в одной сети на разные графические процессоры? Всегда ли я должен раскол полный сеть в разных башнях?
Это может зависеть от многих различных факторов. Это тот же самый gpus? насколько велики ваши данные? – fabrizioM
Да, два графических процессора одинаковы, они находятся на одной карте. Это карта Dual K80 Tesla от NVIDIA [ссылка] (http://www.nvidia.com/object/tesla-k80.html). Он имеет 24 ГБ VRAM, и данные полностью вписываются в VRAM одного GPU (12 ГБ). – daniel451
Вы уверены, что узким местом является скорость GPU для этих вычислений? Для узкого места довольно часто встречается * пропускная способность * в/из графического процессора, а не фактический расчет; и если вы отправляете большой тензор на другой графический процессор, то в этом случае это только ухудшит ситуацию. – Peteris