Jean's Blog

一个专注软件测试开发技术的个人博客

0%

Ubuntu CUDA环境准备

介绍

CUDA是英伟达(NVIDIA)推出的一种GPU编程平台和API,它允许开发者使用C/C++、Fortran等编程语言在NVIDIA的GPU上进行通用计算。CUDA最初是为了加速图形和图像处理而设计的,但随着GPGPU技术的发展,它已经成为了一种广泛应用于科学计算、数据分析、机器学习等领域的计算平台。

CUDA的主要特点包括:

  1. 并行计算:CUDA允许开发者使用GPU的大量核心进行并行计算,以加速各种计算密集型任务。
  2. 高效内存管理:CUDA提供了高效的内存管理机制,包括全局内存、共享内存、常量内存等,可以最大限度地利用GPU的内存资源。
  3. 强大的工具支持:CUDA提供了一系列强大的工具支持,包括CUDA编译器、CUDA调试器、CUDA性能分析器等,可以帮助开发者更加高效地开发和调试CUDA程序。

总之,CUDA是一种基于NVIDIA GPU的GPGPU编程平台和API,它允许开发者使用C/C++、Fortran等编程语言在GPU上进行通用计算,是一种广泛应用于科学计算、数据分析、机器学习等领域的计算平台。

CUDA的意义在于它提供了一种高效的通用计算平台,可以利用GPU的并行计算能力加速各种计算密集型任务,包括科学计算、数据分析、机器学习等。CUDA的出现,使得GPU不再局限于图形和图像处理,而是成为了一种通用的计算资源。

CUDA的意义还在于它为开发者提供了一种相对简单易用的GPGPU编程模型,开发者可以使用C/C++、Fortran等编程语言进行编程,而不需要学习复杂的GPU架构和指令集。CUDA提供了高效的内存管理机制和强大的工具支持,可以帮助开发者更加高效地开发和调试CUDA程序。

另外,CUDA的意义还在于它推动了GPGPU技术的发展和应用。随着CUDA的出现和不断发展,越来越多的应用程序开始利用GPU进行通用计算,这使得GPU成为了一种重要的计算资源,为各种计算密集型任务提供了高效的加速能力。

系统准备

ubuntu系统版本

1
2
3
4
5
6
jean@jean-ubuntu:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.3 LTS
Release: 22.04
Codename: jammy

查看是否安装了gcc

  • 执行命令:gcc -v

    1
    2
    3
    jean@jean-ubuntu:~$ gcc -v
    Command 'gcc' not found, but can be installed with:
    sudo apt install gcc
  • 看到环境缺失gcc,需要安装,安装命令: sudo apt-get install build-essential

  • 再次执行命令:gcc -v验证是否安装完成

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    jean@jean-ubuntu:~$ gcc -v
    Using built-in specs.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper
    OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa
    OFFLOAD_TARGET_DEFAULT=1
    Target: x86_64-linux-gnu
    Configured with: ../src/configure -v --with-pkgversion='Ubuntu 11.4.0-1ubuntu1~22.04' --with-bugurl=file:///usr/share/doc/gcc-11/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-11 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-11-XeT9lY/gcc-11-11.4.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-11-XeT9lY/gcc-11-11.4.0/debian/tmp-gcn/usr --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2
    Thread model: posix
    Supported LTO compression algorithms: zlib zstd
    gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)

禁用 Ubuntu 原本的显卡驱动(避免与 Nvidia 显卡驱动冲突)

  • 创建或者编辑/etc/modprobe.d/blacklist-nouveau.conf文件,在其中添加如下代码

    1
    2
    3
    4
    5
    blacklist nouveau
    blacklist lbm-nouveau
    options nouveau modeset=0
    alias nouveau off
    alias lbm-nouveau off
  • 保存后在命令行执行如下命令,关闭系统自带的显卡驱动,避免与 Nvidia 的显卡驱动发生冲突

    1
    echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
  • 重启内核,验证是否关闭成功

    1
    2
    sudo update-initramfs -u
    sudo reboot
  • 重启后执行命令lsmod | grep nouveau,如果没有屏幕输出,说明禁用 nouveau 成功

    1
    2
    jean@jean-ubuntu:~$ lsmod | grep nouveau
    jean@jean-ubuntu:~$

安装显卡驱动

