TensorFlow: конфигурация с несколькими GPU (производительность)

Я хотел бы знать, что считается "лучшей практикой" для систем с несколькими GPU при обучении сетей с TensorFlow.

например, одна из моих сетей выглядит так:

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

не TensorFlow эффективно распределить нескольких GPU? Или я должен указать, какой 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 с 2 графическими процессорами, но потенциально я мог бы тренироваться на нескольких узлах, поэтому 4, 6 или даже 8 графических процессоров. Тем не менее, я предполагаю, что будет много накладных расходов с более чем 2 графическими процессорами?


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


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

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

1 ответов


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

возможно, мне чего-то не хватает в логике, но от эта строка Кажется, что он поставит все GPU ops на gpu: 0

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

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

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