ubuntu16.04深度学习环境配置

Ubuntu16.04配置

更改Ubuntu源

所谓源,可以理解为Ubuntu从何处下载软件。默认的源是server for china,个人测试这是从美国的服务器下载软件进行安装的,为了加快下载安装软件的速度,我们通常把软件源更改为国内的服务器。

打开软件中心,找到Software&Updates:

选择updates那个选项,出现

Download from那个选项里面选择就行,比如我是用的阿里云的。然后关闭,reload即可。

安装一些依赖项目,这里安装的依赖项是为后面的安装做准备的,反正是要安装的(当然后面还有一些要安装),这里一行一行复制到你的命令行执行就行。

1
2
3
4
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler 
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

要是上面的安装出现了一些问题,随时执行下面指令:

1
sudo apt-get update

Pip换源

先安装pip管理工具

1
2
sudo apt install python3-pip
sudo apt install python-pip

修改 ~/.pip/pip.conf (没有就创建一个), 内容如下:

1
2
3
[global]
timeout = 60000
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

conda换源

使用命令gedit ~/.condarc,然后写入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
channels:
- defaults
show_channel_urls: true
channel_alias: https://mirrors.tuna.tsinghua.edu.cn/anaconda
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

运行 conda clean -i 清除索引缓存,保证用的是镜像站提供的索引。

另外,需要更改miniconda文件夹的权限,否则写不进去。我这里的安装路径为/home/zdaiot/miniconda3/,用户名为zdaiot

1
sudo chown -R zdaiot /home/zdaiot/miniconda3/

the system is running in low-graphics mode

比较高级的显卡,例如泰坦V,在安装完毕系统后提示重启。但是重启后出现了下图

解决方法:在Ubuntu grub的启动选项中选择ubuntu高级选项->recovery mode->resume,即可正常进入界面,接着按照下面的方式安装NVIDIA驱动,重启即可。

在只有Ubuntu系统的时候,开机是无法找到grub引导界面的。这时进入Ubuntu系统的tty界面,备份/etc/default/grub文件 打开/etc/default/grub文件,找到 GRUB_HIDDEN_TIMEOUT=0 这行,使用#注释掉,变成#GRUB_HIDDEN_TIMEOUT=0,然后执行下面命令

1
sudo update-grub

更新内核后显卡驱动异常

如果在Ubuntu内核更新后,显卡驱动异常,具体体现为屏幕分辨率异常。重装NVIDIA驱动也无法正常安装。

解决方法为:在Ubuntu grub的启动选项中选择ubuntu高级选项-旧内核启动系统。

安装NVIDIA显卡驱动

下面方法一与方法二,若不适用NVIDIA作为显示,则可以不干掉nouveau nvidia驱动(即下面的第2步),但是还是推荐干掉它,防止意外。

安装之前要先关闭secret boot,对于华硕主板bios,进入cms打开只有uefi启动,然后进入secret boot,改windows uefi为other uefi

若把显示器接到显卡上,发现没有亮屏。则进入Bios->高级->高级\北桥\显示设置,将首选显卡改为Auto,初始化iGPU改为关闭(这里以华硕主板为例)。

若本来驱动正常,忽然挂了,考虑是因为Ubuntu内核更新导致的,启动Ubuntu的时候,选择高级启动选项,进入旧的内核方式启动即可。

CUDA版本和英伟达驱动版本对应可以在这里找到。驱动和cudnn的版本要对应上。

安装

这里提供了三种安装驱动的方法,保险起见,因选择方法一或者方法三;而为了方便的话,建议选择方法二。

方法一:在线安装驱动

1.卸载你电脑中此刻有的nvidia的驱动。(复制命令就行,方便,后面也一样)

1
sudo apt-get remove --purge nvidia*

运行了这个命令之后,你系统中的NVIDIA、的一些驱动就应该被卸载了。

如果在之前安装过驱动,此时可能用上面指令卸载不完全,可以使用如下指令

1
sudo /usr/bin/nvidia-uninstall

2.然后干掉Ubuntu自带的nouveau nvidia驱动,刚装的系统木有vim ,gedit这个图形的还不错嘛

1
sudo gedit /etc/modprobe.d/blacklist-nouveau.conf

打开后把这些复制进去

1
2
blacklist nouveau
options nouveau modeset=0

保存 ,更新一个

1
sudo update-initramfs -u

接着重启,使用下这个命令看看nouveau有没有被干掉,若什么也没有输出,则已经被干掉了

1
lsmod | grep nouveau

3.添加一个PPA到系统,等一下安装驱动要用的。复制下面的话命令就行(放在这里是因为你现在还在图形界面,复制方便)

1
sudo add-apt-repository ppa:graphics-drivers/ppa

复制完上面那个命令执行之后,千万记得

1
sudo apt-get update

4.上面的准备工作做完,按CTRL+ATL+F1进入终端1(很基础的东西不用我解释啦),这个时候你应该就_脱离图形界面_进入字符界面了(需要重新登录一次就登陆一次。),要是这个时候你看不到教程,还是推荐用手机或者平板或者其他的边看教程边操作。

在终端下面运行:

1
2
3
4
sudo service lightdm stop

# 对于18.04先要执行如下操作:
sudo apt install lightdm

