加载模型时没有 GPU 的机器上的 Cuda 驱动程序错误

Posted

技术标签:

【中文标题】加载模型时没有 GPU 的机器上的 Cuda 驱动程序错误【英文标题】:Cuda driver errors on the machine without GPU while loading model 【发布时间】:2020-06-27 13:47:10 【问题描述】:

我有一台 NVidia GPU 很少的计算机,使用数据包 'segmentation_models' 并在 Unet 的基础上构建 NN:

import segmentation_models as sm
import keras.backend as K
from keras import optimizers
from keras.utils import multi_gpu_model

lr = 2e-4
NUM_GPUS = 3
learning_rate = lr * NUM_GPUS

adam = optimizers.Adam(lr=learning_rate)

def dice_coef(y_true, y_pred, smooth=1):
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    intersection = K.sum(y_true_f * y_pred_f)
    return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)

model = sm.Unet('efficientnetb3', encoder_weights='imagenet', classes=4, activation='softmax', encoder_freeze=False)
parallel_model = multi_gpu_model(model, gpus=NUM_GPUS)
model = parallel_model
model.compile(adam, 'categorical_crossentropy', [dice_coef])
history = model.fit_generator(
        generator=train_gen, steps_per_epoch=len(train_gen), \
        validation_data=validation_gen, \
        epochs=50, callbacks=[clr, checkpoints, csv_logger],
        initial_epoch=0)

训练后我保存权重以备将来在 cpu 模式下使用:

single_gpu_model = model.layers[-2]
single_gpu_model.save(single_proc_model_path_1_kernel)

我尝试使用这些权重:

import keras
model1 = keras.models.load_model(single_proc_model_path_1_kernel)
...
pr_mask = self.model1.predict(img_exp)
神经网络训练机器: Ubuntu 16.04.4 LTS,3 x K80 GPU; python 3.6.7,tensorflow 1.12.0 - 所有代码都在这里工作。 带 1 个 GeForce GTX 1080 的 Win10; python 3.7.3,tensorflow-gpu 1.13.1 - 代码也可以在这里工作。 Win10 不带 NVidia GPU; tensorflow-gpu 1.13.1 - 加载模型时出错:

tensorflow/stream_executor/cuda/cuda_driver.cc:300] 调用 cuInit 失败:CUDA_ERROR_NO_DEVICE:未检测到支持 CUDA 的设备

使用 Ubuntu 18.04.3 LTS 的码头工人; python 3.6.9,张量流 2.1.0。 加载模型时出错:

tensorflow/stream_executor/platform/default/dso_loader.cc:55] 无法加载动态库“libnvinfer.so.6”; dlerror:libnvinfer.so.6:无法打开共享对象文件:没有这样的文件或目录 tensorflow/stream_executor/platform/default/dso_loader.cc:55] 无法加载动态库“libnvinfer_plugin.so.6”; dlerror:libnvinfer_plugin.so.6:无法打开共享对象文件:没有这样的文件或目录 tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:30] 无法打开某些 TensorRT 库。如果您想将 Nvidia GPU 与 TensorRT 一起使用,请确保正确安装了上述缺少的库。 分割模型:使用keras 框架。 tensorflow/stream_executor/platform/default/dso_loader.cc:55] 无法加载动态库“libcuda.so.1”; dlerror:libcuda.so.1:无法打开共享对象文件:没有这样的文件或目录 tensorflow/stream_executor/cuda/cuda_driver.cc:351] 调用 cuInit 失败:未知错误 (303) 我 tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] 内核驱动程序似乎没有在此主机上运行(b36a4cf2df2e):/proc/driver/nvidia/version 不存在

我应该改变什么来强制代码在只有 CPU 的机器上工作?

【问题讨论】:

你需要安装 tensorflow 包(不是 tensorflow-gpu)所以你只能获得 CPU 支持,你为什么还要在没有 GPU 的机器上安装 tensorflow-gpu? 最后一台测试机(docker 和 ubuntu)既没有 GPU,也没有 tensorflow-gpu。它也不起作用。 那些警告只是说没有 GPU,它并不妨碍你使用 Tensorflow。从 2.x 开始,TF 包动态支持 CPU 和 GPU 但是预测的时候不行。 你应该试试我对tensorflow 1.13(不是tensorflow-gpu)的建议,并详细解释“不起作用”。 【参考方案1】:

您可以尝试将环境变量CUDA_VISIBLE_DEVICES 设置为空白或空字符串"",或者可能是-1

否则,您需要告诉 tensorflow 后端仅使用 CPU。

另请参阅:Can Keras with Tensorflow backend be forced to use CPU or GPU at will?

请注意keras multi_gpu_model is deprecated,您应该更改您的代码以改用tf.distribute.MirroredStrategy。我没有亲自使用过它,但我想这个新的 API 旨在更无缝地在像你这样的 GPU/CPU 情况下工作。

【讨论】:

我的帖子里没有写,但是我用了os.environ["CUDA_VISIBLE_DEVICES"]="-1"【参考方案2】:

Tensorflow 1.15 解决了所有问题。谢谢。

【讨论】:

以上是关于加载模型时没有 GPU 的机器上的 Cuda 驱动程序错误的主要内容,如果未能解决你的问题,请参考以下文章

集成 gpu + 外部设备上的 cuda

个人电脑如何搭建深度学习/机器学习开发环境?

如何使用软件实现在没有 GPU 的情况下运行 CUDA?

CUDA版本与GPU驱动版本问题

导入具有GPU支持的TensorFlow时DLL加载失败

GPU 上的 tensorflow:没有已知设备,尽管 cuda 的 deviceQuery 返回“PASS”结果