Ubuntu18.04+CUDA10.1+TensorFlow2.3.0
踩坑总结
!!!CUDA版本与cuDNN以及TensorFlow的版本要对应
在终端输入命令 lspci | grep -i vga
参考下面链接后知道返回的是一个十六进制数字代码,根据这个数字代码可以找到相应的显卡类型。
Linux(Ubuntu)系统查看显卡型号
The PCI ID Repository
在输入框中输入终端返回的十六进制数,就能查到显卡类型,我的是Quadro P2200。
知道自己的显卡型号后,即可登录NVIDIA官网查询对应的驱动并下载。
下图是CUDA和显卡驱动版本的对应表,看表中符号是“>=”,所以下载驱动时只需满足驱动版本高于所要下载的CUDA对应版本就可以了,通常选择官网查询给出的驱动版本。
(我的显卡驱动版本是450的,看这个表就想着下载对应的CUDA11,结果最后TensorFlow还没有支持到CUDA11,只好卸了重装T^T)
NVIDIA驱动程序下载
参考链接https://blog.csdn.net/u014797226/article/details/79626693
1、禁用nouveau第三方驱动
打开编辑配置文件: sudo gedit /etc/modprobe.d/blacklist.conf
在最后一行添加:blacklist nouveau
改好后执行命令:sudo update-initramfs -u
重启使之生效:reboot
输入lsmod | grep nouveau
,若无输出则代表成功。
2、验证是否安装了gcc
按 Ctrl+Alt+F1/F3 进入tty界面
输入下面命令关闭图形界面:
sudo service lightdm stop
或者
sudo telinit 3
给驱动run文件赋予可执行权限:sudo chmod a+x NVIDIA-Linux-x86_64-450.80.0.2.run
(下载的驱动文件名)
安装:sudo ./NVIDIA-Linux-x86_64-450.80.0.2.run -no-opengl-files
开启X服务:sudo /etc/init.d/lightdm start (或者:sudo service lightdm start)
–no-opengl-files 只安装驱动文件,不安装OpenGL文件。这个参数最重要
–no-x-check 安装驱动时不检查X服务
–no-nouveau-check 安装驱动时不检查nouveau
后面两个参数可不加。
重启,输入命令:nvidia-smi
CUDA工具包下载
按 ctrl + alt + F1/F3 进入tty命令行界面,登录用户和密码
关闭图形界面,同上 安装NVIDIA驱动时操作
sudo service lightdm stop
或者
sudo telinit 3
给cuda可执行权限:
sudo chmod a+x cuda_10.1.105_418.39_linux.run
运行cuda文件:
sudo ./cuda_10.1.105_418.39_linux.run --no-opengl-libs
cuda主要有以下参数:
–no-opengl-libs:表示只安装驱动文件,不安装OpenGL文件。必需参数,原因同上。注意:不是-no-opengl-files。
–uninstall (deprecated):用于卸载CUDA Driver(已废弃)。
–toolkit:表示只安装CUDA Toolkit,不安装Driver和Samples
–help:查看更多高级选项。
(注:因为已安装NVIDIA驱动,故安装CUDA时有一个选项DRIVER即驱动不要勾选,否则会安装失败)
安装过程结束后会有以下信息:
Toolkit :Installed in /usr/local/cuda-10.1
Samples :Installed in /home/vincent
安装完成,重启。
打开终端,输入:
export PATH="/usr/local/cuda-10.1/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-10.1/lib64:$LD_LIBRARY_PATH"
这两条命令是将cuda的bin文件和lib导出到系统环境中。
如果安装的版本不是一样的,更换路径中的cuda-10.1。
终端输入:
nvcc -V
编译samples例子
编译并测试设备 deviceQuery:
cd /usr/local/cuda-9.2/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery
#编译并测试带宽 bandwidthTest:
cd ../bandwidthTest
sudo make
./bandwidthTest
如果这两个测试的最后结果都是Result = PASS,说明CUDA安装成功。
将cuda的bin和lib写入系统环境
sudo gedit ~/.bashrc
打开~.bashrc文件在末尾追加:
export CUDA_HOME=/usr/local/cuda-10.1
export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-10.1/bin:$PATH
然后在终端输入以使路径生效
. ~/.bashrc
参考链接:Linux安装CUDA的正确姿势
cuDNN的全称为NVIDIA CUDA® Deep Neural Network library,是NVIDIA专门针对深度神经网络(Deep Neural Networks)中的基础操作而设计基于GPU的加速库。cuDNN为深度神经网络中的标准流程提供了高度优化的实现方式,例如convolution、pooling、normalization以及activation layers的前向以及后向过程。
cuDNN下载
只要与cuda版本匹配就可以了
点击下载后,选择cuDNN Library for Linux
下载完成以后将其解压到Cuda的目录当中,依次执行如下命令:
tar -xzvf cudnn-10.1-linux-x64-v8.0.4.30.tgz
sudo cp cuda/include/cudnn*.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
网上有验证cuDNN是否安装成功的步骤,是查看cudnn.h文件,输入的是“cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2”,但是我输入后没有任何输出,后来看到了“安装成功后验证实际上显示的就是cudnn_version.h里的版本信息”,于是把cudnn.h改成cudnn_version.h。输入
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
成功显示版本信息。
Ubuntu16.04下安装cuda和cudnn的三种方法(亲测全部有效)
安装过程不变,
将~/.bashrc 或 ~/.zshrc 下与cuda相关的路径都改为 /usr/local/cuda/ 而不使用 /usr/local/cuda-10.1/ 或/usr/local/cuda-10.1/。
#切换cuda版本
rm -rf * /usr/local/cuda #删除之前创建的软链接
sudo cp -r /usr/local/cuda-10.1/* /usr/local/cuda/
nvcc -V #查看当前 cuda 版本
#cuda8.0 切换到 cuda9.0
rm -rf * /usr/local/cuda
sudo cp -r /usr/local/cuda-10.0/* /usr/local/cuda/
nvcc -V
参考:在Linux服务器上配置tensorflow-gpu版(最详细教程)
系统中要有anaconda,这里就跳过了。
输入conda create -n (环境名称) python=3.6(python必须3.5或3.6,3.6以上版本tensorflow可能会报错)
conda create -n tensorflow36 python=3.6
等待完成。
输入source activate tensorflow36(我的环境名称为tensorflow36,可自己在创建是命名),进入创建的tensorflow环境。
在安装之前配置清华镜像,下载速度会很快.
在~/.config/.pip目录下新建(或修改)pip.conf文件
然后在文件中输入如下信息:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple/
根据版本对应关系,我就安装了2.3.0版,输入
pip install tensorflow-gpu==2.3.0
网上给出这样的测试代码
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
但我运行后出现错误“RuntimeError: The Session graph is empty. Add operations to the graph before calling run().”
经过查找,了解是TensorFlow版本的原因,调用前没有给session清空
将上述代码改为:
import tensorflow as tf
g = tf.Graph()
with g.as_default():
hello = tf.constant('Hello, TensorFlow!')
sess = tf.compat.v1.Session(graph=g)
print(sess.run(hello))
参考TensorFlow(踩坑):RuntimeError: The Session graph is empty.
测试成功。