当我在GPU上计算渐变时,我的系统挂起。我能够在没有任何问题的情况下计算CPU上的渐变。我可以毫无问题地在我的GPU上计算我的图表中的所有节点,包括我的损失函数。当我在GPU上计算渐变时,无论我使用哪种优化器,我的系统都会挂起。产生此问题的代码是:
sess = tf.Session()
# ...
cnn = CNNClass()
#...
step_size = tf.placeholder(tf.float32, name="step_size")
global_step = tf.Variable(0, name="global_step", trainable=False)
optimizer = tf.train.MomentumOptimizer(step_size, 0.9)
#...
# CRASHES WHEN I RUN THIS
grads_and_vars = optimizer.compute_gradients(cnn.loss)
sess.run([grads_and_vars], feed_dict)
# DOES NOT CRASH WHEN I RUN THIS
sess.run([cnn.loss])
我尝试在我的ConfigProto中设置gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.333)
,但这没有用。
在运行代码之前启动watch -n 0.1 nvidia-smi
会显示Volatile GPU-Util在挂起之前会达到100%。
在我的CPU上计算渐变并打印出来显示正常输出(我没有得到任何NaN或0或类似的东西)。
在缩小模型后,代码在GPU上运行。
在GPU上开始计算似乎有很大的开销。当我训练一个中等大小的模型时,我可以看到这一点:挥发性GPU-Util在没有完成任何评估的情况下有一段时间达到100%,然后Volatile GPU-Util下降到大约%30并且评估循环开始相当快地运行。这不会是一个问题,除非我的系统几乎完全无法使用,直到Volatile GPU-Util下降到30%。
我认为开销与将数据放在GPU上有某种关系。有人可以解释为什么会这样吗?有没有办法防止TensorFlow在新贵阶段占用所有易失性GPU?
答案 0 :(得分:1)
TensorFlow在完全控制GPU时效果最佳。为了避免系统在完全使用时挂起,最简单的方法是在将GPU用于培训时不要将GPU用于图形。