CentOS 7安装GPU、Cuda、Tensorflow

一、安装前准备工作

1、查看当前服务器的显卡

  • 查看VGA接口显卡:lspci | grep VGA
  • 查看Nvidia:lspci | grep NVIDIA
[root@localhost ~]# lspci | grep VGA
00:02.0 VGA compatible controller: Cirrus Logic GD 5446
[root@localhost ~]# lspci | grep NVIDIA
00:1a.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 PCIe] (rev a1)

这里结果中的“00:”前缀,表示该显卡是虚拟机上挂载的显卡。

2、查看是否有历史安装

  • 执行如下命令:
nvidia-smi

如果没有找到命令,则说明驱动没有安装。

  • 执行如下命令:
nvcc -V

如果没有找到命令,则说明cuda没有安装。如果已经安装cuda,则会出现如下结果:

 [root@neuron ~]# nvcc -V
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

3、禁用nouveau

  • 可选,我验证结果是没有重启机器仍然可以安装。

(1)查看系统自带的驱动:

lsmod | grep nouveau

如果有结果,则说明存在nouveau。没有则直接跳过这一步。

(2)编辑如下文件:

vim /usr/lib/modprobe.d/dist-blacklist.conf

然后在最后添加如下内容:

blacklist nouveau
options nouveau modeset=0

(3)重启服务器。

4、 安装基础rpm依赖包

  • 安装Nvidia驱动所需要的依赖包为kernel-devel、gcc、dkms。
  • 验证cudn,编译并运行验证Sample代码所需要的依赖包为gcc-c++。

(1)确认并安装对应服务器内核版本的kernel-devel包。

首先确认当前服务器的内核版本:

[root@localhost gpu-software]#  uname -r
3.10.0-862.el7.x86_64

然后查看当前yum环境中提供的kernel-devel包的版本:

[root@localhost gpu-software]# yum list|grep kernel-devel
kernel-devel.x86_64                     3.10.0-862.el7                 http239

yum提供的kernel-devel的版本是不是和当前服务器内核版本一致,如果一致则直接安装,不一致则更换一个和当前内核一致的版本。

(2)可选:添加一个合适的yum源,因为默认的yum源没有dkms包。参考yum源如下:

cat /etc/yum.repos.d/epel.repo