打开右上角的设置,找到Software&Updates,接着找到Additional Drivers,即可查看适用于你电脑的显卡驱动。这里我的显示的是NVIDIA 384版本,然后运行:

1
2
3
4
sudo apt-get install nvidia-384

# 若找不到安装包,使用如下指令
sudo apt-get install nvidia-driver-384

5.重新进入图像化界面:

1
sudo service lightdm start

如果,你见到了久违的图像化熟悉界面,且没有卡在循环登陆界面,那么恭喜你,你已经通过了最难的一步。

方法二:离线安装驱动

英伟达显卡驱动Linux 64位(包括历史版本):下载地址

1.卸载你电脑中此刻有的nvidia的驱动。(复制命令就行,方便,后面也一样)

1
sudo apt-get remove --purge nvidia*

2.然后干掉Ubuntu自带的nouveau nvidia驱动,刚装的系统木有vim ,gedit这个图形的还不错嘛

1
sudo gedit /etc/modprobe.d/blacklist-nouveau.conf

打开后把这些复制进去

1
2
blacklist nouveau
options nouveau modeset=0

保存 ,更新一个

1
sudo update-initramfs -u

接着重启,使用下这个命令看看nouveau有没有被干掉,若什么也没有输出,则已经被干掉了

1
lsmod | grep nouveau

3.按CTRL+ATL+F1进入终端1,登陆后在终端下面运行:

1
sudo service lightdm stop

找到自己从官网下载的run文件,然后cd到下载好的NVIDIA384.130驱动目录

先给个权限吧

1
chmod 777 NVIDIA-Linux-x86_64-384.130.run

执行下面指令安装!

1
sudo ./NVIDIA-Linux-x86_64-384.130.run

一路保持默认回车就行了。

之前我安装驱动的时候,会在后面加上--no-opengl-files参数,加上这个参数会导致训练过程中其他界面渲染特别卡。所以对于台式机,不要加上这句话了(笔记本有待验证)。加上这句话在系统设置中可以看到图形那一栏是llvmpipe (LLVM 6.0, 256 bits),这其实没有装好。

4.重新进入图像化界面:

1
sudo service lightdm start

如果,你见到了久违的图像化熟悉界面,且没有卡在循环登陆界面,那么恭喜你,你已经通过了最难的一步。

方法三:setting中的驱动

有的时候,利用离线安装驱动的方法会遇到莫名其妙的问题,可以试试System Setting中的驱动,如下图选择using NVIDIA binary driver选项(因为我这里已经手动安装过了,所以是灰色),然后点击Apply Changes

测试

无论通过2.1中的方法一还是2.2中的方法二,没有卡在登陆界面,可以通过运行:

1
nvidia-smi

来看是不是能够输出你的GPU的一些信息。要是不能够输出的话,重启。能够输出的话,也建议重启一次。

Bug

Bug1

若出现sudo service lightdm stop无法关闭图像化界面,出现运行上述语句直接跳转到登陆界面,上述语句改为:

1
`systemctl disable lightdm.service`

则对应的方法一与方法二的第4步改为:

1
2
3
# 开启图形界面命令
ln -s /lib/systemd/system/lightdm.service /etc/systemd/system/display-manager.service
reboot

Bug2

如果是服务器的u,麻烦了不带核显。。遇到开机黑的情况

进入grub界面后,第三行有一个“高级选项”,选择后,按下“e”键进入编辑模式,找到“linux”那一行,将光标移动到这一行最后,先按下空格键加一个空白,然后输入

1
acpi_osi=linux nomodeset

应该可以,待测试

如果你有便宜的亮机卡,先插上去开机也行呀

CUDA10.0+CUDNN

注意,不同于CUDA9版本对应的英伟达驱动为384版本,这里CUDA10对应的英伟达驱动为410版本。实测在384版本下,CUDA10无法使用。

点击此处下载CUDA

找到CUDA10,平台选择如下所示,然后点击下载。

安装CUDA10.0

cd到你下载CUDA9.0的位置,运行

1
sudo ./cuda_10.0.130_410.48_linux.run

接着会出现很长很长的license让你看。之前都是老老实实的按键盘的下键,翻到最后,累到吐。后来查了查怎么调到最后,下面放大招,同时按住键盘的ctrl+C即可跳转到最后的一行。

注意:执行后会有一些提示让你确认,在第二个提示的地方,有个让你选择是否安装驱动时(Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48?),一定要选择否:因为前面我们已经安装了更加新的nvidia384,所以这里不要选择安装。总结安装过程如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Do you accept the previously read EULA?
accept/decline/quit: accept

Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48?
(y)es/(n)o/(q)uit: n

Install the CUDA 10.0 Toolkit?
(y)es/(n)o/(q)uit: y

Enter Toolkit Location
[ default is /usr/local/cuda-10.0 ]:

Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: y

Install the CUDA 10.0 Samples?
(y)es/(n)o/(q)uit: y

Enter CUDA Samples Location
[ default is /home/zdaiot ]:

安装成功后,会出现类似于下面的语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
===========
= Summary =
===========

Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-10.0
Samples: Installed in /home/zdaiot, but missing recommended libraries