查找适合的驱动版本

  • 执行命令:ubuntu-drivers devices,根据命令显示的匹配驱动,找到合适的版本,如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    jean@jean-ubuntu:~$ ubuntu-drivers devices
    == /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
    modalias : pci:v000010DEd00001F08sv000010DEsd000012FDbc03sc00i00
    vendor : NVIDIA Corporation
    model : TU106 [GeForce RTX 2060 Rev. A]
    driver : nvidia-driver-525-server - distro non-free
    driver : nvidia-driver-450-server - distro non-free
    driver : nvidia-driver-470-server - distro non-free
    driver : nvidia-driver-525-open - distro non-free
    driver : nvidia-driver-535 - distro non-free recommended
    driver : nvidia-driver-470 - distro non-free
    driver : nvidia-driver-525 - distro non-free
    driver : nvidia-driver-418-server - distro non-free
    driver : nvidia-driver-535-open - distro non-free
    driver : nvidia-driver-535-server-open - distro non-free
    driver : nvidia-driver-535-server - distro non-free
    driver : xserver-xorg-video-nouveau - distro free builtin

    == /sys/devices/pci0000:00/0000:00:1c.4/0000:04:00.0 ==
    modalias : pci:v000014E4d000043A0sv0000106Bsd00000111bc02sc80i00
    vendor : Broadcom Inc. and subsidiaries
    model : BCM4360 802.11ac Wireless Network Adapter
    driver : bcmwl-kernel-source - distro non-free
  • 由于本机安装的是标准发行版的,则选择nvidia-driver-535 - distro non-free recommended进行安装

安装驱动

  • 执行命令:sudo apt install nvidia-driver-535,安装驱动

  • 安装完毕后,执行nvidia-smi命令可以正常查看到 GPU 的数据界面,说明安装成功,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    jean@jean-ubuntu:~$ nvidia-smi
    Thu Oct 12 17:20:34 2023
    +---------------------------------------------------------------------------------------+
    | NVIDIA-SMI 535.113.01 Driver Version: 535.113.01 CUDA Version: 12.2 |
    |-----------------------------------------+----------------------+----------------------+
    | 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 RTX 2060 Off | 00000000:01:00.0 On | N/A |
    | 30% 46C P0 38W / 160W | 57MiB / 6144MiB | 0% Default |
    | | | N/A |
    +-----------------------------------------+----------------------+----------------------+

    +---------------------------------------------------------------------------------------+
    | Processes: |
    | GPU GI CI PID Type Process name GPU Memory |
    | ID ID Usage |
    |=======================================================================================|
    | 0 N/A N/A 21778 G /usr/bin/gnome-shell 55MiB |
    +---------------------------------------------------------------------------------------+

    报错:

    1
    2
    jean@jean-ubuntu:~$ nvidia-smi
    NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

    解决方案:

    1. 查看当前驱动版本,执行命令: ls /usr/src/ | grep nvidia

      1
      2
      jean@jean-ubuntu:~$ ls /usr/src/ | grep nvidia
      nvidia-535.113.01

      字符串nvidia-后面的部分都是驱动版本,查看驱动是存在的

    2. 编译nvidia驱动模块,执行命令如下:

      1
      2
      sudo apt-get install dkms
      dkms install -m nvidia -v 535.113.01

      -v后跟显卡版本号

    3. 加载驱动模块,执行命令:sudo modprobe nvidia

    4. 完成以上步骤,在执行nvidia-smi

安装CUDA

找到合适的版本(不建议安装最新版本 CUDA,注意 pytorch 支持)

首先根据上一步中命令nvidia-smi 输出内容找到最高适配的 CUDA 版本,再根据 Pytorch 官网上对 CUDA 的支持信息,确定本次安装的 CUDA 版本为 11.8,现阶段 pytorch 对 CUDA 的支持还主要在 11.7、11.8 版本,更高的 12.1 版本支持属于预览版( nightly),为了稳定建议先用 11.8,或者根据显卡型号和 pytorch 官网找到符合的版本

