Tensorflow: одновременное прогнозирование на GPU и CPU

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

Я попытался создать 2 разных потока, которые передают два разных сеанса тензорного потока (один из которых выполняется на процессоре, а другой – на графическом процессоре). Каждый поток подает фиксированное количество партий (например, если мы имеем в общей сложности 100 партий, я хочу назначить 20 пакетов для CPU и 80 на графическом процессоре или любую возможную комбинацию из двух) в цикле и объединить результат. Было бы лучше, если бы раскол был выполнен автоматически.

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

Я ожидал бы, что это будет быстрее, потому что, когда работает только графический процессор, использование процессора составляет около 20-30%, поэтому для ускорения вычислений имеется некоторый процессор.

Я читал много дискуссий, но все они касаются параллелизма с несколькими графическими процессорами, а не между графическим процессором и процессором.

Вот пример кода, который я написал: объекты tensor_cpu и tensor_gpu загружаются из той же модели tensor_gpu следующим образом:

 with tf.device('/gpu:0'): model_gpu = load_model('model1.h5') tensor_gpu = model_gpu(x) with tf.device('/cpu:0'): model_cpu = load_model('model1.h5') tensor_cpu = model_cpu(x) 

Затем прогнозирование выполняется следующим образом:

 def predict_on_device(session, predict_tensor, batches): for batch in batches: session.run(predict_tensor, feed_dict={x: batch}) def split_cpu_gpu(batches, num_batches_cpu, tensor_cpu, tensor_gpu): session1 = tf.Session(config=tf.ConfigProto(log_device_placement=True)) session1.run(tf.global_variables_initializer()) session2 = tf.Session(config=tf.ConfigProto(log_device_placement=True)) session2.run(tf.global_variables_initializer()) coord = tf.train.Coordinator() t_cpu = Thread(target=predict_on_device, args=(session1, tensor_cpu, batches[:num_batches_cpu])) t_gpu = Thread(target=predict_on_device, args=(session2, tensor_gpu, batches[num_batches_cpu:])) t_cpu.start() t_gpu.start() coord.join([t_cpu, t_gpu]) session1.close() session2.close() 

Как я могу достичь этой распараллеливания CPU / GPU? Кажется, я что-то упускаю.

Любая помощь будет очень оценена!

One Solution collect form web for “Tensorflow: одновременное прогнозирование на GPU и CPU”

Вот мой код, который демонстрирует, как выполнение CPU и GPU может выполняться параллельно:

 import tensorflow as tf import numpy as np from time import time from threading import Thread n = 1024 * 8 data_cpu = np.random.uniform(size=[n//16, n]).astype(np.float32) data_gpu = np.random.uniform(size=[n , n]).astype(np.float32) with tf.device('/cpu:0'): x = tf.placeholder(name='x', dtype=tf.float32) def get_var(name): return tf.get_variable(name, shape=[n, n]) def op(name): w = get_var(name) y = x for _ in range(8): y = tf.matmul(y, w) return y with tf.device('/cpu:0'): cpu = op('w_cpu') with tf.device('/gpu:0'): gpu = op('w_gpu') def f(session, y, data): return session.run(y, feed_dict={x : data}) with tf.Session(config=tf.ConfigProto(log_device_placement=True, intra_op_parallelism_threads=8)) as sess: sess.run(tf.global_variables_initializer()) coord = tf.train.Coordinator() threads = [] # comment out 0 or 1 of the following 2 lines: threads += [Thread(target=f, args=(sess, cpu, data_cpu))] threads += [Thread(target=f, args=(sess, gpu, data_gpu))] t0 = time() for t in threads: t.start() coord.join(threads) t1 = time() print t1 - t0 

Результаты синхронизации:

  • Поток процессора: 4-5 с (зависит от машины, конечно).

  • Поток графического процессора: 5 с (он работает в 16 раз больше).

  • Оба в то же время: 5 секунд

Обратите внимание, что не было необходимости иметь 2 сеанса (но это тоже работало для меня).

Причины, по которым вы можете видеть разные результаты, могут быть

  • некоторые разногласия в отношении системных ресурсов (выполнение графического процессора потребляет некоторые ресурсы хост-системы, а если работает поток ЦП, это может ухудшить производительность)

  • неправильное время

  • часть вашей модели может работать только на GPU / CPU

  • узкое место в других местах

  • другая проблема

  • Прогнозирование зависит от размера партии в Keras
  • Как нормализация данных работает в керах во время предсказания?
  • Правильный способ определения функции в anano?
  • Keras: "RuntimeError: не удалось импортировать pydot." После установки graphviz и pydot
  • Теано с Keras на малине Pi
  • Показывать индикатор выполнения для каждой эпохи во время периодического обучения в Keras
  • Как сделать Keras использовать бэкэнс Tensorflow в Анаконде?
  • Дополнительная ценность тренировки Keras 'fit_generator
  • Python - лучший язык программирования в мире.