Please make sure that
- PATH includes /usr/local/cuda-10.0/bin
- LD_LIBRARY_PATH includes /usr/local/cuda-10.0/lib64, or, add /usr/local/cuda-10.0/lib64 to /etc/ld.so.conf and run ldconfig as root

To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-10.0/bin

Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-10.0/doc/pdf for detailed information on setting up CUDA.

***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 384.00 is required for CUDA 10.0 functionality to work.
To install the driver using this installer, run the following command, replacing <CudaInstaller> with the name of this run file:
sudo <CudaInstaller>.run -silent -driver

Logfile is /tmp/cuda_install_23476.log
Signal caught, cleaning up

接下来到了很关键的一步了,配置环境变量

运行下面语句来编辑.bashrc配置文件

1
gedit ~/.bashrc

在该文件的最后加上下面几句即可

1
2
3
export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda

安装完毕后,来个自带的例子测一下。

1
2
3
cd /usr/local/cuda-10.0/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery

出现了下面的你的GPU的一些信息的话,就是真的安装成功了。

这里写图片描述

到这里,CUDA就安装成功了,其实不算是很难,注意一些情况就行了。

安装CUDNN7

这里需要一个NVIDIA的开发者账号,注册一个就OK,需要登陆后到cuDNN选择安装包,这里选择的版本对应cuda10版本的V7

cd到你下载CUDNN7的位置,运行下面语句即可,从下面语句可以看出来,CUDNN7不用安装,直接复制到对应路径即可

1
2
3
4
5
6
7
// 如果下载的安装包是以.solitairetheme8结尾,则将文件名中.solitairetheme8替换为tgz即可

tar -zxvf cudnn-10.0-linux-x64-v7.4.1.5.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/ -d
sudo chmod a+r /usr/local/cuda/include/cudnn.h
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

安装CUDNN8的时候,需要注意cuda/include不只有cudnn.h这一个文件,因此需要执行如下命令:

