跳转至

📔 CUDA 概述和环境准备 学习笔记

1. 环境说明

  • 系统:Ubuntu 20.04.5
  • GPU:RTX 3060Ti
  • gcc:9.4.0
  • 架构:x86_64

本文不是使用手册,只是记录基本的内容处理手册。

2. CUDA 概述

CUDA(Compute Unified Device Architecture)是由 NVIDIA 在2006年推出一个通用的并行计算架构,用来解决复杂的数据计算问题。支持多种编程语言和应用程序接口。

对于CUDA 来说,有两种形式的API:

  • Runtime API:通过CUDA toolkit安装的nvcc编译器、SDK等。

  • Driver API:驱动的安装,也就是查看显卡信息的 nvidia-smi 命令,因为是直接控制GPU硬件的。

3. CUDA基本环境配置

查看显卡是否CUDA,对应的信息查看:https://developer.nvidia.com/cuda-gpus

3.1 环境确认

  • 确认系统架构和OS版本

    uname -m && cat /etc/*release
    
    # 显示信息
    x86_64
    DISTRIB_ID=Ubuntu
    DISTRIB_RELEASE=20.04
    DISTRIB_CODENAME=focal
    DISTRIB_DESCRIPTION="Ubuntu 20.04.5 LTS"
    NAME="Ubuntu"
    VERSION="20.04.5 LTS (Focal Fossa)"
    ID=ubuntu
    ID_LIKE=debian
    PRETTY_NAME="Ubuntu 20.04.5 LTS"
    VERSION_ID="20.04"
    HOME_URL="https://www.ubuntu.com/"
    SUPPORT_URL="https://help.ubuntu.com/"
    BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
    PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
    VERSION_CODENAME=focal
    UBUNTU_CODENAME=focal
    
  • 检测系统内核头文件

    1
    2
    3
    uname -r
    # ubuntu系统
    sudo apt-get install linux-headers-$(uname -r)
    
  • 显卡正常安装

  • 禁用nouveau

    在Ubuntu中,由于系统自带了开源的 nouveau 驱动,所以在安装 NVIDIA驱动时,需要提前禁止驱动的运行。使用如下命令:

    lsmod | grep nouveau # 如果输出为空,则已经禁止
    

    如果未禁止,则创建配置文件:

    1
    2
    3
    4
    5
    cd /etc/modprobe.d
    sudo touch blacklist-nouveau.conf
    # 在新建的文件中增加如下内容
    blacklist nouveau
    options nouveau modeset=0
    
  • gcc 的版本确认

    1
    2
    3
    4
    5
    6
    7
    gcc --version
    
    # 显示信息
    gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
    Copyright (C) 2019 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    

3.2 安装NVIDIA驱动

  • 查看推荐的驱动版本

    ubuntu-drivers devices
    
    # 显示的信息如下
    == /sys/devices/pci0000:00/0000:00:03.1/0000:07:00.0 ==
    modalias : pci:v000010DEd00002489sv00001B4Csd0000153Cbc03sc00i00
    vendor   : NVIDIA Corporation
    driver   : nvidia-driver-510 - distro non-free
    driver   : nvidia-driver-515 - distro non-free recommended
    driver   : nvidia-driver-470 - distro non-free
    driver   : nvidia-driver-470-server - distro non-free
    driver   : nvidia-driver-510-server - distro non-free
    driver   : nvidia-driver-515-server - distro non-free
    driver   : xserver-xorg-video-nouveau - distro free builtin
    

    从信息中来看,系统默认推荐使用 nvidia-driver-515

  • 安装驱动

    选择如下方式其中之一即可安装

    1
    2
    3
    4
    # 直接使用可自动安装
    sudo ubuntu-drivers autoinstall
    # 指定驱动的版本
    sudo apt-get install nvidia-driver-515 -y
    

  • 重启,查看GPU驱动信息

    1
    2
    3
    4
    5
    6
    7
    8
    # 方式1:验证驱动的版本
    cat /proc/driver/nvidia/version
    # 显示信息:
    NVRM version: NVIDIA UNIX x86_64 Kernel Module  515.105.01  Mon Feb 27 12:49:44 UTC 2023
    GCC version:  gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1) 
    
    # 方式2:使用命令查看
    nvidia-smi
    

    方式2输出的信息如下:

    root@solerho /data # nvidia-smi
    Tue Sep 27 21:52:13 2022       
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 515.65.01    Driver Version: 515.65.01    CUDA Version: 11.7     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |                               |                      |               MIG M. |
    |===============================+======================+======================|
    |   0  NVIDIA GeForce ...  Off  | 00000000:07:00.0 Off |                  N/A |
    |  0%   41C    P8     6W / 240W |     14MiB /  8192MiB |      0%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    |    0   N/A  N/A      1407      G   /usr/lib/xorg/Xorg                  9MiB |
    |    0   N/A  N/A      1715      G   /usr/bin/gnome-shell                3MiB |
    +-----------------------------------------------------------------------------+
    

  • Nvidia-smi工具介绍

    • 管理和检测GPU
    • 查询和修改GPU状态
    • 支持多平台
    • 使用方法:nvidia-smi --help
      • 查看系统GPU:nvidia-smi -L
      • 查询GPU详细信息:nvidia-smi -q -i 0
      • 显示特定信息:nvidia-smi -q -i 0 -d(信息名称)

3.2 安装CUDA

CUDA-ToolKit 软件版本地址:https://developer.nvidia.com/cuda-toolkit-archive

由于使用 nvidia-smi 显示的信息中,CUDA version11.7 版本。最好选择对应的版本,因为后续使用的 Tensorflow-GPUPyTorch-GPU 会依赖于CUDA的指定版本。

在链接中,找到对应的版本,然后选择对应的信息后,会显示安装方式,可以选择相对应的方式,本人的使用方式如下:

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin

sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda-repo-ubuntu2004-11-7-local_11.7.0-515.43.04-1_amd64.deb

sudo dpkg -i cuda-repo-ubuntu2004-11-7-local_11.7.0-515.43.04-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2004-11-7-local/cuda-*-keyring.gpg /usr/share/keyrings/

sudo apt-get update
sudo apt-get -y install cuda

/root/.bashrc 中添加环境变量:

1
2
3
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CPUTI/lib64
export CUDA_PATH=/usr/local/cuda/bin
export PATH=$PATH:$LD_LIBRARY_PATH:$CUDA_PATH

使用命令 source /root/.bashrc 使得环境变量生效。

重新打开Terminal,然后查看 NVCC 是否安装成功。

# 方式1
cat /usr/local/cuda/version.txt

# 方式2
nvcc --version
nvcc -V

# 方式2 显示安装的信息如下
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Tue_May__3_18:49:52_PDT_2022
Cuda compilation tools, release 11.7, V11.7.64
Build cuda_11.7.r11.7/compiler.31294372_0

3.3 CUDA 卸载

直接使用命令进行清除:

sudo apt-get --purge remove "*nvidia*" -y

也可以使用如下命令再次确认驱动是否卸载完毕。

sudo /usr/bin/nvidia-uninstall # 显示找不到命令,则卸载干净

3.4 多版本CUDA共存

CUDA 的安装方式不变,如果需要多个版本的支持,但是又不想删除原来的版本,可以直接在安装特定的版本后,进行软链接处理。

1
2
3
4
# 先删除软链接
sudo unlink /usr/local/cuda
# 重新创建新的链接,原本是11.9,现创建使用 11.1 
sudo ln -s /usr/local/cuda-11.1 /usr/local/cuda

4. cuDNN 环境

cuDNN的软件版本地址:https://developer.nvidia.com/rdp/cudnn-archive,根据CUDA Version 去选择相对应的软件版本,中间会让其登陆或者注册账户,请自行处理。

4.1 cuDNN 概述

CUDA深度神经网络库(cuDNN)是NVIDIA 开发,是用于GPU加速的深度神经网络的原语库。

专注于训练神经网络和开发应用程序,通过cuDNN来实现GPU的高性能加速。也使得开发人员和研究人员无序花时间在底层GPU的性能调优伤。

目前cuDNN已经泛化到主流的深度学习框架中,例如TF、PyTorch、MxNet 和 PaddlePaddle等。

4.2 cuDNN 环境准备

# 下载文件,自行下载

# 拷贝文件和目录,赋予相对应的权限即可
# 本人下载的文件版本:8.5.0.96
tar -xvf cudnn-linux-x86_64-8.5.0.96_cuda11-archive.tar.xz

# 修改名字,方便拷贝文件,如果不改名,则文件进行对应处理
mv cudnn-linux-x86_64-8.5.0.96_cuda11-archive cuda
# 拷贝文件内容
sudo cp cuda/include/* /usr/local/cuda/include
sudo cp cuda/lib/libcudnn* /usr/local/cuda/lib64
# 赋予文件相对应的权限
sudo chmod a+r /usr/local/cuda/include/cudnn.h
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

4.3 查看cuDNN的版本

1
2
3
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
# 如果以上的方式未打印信息,则使用如下命令,因为在新版本中,一家改变了位置。详细信息也可以确认 cudnn.h 代码中的一句 #include "cudnn_version.h"
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

4.4 卸载cuDNN

# 查询cuDNN的信息
sudo dpkg -l | grep cudnn

# 使用dpkg命令卸载相关依赖库
sudo dpkg -r libcudnn8-samples
sudo dpkg -r libcudnn8-dev
sudo dpkg -r libcudnn8

# 使用命令再次查询确认信息,如果没有信息,则卸载成功
sudo dpkg -l | grep cudnn

如果如上的方式不可行,可以使用如下方式,直接清除:

1
2
3
# 该方式存在不可控性,所以不建议使用,除非对自己的环境很熟悉
sudo rm -rf /usr/local/cuda/include/cudnn*
sudo rm -rf /usr/local/cuda/lib64/libcudnn*

5. 一键Docker 方式使用CUDA 和 cudNN 环境

前置说明:

  • docker中步骤和Host上执行的步骤是一样的,故本人使用个人习惯的Docker方式进行处理。
  • 请确认环境中,是否已经安装Docker。
  • Docker 内未直接安装 CUDA 驱动,如果需要安装请自行安装。
  • 由于本人是自行对TF进行调优处理和优化,都是自行编译,所以Docker 内未安装 TF-GPU 和 Torch-GPU 版本,使用时根据情况安装。
  • Dockerfile 文件太久没有进行build,可能会存在build不成功的情况,请根据情况去Debug分析。

5.1 安装Docker

请直接参考方式:Docker环境准备 本内容主要是CUDA相关,所以此处不再进行过多赘述。

5.2 Dockerfile 文件

Dockerfile 文件的内容如下:Dockerfile.2004

由于Nvidia,在Docker内只要进行了提权操作,是可以直接在Docker内使用 nvidia-smi 直接查看N卡环境信息等。

Dockerfile 文件的使用方式为:

docker build -t ubuntu20.04:cuda11.7-cudnn8.5 --file Dockerfile .

5.3 Docker环境build后的使用方法

  • 启动Docker 并添加相应的权限和映射

    1
    2
    3
    docker run -itd --privileged=true  -p 6080:80 -p 5900:5900 -e RESOLUTION=1920x1080  -v /dev/shm:/dev/shm --name test-env ubuntu20.04:cuda11.7-cudnn8.5
    # 进入Docker
    docker exec -it test-env bash
    
  • Docker内查看CUDA版本

    1
    2
    3
    4
    # 方式1
    cat /proc/driver/nvidia/version
    # 方式2
    nvcc --version
    
  • Docker内查看cuDNN信息

    1
    2
    3
    cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
    # 如果以上的方式未打印信息,则使用如下命令,因为在新版本中,一家改变了位置。详细信息也可以确认 cudnn.h 代码中的一句 #include "cudnn_version.h"
    cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
    

6. 错误及其解决方案

错误1:Nvidia NVML Driver/library version mismatch

由于使用apt方式进行安装,不同内核升级,导致对应的Nvidia驱动升级,所以会存在版本不匹配的情况。

所以使用如下方式可解决:

sudo apt-get --purge remove "*nvidia*" -y

也可以使用如下命令再次确认驱动是否卸载完毕。

sudo /usr/bin/nvidia-uninstall # 显示找不到命令,则卸载干净

参考资源