由于GPU内存敏感性导致Tensorflow错误

时间:2016-10-12 17:38:32

标签: memory tensorflow gpu

在Tensorflow中考虑以下简单的VGG培训代码:

import tensorflow as tf
import tensorflow.contrib.slim as slim
from tensorflow.contrib.slim.nets import vgg

# random input for training
images     = tf.random_normal(shape=(32, 224, 224, 3))
labels     = tf.cast(1000 * tf.random_uniform(shape=(32,)), dtype=tf.int32)

# init graph & cost
logits, _ = vgg.vgg_19(images)

cost = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels)
cost = tf.reduce_mean(cost, name='cross_entropy_loss')

# create training_op
optimizer  = tf.train.MomentumOptimizer(1e-5, 0.9)
train_op   = slim.learning.create_train_op(cost, optimizer)

# start training
slim.learning.train(train_op, logdir='logs/bugreport')

在我的几款GPU(特斯拉K40以及特斯拉K80)​​中,损失在培训开始时(在每次运行中始终如一)都非常正确地回复NaN:

InvalidArgumentError: LossTensor is inf or nan : Tensor had NaN values
     [[Node: train_op/CheckNumerics = CheckNumerics[T=DT_FLOAT, message="LossTensor is inf or nan", _device="/job:localhost/replica:0/task:0/gpu:0"](cross_entropy_loss)]]
     [[Node: train_op/control_dependency/_337 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_487_train_op/control_dependency", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

有趣的是,如果将内存消耗限制在某个固定部分,即通过用

替换最后一行,可以解决这种情况。
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.9)
slim.learning.train(train_op, logdir='logs/bugreport', 
                    session_config=tf.ConfigProto(gpu_options=gpu_options))

在这种情况下,培训顺利进行。但是,将内存分数增加到0.95会带来上述错误。我可以在其他一些GPU(同样是K40或K80)上重现这个错误,虽然有不同的阈值(在一个内存分数不能超过0.7),但不是所有的GPU都受到影响。更糟糕的是,我有另一个例子(在VGG上评估一组固定的1000个图像),如果没有应用内存约束,返回的精度取决于批量大小。

GPU之间的差异表明GPU内存应该受到指责,尽管我在Theano中从未遇到过这样的问题。有趣的是,受影响的GPU的ECC日志显示了不同数量的内存错误,范围从0到500位。在这一点上,我有点失去了如何进一步分析和调试这个问题。特别是,如果GPU的内存有问题,那么我需要更难的证明才能要求我的供应商更换。

0 个答案:

没有答案