Tensorflow: эффективное перемещение/помещение данных в графический процессор

Итак, я читаю немного больше о перемещении данных из CPU -> GPU в Tensorflow и вижу, что feed_dict все еще работает медленно: https://github.com/tensorflow/tensorflow/issues/2919

Непосредственные варианты, которые я вижу для «перемещения» переменных Python на графический процессор, следующие:

#1. Tensorflow constant
a = tf.constant(data, name='a')

#2. Tensorflow Variable
b = tf.Variable(data, name='b')

#3. Tensorflow placeholder
c = tf.placeholder(dtype=dtype, shape=[x,y,z ...], name='c')

Варианты #1 и #2 нецелесообразны для очень больших переменных набора данных (поскольку вы фактически предварительно загружаете данные в память), так как мы быстро превысим ограничение графа в 2 ГБ. В настоящее время это делает #3 лучшим выбором для добавления больших переменных Python в Tensorflow, но тогда вы вынуждены использовать feed_dict.

Существуют ли другие варианты переноса переменных Python в GPU, кроме #1, #2 и #3? Я имею в виду использование...

with tf.device('/gpu:0'):
    # create tensorflow object(s), whether it's tf.Variable, tf.constant, etc

Если я правильно понимаю, мы можем использовать функции входного конвейера, чтобы обойти эту проблему? Я имею в виду эти два здесь:

  1. https://datascience.stackexchange.com/questions/17559/input-pipeline-for-tensorflow-on-gpu

  2. https://stackoverflow.com/a/38956678/7093236

Могу ли я что-нибудь сделать, чтобы еще больше повысить скорость размещения всего на стороне Tensorflow?


person user42390    schedule 05.08.2017    source источник
comment
Есть дополнительный трюк, который вы можете сделать, если хотите перекрыть доступ к графическому процессору и передачу между процессором и графическим процессором, используя промежуточную область, такую ​​​​как .py#L1218" rel="nofollow noreferrer">здесь   -  person Yaroslav Bulatov    schedule 05.08.2017


Ответы (2)


API наборов данных — это перспективный способ перемещения данных в GPU. Все разумные оптимизации, подобные описанным в руководстве по производительности tensorflow, в конечном итоге будут доступны там.

person Alexandre Passos    schedule 07.08.2017
comment
В конце концов, здесь ключевое слово. Насколько мне известно, в настоящее время это невозможно с использованием набора данных в TF 1.4, и я не слишком надеюсь, что полная асинхронная предварительная выборка на GPU будет и в 1.5, хотя я отмечаю, что очередь, которая может находиться в GPU появится в версии 1.5. - person David Parks; 21.01.2018

Лучший способ — использовать tensorflow Queue для ускорения Обмен данными.

Вы можете выполнить следующий шаг, даже если у вас нет файлов этикеток.

# data_files and labels_files are list, this may be some data files path, and labels values.
filename_queue = tf.train.slice_input_producer([data_files, label_files], shuffle=True)   
# filename_queue = tf.train.slice_input_producer(data_files, shuffle=True)       
# Some steps to decode the files and process
 ......
data, label = some_function(filename_queue)

# Define batch size and get batch for processing
image_batch, label_batch = tf.train.shuffle_batch([data, label], batch_size=batch_size, num_threads=num_threads)                                                                                                       
person Ishant Mrinal    schedule 05.08.2017
comment
Поправьте меня, если я ошибаюсь, но по крайней мере до TF 1.5 я не верю, что существует очередь, которую можно привязать к графическому процессору. Очереди сидят только на процессоре. Есть ли причина ожидать, что очередь на основе ЦП будет быстрее, чем метод feed_dict? - person David Parks; 21.01.2018