[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://mirrors.aliyun.com/epel/7/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=http://mirrors.aliyun.com/epel/7/$basearch/debug
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0

[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=http://mirrors.aliyun.com/epel/7/SRPMS
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0

(3)安装rpm包。

[root@localhost ~]# yum install gcc dkms gcc-c++

二、安装Nvidia驱动

1、安装驱动

./NVIDIA-Linux-x86_64-418.87.00.run --kernel-source-path=/usr/src/kernels/3.10.0-862.el7.x86_64
  • 注意如下选项:

Would you like to register the kernel module sources with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later.

这里选择Yes。

  • 安装结束后,执行如下命令可以查看显卡信息:
nvidia-smi

2、查看显卡基本信息

  • 执行“nvidia-smi”命令后,能看到类似下面对表格:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.73       Driver Version: 410.73       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:01:00.0  On |                  N/A |
| 35%   44C    P8    18W / 250W |   4694MiB / 11176MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 108...  Off  | 00000000:02:00.0 Off |                  N/A |
| 33%   38C    P8    17W / 250W |     12MiB / 11178MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1846      G   /usr/bin/X                                    29MiB |
|    0      1903      G   /usr/bin/gnome-shell                          15MiB |
|    0     11521      C   ./darknet_gpu                               2319MiB |
|    0     32297      C   ./darknet                                   2319MiB |
+-----------------------------------------------------------------------------+
  • 第一行表示当前显卡驱动的版本和显卡支持的CUDA的版本,注意:这里支持CUDA的版本是只能够支持的最高版本,是可以向下兼容的。
  • 下面的表格中:
    • GPU:本机的GPU编号。
    • NAME:GPU名称。
    • Persistence-M:驱动常驻模式,如果设置为ON,则GPU功耗大但是启动新deGPU应用花费的时间更少。
    • Fan:风扇转速百分比。
    • Temp:显卡温度。
    • Perf:当前的性能状态,P0最高,P12最低。
    • Pwr:但前能耗。
    • Bus-Id:GPU总线。
    • Disp.A:GPU显示功能是否初始化。
    • Memory-Usage:显存的使用情况。
    • Volatile GPU-Util:浮动的GPU利用率。
    • ECC:未知。
    • Compute M:计算模式。
    • Processes:每块GPU的进程情况。

三、安装cuda和cuDNN

1、确定要下载的版本

  • CUDA:GPU编程的语言函数。CUDA 版本 (对应)> Tensorflow 版本。
  • cuDNN:深度学习/矩阵运算的加速库。 CUDA 版本 (对应)> cuDNN 版本。
  • 显卡驱动(CUDA驱动):向下兼容的,可以一直保持最新。
  • 下载cuda的地址如下:https://developer.nvidia.com/cuda-toolkit-archive
    这里选择cuda-9.0的版本。(请注意附录中关于cuda-9.2和Tensorflow的问题)这里选择了cuda_9.0.176_384.81_linux.run进行安装。
  • 下载cuDNN需要在官网上注册后才能下载。

2、安装cuda

执行如下命令:

sh cuda_9.0.176_384.81_linux.run

# 然后将文件翻到最后,进行一些选项。
-----------------
Do you accept the previously read EULA?
accept/decline/quit: accept

# 非常关键,我们已经在之前安装了高版本的驱动,这个千万别装。
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 384.81?
(y)es/(n)o/(q)uit: n

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

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

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

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

Enter CUDA Samples Location
 [ default is /root ]:

Installing the CUDA Toolkit in /usr/local/cuda-9.0 ...

===========
= Summary =
===========

Driver:   Not Selected
Toolkit:  Installed in /usr/local/cuda-9.0
Samples:  Installed in /root, but missing recommended libraries

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 root

To 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 384.00 is required for CUDA 9.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_24940.log

千万注意上面中的这个选项:

Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 384.81?

这里一定要选择“n”,因为我们之前已经安装过了显卡驱动。安装结果提示有问题也不用管,我们可以做后面的验证。

  • 配置环境变量,修改/etc/profile文件,添加如下配置:
export PATH=${PATH}:/usr/local/cuda/bin
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda/lib64

然后执行:

source /etc/profile
  • 验证cuda以及版本,执行如下命令:
[root@aicloud-1 ~]# nvcc -V
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
  • 如果前面安装了CUDA的example,这里可以执行如下操作:
[root@aicloud-1 ~]# cd /root/NVIDIA_CUDA-9.0_Samples/1_Utilities/deviceQuery
[root@aicloud-1 deviceQuery]# make

等编译完成后,执行“deviceQuery”命令:

[root@aicloud-1 deviceQuery]# ./deviceQuery
./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "Tesla V100-PCIE-16GB"

3、安装cuDNN

  • 解压cuDNN的包:
tar -xvf cudnn-9.0-linux-x64-v7.tgz

注意这里解压后的文件目录叫做“cuda”。

  • 将解压后的文件复制到cuda的安装后的目录中:
cp cuda/include/cudnn.h /usr/local/cuda-9.0/include
cp cuda/lib64/libcudnn* /usr/local/cuda-9.0/lib64

  • 将上面复制后的文件全部添加“a+r”权限:
chmod a+r /usr/local/cuda-9.0/include/cudnn.h  /usr/local/cuda-9.0/lib64/libcudnn*

附、几个重要的问题

(1)关于cuda和tensorflow版本问题。

因此,下载cuda之前首先要了解tensorflow与cuda版本之间的对应关系。

TF版本 cuda版本 cuDNN版本
tenfowflow_gpu-1.0.0 ~ tenfowflow_gpu-1.2.0 8 5.1
tenfowflow_gpu-1.3.0 ~ tenfowflow_gpu-1.4.0 8 6
tenfowflow_gpu-1.5.0 ~ tenfowflow_gpu-1.12.0 9 7
tenfowflow_gpu-1.13.1 10 7.4 10 7.4
  • 注意下面的问题!!
    经过验证发现如下问题:tensorflow_gpu-1.8.0,其官方说明是支持cuda版本为9。但是如果安装了cuda-9.2,那么在安装完成TF后,执行import的时候,会报错误:

ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory。

因为安装后的so文件为libcublas.so.9.2,如果我们在“/usr/local/cuda-9.2/lib64”中手动添加了软连接libcublas.so.9.0后,会报另外的错误:

ImportError: /usr/local/cuda/lib64/libcublas.so.9.0: version `libcublas.so.9.0' not found (required by /home/linxueqin/python3/lib/python3.6/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so)

这种情况说明tensorflow_gpu-1.8.0源码编译的时候已经写死了cuda的版本是9.0。因此需要把cuda版本切换成9.0。这个问题在其他tensorflow的版本中没有验证。
但是为了不走弯路,请安装cuda-9.0。

(2)扩展:关于tensorflow的CPU版本问题。

  • tensorflow在1.6.0开始,是在支持AVX指令集的CPU服务器中编译的。因此,如果当前服务器的CPU不支持AVX指令集,则最高只能安装tensorflow-1.5.0版本,否则在python中依赖tensorflow的时候就会出现如下错误:
Illegal instruction (core dumped)

在GPU版本中也会存在这个问题。因此,在安装Tensorflow的时候,应该按照如下操作:

  1. 验证当前服务器是否支持AVX指令集:

方法1:执行如下命令

cat /proc/cpuinfo |grep avx

如果没有结果,则说明不支持AVX指令集,否则就会出现如下内容:

[root@neuron cuda9]# cat /proc/cpuinfo |grep avx
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb intel_pt ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp spec_ctrl intel_stibp flush_l1d

方法2:执行如下命令

gcc -march=native -Q --help=target|grep march

如果支持avx则是如下显示(会包含avx,这里是avx版本2):

[root@neuron cuda9]# gcc -march=native -Q --help=target|grep march
  -march=                     		core-avx2

否则,可能会显示如下内容(不包含avx):

[root@aicloud-1 nvidia-soft]# gcc -march=native -Q --help=target|grep march
  -march=                     		core2

  1. 如果支持avx指令集,可以安装 tensorflow 1.6.0及以上的版本。
  2. 如果不支持,最高只能安装 tensorflow 1.5.0的版本。

(3)扩展:Linux显存持续占用问题。

  • 通过nvidia-smi查看GPU状态:
[root@aicloud-1 ~]# nvidia-smi
Wed Aug 28 11:53:08 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.87.00    Driver Version: 418.87.00    CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla V100-PCIE...  Off  | 00000000:00:1A.0 Off |                  Off |
| N/A   29C    P0    35W / 250W |  16115MiB / 16130MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      3466      C   python3                                      509MiB |
+-----------------------------------------------------------------------------+

可以发现,GPU的显存已经占满,但是下面的进程列表却没有显示。

而且,实际在运行python代码的时候,却出现如下问题,说明GPU显存没有被释放。

failed to allocate 15.26M(15997184 bytes) from device : CUDA_ERROR_OUT_OF_MEMORY

执行如下代码,可以查看当前实际占用显存的进程号:

[root@aicloud-1 ~]# fuser /dev/nvidia*
25911 25912 25913 25914 25915 25916 25917 25918 25919 25924 25926 25927 25928 25929 25930 25931 25932 25933 25934 25935 25936 25939 25940 25941 25942 25943 25944 25945 25947 25948 25950 25957

将这些进程全部杀掉后再次执行,则发现显存已经释放:

[root@aicloud-1 ~]# kill -9 25911 25912 25913 25914 25915 25916 25917 25918 25919 25924 25926 25927 25928 25929 25930 25931 25932 25933 25934 25935 25936 25939 25940 25941 25942 25943 25944 25945 25947 25948 25950 25957
[root@aicloud-1 ~]# nvidia-smi
Wed Aug 28 12:04:25 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.87.00    Driver Version: 418.87.00    CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla V100-PCIE...  Off  | 00000000:00:1A.0 Off |                  Off |
| N/A   32C    P0    35W / 250W |      0MiB / 16130MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
[root@aicloud-1 ~]#


posted @ 2020-01-02 15:30  GC_AIDM  阅读(5757)  评论(0编辑  收藏  举报