layout: post # 使用的布局(不需要改)
title: 手把手搭建深度学习环境 # 标题
subtitle: 手把手搭建深度学习环境 #副标题
date: 2019-10-24 # 时间
author: NSX # 作者
header-img: img/post-bg-2015.jpg #这篇文章标题背景图片
catalog: true # 是否归档
tags: #标签
- 技术
- 教程
- Linux


预告:三种套餐组合方式

第一种

  1. Nvidia GPU 驱动(v375)——允许系统获得 GPU 带来的加速。
  2. CUDA(v8.0)——GPU C 语言库。「计算同一设备架构」。
  3. cuDNN(v6.0.21)——基于 CUDA 的深度学习基元库。「CUDA 深度学习库」。
  4. TensorFlow(v1.3)——谷歌开发的深度学习框架,保证TensorFlow<=1.4

第二种

  1. Nvidia GPU 驱动(v384)——允许系统获得 GPU 带来的加速。
  2. CUDA(v9.0)——GPU C 语言库。「计算同一设备架构」。
  3. cuDNN(v7.4.2)——基于 CUDA 的深度学习基元库。「CUDA 深度学习库」。
  4. TensorFlow(v1.12.0)——谷歌开发的深度学习框架,保证TensorFlow>=1.5

第三种

  1. Nvidia GPU 驱动(v418)——允许系统获得 GPU 带来的加速。
  2. CUDA(v10.1)——GPU C 语言库。「计算同一设备架构」。
  3. cuDNN(v7.6.4)——基于 CUDA 的深度学习基元库。「CUDA 深度学习库」。
  4. TensorFlow(v1.14.0)——谷歌开发的深度学习框架

    安装准备

前提机器上面有支持CUDA的Nvidia GPU,查看支持CUDA的GPU列表:

https://developer.nvidia.com/cuda-gpus

  1. lspci | grep -i nvidia

我这边服务器使用 NVIDIA显卡的版本信息:

  1. Tesla V100 SXM2 16GB

验证系统是否是受支持的Linux版本

  1. uname -m && cat /etc/redhat-release
  2. # CentOS Linux release 7.6.1810 (Core)

到这里查看受支持的Linux版本:http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#system-requirements

验证系统是否有GCC编译环境

  1. gcc -v
  2. # gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)

没有的话需要先安装GCC,Centos7的最小化安装一般勾选上开发软件都会自动安装GCC

验证系统是否安装了正确的内核头文件和开发包

  1. sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)

开始安装

禁用nouveau

nouveau是一个第三方开源的Nvidia驱动,一般Linux安装的时候默认会安装这个驱动。 这个驱动会与Nvidia官方的驱动冲突,在安装Nvidia驱动和和CUDA之前应先禁用nouveau

查看系统是否正在使用nouveau

  1. lsmod | grep nouveau

