【发布时间】:2016-09-16 13:48:19
【问题描述】:
我很困惑如何有效地将我的 TensorFlow 操作和变量分配给设备。很明显,至少对于我实现的基本卷积神经网络而言,在 GPU 上放置尽可能多的操作是可取的。但是我目前可以访问的 GPU 内存有限,并导致许多表单警告
Ran out of memory trying to allocate 2.60GiB. The caller indicates that this is not a failure, but may mean that there could be performance gains if more memory is available.
以及某些特定操作的偶尔崩溃,例如
Ran out of memory trying to allocate 83.74MiB. See logs for memory state. Resource exhausted: OOM when allocating tensor with shape[28000,1,28,28]
这些可以通过在 CPU 上放置变量来避免,但在我的实现中,这会导致训练 epoch 需要 10 倍的计算时间。
显然,理想的策略是识别产生错误的特定代码块,并尝试仅将这些代码块放在 CPU 上。但我不清楚如何做到这一点,因为这些计算无法与其他需要 GPU 放置以实现效率的计算隔离开来。
例如,简单地使用类似的东西在测试集上生成预测
evals = sess.run(tf.argmax(y, 1), feed_dict={x: use_x_all})
其中x 是我模型的输入tf.placeholder,y 是我的网络的输出激活,当use_x_all 是一个大数组时会产生上述错误(这里有28000 示例) .尝试将此计算单独放在 CPU 上失败,可能是因为生成 y 的网络评估在 GPU 上。
因此,我(似乎)需要采用类似的方法
use_x_all, _ = data_loader.stack_data(use_data, as_cols=False)
use_x_split = np.split(use_x_all, splits)
for use_x in use_x_split:
# ... (full example below)
evals_part = sess.run(tf.argmax(y, 1), feed_dict={x: use_x})
# accumulate evals
这显然无法扩展。
有没有更好的方法?具体来说:
- 有没有一种方法可以将上述计算放在 CPU 上,并且仍然在 GPU 上运行相同图形(例如训练)的这些计算?
或者,或者
- 是否有一种习惯用法(如批处理)可以更轻松地应用于此类情况以减少此类计算的内存需求?
实际上,我很惊讶后者不是 TensorFlow API 的一部分。不应该可以automatically break up calculations 不适合设备,而不需要上面的代码吗?
我的代码中的完整示例:
f = open('{0:s}/{1:s}_{2:3.0f}.csv'.format(FLAGS.pred_dir, FLAGS.session_name,
10000*float(sess.run(accuracy, feed_dict=valid_feed))), 'w')
f.write('ImageId,Label\n')
use_x_all, _ = data_loader.stack_data(use_data, as_cols=False)
use_x_split = np.split(use_x_all, splits)
last = 0
buff = ''
for use_x in use_x_split:
evals = sess.run(tf.argmax(y, 1), feed_dict={x: use_x})
f.write('\n'.join('{0},{1}'.format(r[0]+ last, r[1]) for r in enumerate(evals, start=1)))
last += int(len(use_x_all)/splits)
if last < len(use_x_all):
f.write('\n')
f.close()
【问题讨论】:
-
也以 TensorFlow 身份问feature request。
标签: memory-management out-of-memory gpu tensorflow