layout: post # 使用的布局(不需要改)
title: 手把手搭建深度学习环境 # 标题
subtitle: 手把手搭建深度学习环境 #副标题
date: 2019-10-24 # 时间
author: NSX # 作者
header-img: img/post-bg-2015.jpg #这篇文章标题背景图片
catalog: true # 是否归档
tags: #标签
- 技术
- 教程
- Linux
预告:三种套餐组合方式
第一种
- Nvidia GPU 驱动(v375)——允许系统获得 GPU 带来的加速。
- CUDA(v8.0)——GPU C 语言库。「计算同一设备架构」。
- cuDNN(v6.0.21)——基于 CUDA 的深度学习基元库。「CUDA 深度学习库」。
- TensorFlow(v1.3)——谷歌开发的深度学习框架,保证TensorFlow<=1.4
第二种
- Nvidia GPU 驱动(v384)——允许系统获得 GPU 带来的加速。
- CUDA(v9.0)——GPU C 语言库。「计算同一设备架构」。
- cuDNN(v7.4.2)——基于 CUDA 的深度学习基元库。「CUDA 深度学习库」。
- TensorFlow(v1.12.0)——谷歌开发的深度学习框架,保证TensorFlow>=1.5
第三种
- Nvidia GPU 驱动(v418)——允许系统获得 GPU 带来的加速。
- CUDA(v10.1)——GPU C 语言库。「计算同一设备架构」。
- cuDNN(v7.6.4)——基于 CUDA 的深度学习基元库。「CUDA 深度学习库」。
- TensorFlow(v1.14.0)——谷歌开发的深度学习框架
安装准备
前提机器上面有支持CUDA的Nvidia GPU,查看支持CUDA的GPU列表:
https://developer.nvidia.com/cuda-gpus
lspci | grep -i nvidia
我这边服务器使用 NVIDIA显卡的版本信息:
Tesla V100 SXM2 16GB
验证系统是否是受支持的Linux版本
uname -m && cat /etc/redhat-release
# CentOS Linux release 7.6.1810 (Core)
到这里查看受支持的Linux版本:http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#system-requirements
验证系统是否有GCC编译环境
gcc -v
# gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
没有的话需要先安装GCC,Centos7的最小化安装一般勾选上开发软件都会自动安装GCC
验证系统是否安装了正确的内核头文件和开发包
sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
开始安装
禁用nouveau
nouveau是一个第三方开源的Nvidia驱动,一般Linux安装的时候默认会安装这个驱动。 这个驱动会与Nvidia官方的驱动冲突,在安装Nvidia驱动和和CUDA之前应先禁用nouveau
查看系统是否正在使用nouveau
lsmod | grep nouveau
如果有显示内容,则进行以下的步骤: Centos7禁用方法
#新建一个配置文件sudo vim /etc/modprobe.d/blacklist-nouveau.conf#写入以下内容blacklist nouveauoptions nouveau modeset=0#保存并退出:wq#备份当前的镜像sudo mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak#建立新的镜像sudo dracut /boot/initramfs-$(uname -r).img $(uname -r)#重启sudo reboot#最后输入上面的命令验证lsmod | grep nouveau
安装驱动
GPU 服务器正常工作需安装正确的基础设施软件,对 NVIDIA 系列 GPU 而言,有两个层次的软件包需要安装:
- 驱动 GPU 工作的硬件驱动程序。
- 上层应用程序所需要的库。
若把 NVIDIA GPU 用作通用计算,需要安装 Tesla Driver + CUDA:
rpm 包安装
- 打开 NVIDIA 驱动下载链接 http://www.nvidia.com/Download/Find.aspx 。
- 选择支持 RPM 包的操作系统,并获取该 RPM 包的下载链接。例如:选择 Linux 64-bit CUDA Toolkit: 10.1, 得到下载链接:https://www.nvidia.cn/Download/driverResults.aspx/152484/cn,按照提示下载并安装驱动。
- 使用
rpm
命令安装 rpm 包。rpm -i nvidia-driver-local-repo-rhel7-418.87.01-1.0-1.x86_64.rpm
- 使用
yum
命令清除缓存。yum clean all
- 使用yum命令安装驱动。
yum install cuda-drivers
- 重启机器
reboot
- 运行
nvidia-smi
能输出正确信息代表驱动安装成功。
CUDA 安装
CUDA (Compute Unified Device Architecture) 是显卡厂商 NVIDIA 推出的运算平台。 CUDA™ 是一种由 NVIDIA 推出的通用并行计算架构,该架构使 GPU 能够解决复杂的计算问题。 它包含了 CUDA 指令集架构(ISA)以及 GPU 内部的并行计算引擎。 开发人员现在可以使用 C 语言, C++ , FORTRAN 来为 CUDA™ 架构编写程序,所编写出的程序可以在支持 CUDA™ 的处理器上以超高性能运行。
最快捷的安装方法:conda install cudatoolkit=10.0
采用 NVIDIA 显卡的GPU 云服务器,需要安装 CUDA 开发运行环境:
- 先查看官方给的CUDA和显卡驱动Driver的匹配兼容性,进行CUDA Toolkit的版本选择 (9.0~10.1 应该均可)
- 选择操作系统和安装包。以 CentOS 7 64 位的CUDA驱动下载为例,下载 Base 以及 Patch 补丁
- 在 CUDA 安装包所在目录下运行如下命令(run_file)
下载10.0版本的CUDAwget -c https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda_10.0.130_410.48_linux
下载10.1版本的CUDA
安装
安装具体细节:之前已经安装过显卡驱动程序,因此在提问是否安装显卡驱动时选择no,其他默认(NVIDIA Accelerated Graphics Driver)
(是否同意条款,必须同意才能继续安装)
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?(是否安装CUDA 10 ,这里必须要安装)
(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: n
Installing the CUDA Toolkit in /usr/local/cuda-10.0 ...(开始安装)
===========
= Summary =
===========
Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-10.1/
Samples: Installed in /home/lhadmin/, but missing recommended libraries
Please make sure that
- PATH includes /usr/local/cuda-10.1/bin
- LD_LIBRARY_PATH includes /usr/local/cuda-10.1/lib64, or, add /usr/local/cuda-10.1/lib64 to /etc/ld.so.conf and run ldconfig as root
To uninstall the CUDA Toolkit, run cuda-uninstaller in /usr/local/cuda-10.1/bin
Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-10.1/doc/pdf for detailed information on setting up CUDA.
添加CUDA环境变量
在 ~/.bashrc 里再设置一下cuda的环境变量:vi ~/.bashrc
export PATH=/usr/local/cuda-10.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda-10.1
source ~/.bashrc
在 /etc/profile 里也设置一下cuda的安装路径及相应的库文件:(这个似乎可以不改)
配置LD路径(这个似乎也可以不改):查看cuda版本:
nvcc -V
cat /usr/local/cuda/version.txt
卸载CUDA
To uninstall the CUDA Toolkit, run cuda-uninstaller in /usr/local/cuda-10.1/bin
sudo /usr/local/cuda-10.1/bin/cuda-uninstaller
sudo rm -rf /usr/local/cuda-10.1/
CuDNN 安装
- 最快捷的方法(有一定概率安装成功仍找不到cudnn,以及和你安装的cuda版本不对应的情况…)
conda install cudnn=7.6.5
- 传统安装方法
- 在cuDNN Archive中,选择合适的CuDNN版本;
Download cuDNN Library cudnn-10.1-linux-x64-v7.6.3.30.tgz
PS:cuDNN需要注册NVIDIA的会员(免费)才能下载,无法在远程机器上用curl或者wget下载!! 用户名:qq邮箱 密码:zX1994???721
问题:要经过登录授权的,就算你在网页上登录了得到下载链接,直接在命令行中:wget 下载链接,也是会报403禁止错误。
解决方案:linux下载高版本cudnn可以用下面的网址绕过授权检查:sudo wget http://developer.download.nvidia.com/compute/redist/cudnn/v7.6.5/cudnn-10.0-linux-x64-v7.6.5.32.tgz
可以根据你想要的cudnn版本号对其中的cuda版本(如10.0)和cudnn版本(v7.6.5)进行修改,然后就可以下载cudnn了。下载完毕后解压
cd ~/Downloads/
tar -zxvf cudnn-*.tgz
- 然后将cuDNN中的bin、include、lib文件覆盖cuda安装目录下即可
cd /software/
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*
- 验证
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
#or
git clone https://github.com/wilhelmguo/cudnn_samples_v7.git
cd cudnn_samples_v7/mnistCUDNN
make
./mnistCUDNN
- 可能遇到
ibcudnn.so.5 is not a symbolic link
错误ls -lha /usr/local/cuda/lib64/libcudnn*
If libcudnn.so and libcudnn.so.5 are not symlinks then this is the reason why you got this error.
If so, this is what you need to do:
PS: 最好参照本文最后一节 错误解决 进行软链接
配置Pip国内镜像
- 临时使用:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow-gpu
- 永久修改,一劳永逸:
Linux下,修改 ~/.pip/pip.conf (没有就创建一个文件夹及文件。文件夹要加“.”,表示是隐藏文件夹)
内容如下:- 阿里源(非常快) ``` [global] index-url = https://mirrors.aliyun.com/pypi/simple/
[install] trusted-host=mirrors.aliyun.com
- 清华源(贼鸡儿的快)
[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install] trusted-host = https://pypi.tuna.tsinghua.edu.cn
PS: windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini。内容同上。
<a name="889ea99a"></a>
## 安装 Anaconda3
yum -y install wget sudo wget -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2020.11-Linux-x86_64.sh bash Anaconda3-2019.10-Linux-x86_64.sh
$ Do you accept the license terms? [yes|no] $ [no] >>> $ Please answer ‘yes’ or ‘no’: $ >>> yes $ … $ Anaconda3 will now be installed into this location: $ /root/anaconda3 $ /home/ningshixian/anaconda3 $ $ - Press ENTER to confirm the location $ - Press CTRL-C to abort the installation $ - Or specify a different location below $ $ [/root/anaconda3] >>> 更改要输入绝对路径 $ … $ Do you wish the installer to initialize Anaconda3 $ by running conda init? [yes|no] $ [no] >>> no $ …
安装成功之后,配置环境变量
vi ~/.bashrc # 每次启动新shell时运行的命令 vi ~/.bash_profile # 只运行一次,如定义环境变量PATH
在文件最后加入如下语句(路径需要根据自己的安装位置更改)
export PATH=”/home/ningshixian/anaconda3/bin:$PATH”
按住shift键+:键,输入wq,保存文件并退出;最后使用如下命令刷新环境变量即可:
source ~/.bashrc
检查是否成功
which conda which pip
[anaconda](https://so.csdn.net/so/search?q=anaconda&spm=1001.2101.3001.7020)安装完成后需要更换为清华源以提高相关包的下载速度,在终端依次执行这些命令:
```python
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --append channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/fastai/
conda config --append channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --append channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
# 搜索时显示通道地址
conda config --set show_channel_urls yes
Conda虚拟环境
创建
conda create --name nsxenv python=3.6
python -m pip install -i https://mirrors.aliyun.com/pypi/simple/ -U setuptools
安装好后,使用activate激活某个环境
activate python34 # for Windows
source activate python34 # for Linux & Mac
退出虚拟环境
deactivate python34 # for Windows
source deactivate python34 # for Linux & Mac
查看所有已安装虚拟环境
conda env list
复制别人的虚拟环境
conda create -n BBB --clone AAA
删除一个已有的环境
conda remove -name myenv --all
安装TensorFlow
- 先查看tensorflow CUDA cudnn 版本对应关系 ↓
pip install tensorflow-gpu==1.14.0
- 验证是否安装成功 (确定自己的TensorFlow是CPU还是GPU的版本) ``` import tensorflow as tf tf.test.gpu_device_name() tf.test.is_gpu_available()
下方有大段显示GPU信息表示安装成功
<a name="99278c23"></a>
## 安装 Keras
sudo pip install keras
<a name="41b41d5b"></a>
## 错误解决
<a name="fedd8cca"></a>
### 1. so文件找不到的错误
2019-11-04 21:46:44.297090: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library ‘libcudart.so.10.0’; dlerror: libcudart.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-10.1/lib64:/usr/local/cuda-10.1/lib64
2019-11-04 21:46:44.300375: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10.0
2019-11-04 21:46:44.300532: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library ‘libcufft.so.10.0’; dlerror: libcufft.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-10.1/lib64:/usr/local/cuda-10.1/lib64
2019-11-04 21:46:44.300625: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library ‘libcurand.so.10.0’; dlerror: libcurand.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-10.1/lib64:/usr/local/cuda-10.1/lib64
2019-11-04 21:46:44.300739: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library ‘libcusolver.so.10.0’; dlerror: libcusolver.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-10.1/lib64:/usr/local/cuda-10.1/lib64
2019-11-04 21:46:44.300822: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library ‘libcusparse.so.10.0’; dlerror: libcusparse.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-10.1/lib64:/usr/local/cuda-10.1/lib64
2019-11-04 21:46:44.309809: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7
2019-11-04 21:46:44.309870: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1641] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform. Skipping registering GPU devices…
主要错误信息为`Could not dlopen library 'libcublas.so.10.0'`。造成这样的原因是链接文件不对造成的。这种问题很好解决,下面我罗列一些常发生这样错误的`so`文件解决办法,首先大家要确定报错的`so`文件名称是什么,例如上面报错的是`libcublas.so.10.0`这个文件,那么就找到对应的`libcublas`库文件,然后在`/usr/local/cuda-10.1/lib64/`目录下创建一个`libbcublas.so.10.0`链接文件即可。
出现该错误消息,表示会使用CPU,它可以识别GPU,但找不到与cuda相关的库文件。(CUDA 10.1或10.0文件内容似乎没有太大不同……[参考](http://ejklike.github.io/2019/08/19/insatall-tensorflow-2.0.0-beta1-in-ubuntu-with-cuda-10-1.html))
**解决方法**
1. 要么将cuda降为10.0;
2. 要么则执行软链接命令
> 根据配置文件 LD_LIBRARY_PATH=lib_.so.10.1_<br />将相应的库文件软链接到`/usr/local/cuda-10.0/lib64/`,使得可以找到`*.so.10.0`<br />在路径中找到对应的文件,为找不到的lib*.so.10.0创建符号链接
创建一个CUDA 10.0文件夹(可省略此步)
sudo cp -r /usr/local/cuda-10.1 /usr/local/cuda-10.0
针对性软链接
libcudart也可能是这个 sudo ln -s /usr/local/cuda-10.1/lib64/libcudart.so.10.1.243 /usr/local/cuda-10.0/lib64/libcudart.so.10.0
sudo ln -s /usr/local/cuda-10.1/lib64/libcudart.so.10.1.1.243 /usr/local/cuda-10.0/lib64/libcudart.so.10.0 sudo ln -s /usr/local/cuda-10.1/lib64/libcublas.so.10.1.1.243 /usr/local/cuda-10.0/lib64/libcublas.so.10.0 sudo ln -s /usr/local/cuda-10.1/lib64/libcufft.so.10.1.1.243 /usr/local/cuda-10.0/lib64/libcufft.so.10.0 sudo ln -s /usr/local/cuda-10.1/lib64/libcurand.so.10.1.1.243 /usr/local/cuda-10.0/lib64/libcurand.so.10.0 sudo ln -s /usr/local/cuda-10.1/lib64/libcusolver.so.10.2.0.243 /usr/local/cuda-10.0/lib64/libcusolver.so.10.0 sudo ln -s /usr/local/cuda-10.1/lib64/libcusparse.so.10.3.0.243 /usr/local/cuda-10.0/lib64/libcusparse.so.10.0
sudo ln -s /usr/lib64/libcublas.so.10.2.1.243 /usr/local/cuda-10.0/lib64/libcublas.so.10.0
再次修改环境配置
vi ~/.bashrc
export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}} export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} export LD_LIBRARY_PATH=/usr/local/cuda-10.0/extras/CUPTI/lib64:$LD_LIBRARY_PATH
source ~/.bashrc
PS: 以上 `cuda-10.0` 应该都可以换成 `cuda-10.1`
若出现 Error: failed to create symbolic link,可采取强制覆盖方法
ln -sf sudo ln -s /usr/local/cuda-10.1/lib64/libcudart.so.10.1.243 /usr/local/cuda-10.0/lib64/libcudart.so.10.0
<a name="fcdbbde5"></a>
### 2. cuda driver的驱动器跟cuda不匹配
> Failed to initialize NVML: Driver/library version mismatch
在版本不匹配时,适当降低或者更新驱动器版本即可。另外驱动器版本更新之后可能需要重启系统,当然通过如下方法不用重启也可以更新版本。首先尝试删除nvidia相关的kernel mod。
sudo rmmod nvidia
当然这里一般会报个Module nvidia is in use by的错误。不碍事,我们先查看下kernel mod 的依赖情况:
ls mod | grep nvidia
根据根据结果逐一rmmod即可。
sudo rmmod nvidia_uvm
sudo rmmod nvidia_modeset
最后再rmmod nvidia即可达到驱动器更新效果。
sudo rmmod nvidia
nvidia-smi
<a name="be193a70"></a>
### 3.多个 cuda 版本之间进行切换
在切换cuda版本时
rm -rf /usr/local/cuda#删除之前创建的软链接 sudo ln -s /usr/local/cuda-8.0/ /usr/local/cuda/ nvcc —version #查看当前 cuda 版本
nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2016 NVIDIA Corporation Built on Mon_Jan_23_12:24:11_CST_2017 Cuda compilation tools, release 8.0, V8.0.62
cuda8.0 切换到 cuda9.0
rm -rf /usr/local/cuda sudo ln -s /usr/local/cuda-9.0/ /usr/local/cuda/ nvcc —version
<a name="2c2d102a"></a>
### 4. tensorflow-gpu运行出错: Could not create cudnn handle
错误信息如下:
> Successfully opened dynamic library libcublas.so.10.0
>
> failed to create **cublas** handle: **CUBLAS**_STATUS_NOT_INITIALIZED
>
> Successfully opened dynamic library libcudnn.so.7
>
> Could not create **cudnn** handle: **CUDNN**_STATUS_NOT_INITIALIZED
>
> Possibly insufficient driver version: 418.87.0
[解决:](https://github.com/pcpLiu/DeepSeqPan/issues/2)
In the end, the problem was that it did not use the system’s Cudnn version but an incompatible version which came with the creation of the Anaconda environment. By overwriting this with the system’s version manually, I could solve the problem.
无效解决方案1:也即cudnn的版本错误(按照conda list显示的cuda版本[必须低于](https://webcache.googleusercontent.com/search?q=cache:8vC2brZLV20J:https://www.machunjie.com/message-board+&cd=19&hl=zh-CN&ct=clnk&gl=us)nvcc -V查看的系统版本),导致[对应cublas64_10.dll出错](https://www.geek-share.com/detail/2806021724.html),重新将手动安装的cudnn文件覆盖就行?
无效解决方案2:pytorch构建数据集时调用了gpu导致tensorflow不能占用gpu了?
无效解决方案3:`sudo rm -f ~/.nv`
**有效解决方案:**重新建一个虚拟环境,重新安装依赖包,记得在 ~/.bashrc 里再设置一下对应版本cuda的环境变量,问题解决👍🏻
<a name="8a9681b0"></a>
## 免费的GPU资源
colab地址:
https://colab.research.google.com/notebooks/
kaggle地址:
nvidia官方文档地址:
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html ```
参考
- Centos 7 安装 Nvidia GPU 驱动及 CUDA
- 找不到libcublas.so.10.0文件
tensorflow
版本与CUDA
的版本不对应- 软链接有误,重新进行链接 (Could not dlopen library ‘libcurand.so.10.0’…LD_LIBRARY_PATH…)
- cuda程序执行出错: libcudart.so.10.0: cannot open shared object file: No such file or directory
- 用wget下载需要用户名和密码认证的网站或者ftp服务器文件
- Ubuntu安装和卸载CUDA和CUDNN
- Installing CUDA TK 8 and Tensorflow on a Clean Ubuntu 16.04 Install
- 深度学习环境配置有哪些坑?