如果有显示内容,则进行以下的步骤: Centos7禁用方法

  1. #新建一个配置文件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 包安装

  1. 打开 NVIDIA 驱动下载链接 http://www.nvidia.com/Download/Find.aspx
  2. 选择支持 RPM 包的操作系统,并获取该 RPM 包的下载链接。例如:选择 Linux 64-bit CUDA Toolkit: 10.1, 得到下载链接:https://www.nvidia.cn/Download/driverResults.aspx/152484/cn,按照提示下载并安装驱动。
  3. 使用rpm命令安装 rpm 包。
    1. rpm -i nvidia-driver-local-repo-rhel7-418.87.01-1.0-1.x86_64.rpm
  1. 使用yum命令清除缓存。
    1. yum clean all
  1. 使用yum命令安装驱动。
    1. yum install cuda-drivers
  1. 重启机器
    1. reboot
  1. 运行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 开发运行环境:

  1. 先查看官方给的CUDA和显卡驱动Driver的匹配兼容性,进行CUDA Toolkit的版本选择 (9.0~10.1 应该均可)
  2. 选择操作系统和安装包。以 CentOS 7 64 位的CUDA驱动下载为例,下载 Base 以及 Patch 补丁
  3. 在 CUDA 安装包所在目录下运行如下命令(run_file)
    下载10.0版本的CUDA
    1. wget -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)

    1. (是否同意条款,必须同意才能继续安装)
    2. accept/decline/quit: accept
    3. (这里不要安装驱动,因为已经安装最新的驱动了,否则可能会安装旧版本的显卡驱动,导致重复登录的情况)
    4. Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48?
    5. (y)es/(n)o/(q)uit: n
    6. Install the CUDA 10.0 Toolkit?(是否安装CUDA 10 ,这里必须要安装)
    7. (y)es/(n)o/(q)uit: y
    8. Enter Toolkit Location(安装路径,使用默认,直接回车就行)
    9. [ default is /usr/local/cuda-10.0 ]:
    10. Do you want to install a symbolic link at /usr/local/cuda?(同意创建软链接)
    11. (y)es/(n)o/(q)uit: y
    12. Install the CUDA 10.0 Samples?(不用安装测试,本身就有了)
    13. (y)es/(n)o/(q)uit: n
    14. Installing the CUDA Toolkit in /usr/local/cuda-10.0 ...(开始安装)
    15. ===========
    16. = Summary =
    17. ===========
    18. Driver: Not Selected
    19. Toolkit: Installed in /usr/local/cuda-10.1/
    20. Samples: Installed in /home/lhadmin/, but missing recommended libraries
    21. Please make sure that
    22. - PATH includes /usr/local/cuda-10.1/bin
    23. - 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
    24. To uninstall the CUDA Toolkit, run cuda-uninstaller in /usr/local/cuda-10.1/bin
    25. Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-10.1/doc/pdf for detailed information on setting up CUDA.
  1. 添加CUDA环境变量
    在 ~/.bashrc 里再设置一下cuda的环境变量:

    1. vi ~/.bashrc
    2. export PATH=/usr/local/cuda-10.1/bin${PATH:+:${PATH}}
    3. export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
    4. export CUDA_HOME=/usr/local/cuda-10.1
    5. source ~/.bashrc


    在 /etc/profile 里也设置一下cuda的安装路径及相应的库文件:(这个似乎可以不改)
    配置LD路径(这个似乎也可以不改):

  2. 查看cuda版本:

    1. nvcc -V
    2. cat /usr/local/cuda/version.txt

卸载CUDA

To uninstall the CUDA Toolkit, run cuda-uninstaller in /usr/local/cuda-10.1/bin

  1. sudo /usr/local/cuda-10.1/bin/cuda-uninstaller
  2. sudo rm -rf /usr/local/cuda-10.1/

CuDNN 安装

  1. 最快捷的方法(有一定概率安装成功仍找不到cudnn,以及和你安装的cuda版本不对应的情况…)
  1. conda install cudnn=7.6.5
  1. 传统安装方法
  • 然后将cuDNN中的bin、include、lib文件覆盖cuda安装目录下即可
    1. cd /software/
    2. sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
    3. sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
    4. sudo chmod a+r /usr/local/cuda/include/cudnn.h
    5. sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
  • 验证
    1. cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
    2. #or
    3. git clone https://github.com/wilhelmguo/cudnn_samples_v7.git
    4. cd cudnn_samples_v7/mnistCUDNN
    5. make
    6. ./mnistCUDNN
  • 可能遇到ibcudnn.so.5 is not a symbolic link错误
    1. 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国内镜像

[install] trusted-host=mirrors.aliyun.com

  1. - 清华源(贼鸡儿的快)

