其实之前很早就在Ubuntu上配置过tensorflow1.10的环境了,平时用也没啥问题,后来要看tensorflow的object detection模块,需要升级到tensorflow1.12版本以上。想着直接在原来的环境中直接使用命令pip install tensorflow-gpu==1.12
就可以了,确实这样是可以安装好tensorflow,可以运行object detection demo的时候直接就报错了,大体意思就是 CUDA Driver Version 和CUDA Runtime Version不一致适合导致的。网上给出的方法主要是两种,一种是升级驱动,一种是降低tensorflow的版本,在这里我只能使用第一种了。所以就卸载原来的显卡驱动,然后安装新的显卡驱动程序。
1 卸载原来的驱动和CUDA
1.1 卸载原来的显卡驱动
- 在卸载之前的先关闭图形界面的显示,使用Ctrl+Alt+F1进入命令行模式,然后输入命令
sudo service lightdm stop
关闭。(开启为:sudo serviece lightdm start
) - 输入
sudo apt-get purge nvidia*
卸载掉原来的驱动,更多的卸载方式请[参考]((https://blog.csdn.net/ezhchai/article/details/80536949) - 重启系统,
sudo reboot
重启后会自动开启图形界面的显示。
1.2 卸载原来版本的CUDA
- 输入命令
sudo /usr/local/cuda-9.0/bin/uninstall_cuda-9.0.pl
,这里的cuda-9.0
是CUDA的版本号,我自己是9.0的,如果不知道自己CUDA的版本号,可以在终端使用nvcc -V
命令查看。 - 可能存在残留文件,使用
sudo rm -r /usr/local/cuda-9.0
。更多请参考 - 如果彻底不用了,需要清除环境变量中对应的设置,这里我就不清除了,因为还要安装。
2 显卡驱动的安装
我的显卡为NVIDIA 1050Ti,显卡驱动的安装方式有三种,其中主流的有两种,一种是ppa源安装,一种是通过runfile的形式安装;通过runfile形式安装主要是可以解决通过ppa源安装后不断弹出登录界面的情况,而ppa源安装方式比较简单,而且是比较安全稳定的安装方式。
- runfile的安装方式
我之前使用了这种方式安装,在所有步骤都进行完了以后,在终端输入nvidia-smi
可以弹出显卡的信息,然后输入nvidia-setting
命令时,却报错了,无奈自己很菜啊,一直没有找到解决的方法,之后就换成了ppa源的方式安装了。如果要使用runfile的方式安装请参考 - ppa源安装(本文使用)
2.1 禁用nouveau驱动(如果之前已经禁用了,跳过这步)
- 修改blacklist.conf文件的属性,使用
sudo chmod 666 /etc/modprobe.d/blacklist.conf
- 使用gedit打开文件,
sudo gedit /etc/modprobe.d/blacklist.conf
- 在文件末尾增加如下命令:
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist rivatv
blacklist nvidiafb
- 保存文件退出并将文件blacklist.conf属性还原,
sudo chmod 644 /etc/modprobe.d/blacklist.conf
- 更新内核,
sudo update-initramfs -u
- 重启后确认nouveau是否已经被屏蔽掉,使用
lsmod | grep nouveau
查看,如果什么都没有,则禁用nouveau驱动成功;如果有,那么请重复上面的操作。
2.2 驱动安装(ppa源安装)
- 添加ppa源
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
- 使用Ctrl+Alt+F1进入命令行模式,并使用命令
sudo service lightdm stop
关闭图形界面的显示。 - 找到合适的驱动,输入
ubuntu-drivers devices
命令后,会弹出当前适合你显卡的驱动,一般选择recommend那个,我这里使用的是nvidia-396 - 驱动安装,
sudo apt-get install nvidia-396
,安装速度跟网速有关。 - 重启系统,
sudo reboot
- 输入
nvidia-smi
查看显卡信息,输入nvidia-settings
打开显卡设置;如果都成功则安装成功。
3 CUDA的安装和cuDNN配置
3.1 CUDA的安装
在Ubuntu上CUDA的安装主要有两种方式,一种是使用.deb文件安装,一种是使用runfile的形式安装。使用runfile的安装方式可以选择不安装CUDA包中推荐的显卡驱动,而使用.deb文件则会默认安装其自带的显卡驱动,这样的话之前的工作就白做了。
- 首先去官网下载对应的CUDA版本,我这里使用的是CUDA9.0,因为tensorflow对CUDA9.0的支持更好。
- 最好将下载的文件放置在home目录下,方便安装。
- 重启电脑,按Ctrl + Alt + F1进入命令行,并使用命令
sudo service lightdm stop
关闭图形界面的显示。 - 安装CUDA,
sudo sh cuda_9.0.176_384.81_linux.run
,在安装过程中,除了选择driver安装那一项为n
,其余均选择y
或则accept
。 sudo reboot
重启电脑,当然也可以不用重启,使用sudo service lightdm start
开启图形界面的显示。- 配置环境变量,运行如下命令打开profile文件,
sudo gedit /etc/profile
在文件末尾添加:
export PATH=/usr/local/cuda-9.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64$LD_LIBRARY_PATH
- 输入,
sudo source /etc/profile
使其生效。 - 添加CUDA-lib的路径,打开文件
sudo vi /etc/ld.so.conf.d/cuda.conf
,在文件末尾添加/usr/local/cuda/lib64
,进入底行模式(ESC键)后如果wq
保存退出;输入命令sudo ldconfig
使其生效。 - 检测环境变量是否添加成功,输入
nvcc -V
或者nvcc -version
,查看CUDA信息,如下图显示则表示配置成功。
3.2 编译CUDA Samples
为啥要编译呢,究竟安装成功没有,编译一把就知道了。到CUDA samples的目录下打开终端,输入make -j4
,4表示计算机是4核,8用8核,我这里电脑是4核的,所以写了4,这样可以编译快一点。
如果编译成功,会出现Finished building CUDA samples
。输入以下命令验证安装:
- 编译后生成的文件在/home/lxxx/NVIDIA_CUDA-9.0_Samples/bin/x86_64/linux/release目录下,在终端输入
cd /home/lxxx/NVIDIA_CUDA-9.0_Samples/bin/x86_64/linux/release
,其中xxx是你的计算机名,然后输入./deviceQuery
,出现Result = PASS
代表成功,Result = FAIL
表示失败。 - 输入
./bandwidthTest
检查一下系统和CUDA-Capable device的连接情况,同样出现Result = PASS
代表成功,Result = FAIL
表示失败。
在编译过程中可能遇到的问题: - 编译一开始就报错,可能是gcc的问题。
- 在编译过程中,出现
not found lgut
等类似错误,表明确实某个库,或则软连接,具体解决方法参考,参考
3.3 cuDNN的配置
- 去官网下载需要的cuDNN版本,我这里下载的是7.3forCUDA9.0的二进制文件。
- 解压文件,会在当前目录下生成一个
cuda
的文件夹,在当前目录下进入终端。 - 替换CUDA安装时的文件
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
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
- 更新软连接(这步非常重要,否则可能会在运行tensorflow的时候出现错误),这里需要在
/usr/local/cuda/lib64
目录下输入如下命令:
sudo ln -sf libcudnn.so.7.3.0 libcudnn.so.7
sudo ln -sf libcudnn.so.7 libcudnn.so
sudo ldconfig
- 查看cuDNN的版本,
sudo cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A2
。如下图所示,我这里是7.3.0:
大功告成,CUDA和cuDNN的配置到这里就结束了。
上述配置过程参考1,参考2
4 Tensorflow的安装
我这里使用的anaconda下创建的tensorlfow虚拟环境来安装的,具体的安装过程,网上有很多的博客,我这里就不列举了,这里指说明我遇到的错误。在刚开始的时候,我使用pip install tensorlfow-gpu==1.10
来安装1.10版本的tensorflow,后来要使用object detection模块,就升级了tensorflow的版本,手贱的我,使用了conda install tensorflow-gpu==1.12
的命令,我以为会直接覆盖掉,后来证明我想多了,在同一个虚拟环境下共存了两个tensorflow的版本,一旦利用gpu跑网络的时候就出问题,系统不知道去调用那个tensorflow。另外在使用conda
命令安装时,会默认给你安装cuda的环境,是不是贼坑,这样就可能让你的显卡驱动版本和CUDA的版本不合适了。所以建议在使用anaconda安装tensorlfow时,最好还是使用pip命令安装。这里给出几个查看tensorflow环境下安装tensorlfow具体方式和版本的命令。
conda list tensorflow
,会列出此环境下的tensorflow。如下图所示,我这里显示的只有pip
命令安装的tensorflow-gpu.
- conda list cudnn,会列出anaconda在此环境下安装的CUDA toolkit。我这里显示啥都没有,就表示没有用conda来安装了CUDA。