我在使用源代码编译的 Tensorflow 构建的 Keras 上运行卷积网络时遇到了麻烦。我使用的是 CUDA 10.0 和 CuDNN 7.4,并且两者都已正确编译,这已通过其示例 makefile 验证。当我运行卷积网络而不是密集网络时,我最终会收到以下错误:
UnknownError: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
[[{{node conv2d_1/convolution}}]]
[[metrics/acc/Mean/_169]]
我尝试将 CUDA 和 CuDNN 的路径直接附加到我的路径中,尝试重新安装并重新编译 TensorFlow,但没有结果。由于这是在这台机器上全新安装,因此不应该存在版本冲突的问题。
import keras
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, Dropout
from keras.datasets import mnist
import sys
def one_hot(data, num_categories):
oh = np.zeros((len(data),num_categories))
for i,entry in enumerate(data):
oh[i, entry] = 1
return oh
# import data
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# preprocess data
x_train = x_train.reshape( (60000,28,28,1) ) / 256
x_test = x_test.reshape( (10000,28,28,1) ) / 256
y_train = one_hot(y_train, 10)
y_test = one_hot(y_test, 10)
# build the model
model = Sequential()
input_shape=(28,28,1)
model.add(Conv2D(filters=32,
kernel_size=(3,3),
activation='relu',
input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2,2),
strides=(2,2)))
model.add(Conv2D(filters=32,
kernel_size=(3,3),
activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2),
strides=(2,2)))
model.add(Flatten())
model.add(Dropout(0.5))
model.add(Dense(units=256,
activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(units=10,
activation='softmax'))
# load model weight
# compile model
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.summary()
# train
num_epochs = 20
if num_epochs != 0:
# train the model
model.fit(x_train, y_train,
batch_size=32,
epochs=num_epochs)
# evaluate model
score = model.evaluate(x_test, y_test)
print('\nScore: ', score)
我正在运行的代码在没有专用 GPU 的笔记本电脑上运行得很好,但我正尝试在这台台式机上启动并运行 CUDA/CuDNN。如能提供任何帮助来诊断此问题,我将不胜感激。
更新:从源代码构建 TF 时,似乎可能存在与使用默认 NCCL 而非最新版本相关的错误。我正尝试安装最新 NCCL 的与操作系统无关的版本。这带来了一个新错误:ldconfig 列出了 NCCL,但找不到它的库。这使我无法使用最新的 NCCL 从源代码构建,所以我还不知道这是否是根本原因。
答案1
我曾因三种不同的原因看到过此错误消息,并且有不同的解决方案:
1. 您有缓存问题
我经常通过关闭 Python 进程、删除目录~/.nv
(在 Linux 上rm -rf ~/.nv
),然后重新启动 Python 进程来解决此错误。我不太清楚为什么这样做有效。这可能至少部分与第二个选项有关:
3. 你的记忆力不够
如果显卡内存不足,也会出现此错误。使用 nvidia GPU,您可以使用 检查显卡内存使用情况nvidia-smi
。这不仅会为您提供正在使用的 GPU RAM 量读数(例如,6025MiB / 6086MiB
如果您几乎已达到极限),还会提供正在使用 GPU RAM 的进程列表。
如果内存不足,则需要重新启动该过程(这应该会释放内存),然后采取内存占用较少的方法。以下是一些选项:
- 减少批次大小
- 使用更简单的模型
- 使用更少的数据
- 限制 TensorFlow GPU 内存比例:例如,以下内容将确保 TensorFlow 使用 <= 90% 的 RAM:
import keras
import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.9
keras.backend.tensorflow_backend.set_session(tf.Session(config=config))
如果不与上述项目一起使用,这可能会减慢您的模型评估速度。
3. 您的 CUDA、TensorFlow、NVIDIA 驱动程序等版本不兼容。
如果你从未使用过类似的模型,那么你就不会耗尽 VRAM和你的缓存很干净,我会回去使用最好的安装指南设置 CUDA + TensorFlow - 我按照以下说明取得了最大的成功https://www.tensorflow.org/install/gpu而不是 NVIDIA / CUDA 网站上的。
答案2
只需添加导入 tensorflow 的位置
适用于 tensorflow=1.*
import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)
答案3
使用 Jupyter 笔记本并同时运行多个笔记本会导致 GPU 内存填满,我所做的就是关闭一些我没有使用的笔记本内核。