2017-02-06 40 views
4

Я новичок в тензорном потоке. В настоящее время я работаю над системой с 2 ​​графическими процессорами, каждый из которых составляет 12 ГБ. Я хочу реализовать параллелизм модели на двух графических процессорах для подготовки больших моделей. Я просматривал всю информацию в Интернете, SO, документацию о тензорном потоке и т. Д., Я смог найти объяснения параллелизма модели и ее результатов, но нигде я не нашел небольшой учебник или небольшие фрагменты кода о том, как его реализовать, используя tenorflow. Я имею в виду, что мы должны обмениваться активациями сразу после каждого слоя? Итак, как мы это делаем? Существуют ли конкретные или более чистые способы реализации параллелизма модели в тензорном потоке? Было бы очень полезно, если бы вы предложили мне место, где я могу научиться его реализовывать, или простой код, например, обучение mnist на нескольких графических процессорах, используя «MODEL PARALLELISM».Реализация параллелизма модели в тензорном потоке

Примечание: Я выполнил параллелизм данных, как в CIFAR10 - многопроцессорный учебник gpu, но я не нашел реализации параллелизма модели.

ответ

7

Вот пример. Модель имеет некоторые части на GPU0, некоторые части на GPU1 и некоторые части на процессоре, поэтому это трехходовой параллелизм модели.

with tf.device("/gpu:0"): 
    a = tf.Variable(tf.ones(())) 
    a = tf.square(a) 
with tf.device("/gpu:1"): 
    b = tf.Variable(tf.ones(())) 
    b = tf.square(b) 
with tf.device("/cpu:0"): 
    loss = a+b 
opt = tf.train.GradientDescentOptimizer(learning_rate=0.1) 
train_op = opt.minimize(loss) 

sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 
for i in range(10): 
    loss0, _ = sess.run([loss, train_op]) 
    print("loss", loss0) 
+0

@Buatov - Спасибо за выше реализацию, но то, что я искал в том, что при реализации модели параллелизма для нейронной сети, мы должны разделить активации после вперед пройти через каждый слой, так что мое главное сомнение было как передать весовые матрицы с одного устройства на другое (т. е. между графическими процессорами). – krish567

+0

Все это делается автоматически для вас. IE, просто замените часть 'tf.square' в приведенном выше коде с помощью' a = create_left_part_of_network' и 'b = create_right_part_of_network', и вы получите сеть, разделенную между gpu0 и gpu1. –

+0

Работает так, как я ожидал, но он медленнее, чем время, которое требуется, если я запускаю все в одном gpu. Вы знаете, почему это происходит. здесь есть ссылка на коды: [multi_gpu] (https://github.com/krish567/deep_learning/blob/master/model3.py) [one gpu] (https://github.com/krish567/deep_learning /blob/master/model2.py) – krish567