1. 您有缓存问题

1. 您有缓存问题

我在使用源代码编译的 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 内存填满,我所做的就是关闭一些我没有使用的笔记本内核。

相关内容