下载CUDA

  • 在 NVIDIA 的开发者官方下载地址 找到对应版本 CUDA,按照系统版本、内核等信息选择后,可以直接拿到安装文件或者安装命令,本示例中使用 runfile 的方式安装

    1
    wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
  • 注意: 由于 CUDA 文件较大,安装时会占用/tmp 下很大的容量(大概 5G+),可能因为/tmp 容量不够而导致报错推出,可以在/etc/fstab 中新增/tmp 挂载的方式,临时将部分内存挂载到/tmp 目录修改容量,避免安装失败

    • 先查看当前tmp的大小

      1
      2
      3
      4
      5
      6
      7
      8
      9
      jean@jean-ubuntu:~$ df -h
      Filesystem Size Used Avail Use% Mounted on
      tmpfs 3.2G 2.1M 3.2G 1% /run
      /dev/nvme1n1p3 458G 23G 412G 6% /
      tmpfs 16G 0 16G 0% /dev/shm
      tmpfs 5.0M 4.0K 5.0M 1% /run/lock
      /dev/nvme0n1p1 599M 48M 552M 8% /boot/efi
      tmpfs 3.2G 84K 3.2G 1% /run/user/128
      tmpfs 3.2G 68K 3.2G 1% /run/user/1000
    • ,加入如下内容

      1
      2
      3
      4
      # 找到原本的/tmp挂载设置,前面加#将它注释掉,没有新增即可
      # /dev/disk/by-uuid/fba367b1-46bd-4b28-b769-5db19dce6129 /tmp ext4 defaults 0 1
      # 新加一行将/tmp挂载到内存中的方式,提前确认好内存的大小,避免内存不足,size中设置的是新的/tmp大小
      tmpfs /tmp tmpfs nodev,nosuid,size=10G 0 0
  • 修改完毕后需要重启机器,然后使用df -h命令查看/tmp 目录的大小是否有变动

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    jean@jean-ubuntu:~$ df -h
    Filesystem Size Used Avail Use% Mounted on
    tmpfs 3.2G 2.1M 3.2G 1% /run
    /dev/nvme1n1p3 458G 27G 408G 7% /
    tmpfs 16G 0 16G 0% /dev/shm
    tmpfs 5.0M 4.0K 5.0M 1% /run/lock
    tmpfs 10G 0 10G 0% /tmp
    /dev/nvme0n1p1 599M 48M 552M 8% /boot/efi
    tmpfs 3.2G 76K 3.2G 1% /run/user/128
    tmpfs 3.2G 68K 3.2G 1% /run/user/1000

安装CUDA

  • 设置好/tmp 文件夹大小后,切换到之前下载 run 文件的文件夹内,执行命令安装 CUDA

    1
    sudo sh cuda_11.8.0_520.61.05_linux.run
  • 因为之前已经安装过显卡驱动,所以在安装 CUDA 时会出现额外的提示,建议先卸载驱动再继续安装,这里直接选择 Continue 即可

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    jean@jean-ubuntu:~$
    ┌─────────────────────────────────────────────────────────────────────────────┐
    │ Existing package manager installation of the driver found. It is strongly │
    │ recommended that you remove this before continuing. │
    │ Abort │
    │ Continue │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ Up/Down: Move | 'Enter': Select │
  • 下一步是一个用户协议,输入 accept 即可

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    jean@jean-ubuntu:~$
    ┌──────────────────────────────────────────────────────────────────────────────┐
    │ End User License Agreement │
    │ -------------------------- │
    │ │
    │ NVIDIA Software License Agreement and CUDA Supplement to │
    │ Software License Agreement. Last updated: October 8, 2021 │
    │ │
    │ The CUDA Toolkit End User License Agreement applies to the │
    │ NVIDIA CUDA Toolkit, the NVIDIA CUDA Samples, the NVIDIA │
    │ Display Driver, NVIDIA Nsight tools (Visual Studio Edition), │
    │ and the associated documentation on CUDA APIs, programming │
    │ model and development tools. If you do not agree with the │
    │ terms and conditions of the license agreement, then do not │
    │ download or use the software. │
    │ │
    │ Last updated: October 8, 2021. │
    │ │
    │ │
    │ Preface │
    │ ------- │
    │ │
    │──────────────────────────────────────────────────────────────────────────────│
    │ Do you accept the above EULA? (accept/decline/quit): │
    │ │
  • 注意!最后一步中是选择要安装的内容,前面在提示驱动已存在时,我们没有额外处理驱动,所以这一步一定要选中 Driver 选项,使用 Enter 将选中的 X 去掉,避免重复安装驱动导致的异常

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    ┌──────────────────────────────────────────────────────────────────────────────┐
    │ CUDA Installer │
    │ - [ ] Driver │
    │ [ ] 520.61.05 │
    │ + [X] CUDA Toolkit 11.8 │
    │ [X] CUDA Demo Suite 11.8 │
    │ [X] CUDA Documentation 11.8 │
    │ - [ ] Kernel Objects │
    │ [ ] nvidia-fs │
    │ Options │
    │ Install │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ │
    │ Up/Down: Move | Left/Right: Expand | 'Enter': Select | 'A': Advanced options │
    • [X ] Driver 进来默认是有X的,按下回车,将X去掉

    • 键盘下移到Install,按下回车,进行安装

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      jean@jean-ubuntu:~$ sudo sh cuda_11.8.0_520.61.05_linux.run
      ===========
      = Summary =
      ===========

      Driver: Not Selected
      Toolkit: Installed in /usr/local/cuda-11.8/

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

      To uninstall the CUDA Toolkit, run cuda-uninstaller in /usr/local/cuda-11.8/bin
      ***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 520.00 is required for CUDA 11.8 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 /var/log/cuda-installer.log

