我试图在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):>
我怀疑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安装。我已经安装
编辑:我在非anaconda环境中尝试了相同的代码,并且运行正常。我宁愿使用anaconda来避免系统更新中断事情。
答案 0 :(得分:5)
从源(r1.13)建立张量流.Conv2D分段错误已修复。
我的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上可靠地重现分段错误。我的设置:
我终于通过 从源头构建张量流 来解决这个问题,并将其构建到新的conda环境中。有关出色的指南,请参见以下链接: https://gist.github.com/Brainiarc7/6d6c3f23ea057775b72c52817759b25c
这基本上与任何其他build-tensorflow-from-source指南类似,并且在我的以下情况中包括以下步骤:
// 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()
./configure
命令(有关详细信息,请参见链接)在构建过程中出现了一些小问题,其中一个问题是通过使用以下方法手动安装3个软件包来解决的:
bazel build
我在这里使用此答案发现的: Error Compiling Tensorflow From Source - No module named 'keras_applications'
conv2d现在可以在使用gpu时像超级按钮一样工作!
但是,由于所有这一切都花费了相当长的时间(从源头构建需要一个多小时,还不包括在Internet上搜索解决方案的时间),因此我建议在系统正常工作后对其进行备份,例如使用timeshift或您喜欢的任何其他程序。
答案 2 :(得分:1)
我在以下方面也遇到了相同的Conv2D问题:
最佳建议来自以下链接:https://github.com/tensorflow/tensorflow/issues/24383
因此, Tensorflow 1.13 应该附带修复程序。 同时,使用Tensorflow 1.13每晚构建(2018年12月26日)+使用tensorflow.keras代替keras 解决了该问题。