【问题标题】:How to debug Tensorflow segmentation fault in model.fit()?如何在 model.fit() 中调试 Tensorflow 分段错误?
【发布时间】:2018-11-14 14:51:57
【问题描述】:

我正在尝试使用 tensorflow-gpu 和 Geforce 2080 运行 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):

我怀疑 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
  • 张量流 1.12.0
  • tensorflow-gpu 1.12.0
  • cudnn 7.2.1
  • cudatoolkit 9.2

编辑:我在非 anaconda 环境中尝试了相同的代码,它完美无缺。我更喜欢使用 anaconda,以避免系统更新破坏。

【问题讨论】:

  • 您的型号参数号和批号?
  • 只是为了测试尝试使用 batchsize=1 运行你的代码
  • 感谢您的回复。模型参数是链接中示例中未修改的参数。我刚刚尝试使用 batchsize = 1 并遇到了同样的问题。
  • 好吧,回到基础,你的模型非常小。你根本不应该有记忆问题。你是如何安装 tensorflow-gpu 的,在哪个环境中,即 anaconda 或来自源代码、python 版本等。
  • 我通过 Anaconda 安装并运行了一切。我编辑了我的问题以显示版本。

标签: python tensorflow keras


【解决方案1】:

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

关注Build from Source

我的 GPU:RTX 2070 Ubuntu 16.04 Python 3.5.2 英伟达驱动 410.78 CUDA - 10.0.130 cuDNN-10.0 - 7.4.2.24 张量RT-5.0.0 计算能力:7.5

构建:tensorflow-1.13.0rc0-cp35-cp35m-linux_x86_64

https://github.com/tensorflow/tensorflow/issues/22706下载预编译

【讨论】:

    【解决方案2】:

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

    • Ubuntu:18.04
    • GPU:RTX 2070
    • CUDA:10
    • cudnn: 7
    • conda 与 python 3.6

    我终于通过从源代码构建 tensorflow 到一个新的 conda 环境中解决了这个问题。有关出色的指南,请参见例如以下链接: https://gist.github.com/Brainiarc7/6d6c3f23ea057775b72c52817759b25c

    这基本上与任何其他 build-tensorflow-from-source 指南一样,包括以下步骤:

    1. 安装巴泽尔
    2. 从 git 克隆 tensorflow 并运行 ./configure
    3. 运行适当的bazel build 命令(详见链接)

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

    pip install keras_applications==1.0.4 --no-deps
    pip install keras_preprocessing==1.0.2 --no-deps
    pip install h5py==2.8.0
    

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

    conv2d 现在在使用 gpu 时就像一个魅力!

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

    【讨论】:

    • 请提供链接的上下文,因为如果这些链接失效,您的答案将变得毫无价值。如果您想了解更多详细信息,请参阅帮助中心的回答指南:stackoverflow.com/help/how-to-answer
    • 感谢@AonghasM 的输入,我尝试在我的回答中添加更多细节
    【解决方案3】:

    我遇到了同样的 Conv2D 问题:

    • Ubuntu 18.04
    • 显卡:GeForce RTX 2080
    • CUDA:cuda_10.0.130_410
    • CUDNN:cudnn-10.0-linux-x64-v7.4.2
    • conda 与 Python 3.6

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

    所以 Tensorflow 1.13 应该会提供一个修复程序。 与此同时,使用 Tensorflow 1.13 nightly build(2018 年 12 月 26 日)+ 使用 tensorflow.keras 代替 keras 解决了问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2012-07-16
      • 2016-09-07
      • 2013-01-06
      • 2013-05-19
      • 1970-01-01
      相关资源
      最近更新 更多