1
2
3
4
sudo cp cuda/include/* /usr/local/cuda/include/
sudo cp cuda/lib64/* /usr/local/cuda/lib64/ -d
sudo chmod a+r /usr/local/cuda/include/cudnn*
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

CUDA9.0+CUDNN

点击此处下载CUDA

找到CUDA9,平台选择如下所示,然后点击下载。

安装CUDA9.0

cd到你下载CUDA9.0的位置,运行

1
sudo sh cuda_9.0.176_384.81_linux.run

接着会出现很长很长的license让你看。之前都是老老实实的按键盘的下键,翻到最后,累到吐。后来查了查怎么调到最后,下面放大招,同时按住键盘的ctrl+C即可跳转到最后的一行。

注意:执行后会有一些提示让你确认,在第二个提示的地方,有个让你选择是否安装驱动时(Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 384.81?),一定要选择否:因为前面我们已经安装了更加新的nvidia384,所以这里不要选择安装。然后其余的让你萱蕚选择yes/no/quit的时候均选择yes,没有选择项的直接回车保持默认即可

安装成功后,会出现类似于下面的语句:

1
2
3
4
5
6
7
8
9
10
11
12
===========
= Summary =
===========
Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-9.0Samples: Installed in /home/textminer
Please make sure that
– PATH includes /usr/local/cuda-9.0/bin
– LD_LIBRARY_PATH includes /usr/local/cuda-9.0/lib64, or, add /usr/local/cuda-9.0/lib64 to /etc/ld.so.conf and run ldconfig as rootTo uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-9.0/bin
Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-9.0/doc/pdf for detailed information on setting up CUDA.
***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 361.00 is required for CUDA 9.0 functionality to work.To install the driver using this installer, run the following command, replacing with the name of this run file:
sudo .run -silent -driver
Logfile is /opt/temp//cuda_install_6583.log

接下来到了很关键的一步了,配置环境变量

运行下面语句来编辑.bashrc配置文件

1
gedit ~/.bashrc

在该文件的最后加上下面几句即可

1
2
3
export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda

安装完毕后,来个自带的例子测一下。

1
2
3
cd /usr/local/cuda-9.0/samples/1_Utilities/deviceQuery 
sudo make
./deviceQuery

出现了下面的你的GPU的一些信息的话,就是真的安装成功了。

这里写图片描述

到这里,CUDA就安装成功了,其实不算是很难,注意一些情况就行了。

安装CUDNN7

这里需要一个NVIDIA的开发者账号,注册一个就OK,需要登陆后到cuDNN选择安装包,这里选择的版本是对应cuda9的V7

cd到你下载CUDNN7的位置,运行下面语句即可,从下面语句可以看出来,CUDNN7不用安装,直接复制到对应路径即可

1
2
3
4
5
6
7
// 如果下载的安装包是以.solitairetheme8结尾,则将文件名中.solitairetheme8替换为tgz即可

tar -zxvf cudnn-9.0-linux-x64-v7.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/ -d
sudo chmod a+r /usr/local/cuda/include/cudnn.h
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

卸载CUDA

在登陆界面状态下,按Ctrl + Alt + f1,进入TUI

执行

1
2
sudo /usr/local/cuda-9.0/bin/uninstall_cuda_9.0.pl
sudo /usr/bin/nvidia-uninstall

然后重启

1
sudo reboot

CUDA8.0+CUDNN

安装CUDA8.0

cd到你下载CUDA8.0的位置,运行

1
sudo sh cuda_8.0.61_375.26_linux.run

接着会出现很长很长的license让你看。之前都是老老实实的按键盘的下键,翻到最后,累到吐。后来查了查怎么调到最后,下面放大招,同时按住键盘的ctrl+C即可跳转到最后的一行。

注意:执行后会有一些提示让你确认,在第二个提示的地方,有个让你选择是否安装驱动时(Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 375.26?),一定要选择否:因为前面我们已经安装了更加新的nvidia367,所以这里不要选择安装。然后其余的让你萱蕚选择yes/no/quit的时候均选择yes,没有选择项的直接回车保持默认即可

安装成功后,会出现类似于下面的语句:

1
2
3
4
5
6
7
8
9
10
11
12
===========
= Summary =
===========
Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-8.0Samples: Installed in /home/textminer
Please make sure that
– PATH includes /usr/local/cuda-8.0/bin
– LD_LIBRARY_PATH includes /usr/local/cuda-8.0/lib64, or, add /usr/local/cuda-8.0/lib64 to /etc/ld.so.conf and run ldconfig as rootTo uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-8.0/bin
Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-8.0/doc/pdf for detailed information on setting up CUDA.
***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 361.00 is required for CUDA 8.0 functionality to work.To install the driver using this installer, run the following command, replacing with the name of this run file:
sudo .run -silent -driver
Logfile is /opt/temp//cuda_install_6583.log

接下来到了很关键的一步了,配置环境变量

运行下面语句来编辑.bashrc配置文件

1
gedit ~/.bashrc

在该文件的最后加上下面几句即可

1
2
3
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}} 
export LD_LIBRARY_PATH=/usr/local/cuda8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda

安装完毕后,来个自带的例子测一下。

1
2
3
cd /usr/local/cuda-8.0/samples/1_Utilities/deviceQuery 
sudo make
./deviceQuery

出现了下面的你的GPU的一些信息的话,就是真的安装成功了。

这里写图片描述

到这里,CUDA就安装成功了,其实不算是很难,注意一些情况就行了。

CUDNN安装

CUDA8.0对应的CUDNN版本有5.1和6两个版本,这两个版本使用与不同的深度学习框架,具体安装哪个根据自己的需求而定。这里需要一个NVIDIA的开发者账号,注册一个就OK,需要登陆后到cuDNN选择安装包

版本一:安装CUDNN5.1

下载完cudnn5.1之后进行解压

cd进入cudnn5.1解压之后的include目录,在命令行进行如下操作:

1
sudo cp cudnn.h /usr/local/cuda/include/ #复制头文件

再将cd进入lib64目录下的动态文件进行复制和链接:

1
2
3
4
5
6
sudo cp lib* /usr/local/cuda/lib64/ #复制动态链接库 
cd /usr/local/cuda/lib64/
sudo rm -rf libcudnn.so libcudnn.so.5 #删除原有动态文件
sudo ln -s libcudnn.so.5.1.5 libcudnn.so.5 #生成软衔接
sudo ln -s libcudnn.so.5 libcudnn.so #生成软链接
sudo ldconfig -v

执行完之后,cuDNN5.1算是安装完成了。

版本二:安装CUDNN6

下载完cudnn6之后进行解压,cd进入cudnn5.1解压之后的include目录,在命令行进行如下操作:

1
sudo cp *.h /usr/local/cuda/include/

再将cd进入lib64目录下的动态文件进行复制和链接:

1
2
3
4
sudo cp libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
sudo ln -s libcudnn.so.6.0.21 libcudnn.so.6
sudo ln -s libcudnn.so.6 libcudnn.so

执行完之后,cuDNN6算是安装完成了。

卸载CUDA

在登陆界面状态下,按Ctrl + Alt + f1,进入TUI

执行

1
2
sudo /usr/local/cuda-8.0/bin/uninstall_cuda_8.0.pl
sudo /usr/bin/nvidia-uninstall

然后重启

1
sudo reboot

Bug

若出现CUDA未安装成功的情况,尝试降级GCC,可能你下载的CUDA8.0最高支持的版本只到GCC5.3。

下载GCC源码并且解压

1
2
3
wget ftp://mirrors.kernel.org/gnu/gcc/gcc-5.3.0/gcc-5.3.0.tar.gz 
或者到 http://www.netgull.com/gcc/releases/gcc-5.3.0/ 下载
tar -zxvf gcc-5.3.0.tar.gz

下载编译所需依赖项:

1
2
3
cd gcc-5.3.0 //进入解包后的gcc文件夹 
./contrib/download_prerequisites //下载依赖项
cd .. //返回上层目录

建立编译输出目录:

1
mkdir gcc-build-5.3.0

进入输出目录,执行以下命令,并生成makefile文件:

1
2
cd gcc-build-5.3.0 
../gcc-5.3.0/configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

编译(这里会花一点时间):

1
make -j4

安装

1
sudo make install

弄好了,然后你可以看一下自己的gcc版本

多个版本的CUDA并存

推荐下面第一种安装方法。

方法一

在我们安装CUDA的时候,发现默认建立了一个软连接。

1
2
cd /usr/local
ls -al

可以看到cuda指向真正的地址。例如:cuda -> /usr/local/cuda-10.0。而我们在bashrc的时候,使用的是软连接地址,而非真实地址。因此,我们可以按照上述安装CUDA10.0与CUDA9.0的方法分别安装CUDA、CUDNN和设置环境变量。

然后,需要使用CUDA9.0的时候,使用下面命令,让cuda指向cuda9即可。

1
sudo ln -s /usr/local/cuda-9.0 cuda

若需要使用CUDA10.0,使用下面命令,让cuda指向cuda10即可。

1
sudo ln -s /usr/local/cuda-10.0 cuda

方法二

可以将两个版本的cuda安装到不同的地址,在bashrc文件中根据不同的安装位置设置不同版本cuda的环境,下面以CUDA9.0与CUDA8.0并存为例。

首先,按照步骤3中的安装cuda9.0的方法,装上cuda9.0。

然后,安装cuda8.0的时候,注意下面几个步骤的选择,其余的选择与上文中的步骤4一样。

1
2
3
4
5
Enter Toolkit location
[ default is /usr/local/cuda-8.0]: /home/ubuntu/cuda8

Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: n

安装cudnn的时候,注意复制的路径:

1
2
sudo cp -a cuda/include/cudnn.h /home/ubuntu/cuda8/include/
sudo cp -a cuda/lib64/libcudnn* /home/ubuntu/cuda8/lib64/

运行下面语句来编辑.bashrc配置文件

1
gedit ~/.bashrc

在该文件的最后加上下面几句即可

1
2
3
export PATH=/home/ubuntu/cuda8/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/home/ubuntu/cuda8/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/home/ubuntu/cuda8

经过上述步骤,就完成了CUDA8.0和CUDA9.0的并存。想适应那个CUDA,只需要更改 .bashrc 文件中的环境变量即可。

值得注意的是,深度学习框架通常不同时支持cuda9.0与cuda8.0,所以当你切换CUDA版本的时候,需要重新安装适合对应CUDA版本的深度学习框架版本,这个比较无语

软件配置

Pycharm配置

Pycharm下会出现ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory的bug,更改为bin/pycharm.sh为如下的形式,对于pycharm2017.3.4以及以后版本,则要改第5行和第6行:

若改完之后启动Pycharm报错了,说找不到java类似的错误,将LD_LIBRARY_PATH="$IDE_BIN_HOME:$LD_LIBRARY_PATH" "$JAVA_BIN" \这句话去掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 
IFS="$(printf '\n\t')"
LD_LIBRARY_PATH='/usr/local/cuda/lib64'
LD_LIBRARY_PATH="$IDE_BIN_HOME:$LD_LIBRARY_PATH" "$JAVA_BIN" \
${AGENT} \
"-Xbootclasspath/a:$IDE_HOME/lib/boot.jar" \
-classpath "$CLASSPATH" \
${VM_OPTIONS} \
"-XX:ErrorFile=$HOME/java_error_in_PYCHARM_%p.log" \
"-XX:HeapDumpPath=$HOME/java_error_in_PYCHARM.hprof" \
-Didea.paths.selector=PyCharmCE2017.3 \
"-Djb.vmOptionsFile=$VM_OPTIONS_FILE" \
${IDE_PROPERTIES_PROPERTY} \
-Didea.platform.prefix=PyCharmCore \
com.intellij.idea.Main \
"$@"

或者可以采取下面方式修复该bug:
设置环境变量和动态链接库,在命令行输入:

1
sudo gedit /etc/profile

在打开的文件末尾加入:

1
export PATH=/usr/local/cuda/bin:$PATH

保存之后,创建链接文件:

1
sudo gedit /etc/ld.so.conf.d/cuda.conf

在打开的文件中添加如下语句:

1
/usr/local/cuda/lib64

然后执行

1
sudo ldconfig

使链接立即生效。此时有可能会报什么 is not a symbol 之类的错了,忽略不计。

spyder

在启动器中直接点击spyder的图标,使用tensorflow的过程中,出现了ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory错误,若~/.bashrc已经有CUDA的环境配置,检查/usr/local/cuda-9.0/lib64下是否有 libcublas.so.9.0。如果有,终端输入:在终端执行sudo ldconfig /usr/local/cuda-9.0/lib64即可。

ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib.so),进而创建出动态装入程序(ld.so)所需的连接和缓存文件,缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。

安装Opencv

方法一:非编译式

Opencv经常使用,以前经常采用编译的方法去安装Opencv,比较郁闷的是为啥Opencv只有Windows下的非编译安装方法。最近终于在论坛上找到了在Ubuntu下非编译安装方法,吓得我赶紧记录下来

for Python2:

1
2
sudo apt-get install libopencv-dev
sudo apt-get install python-opencv

for Python3:

1
sudo pip3 install opencv-python

方法二:编译式

编译的方法好处是,C++也能调用,以安装Opencv3.1为例

首先肯定是先安装依赖了,官方列出了一些:

1
2
3
4
5
sudo apt-get install build-essential
sudo apt-get install cmake Git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo apt-get install --assume-yes libopencv-dev libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip
sudo apt-get install ffmpeg libopencv-dev libgtk-3-dev python-numpy python3-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libv4l-dev libtbb-dev qtbase5-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev

反正不管了,全部都装上去。
在你喜欢的地方建立一个工作目录,随便什么名字,就在home目录下面建立了一个OpenCV的目录

1
mkdir OpenCV

进入这个工作目录(OpenCV)然后用git克隆官方的项目(下载接受会需要一点时间,等待)

1
2
3
cd Opencv 
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git

克隆好了之后,你就会看见你的工作目录(OpenCV)下面有了两个项目的文件夹opencv了。
进入到你下载的那个opencv文件夹,这时候建立一个build的文件夹,用来接收cmake之后的文件。
cd build进入到build里面,运行这句命令(直接复制就行):

1
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

这里要解释一下,后面是一个空格加上两个点,不要搞错了。
运行之后,下图表示cmake完成了。
这里写图片描述
这个时候的build下面也有了一些文件。你当然不用管这些是什么。
直接运行sudo make -j4,编译等待
这里写图片描述
make完成之后,再sudo make install就安装好了。
你能够在/usr/local中找到你新安装的opencv的一些头文件和库了。
这里要说明一下,要是中途出现了一些问题是与cuda有关的,打开opencv下面那个cmakelist文件把with_cuda设置为OFF,如下图,之后再cmake,再编译。
这里写图片描述
OK,OpenCV也到这里了。

TensorFlow

GPU版本whl下载地址

此处可以看到tensorflow与cuda、cudnn的对应关系。如下图所示:

若你安装的是CUDA8.0,则需要指定TensorFLow版本,因为最新的版本是根据CUDA9.0编译的

1
2
sudo pip install tensorflow-gpu==1.4.0
sudo pip3 install tensorflow-gpu==1.4.0

若安装的是CUDA9.0,也需要指令Tensorflow版本,因为CUDA9只支持到tensorflow1.12

1
2
sudo pip install tensorflow-gpu==1.12.2
sudo pip3 install tensorflow-gpu==1.12.2

若安装的是CUDA10.0

1
2
sudo pip install tensorflow-gpu
sudo pip3 install tensorflow-gpu

然后就安装好啦,运行下面的代码检验一下

1
2
3
4
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))

正确输出Hello, TensorFlow!的话,就表示安装成功啦。

Pytorch

点击这里,os选择Linux,Package Manager选择pip方式。接着根据Python和自己安装CUDA版本,按照下方提示安装即可。这里以CUDA9.0和Python3.5为例:

1
2
sudo pip3 install http://download.pytorch.org/whl/cu90/torch-0.3.1-cp35-cp35m-linux_x86_64.whl 
sudo pip3 install torchvision

注意对于cuda10环境下,若直接使用pip3 install torchvision,会导致出现from torchvision import _C ImportError: libcudart.so.9.0: cannot open shared object file:错误,我们需要官网查看torchvision的安装方法。例如对于Python3.7安装方式为

1
pip3 install https://download.pytorch.org/whl/cu100/torchvision-0.3.0-cp37-cp37m-linux_x86_64.whl

最简单的方式是可以使用anaconda的安装方式,同时还可以指定cuda版本:

1
conda install pytorch torchvision cudatoolkit=9.0

当然也可以从这里找到所有的发行版本,然后下载相应版本。

PyTorch选择cuda的顺序

各个版本的CUDA:

  • cuda:完整版的cuda
  • cuda动态链接库:阉割版的cuda,只有cuda运行时需要的动态链接库。
  • cudatoolkit:是conda提供的阉割版的cuda,只有cuda运行时需要的动态链接库。

pytorch选择cuda的顺序:

  • 分为编译时的查找顺序和执行时的查找顺序
  • 编译时的查找顺序由 torch/utils/cpp_extension.py的_find_cuda_home()决定。
  • 执行的查找顺序由动态库的搜索路径决定

编译时的查找顺序

1、顺序总览

(1)环境变量CUDA_HOME 或 CUDA_PATH

(2)/usr/local/cuda

(3)which nvcc的上级上级目录(which nvcc 会在环境变量PATH中找)

(4)如果上述都不存在,则torch.utils.cpp_extension.CUDA_HOME为None,会使用conda安装的cudatoolkit,其路径为cudart 库文件目录的上级目录(此时可能是通过 conda 安装的 cudatoolkit,一般直接用 conda install cudatoolkit,就是在这里搜索到 cuda 库的)。

2、编译pytorch时的使用过cuda版本

1
python -c "import torch;print(torch.version.cuda )"

pytorch可能不是在你的电脑上编译的,这个版本代表pytorch在编译时,使用过的cuda版本。

这时候,我们只在本地有相应版本的cuda动态链接库,就可以使用别人已经编译好的pytorch,非常方便。

3、当编译一个新程序,会使用的cuda版本

1
python -c "import torch.utils.cpp_extension; print(torch.utils.cpp_extension.CUDA_HOME)"

在很多时候,(比如安装apex,precious roipooling),我们需要使用cuda重新编译,这时候,我们需要的不仅仅是一个阉割版的cuda动态链接库,我们需要一个完整的cuda,以上的CUDA_HOME就是完整cuda的路径。

执行时的查找顺序

1、执行的查找顺序由动态库的搜索路径决定,搜索so文件的顺序如下

(1)gcc编译时指定的运行时库路径,如-rpath

(2)LD_LIBRARY_PATH

(3)/etc/ld.so.cache

(4)/lib,/usr/lib等

2、conda的查找顺序

1
2
3
4
envname=my_env_pytorch17
objdump -x ~/miniconda3/envs/$envname/bin/python | grep RPATH
# out:
# RPATH $ORIGIN/../lib

可以看到,conda是通过rpath的方式实现的,先去查找lib。

1
2
3
ls ~/miniconda3/envs/$envname/lib/ | grep libcudart.so
# out:
# libcudart.so.10.2.89

可以看到,lib中包含一个libcudart.so.10.2.89,这就是安装的cudatoolkit,是10.2版本的。

Mxnet

MxNet-cu100 whl下载地址

按照这里的教程安装即可

这里以安装的CUDA9.0,Python3.5为例

1
2
3
sudo pip3 install mxnet-cu90
sudo apt-get install graphviz
sudo pip3 install graphviz

查看Pytorch是否支持CUDA,并查看支持的CUDA版本。

1
2
3
4
5
6
7
8
python -c "import torch; print(torch.cuda.is_available())"
>>> True

python -c "import torch; print(torch.version.cuda)"
>>> 10.0

nvcc --version
>>> 10.0

theano

for CUDA8.0

1
sudo pip install theano

直接复制下面的测试代码看是不是能够出来结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time
vlen = 10 * 30 * 768 # 10 x #cores x # threads per core
iters = 1000
rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], T.exp(x))
print(f.maker.fgraph.toposort())
t0 = time.time()
for i in range(iters):
r = f()
t1 = time.time()
print("Looping %d times took %f seconds" % (iters, t1 - t0))
print("Result is %s" % (r,))
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):
print('Used the cpu')
else:
print('Used the gpu')


成功,但是这个时候使用的CPU来跑的。然后接下来的任务就是给他添加GPU加速。
在你的主目录下面,(就是你直接~/文件夹,后者你自己cd之后回车的那个文件夹)。

1
sudo vim .theanorc

建立一个.theanorc的文件。
文件中的的内容直接复制下面就行了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[global]

floatX=float32
device=gpu
base_compiledir=~/external/.theano/
allow_gc=False
warn_float64=warn
[mode]=FAST_RUN

[nvcc]
fastmath=True

[cuda]
root=/usr/local/cuda

保存。再次运行那个例子。得到结果
这里写图片描述
CPU那个用了30多秒,这个只用了0.8秒,说明GPU的加速还是有点用的。
至此,theano安装完成了。

for CUDA9.0 Or CDUA10.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo pip install theano
# 安装 pygpu
git clone https://github.com/Theano/libgpuarray.git
cd libgpuarray
mkdir Build
cd Build
# you can pass -DCMAKE_INSTALL_PREFIX=/path/to/somewhere to install to an alternate location
cmake .. -DCMAKE_BUILD_TYPE=Release # or Debug if you are investigating a crash
make
sudo make install
cd ..
# This must be done after libgpuarray is installed as per instructions above.
python setup.py build
sudo python setup.py install
sudo ldconfig

在你的主目录下面,(就是你直接~/文件夹,后者你自己cd之后回车的那个文件夹)。

1
sudo gedit .theanorc

建立一个.theanorc的文件,如何使用GPU:http://deeplearning.net/software/theano/tutorial/using_gpu.html。

1
2
3
[global]
device = cuda
floatX = float32

运行下面的例子,注意例子的命名不能是 theano.py,否则的话,导包错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from theano import function, config, shared, tensor
import numpy
import time
vlen = 10 * 30 * 768 # 10 x #cores x # threads per core
iters = 1000
rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], tensor.exp(x))
print(f.maker.fgraph.toposort())
t0 = time.time()
for i in range(iters):
r = f()
t1 = time.time()
print("Looping %d times took %f seconds" % (iters, t1 - t0))
print("Result is %s" % (r,))
if numpy.any([isinstance(x.op, tensor.Elemwise) and
('Gpu' not in type(x.op).__name__)
for x in f.maker.fgraph.toposort()]):
print('Used the cpu')
else:
print('Used the gpu')

运行:

1
THEANO_FLAGS=device=cuda0 python test.py

最后输出的是

若从cuda9.0升级到10.0,重新编译libgpuarray后,需要重新安装theano

Caffe

因为Caffe是最难安装的,因此就放到了最后了。废话不说多了。
首先你需要从github上面clone或者下载.zip的压缩包。效果是一样的。然后你得到一个cafffe-master的压缩包或者文件夹。进到这个文件夹里面,你会看到是这个样子的。

首先安装第三方依赖:

1
2
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev libatlas-base-dev libjpeg62
sudo apt-get install --no-install-recommends libboost-all-dev

接着,你会看到其中有一个文件叫Makefile.config.example这个文件是官方给出了编译的“模板”,我们可以直接拿过来小小的修改一下就行。复制下面的命令把名字改为Makefile.config

1
cp Makefile.config.example Makefile.config

你会发现下面多了一个Makefile.config的文件

打开这个文件并且修改(我这里用的是vscode,你可以换成其他的编辑器比如vim):

1
code Makefile.config

你能够看到类似于这样的东西

然后根据个人情况修改文件:

1) 若使用cudnn,则将#USE_CUDNN := 1修改成: USE_CUDNN := 1 (就是去掉注释的‘#’号)

2) 若使用cuda9,则注释掉-gencode arch=compute_20,code=sm_20 \-gencode arch=compute_20,code=sm_21 \

在我的电脑上,在使用cuda9的情况下,没有注释掉-gencode arch=compute_20,code=sm_21 \仍然可以编译过去,但是今天在一个笔记本上没有编译过去,所以大家按照Makefile.config文件中的要求——# For CUDA >= 9.0, comment the *_20 and *_21 lines for compatibility.注释掉吧~

3) 为了防止出现fatal error: hdf5.h: No such file or directory,将下面两行语句进行修改

1
2
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib

修改为:

1
2
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/lib/x86_64-linux-gnu/hdf5/serial/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial/

4) 解除下面几行的注释,可以使用Python 3 (default is Python 2,未成功)

1
2
3
PYTHON_LIBRARIES := boost_python3 python3.5m
PYTHON_INCLUDE := /usr/include/python3.5m \
/usr/lib/python3.5/dist-packages/numpy/core/include

编译,-j$(nproc)表示全部线程

1
2
3
4
make all -j$(nproc)
make test -j$(nproc)
make runtest -j$(nproc)
make pycaffe -j$(nproc)

修改环境变量

gedit ~/.bashrc 打开 “.bashrc” 文件,在文件末尾加入如下代码并保存:

1
2
3
4
5
# Set Caffe environment
export CAFFE_ROOT=/home/zdaiot/software/caffe

#caffe python
export PYTHONPATH=/home/zdaiot/software/caffe/python/:$PYTHONPATH

为验证安装成功,终端输入 ipython 或 python 进入Python解释器环境,输入:import caffe,不报错误代表caffe的Python接口可以使用。

报错

报错:fatal error: gflags/gflags.h: No such file or directory

1
sudo apt-get install libgflags-dev

报错:`fatal error: glog/logging.h: No such file or directory`

1
sudo apt install libgoogle-glog-dev

报错:mdb.h: No such file or directory

1
sudo apt install liblmdb-dev

报错:

/usr/bin/ld: cannot find -lcblas
/usr/bin/ld: cannot find -latlas

1
sudo apt install libatlas-base-dev

报错:

ImportError: libjpeg.so.62: cannot open shared object file: No such file or

1
sudo apt install libjpeg62

报错:编译Python3的时候:

/usr/bin/ld: cannot find -lboost_python3

1
2
cd /usr/lib/x86_64-linux-gnu
sudo ln -s libboost_python-py35.so libboost_python3.so

报错:

pip3 安装出现:AttributeError: '_NamespacePath' object has no attribute 'sort'

I edited line #2121~2122 of this file: sudo vim /usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__init__.py

1
2
3
4
5
#orig_path.sort(key=position_in_sys_path)
#module.__path__[:] = [_normalize_cached(p) for p in orig_path]
orig_path_t = list(orig_path)
orig_path_t.sort(key=position_in_sys_path)
module.__path__[:] = [_normalize_cached(p) for p in orig_path_t]

报错:

CUDA9.0环境下,运行make runtest -j$(nproc)报下面的错:

1
math_functions.cu:28] Check failed: status == CUBLAS_STATUS_SUCCESS (13 vs. 0) CUBLAS_STATUS_EXECUTION_FAILED

解决方法:安装Patch 2 (Released Mar 5, 2018) 解决。但是在笔记本上失败了,推测是因为该笔记本的计算能力为2.1,但是在CUDA9.0下编译caffe需要comment the *_20 and *_21 lines for compatibility,所以会失败。因此,遇到这种情况可能需要降级到8.0解决~

报错:

1
2
.build_release/src/caffe/proto/caffe.pb.h:4:0: error: unterminated #ifndef
#ifndef PROTOBUF_caffe_2eproto__INCLUDED

解决方法:编译caffe的时候,开个两个终端。关闭一个即可。

报错:

Python3下出现:Failed to include caffe_pb2, things might go wrong!

仍待解决

常见错误

cudnn链接库问题

例如报错:

1
ImportError: libcudnn.so.7: cannot open shared object file: No such file or directory

则进入/usr/local/cuda/lib64目录,使用ls -al指令查看是否有该链接库。

参考

ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory
cuda problem when training the model
Check failed: status == CUBLAS_STATUS_SUCCESS (13 vs. 0) CUBLAS_STATUS_EXECUTION_FAILED
Ubuntu 16.04 卸载Nvidia显卡驱动和cuda
tensorflow CUDA cudnn 版本对应关系
UBUNTU 系统开机没有grub启动项
Anaconda 清华源即将恢复!
Updating Anaconda Fails. Environment Not Writable Error
v0.3: Import error [CUDA10]
图形”llvmpipe (LLVM 6.0, 256 bits)”
解压 .solitairetheme8 文件
Anaconda 镜像使用帮助
解决pip安装超时的问题
【环境】pytorch选择cuda的顺序【关于cudatoolkit和/usr/local/cuda】

------ 本文结束------
坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道