Я использую 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 раз на одном и том же графическом процессоре для параллельного вывода, это будет проблемой?