如何在model.fit()中调试Tensorflow分段错误?

时间:2018-11-14 14:51:58

标签: python tensorflow keras

我试图在Geforce 2080上使用tensorflow-gpu运行Keras MINST example。我的环境是Linux系统上的Anaconda。

我正在从命令行python会话运行未修改的示例。我得到以下输出:

Using TensorFlow backend.
Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: GeForce RTX 2080, pci bus id: 0000:01:00.0, compute capability: 7.5
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
Train on 60000 samples, validate on 10000 samples
Epoch 1/12
conv2d_1/random_uniform/RandomUniform: (RandomUniform): 
/job:localhost/replica:0/task:0/device:GPU:0
conv2d_1/random_uniform/sub: (Sub): 
/job:localhost/replica:0/task:0/device:GPU:0
conv2d_1/random_uniform/mul: (Mul): 
/job:localhost/replica:0/task:0/device:GPU:0
conv2d_1/random_uniform: (Add): 
/job:localhost/replica:0/task:0/device:GPU:0
[...]

我收到的最后几行是:

training/Adadelta/Const_31: (Const): /job:localhost/replica:0/task:0/device:GPU:0
training/Adadelta/mul_46/x: (Const): /job:localhost/replica:0/task:0/device:GPU:0
training/Adadelta/mul_47/x: (Const): /job:localhost/replica:0/task:0/device:GPU:0
Segmentation fault (core dumped)

通过阅读,我认为这可能是内存问题,并添加了以下几行以防止GPU内存不足:

config = tf.ConfigProto(log_device_placement=True)
config.gpu_options.per_process_gpu_memory_fraction=0.3
K.tensorflow_backend.set_session(tf.Session(config=config))

使用nvidia-smi工具检查是否实际使用了GPU(watch -n1 nvidia-smi),我可以从以下输出中确认(在此运行中,没有将per_process_gpu_memory_fraction设置为1):

enter image description here

我怀疑CUDA,Keras和Tensorflow之间的版本不兼容是问题所在,但我不知道如何调试它。

可以采取哪些调试措施来深入了解此问题?还有哪些其他问题可能导致此段错误?

编辑:我进行了进一步的实验,并使用此代码替换了模型,效果很好:

model = keras.Sequential([
    keras.layers.Flatten(input_shape=input_shape),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)
])

但是一旦我像这样引入了卷积层

model = keras.Sequential([
    keras.layers.Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape),
#    keras.layers.Flatten(input_shape=input_shape),
    keras.layers.Flatten(),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)

])

然后我再次遇到上述段错误。

所有数据包均已通过Anaconda安装。我已经安装

  • conda 4.5.11
  • python 3.6.6
  • keras-gpu 2.2.4
  • tensorflow 1.12.0
  • tensorflow-gpu 1.12.0
  • cudnn 7.2.1
  • cudatoolkit 9.2

编辑:我在非anaconda环境中尝试了相同的代码,并且运行正常。我宁愿使用anaconda来避免系统更新中断事情。

3 个答案:

答案 0 :(得分:5)

从源(r1.13)建立张量流.Conv2D分段错误已修复。

关注Build from Source

我的GPU:RTX 2070 Ubuntu 16.04 Python 3.5.2 Nvidia驱动程序410.78 CUDA-10.0.130 cuDNN-10.0-7.4.2.24 TensorRT-5.0.0 计算能力:7.5

内部版本:tensorflow-1.13.0rc0-cp35-cp35m-linux_x86_64

https://github.com/tensorflow/tensorflow/issues/22706下载预构建的

答案 1 :(得分:2)

在与Francois非常相似的系统上,我遇到了完全相同的问题,但是使用RTX2070,当使用在GPU上执行的conv2d函数时,可以在该RTX2070上可靠地重现分段错误。我的设置:

  • Ubuntu:18.04
  • GPU:RTX 2070
  • CUDA:10
  • cudnn:7
  • 使用python 3.6的conda

我终于通过 从源头构建张量流 来解决这个问题,并将其构建到新的conda环境中。有关出色的指南,请参见以下链接: https://gist.github.com/Brainiarc7/6d6c3f23ea057775b72c52817759b25c

这基本上与任何其他build-tensorflow-from-source指南类似,并且在我的以下情况中包括以下步骤:

  1. 令人惊叹的榛子
  2. 从git克隆tensorflow并运行// instantiate the new fragment val fragment: Fragment = ExampleFragment() val transaction = supportFragmentManager.beginTransaction() transaction.replace(R.id.book_description_fragment, fragment) transaction.addToBackStack("transaction_name") // Commit the transaction transaction.commit()
  3. 运行适当的./configure命令(有关详细信息,请参见链接)

在构建过程中出现了一些小问题,其中一个问题是通过使用以下方法手动安装3个软件包来解决的:

bazel build

我在这里使用此答案发现的: Error Compiling Tensorflow From Source - No module named 'keras_applications'

conv2d现在可以在使用gpu时像超级按钮一样工作!

但是,由于所有这一切都花费了相当长的时间(从源头构建需要一个多小时,还不包括在Internet上搜索解决方案的时间),因此我建议在系统正常工作后对其进行备份,例如使用timeshift或您喜欢的任何其他程序。

答案 2 :(得分:1)

我在以下方面也遇到了相同的Conv2D问题:

  • Ubuntu 18.04
  • 图形卡:GeForce RTX 2080
  • CUDA:cuda_10.0.130_410
  • CUDNN:cudnn-10.0-linux-x64-v7.4.2
  • 使用Python 3.6的conda

最佳建议来自以下链接:https://github.com/tensorflow/tensorflow/issues/24383

因此, Tensorflow 1.13 应该附带修复程序。 同时,使用Tensorflow 1.13每晚构建(2018年12月26日)+使用tensorflow.keras代替keras 解决了该问题