2016-03-03 12 views
8

Я хотел бы знать, что считается «лучшей практикой» для многопроцессорных систем при обучении сетей с помощью TensorFlow.TensorFlow: конфигурация нескольких графических процессоров (производительность)

Е.Г., один из моих сетей выглядит следующим образом:

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

ли TensorFlow эффективно выделять несколько графических процессоров? Или я должен указать, какой GPU TensorFlow должен использовать для конкретной операции?

Я уже не тестировал его, только что начал эксперименты с GPU. Тем не менее, на данный момент у меня не указано, какое устройство использовать на сверточных слоев, но я указать его для полностью связанных слоев:

# flattened information of the last convolutional layer 
h_pooln_flat = tf.reshape(...) 

with tf.device("/gpu:0"): 
    # stream 1 stuff 

with tf.device("/gpu:1"): 
    # stream 2 stuff 

Является ли это хорошая идея? Или следует оставить выделение ресурсов открытым для TensorFlow?

Я думаю, что один «поток» сверточных слоев не может быть вычислен параллельно? Так что не имеет значения, какое устройство выполняет свертку, объединение, ... часть ?!

Любые советы для получения наилучшего результата?

В настоящее время я тренируюсь на одном узле кластера Slurm с двумя графическими процессорами, но, возможно, я мог бы тренироваться на нескольких узлах, поэтому 4, 6 или даже 8 графических процессоров. Однако, я думаю, будет много накладных расходов с более чем 2 графическими процессорами?


EDIT (медленный многополосной GPU): После некоторых тестов я очень удивлен ... если я позволю TensorFlow решить, что выделить и удалить заявления конкретного устройства сети Поезда значительно быстрее , Это было действительно удивительно для меня ... что может быть более эффективным, чем каждый поток вывода на одном графическом процессоре при наличии всего двух GPU? Кроме того, кажется (по результатам), что Tensorflow использует только один GPU ?!


EDIT2 (значения NaN): После еще нескольких тестов, которые я испытал, что моя установка вручную из gpu:0 для потока 1 и gpu:1 для потока 2 не только медленнее, чем позволить TensorFlow решить, что использовать (и в соответствии с выход TendorFlow с использованием конвейера TensorFlow использует только один GPU), но также иногда мой (я не знаю почему) мой «gpu:0 для потока 1 и gpu:1 для потока 2« -разрешение просто генерирует значения NaN. Как сразу или коротко после init. Очень странно.

Нужна ли TensorFlow какая-либо блокировка потока или ручная копия входных данных для нескольких графических процессоров?

+1

Я не могу ответить на ваш вопрос, но могу отметить, что в документации Tensorflow упоминается, что выделение процессоров (графических процессоров и процессоров) выполняется в жадном методе после выделения ограничений на размещение пользователей. Вот белый документ: http://download.tensorflow.org/paper/whitepaper2015.pdf. См. Разделы 3.2 и 4.3. Мне будет любопытно видеть ответы на лучшие практики. – nfmcclure

+0

Все данные переносятся для вас, и вам не нужно блокировать входные данные для предотвращения NaN. Но вы также можете получить NaN, если ваша оптимизация расходится –

+0

Да, но у меня никогда не было проблемы с NaN с моей сетью на одном графическом процессоре. Я имею в виду, что в 5 из 5 экспериментов он сходился нормально на одном GPU, но в 3 из 5 сеансов с несколькими GPU я получил значения NaN. Дополнительно: почему много GPU будет медленнее? Я имею в виду, что из-за передачи данных между GPU я не ожидал удвоенной скорости, но медленнее? – daniel451

ответ

5

Логика для размещения устройств по умолчанию находится в simple_placer.cc

я могу отсутствовать что-то в логике, но из this line, кажется, что это поставит весь оп GPU на GPU: 0

Вы можете увидеть от реализации, что стратегия размещения не учитывает затраты на передачу данных или вычисление, поэтому ручное размещение часто лучше, чем автоматическое. Например, если вы делаете какой-то входной конвейер, размещение по умолчанию обычно помещает некоторые операции обработки данных на GPU, что делает вещи более медленными в целом.

Насколько ваша реализация медленна ... возможно, есть где-то копия gpu0-> gpu1?

Получение работы с несколькими GPU - это очень открытая область, сообщите нам, что вы найдете!

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