安装paddlepaddle飞桨的GPU版本,需要安装显卡驱动、CUDA和cuDNN。
飞桨快速安装:https://www.paddlepaddle.org.cn/install/quick
Ubuntu下安装:https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/beginners_guide/install/install_Ubuntu.html
环境准备要求:
查看GPU信息和版本驱动
Ubuntu发行版本以及内核版本
在Linux系统上查询
lspci | grep -i nvidia
04:00.0 3D controller: NVIDIA Corporation GF117M [GeForce 610M/710M/810M/820M / GT 620M/625M/630M/720M] (rev a1)
在windows系统查询
现在的GPU为GeForce 820M,CUDA8.0,计算能力为2.1。
参考该链接也能找到CUDA以及Cudnn版本对应关系
https://blog.csdn.net/qq_27825451/article/details/89082978
sudo dpkg --list | grep nvidia-*
我的系统没有安装过驱动,因此没有显示旧版本。
有需要可以按下面指令卸载旧驱动
若通过apt-get安装,卸载如下:
sudo apt-get remove --purge nvidia*
若通过run文件安装,*为原有文件名,cd到安装目录,卸载如下:
sudo chmod +x *.run
sudo ./*.run --uninstall
方法一:在官网下载.run文件
在安装目录下读取权限:
$ sudo chmod 775 NVIDIA-Linux-x86_64-430.40.run
执行
$ ./NVIDIA-Linux-x86_64-430.run
方法二:ppa源安装
终端输入
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-430
$ sudo apt-get install mesa-common-dev
$ sudo apt-get install freeglut3-dev
但是我下载的时候
提示本机只能装390.xx的版本,于是去官网下了个低一点的版本390.138
。
下载runfile后,同之前步骤,但是执行出现X service error。
1)按住CTRL+ALT+F1 进入命令行
2)
$ sudo service lightdm stop
或者
$ sudo stop lightdm
3)
$ sudo init 3
4)安装驱动程序
在安装目录下读取权限:
$ sudo chmod 775 NVIDIA-Linux-x86_64-390.138.run
执行
$ ./NVIDIA-Linux-x86_64-390.138.run
5) 按照提示安装完成,重启
$ sudo reboot
或者返回桌面
$ sudo service lightdm start
很不幸,我又出现pre-install scipt failed的错误。居然是nvidia的工程师开的玩笑。
Ubuntu 安装nvidia驱动一直遇到 pre-install scipt failed 错误
需要禁用nouveau
$ sudo gedit /etc/modprobe.d/blacklist.conf
在最后一行添加:
blacklist nouveau
之后,执行命令:
sudo update-initramfs -u
电脑重启之后继续执行安装
lsmod | grep nouveau #没有输出,即说明安装成功
在Ubuntu上安装显卡驱动时报以下错误:
The CC version check failed:
The kernel was built with gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12),
but the current compiler version is cc(Ubuntu 4.9.4-2ubuntu1~16.04) 4.9.4.
查了发现我的gcc装了4.9和5的版本,路径在/usr/bin/
,是版本冲突的问题。
查询gcc版本
$ gcc -v
查询路径有无其他版本
$ ls /usr/bin/gcc*
进行版本切换设置
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 40
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50
接着输入:
$ sudo update-alternatives --config gcc
有三个选项,把自动模式设为gcc5了。
查询gcc版本,看看是否更改完成
$ gcc -v
安装完重启后出现循环登陆,无法进入ubuntu桌面的情况
1)ctrl+alt+f1,进入tty1
2)sudo service lightdm stop
3)卸载之前安装的驱动
$ sudo apt-get purge nvidia-*
$ nvidia-smi
如果没有显示驱动信息则卸载成功。依旧显示驱动信息,继续下一步。
$ sudo /usr/bin/nvidia-uninstall
检查是否成功
$ nvidia-smi
若找不到命令则成功安装
4)重新安装驱动
在run文件目录下
$ sudo ./ NVIDIA-Linux-x86_64-390.138.run --no-opengl-files
5)返回桌面
$ sudo service lightdm start
6)打开终端,检查是否安装成功
$ nvidia-smi
显示390.138版本已安装成功
或
$ cat /proc/driver/nvidia/version
显示:
NVRM version: NVIDIA UNIX x86_64 Kernel Module 390.138 Thu May 14 01:01:53 PDT 2020
GCC version: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)
检查电脑环境能否安装CUDA
1)查看GPU信息。操作如 1准备工作
2)检验Linux版本是否支持
终端输入
$ uname -m && cat /etc/*release
我的电脑参数如下:
x86_64
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
一般x86_64 Ubuntu 16.04的系统是可行的
3)验证gcc是否安装
$ gcc –-version
结果显示
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
若未安装则用一下命令
$ sudo apt-get install build-essential
4)验证系统是否安装了kernel header和 package development
终端输入
$ uname –r
结果显示
4.4.0-173-generic
若未安装,终端输入以下命令安装对应kernel header和 package development。已安装显示未升级的信息。
$ sudo apt-get install linux-headers-$(uname -r)
官方的版本要求说明:
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
我的电脑为例,390.138版本的驱动,对应可以安装的最高版本为CUDA 9.1。
cuda安装可以采用package manager安装和runfile安装的方式。为提高成功概率,我选择复杂一点的run文件的安装方式。
CUDA的toolkit安装 https://developer.nvidia.com/cuda-toolkit-archive
将runfile转移到相应目录
在安装目录下读取权限:
$ sudo chmod 775 cuda_9.1.85_387.26_linux.run
执行
$ ./cuda_9.1.85_387.26_linux.run
安装过程
一开始是NVIDIA的介绍文档,一直ENTER直到需要输入。(非常之长………… ctrl+d 可以快速阅读)
同意条款accept,不同意安装驱动N,首次安装同意安装symbol软链接,非首次则不同意symbol软链接安装,其余Y
简单来说就是
ENTER
accept
n(不要安装driver)
y
ENTER
y
n (首次选y)
y
ENTER
同理,安装一下三个补丁
补丁1:
$ sudo chmod 775 cuda_9.1.85.1_linux.run
$ ./cuda_9.1.85.1_linux.run
ENTER看完介绍文件,accept接受,ENTER同意安装目录
同理:
补丁2:
$ sudo chmod 775 cuda_9.1.85.2_linux.run
$ ./cuda_9.1.85.2_linux.run
补丁3:
$ sudo chmod 775 cuda_9.1.85.3_linux.run
$ ./cuda_9.1.85.3_linux.run
先打开根目录的环境配置文件
$ sudo gedit .bashrc
在文件末端加上以下代码,对应自己的版本安装目录修改
export PATH=/usr/local/cuda-9.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-9.1/lib64$LD_LIBRARY_PATH
使文件生效
$ source ~/.bashrc
以防万一,在/etc/文件的配置文件也添加代码
$ sudo gedit /etc/bash.bashrc
同样在文末添加两行代码
export PATH=/usr/local/cuda-9.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-9.1/lib64$LD_LIBRARY_PATH
使文件生效
$ source /etc/bash.bashrc
检查
$ nvcc -V
显示如下,证明配置成功
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Nov__3_21:07:56_CDT_2017
Cuda compilation tools, release 9.1, V9.1.85
$ cd /usr/local/cuda-9.1/samples/1_Utilities/deviceQuery
$ sudo make
$ ./deviceQuery
同理安装其他版本的cuda。
我自己安装的是另一个版本是9.0版本。
出现报错
***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 384.00 is required for CUDA 9.0 functionality to work.
这样就已经安装好了。不用管报错。
同理安装补丁,如果出现不能写入的报错,则获得权限后root安装。
设置链接库。
环境配置更改,将所有cuda-9.1改为cuda
export PATH="$PATH:/usr/local/cuda/bin"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64/"
export LIBRARY_PATH="$LIBRARY_PATH:/usr/local/cuda/lib64"
export CUDA_HOME=/usr/local/cuda
使配置生效
$ source ~/.bashrc
从cuda9.1 切换到 cuda9.0
删除之前创建的软链接,创建新的软连接。
在root的环境下
$ rm -rf /usr/local/cuda
$ sudo ln -s /usr/local/cuda-9.0 /usr/local/cuda
查看当前 cuda 版本
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Nov__3_21:07:56_CDT_2017
Cuda compilation tools, release 9.1, V9.1.85
nvcc可能默认是你以前deb安装时候其他版本的,nvcc –version结果还是没变。
找到nvcc位置,然后创建usr/local/cuda/nvcc软链接到原先nvcc位置,为usr/bin/nvcc
$ which nvcc # 找到nvcc位置,假定在/usr/bin/nvcc且是以前版本
/usr/local/cuda-9.1/bin/nvcc
$ sudo ln -s /usr/local/cuda-9.1/bin/nvcc /usr/bin/nvcc # 创建软链接到当前cuda的nvcc
$ nvcc --version # 显示当前cuda版本
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176
#cuda9.0 切换到 cuda9.1
$ rm -rf /usr/local/cuda
$ sudo ln -s /usr/local/cuda-9.1 /usr/local/cuda
$ nvcc --version
对于~/.bashrc文件的修改方法和上面一致。
cuDNN是基于cuda的一个数据库,实际上不需要安装,将压缩包解压头文件/库文件等即可。
下载对应版本的cuDNN
https://developer.nvidia.com/cudnn
需要注册或登录NVIDIA账号
我这里是cuda9.1没有找到相应的版本,展开列表可见。
找了半天才找到9.1相应的cuDNN版本,下载对应系统的压缩包。
(为了CUDA版本新一点,委屈一下用旧版本的cuDNN数据库吧)
(结果学习用的飞桨需要7.6以上的cuDNN,只好又装了cuda9.0,对应可选择7.6.5的cuDNN版本)
Runtime 和 Developer 版本的区别是:
developer library 包含了在Ubuntu系统上开发深度学习时所需的cuDNN头文件。如果不需要开发编译任何深度学习程序,只是用于运行某些深度学习应用,那么只下载“runtime library”。
我自己下载的是cuDNN v7.1.3 Library for Linux
cuDNN v7.1.3 Runtime Library for Ubuntu16.04 (Deb)
cuDNN v7.1.3 Developer Library for Ubuntu16.04 (Deb)
cuDNN v7.1.3 Code Samples and User Guide for Ubuntu16.04 (Deb)
打开终端到下载文件目录
$ tar -xzvf cudnn-9.1-linux-x64-v7.1.tgz
$ sudo dpkg -i libcudnn7_7.1.3.16-1+cuda9.1_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.1.3.16-1+cuda9.1_amd64.deb
$ sudo dpkg -i libcudnn7-doc_7.1.3.16-1+cuda9.1_amd64.deb
在安装目录下cuda
cd cuda/
sudo cp include/cudnn.h /usr/local/cuda/include/
sudo cp lib64/* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/include/cudnn.h
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
cd /usr/local/cuda/lib64/
sudo rm -rf libcudnn.so libcudnn.so.7
sudo ln -s libcudnn.so.7.0.5 libcudnn.so.7
sudo ln -s libcudnn.so.7 libcudnn.so
sudo ldconfig
5)报错解决
我的电脑解压不了deb后缀文件,报错如下:
dpkg-deb: error: 'libcudnn7-dev_7.1.3.16-1+cuda9.1_amd64.deb' is not a debian format archive
dpkg: error processing archive libcudnn7-dev_7.1.3.16-1+cuda9.1_amd64.deb (--install):
subprocess dpkg-deb --control returned error exit status 2
Errors were encountered while processing:
libcudnn7-dev_7.1.3.16-1+cuda9.1_amd64.deb
原因是md5不对。
官方解答 https://forums.developer.nvidia.com/t/bad-checksum-for-cuda-8-0-for-ubuntu-14-04/47813
ubuntn论坛https://askubuntu.com/questions/896856/dpkg-deb-file-not-a-debian-format
解决办法就是重装一遍。
再运行解压
dpkg: error processing package libcudnn7-dev (--install):
dependency problems - leaving unconfigured
Errors were encountered while processing:
libcudnn7-dev
报错原因是缺少依赖。
更新apt库后,安装依赖。
$ sudo apt update
$ sudo apt upgrade -f
$ sudo apt install libcudnn7 -f
$ sudo apt install libcudnn7-dev -f
若报错 依赖关系问题未被配置,则修复安装
$ sudo apt-get install -f
仍出现报错Errors were encountered while processing: libcudnn7-dev
$ cd /var/lib/dpkg
$ sudo mv info info.bak
$ sudo mkdir info
$ sudo apt-get install -f
$ sudo apt-get upgrade
还是报错的话。可能是 initramfs-tools包有问题,导致apt配置不成功。
用grep找到对应内容的位置
$ cd /var/lib/dpkg/
$ grep -n "initramfs-tools" status
编辑dpkg status 文件
找到包 initramfs-tools 那一段,删掉
$ sudo gedit /var/lib/dpkg/status
Package: initramfs-tools
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 125
Maintainer: Ubuntu Developers
Architecture: all
Multi-Arch: foreign
Version: 0.122ubuntu8.16
Provides: linux-initramfs-tool
Depends: initramfs-tools-core (= 0.122ubuntu8.16), linux-base
Suggests: bash-completion
Breaks: console-setup (<< 1.72), cryptsetup (<< 2:1.6.6-4~), elilo (<< 3.12-3.1~), initscripts (<< 2.88dsf-59.3~), isc-dhcp-client (= 4.3.3-5ubuntu13), lilo (<< 22.8-8.2~), lvm2 (<< 2.02.111-2.1~), mountall (<< 2.0~), nplan (<< 0.32~16.04.5), s390-tools (<< 1.8.3-2~), systemd-sysv (<< 186)
Conflicts: linux-initramfs-tool, usplash (<< 0.5.50)
Conffiles:
/etc/initramfs-tools/update-initramfs.conf e2026d4603e7161efaccca519aeb1297
/etc/kernel/postinst.d/initramfs-tools 1d77d3e4b57c3da299aacd44b1dc207c
/etc/kernel/postrm.d/initramfs-tools f57d0b03f79fd46dd1a1fa3b00206070
Description: generic modular initramfs generator (automation)
This package builds a bootable initramfs for Linux kernel packages. The
initramfs is loaded along with the kernel and is responsible for
mounting the root filesystem and starting the main init system.
Original-Maintainer: Debian kernel team
修改安装
$ sudo apt-get install -f
(最后发现是我忘记安装Runtime文件了,泪目)
$ cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
显示
#define CUDNN_MAJOR 7
#define CUDNN_MINOR 6
#define CUDNN_PATCHLEVEL 5
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)
#include "driver_types.h"
说明cuDNN已正确识别
$ cp -r /usr/src/cudnn_samples_v7/ /home/chan #用户名根目录
$ cd /home/chan/cudnn_samples_v7/mnistCUDNN
$ make clean && make
$ ./mnistCUDNN
成功显示 Test passed
实际上又报错了。。
Error: CUDNN_STATUS_ARCH_MISMATCH
官方解释:
https://docs.nvidia.com/deeplearning/cudnn/api/index.html
The function requires a feature absent from the current GPU device. Note that cuDNN only supports devices with compute capabilities greater than or equal to 3.0.
To correct, compile and run the application on a device with appropriate compute capability.
CUDNN要求GPU CUDA Capability 不小于3.0。我的电脑的计算能力只有2.1。
===================================
参考:
Ubuntu16.04安装Nvidia显卡驱动(cuda)
ubuntu 下安装NVIDIA显卡驱动出现X service error问题解决方法
安装显卡驱动时遇到The CC version check failed问题解决方法
NVIDIA驱动gcc不匹配 - 安装指定gcc版本(Linux/Ubuntu)
Ubuntu安装NVIDIA驱动后,无法登录,循环登录,登录界面进不去,回到登录界面
NVIDIA显卡驱动版本,CUDA版本,cudnn版本之间关系及如何选择
手把手教你在Linux上安装CUDA9.0
ubuntu安装多个版本的CUDA并随时切换
NVIDIA cuDNN deb安装失败经验及成功tar方法