Как TensorFlow выделяет память графического процессора при выполнении логического вывода? - PullRequest
2 голосов
/ 08 апреля 2019

Я использую FastRCNN с архитектурой ResNet50. Я загружаю контрольную точку модели и делаю вывод следующим образом:

saver = tf.train.Saver()
saver.restore(sess, 'model/model.ckpt')
with tf.Session() as sess:
    sess.run(y_pred, feed_dict={x: input_data})

Кажется, все работает отлично. Для выполнения логического вывода модели требуется 0,08 с .

Но я заметил, что когда я это делаю, использование памяти GPU увеличивается до 15637MiB / 16280MiB в соответствии с nvidia-smi.

Я обнаружил , что вы можете использовать опцию config.gpu_options.allow_growth, чтобы запретить Tensorflow выделять весь GPU и вместо этого использовать память GPU по мере необходимости:

config = tf.ConfigProto()
config.gpu_options.allow_growth = True

saver = tf.train.Saver()
saver.restore(sess, 'model/model.ckpt')
with tf.Session(config=config) as sess:
    sess.run(y_pred, feed_dict={x: input_data})

При этом уменьшается использование памяти до 4875MiB / 16280MiB. Для запуска модели по-прежнему требуется 0,08 с .

Наконец, я сделал это ниже, где я выделяю фиксированный объем памяти, используя per_process_gpu_memory_fraction.

config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.05

saver = tf.train.Saver()
saver.restore(sess, 'model/model.ckpt')
with tf.Session(config=config) as sess:
    sess.run(y_pred, feed_dict={x: input_data})

Благодаря этому использование сокращается до 1331MiB / 16280MiB, а модели все еще требуется 0,08 с для запуска.

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

1 Ответ

1 голос
/ 08 апреля 2019

Давайте сначала убедимся, что происходит в tf.Session(config=config).

Это означает, что использовать отправку графика по умолчанию def для времени выполнения tenorflow, затем для времени выполнения выделять память GPU соответствующим образом.

Тогда Tensorflow выделит всю память GPU, если вы не ограничите ее, установив per_process_gpu_memory_fraction. Он потерпит неудачу, если не сможет выделить объем памяти, если только .gpu_options.allow_growth = True, что говорит TF снова попытаться выделить меньше памяти в случае сбоя, но итерация всегда начинается со всей или дробной части памяти графического процессора.

И если у вас есть 10 сеансов, для каждого сеанса требуется менее 1/10 памяти графического процессора, это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...