Параллельное использование нескольких графических процессоров в тензорном потоке

avatar
younginsong
14 июля 2018 в 17:53
7641
1
5

Я хочу использовать 8 GPU параллельно, а не последовательно.

Например, когда я выполняю этот код,

import tensorflow as tf

with tf.device('/gpu:0'):
    for i in range(10):
        print(i)

with tf.device('/gpu:1'):
    for i in range(10, 20):
        print(i)

Я попробовал команду cmd 'CUDA_VISIBLE_DEVICE='0,1', но результат тот же.

Я хочу увидеть результат "0 10 1 11 2 3 12 .... и т.д."

Но фактический результат последовательно "0 1 2 3 4 5 ..... 10 11 12 13.."

Как я могу получить желаемый результат?

Источник

Ответы (1)

avatar
Semih Korkmaz
14 июля 2018 в 20:18
4

** Я вижу редактирование вопроса, поэтому добавляю его к моему ответу**

Вам необходимо передать свои операции в сеанс Tensorflow, иначе код будет интерпретироваться как последовательный (как это делают многие языки программирования), после чего операции будут выполняться последовательно.

Для предыдущего понимания вопроса обсуждение создания обучения нейронных сетей с несколькими GPU обсуждается ниже:

Плохая новость заключается в том, что не существует волшебной функциональности, которая просто сделает это за вас.

Хорошие новости: есть несколько проверенных методов.

Первый способ знаком некоторым разработчикам CUDA и, возможно, другим разработчикам графических процессоров, чтобы реплицировать модель на несколько графических процессоров, синхронизируя их через ЦП. Один из способов сделать это — разбить набор данных на пакеты или, в данном случае, на башни, а затем передать каждому графическому процессору башню. Если бы это был набор данных MNIST и у вас было два графических процессора, вы могли бы инициировать инициацию этих данных, явно используя ЦП в качестве устройства. Теперь, когда ваш набор данных стал меньше, ваш относительный размер пакета может быть больше. После завершения эпохи вы можете поделиться градиентами и усреднить их для обучения обеих сетей. Конечно, это легко масштабируется для вашего случая с 8 графическими процессорами.

Минимальный пример распределения задач и сбора результатов на ЦП можно увидеть ниже:

# 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))

Однако передача данных между многими устройствами не позволит вам получить ускорение, равное your_gpu_number раз. Поэтому вам необходимо оптимизировать рабочую нагрузку для каждого графического процессора, чтобы максимизировать производительность, и постараться максимально избежать обмена данными между устройствами.

Второй — разделить вашу нейронную сеть на несколько имеющихся у вас устройств, обучить их и объединить.

Явный запуск моделей на нескольких графических процессорах потребует от вас такой настройки алгоритма. Проверьте это:

https://www.tensorflow.org/guide/using_gpu#using_multiple_gpus

https://gist.github.com/j-min/69aae99be6f6acfadf2073817c2f61b0