配置环境变量

  • 安装完毕后,根据安装提示,将目录配置到环境变量中

    1
    2
    3
    Please make sure that
    - PATH includes /usr/local/cuda-11.8/bin
    - LD_LIBRARY_PATH includes /usr/local/cuda-11.8/lib64, or, add /usr/local/cuda-11.8/lib64 to /etc/ld.so.conf and run ldconfig as root
  • 编辑全部用户有效的环境文件 sudo vim /etc/profile,添加如下语句(语句中的具体路径根据安装时提示的路径自行修改)

    1
    2
    export PATH=/usr/local/cuda-11.8/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH
  • 使用命令直接加载source /etc/profile,或者重启服务器,使配置生效

  • 使用命令验证安装情况nvcc -V,如下图表示已经配置成功

    1
    2
    3
    4
    5
    6
    jean@jean-ubuntu:~$ nvcc -V
    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 2005-2022 NVIDIA Corporation
    Built on Wed_Sep_21_10:33:58_PDT_2022
    Cuda compilation tools, release 11.8, V11.8.89
    Build cuda_11.8.r11.8/compiler.31833905_0

    注:nvcc命令不存在,使用命令进行安装:sudo apt-get install nvidia-cuda-toolkit

  • 如果在准备步骤中修改了/tmp 的挂载位置,此时记得将它还原回原本的方式,重启后生效

完成以上步骤,到此CUDA就算完整的安装完毕了!

nvidia-smi命令详解

介绍

nvidia-sim简称NVSMI,提供监控GPU使用情况和更改GPU状态的功能,是一个跨平台工具,支持所有标准的NVIDIA驱动程序支持的Linux和WindowsServer 2008 R2 开始的64位系统。这个工具是N卡驱动附带的,只要装好驱动,就会有这个命令。

常用命令

1. 显示GPU当前的状态:

1
nvidia-smi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
jean@jean-ubuntu:~$ nvidia-smi
Sat Feb 1 13:52:39 2025
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.183.01 Driver Version: 535.183.01 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| 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 RTX 4060 Ti Off | 00000000:01:00.0 Off | N/A |
| 0% 20C P8 2W / 165W | 71MiB / 16380MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 1236 G /usr/lib/xorg/Xorg 56MiB |
| 0 N/A N/A 1323 G /usr/bin/gnome-shell 6MiB |
+---------------------------------------------------------------------------------------+

表格参数详解:

  • GPU:本机中的GPU编号(有多块显卡的时候,从0开始编号)图上GPU的编号是:0
  • Fan:风扇转速(0%-100%),N/A表示没有风扇,这个速度是计算机期望的风扇转速,实际情况下如果风扇堵转,可能打不到显示的转速。
  • Name:GPU类型,图上GPU的类型是:NVIDIA GeForce RTX 4060 Ti
  • Temp:GPU的温度(GPU温度过高会导致GPU的频率下降)
  • Perf:GPU的性能状态,从P0(最大性能)到P12(最小性能),图上是:P0
  • Persistence-M:持续模式的状态,持续模式虽然耗能大,但是在新的GPU应用启动时花费的时间更少,图上显示的是:off
  • Pwr:Usager/Cap:能耗表示,Usage:用了多少,Cap总共多少
  • Bus-Id:GPU总线相关显示,domain:bus:device.function
  • Disp.A:Display Active ,表示GPU的显示是否初始化
  • Memory-Usage:显存使用率
  • Volatile GPU-Util:GPU使用率
  • Uncorr. ECC:关于ECC的东西,是否开启错误检查和纠正技术,0/disabled,1/enabled
  • Compute M:计算模式,0/DEFAULT,1/EXCLUSIVE_PROCESS,2/PROHIBITED
  • Processes:显示每个进程占用的显存使用率、进程号、占用的哪个GPU
  • type:进程类型。C 表示计算进程,G 表示图形进程,C+G 表示都有。

2.隔几秒刷新一下显存状态:nvidia-smi -l 秒数

例如:隔两秒刷新一下GPU的状态:

1
nvidia-smi -l 2

3.将监控结果写入文件,并且指定写入文件的监控字段

1
nvidia-smi -l 1 --format=csv --filename=report.csv --query-gpu=timestamp,name,index,utilization.gpu,memory.total,memory.used,power.draw
  • -l:隔多久记录一次,命令中写的是1
  • –-format:结果记录文件格式是csv
  • –-filename: 结果记录文件的名字
  • -–query-gpu:记录哪些数据到csv文件
  • timestamp:时间戳
  • memory.total:显存大小
  • memory.total:显存使用了多少
  • utilization.gpu:GPU使用率
  • power.draw:显存功耗,对应Pwr:Usage

4.帮助命令

以上是常用的命令,要查看更多命令,使用帮助命令,查看即可

1
nvidia-smi  -h