ubuntu 18.04下使用keras+tensorflow-gpu(安装cuda,cudnn)

在经历了接近两天的瞎搞中,终于完成了ubuntu下用gpu训练模型,真是比cpu快了好多倍啊。。。

先看看成功结果图

ubuntu 18.04下使用keras+tensorflow-gpu(安装cuda,cudnn)可以看到这时的gpu平均利用率达到了80%以上,而cpu利用率保持在20%以下。

必须强调的是

要想成功,版本对的上是关键,你若对不上,那就不可能成功
需要明白的是:tensorflow-gpu应该是会调用cuda提供的函数(或者说tensorflow-gpu通过cuda才能在gpu上运行),所以tensorflow的版本和cuda的版本需要对应;而cudnn又是建立在cuda上的,所以cudnn需要和cuda版本对应;同时keras往往使用tensorflow作为backend,所以keras需要和tensorflow-gpu版本对应(我估计若同时装有tensorflow和tensorflow-gpu的情况下,keras会优先利用tensorflow而不是tensorflow-gpu,所以请只保留tensorflow-gpu,反正多一个也没用)
下面给出我从别的博客那里看到的对应版本图
ubuntu 18.04下使用keras+tensorflow-gpu(安装cuda,cudnn)
ubuntu 18.04下使用keras+tensorflow-gpu(安装cuda,cudnn)

说说我的配置

显卡:NVIDIA GTX1050Ti(官网上查看可以用于cuda的显卡里没有这一项,然而其实可以)

显卡驱动版本(NVIDIA Driver Version):450.80.02

系统版本:Ubuntu 18.04.5 LTS

gcc/g++版本:gcc (Ubuntu 4.8.5-4ubuntu8) 4.8.5

python版本:Python 3.6.9

cuda版本:
我的cuda安装包名称:cuda_10.0.130_410.48_linux.run,这个名称才是网上一般所说的cuda版本,也就是说我的cuda是10.0版本的
若用nvcc --version查看,结果如下
nvcc: NVIDIA ® Cuda compiler driver
Copyright © 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:01_CDT_2018
Cuda compilation tools, release 10.0, V10.0.130

cudnn版本:
我的cudnn安装包名称:cudnn-10.0-linux-x64-v7.4.1.5.tgz,这个名称才是网上一般所说的cudnn版本,也就是说我的cudnn是7.4版本的(cudnn7.4 for cuda 10.0)
其他博客里说用这个查看:cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2,然而貌似看不出来
结果如下
#define CUDNN_MAJOR 7
#define CUDNN_MINOR 4
#define CUDNN_PATCHLEVEL 1

tensorflow-gpu版本:1.14

keras版本:2.2.0

传送门

cuDNN下载:https://developer.nvidia.com/rdp/cudnn-archive#a-collapse7415-10
卸载cuDNN:https://blog.****.net/qq_15192373/article/details/81609077

参考博客

http://www.mamicode.com/info-detail-3024196.html
https://blog.****.net/fengdu78/article/details/104667044/
https://blog.****.net/zhiman_zhong/article/details/91491780
第三篇博客写的很详细,基本上跟着做就没问题,若是哪一步不对了,卸载重装就行(比如说我的cuda开始装完后,/usr/local/下的cuda文件名为cuda,而写进配置文件的是cuda-10.0,这个问题直到我重装才发现,所以请确定自己某一步安装确实完成了,从网上搜一搜如何查看是否安装上即可)

-----------------------------------------------更新分割线------------------------------------------------------
在训练时出现了这样一个错误:
运行:
model = models.Sequential()
model.add(conv_base)
错误:
The added layer must be an instance of class Layer.
网上的说法大多是:从不同的位置导入了layer,或从tensorflow导入了layer的同时从keras导入了VGG
然而我的并非如此

由于我在另外一个版本的环境中跑过相同的代码,因此怀疑是tensorflow版本的问题
所以:更新tensorflow–>更新keras,cudnn
更新后的环境:
不变的部分
显卡:NVIDIA GTX1050Ti
显卡驱动版本(NVIDIA Driver Version):450.80.02
系统版本:Ubuntu 18.04.5 LTS
python版本:Python 3.6.9
cuda版本:10.0
变化的部分
cuDNN版本:7.6.5
tensorflow-gpu版本:2.0.0
keras版本:2.3.1
大概可以猜测:版本之间的匹配重要的是前两个数字,比如7.6,2.0,2.3之类的,后面的数字不太重要