2017-02-17 3 views
1

У меня есть некоторые сомнения относительно использования GPU в Tensorflow. Я следовал инструкциям по сверточной нейронной сети here (тензорный поток/models/image/cifar10/cifar10_train.py). Как и в учебнике, все параметры (например, веса) сохраняются и обновляются в памяти процессора, а графические процессоры используются только для вычисления градиентов или вывода.Управление памятью при использовании GPU в TensorFlow

Поскольку весы хранятся в ЦП, они должны быть синхронизированы на каждой итерации, и, похоже, ГПУ недостаточно используется (около 60% согласно nvidia-smi). В случае использования нескольких графических процессоров я понимаю, что весы должны храниться в памяти процессора для синхронизации между графическими процессорами. Однако почему этот учебник хранит все веса в процессоре даже в одном графическом процессоре? Есть ли способ сохранить и обновить их в памяти GPU?

В случае вывода, весы копируются на GPU один раз и повторно их используют? или они должны копироваться каждый раз, когда они используются?

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

  • Если они скопированы на GPU сразу после их загрузки с диска, что произойдет, если размер данных изображения слишком велик, чтобы вписаться в память графического процессора? В таком случае можно каким-либо образом скопировать данные отдельно (что-то вроде предварительной выборки)?
  • Если они копируются на GPU по запросу, есть ли способ их предварительной выборки, прежде чем они будут фактически использованы GPU, чтобы избежать простоев?

EDIT: Было бы полезно, если есть способ проверить, где посыла/ПРИЕМ узлы вставляются между CPU и GPU (как в white paper).

+0

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

ответ

1

Эти учебные пособия предназначены для демонстрации API, поэтому они не оптимизируют производительность. Быстрое сохранение переменной на графическом процессоре для модели с одной башней, а также более быстрая для модели с несколькими башнями, когда у вас установлена ​​связь p2p между GPU. Чтобы привязать переменные к графическому процессору, используйте тот же подход tf.device('/gpu:0'), как и для любого другого op.

Вы можете увидеть все копии памяти между графическими процессорами, если вы включите графики раздела, то есть сделать что-то вроде этого:

metadata = tf.RunMetadata() 
sess.run(x, options=tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE, 
            output_partition_graphs=True), 
     run_metadata=metadata) 

timeline = Timeline(metadata.step_stats) 
with open("dynamic_stitch_gpu_profile.json", "w") as f: 
    f.write(timeline.generate_chrome_trace_format()) 
with open("dynamic_stitch_gpu_profile.pbtxt", "w") as f: 
    f.write(str(metadata)) 

Посмотреть этот вопрос на примере использования этого метода для отслеживания копий: https://github.com/tensorflow/tensorflow/issues/7251#issuecomment-277385212

для упреждающего на GPU, увидеть это issue

есть новые stage_op опса, которые были добавлены, которые позволяют предзапросы на GPU и являются Драмами по крайней мере, быстрее, чем использование подхода Python queue runner. Они находятся в процессе документирования.

+0

Связь p2p означает что-то вроде GPUDirect вправо? Тогда как я могу использовать его в TensorFlow? Поддерживает ли TF автоопределение GPUDirect, если мой GPU поддерживает его? – enc

+0

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

+0

На временной шкале, что означает каждая строка?Я могу видеть строки с/gpu: 0/memcpy Compute] или/gpu: 0/stream: XX Вычисление или/job: localhost/replica: 0/task: 0/cpu: 0 Вычисление или/job: localhost/replica: 0/Задача: 0/gpu: 0 Вычислить. Некоторые строки потока и строка localhost/gpu содержат такие слои, как conv2D, relu или add, mul. Однако их сроки очень разные. – enc

Смежные вопросы