[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple

[install] trusted-host = https://pypi.tuna.tsinghua.edu.cn

  1. PS: windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini。内容同上。
  2. <a name="889ea99a"></a>
  3. ## 安装 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 $ …

  1. 安装成功之后,配置环境变量

vi ~/.bashrc # 每次启动新shell时运行的命令 vi ~/.bash_profile # 只运行一次,如定义环境变量PATH

  1. 在文件最后加入如下语句(路径需要根据自己的安装位置更改)

export PATH=”/home/ningshixian/anaconda3/bin:$PATH”

  1. 按住shift键+:键,输入wq,保存文件并退出;最后使用如下命令刷新环境变量即可:

source ~/.bashrc

  1. 检查是否成功

which conda which pip

  1. [anaconda](https://so.csdn.net/so/search?q=anaconda&spm=1001.2101.3001.7020)安装完成后需要更换为清华源以提高相关包的下载速度,在终端依次执行这些命令:
  2. ```python
  3. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
  4. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  5. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
  6. conda config --append channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/fastai/
  7. conda config --append channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
  8. conda config --append channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
  9. # 搜索时显示通道地址
  10. conda config --set show_channel_urls yes

Conda虚拟环境

创建

  1. conda create --name nsxenv python=3.6
  2. python -m pip install -i https://mirrors.aliyun.com/pypi/simple/ -U setuptools

安装好后,使用activate激活某个环境

  1. activate python34 # for Windows
  2. source activate python34 # for Linux & Mac

退出虚拟环境

  1. deactivate python34 # for Windows
  2. source deactivate python34 # for Linux & Mac

查看所有已安装虚拟环境

  1. conda env list

复制别人的虚拟环境

  1. conda create -n BBB --clone AAA

删除一个已有的环境

  1. conda remove -name myenv --all

安装TensorFlow

下方有大段显示GPU信息表示安装成功

  1. <a name="99278c23"></a>
  2. ## 安装 Keras

sudo pip install keras

  1. <a name="41b41d5b"></a>
  2. ## 错误解决
  3. <a name="fedd8cca"></a>
  4. ### 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…

  1. 主要错误信息为`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`链接文件即可。
  2. 出现该错误消息,表示会使用CPU,它可以识别GPU,但找不到与cuda相关的库文件。(CUDA 10.110.0文件内容似乎没有太大不同……[参考](http://ejklike.github.io/2019/08/19/insatall-tensorflow-2.0.0-beta1-in-ubuntu-with-cuda-10-1.html))
  3. **解决方法**
  4. 1. 要么将cuda降为10.0;
  5. 2. 要么则执行软链接命令
  6. > 根据配置文件 LD_LIBRARY_PATH=lib_.so.10.1_<br />将相应的库文件软链接到`/usr/local/cuda-10.0/lib64/`,使得可以找到`*.so.10.0`<br />在路径中找到对应的文件,为找不到的lib*.so.10.0创建符号链接
  7. 创建一个CUDA 10.0文件夹(可省略此步)

sudo cp -r /usr/local/cuda-10.1 /usr/local/cuda-10.0

  1. 针对性软链接

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

  1. 再次修改环境配置

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

  1. PS: 以上 `cuda-10.0` 应该都可以换成 `cuda-10.1`
  2. 若出现 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

  1. <a name="fcdbbde5"></a>
  2. ### 2. cuda driver的驱动器跟cuda不匹配
  3. > Failed to initialize NVML: Driver/library version mismatch

在版本不匹配时,适当降低或者更新驱动器版本即可。另外驱动器版本更新之后可能需要重启系统,当然通过如下方法不用重启也可以更新版本。首先尝试删除nvidia相关的kernel mod。

  1. sudo rmmod nvidia

当然这里一般会报个Module nvidia is in use by的错误。不碍事,我们先查看下kernel mod 的依赖情况:

  1. ls mod | grep nvidia

根据根据结果逐一rmmod即可。

  1. sudo rmmod nvidia_uvm
  2. sudo rmmod nvidia_modeset

最后再rmmod nvidia即可达到驱动器更新效果。

  1. sudo rmmod nvidia
  2. nvidia-smi
  1. <a name="be193a70"></a>
  2. ### 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

  1. <a name="2c2d102a"></a>
  2. ### 4. tensorflow-gpu运行出错: Could not create cudnn handle
  3. 错误信息如下:
  4. > Successfully opened dynamic library libcublas.so.10.0
  5. >
  6. > failed to create **cublas** handle: **CUBLAS**_STATUS_NOT_INITIALIZED
  7. >
  8. > Successfully opened dynamic library libcudnn.so.7
  9. >
  10. > Could not create **cudnn** handle: **CUDNN**_STATUS_NOT_INITIALIZED
  11. >
  12. > Possibly insufficient driver version: 418.87.0
  13. [解决:](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. 无效解决方案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. 无效解决方案2pytorch构建数据集时调用了gpu导致tensorflow不能占用gpu了?
  3. 无效解决方案3`sudo rm -f ~/.nv`
  4. **有效解决方案:**重新建一个虚拟环境,重新安装依赖包,记得在 ~/.bashrc 里再设置一下对应版本cuda的环境变量,问题解决👍🏻
  5. <a name="8a9681b0"></a>
  6. ## 免费的GPU资源
  7. colab地址:

https://colab.research.google.com/notebooks/

  1. kaggle地址:

https://www.kaggle.com/

  1. nvidia官方文档地址:

https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html ```

参考