tensorflow хранит тренировочные данные в памяти графического процессора

Я новичок в тензорном потоке. Раньше я использовал theano для развития глубокого обучения. Я замечаю разницу между этими двумя, то есть где могут храниться входные данные.

В Theano он поддерживает общую переменную для хранения входных данных в памяти графического процессора, чтобы уменьшить передачу данных между процессором и графическим процессором.

В тензорном потоке нам нужно вводить данные в заполнитель, и данные могут поступать из памяти ЦП или файлов.

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

Спасибо.


person xyd    schedule 02.06.2016    source источник
comment
Вот полный пример этого: mnist full_connected_preloaded .py   -  person Yaroslav Bulatov    schedule 02.06.2016
comment
@ЯрославБулатов Спасибо!   -  person xyd    schedule 04.06.2016
comment
@YaroslavBulatov не уверен, знаете ли вы или нет, но предоставленный вами код выполняет одну эпоху за 28 секунд, что ужасно. (Кстати, это на GPU). Кроме того, я не могу найти в Интернете ни одного хорошо работающего примера tensorflow, что очень странно по сравнению с другими фреймворками глубокого обучения, такими как theano и torch. Это потому, что тензорный поток действительно медленнее других? Если нет, то почему никто из создателей не пытается решить эту проблему, пока все новые пользователи tensorflow жалуются на это?   -  person zwlayer    schedule 03.10.2016
comment
У Soumith Chintala есть тесты с кодом, который выгодно сравнивает tf с caffe/torch, вы можете начать с этих моделей.   -  person Yaroslav Bulatov    schedule 03.10.2016
comment
@zwlayer -- вот ссылка на тесты коннетов -- github.com/soumith/convnet-benchmarks . Кроме того, я перенес пример сценария Torch lbfgs.lua в TensorFlow и заставил его работать быстрее с полноразмерными пакетами, вот сравнение — github.com/yaroslavvb/lbfgs . Сопоставить производительность на небольших партиях сложнее, поскольку TensorFlow предназначен для масштабирования до распределенных систем/аппаратных чипов будущего, существует несколько уровней косвенности с некоторыми постоянными накладными расходами, которые преобладают в крошечных вычислениях. IE, скрипт, который умножает 2 числа, в TF в 1000 раз медленнее, чем numpy   -  person Yaroslav Bulatov    schedule 03.10.2016
comment
@YaroslavBulatov спасибо за всю ценную информацию, которую вы предоставили.   -  person zwlayer    schedule 03.10.2016
comment
@YaroslavBulatov Я знаю, что это старый вопрос, но включение log_device_placement в первом примере, на который вы ссылаетесь, показывает, что операции организации очереди, сгенерированные tf.train.slice_producer, находятся на ЦП. Постановка слайсов в очередь на ЦП, казалось бы, сводит на нет преимущество хранения данных на ГП, поскольку слайсы будут передаваться в ЦП и обратно. Я что-то упускаю?   -  person Tobias Hagge    schedule 19.10.2017
comment
Вы правы, очереди не поддерживают GPU. Для лучшей производительности на графическом процессоре используйте tf.data вместо очередей.   -  person Yaroslav Bulatov    schedule 19.10.2017
comment
@YaroslavBulatov Согласно моим сообщениям об ошибках, tf.data.Dataset.from_tensor_slices и некоторые функции Iterator в настоящее время также не имеют ядра графического процессора. Вот так я оказался здесь.   -  person Tobias Hagge    schedule 19.10.2017
comment
Я понимаю. Это кажется необычным случаем, обычно чтение данных не является узким местом, поэтому данные живут на процессоре.   -  person Yaroslav Bulatov    schedule 19.10.2017


Ответы (2)


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

with tf.device('/gpu:0'):
  tensorflow_dataset = tf.constant(numpy_dataset)

Одним из способов извлечения мини-пакетов может быть нарезка этого массива на каждом шаге вместо того, чтобы передавать его с помощью tf.slice< /а>:

  batch = tf.slice(tensorflow_dataset, [index, 0], [batch_size, -1])

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

person Vincent Vanhoucke    schedule 02.06.2016
comment
Большое спасибо! Я посмотрю на это. - person xyd; 04.06.2016

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

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

1) Начните сеанс с ведения журнала размещения устройств, чтобы регистрировать, какие операции выполняются на каких устройствах:

config = tf.ConfigProto(log_device_placement=True)
sess = tf.Session(config=config)

2) Попробуйте вручную разместить график на GPU, поместив его определение в блок with tf.device('/gpu:0'):. Это вызовет исключения, если операции не поддерживаются графическим процессором.

person Tobias Hagge    schedule 19.10.2017