Featured image of post Ubuntu上Nvidia显卡设置:游戏、CUDA、深度学习、Docker等

Ubuntu上Nvidia显卡设置:游戏、CUDA、深度学习、Docker等

在Ubuntu上使用Nvidia显卡的相关设置:游戏、CUDA编程、深度学习、Docker容器等

缘起

最近买了一块Nvidia RTX 4060 Ti (8GB)显卡,为了物尽其用,我想在Ubuntu上使用这块显卡进行游戏、CUDA编程、深度学习等。但是在Ubuntu上使用Nvidia显卡并不是一件容易的事情,需要进行一些设置,下面记录一下我在Ubuntu上使用Nvidia显卡的相关设置。

Ubuntu安装Nvidia显卡驱动

查看显卡信息

首先,我们需要查看一下我们的显卡信息,打开终端,输入以下命令:

1
lspci | grep VGA

如果你的电脑上安装了英伟达的显卡,你会看到类似以下的输出:

1
01:00.0 VGA compatible controller: NVIDIA Corporation Device 2803 (rev a1)

不知道为啥,我的电脑上显示的是NVIDIA Corporation Device 2803,而不是RTX 4060 Ti,不过没关系,我们只需要知道这是一块英伟达的显卡就行了。

安装Nvidia显卡驱动

  1. 首先删除可能已经安装的Nvidia显卡驱动:
1
2
3
sudo apt-get remove --purge '^nvidia-.*'
sudo apt-get remove --purge '^libnvidia-.*'
sudo apt-get remove --purge '^cuda-.*'
  1. 安装可能缺失的依赖项:
1
sudo apt-get install linux-headers-$(uname -r)
  1. 添加Nvidia显卡驱动PPA源并更新:
1
2
sudo add-apt-repository ppa:graphics-drivers
sudo apt-get update
  1. 安装Nvidia显卡驱动:
1
sudo ubuntu-drivers autoinstall
  1. 重启电脑

  2. 确认显卡驱动是否安装成功:

1
nvidia-smi

如果你看到了类似以下的输出,那么恭喜你,你的Nvidia显卡驱动安装成功了:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.57.02    Driver Version: 470.57.02    CUDA Version: 12.5     |
|-------------------------------+----------------------+----------------------+
| 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 RTX 4060 Ti  Off  | 00000000:01:00.0 Off |                  N/A |
| N/A   41C    P8    10W /  N/A |      0MiB /  7611MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

禁用Nouveau显卡驱动

Nouveau是一个开源的Nvidia显卡驱动,但是它的性能不如Nvidia官方的闭源驱动,所以我们需要禁用Nouveau显卡驱动。

  1. 查看Nouveau显卡驱动是否被加载:
1
lsmod | grep nouveau

如果你看到了类似以下的输出,那么说明Nouveau显卡驱动被加载了:

1
2
3
4
5
6
7
nouveau              2457600  1
mxm_wmi                16384  1 nouveau
ttm                   106496  1 nouveau
drm_kms_helper        217088  1 nouveau
drm                   552960  3 drm_kms_helper,nouveau,ttm
wmi                    36864  2 mxm_wmi,nouveau
video                  49152  1 nouveau
  1. 禁用Nouveau显卡驱动:
1
cat <<EOF | sudo tee /etc/modprobe.d/blacklist-nouveau.conf\nblacklist nouveau\noptions nouveau modeset=0\nEOF
  1. 更新initramfs:

然后我们需要更新启动时加载的内核模块:

1
sudo update-initramfs -u
  1. 重启电脑

  2. 确认Nouveau显卡驱动是否被禁用:

1
lsmod | grep nouveau

如果没有任何输出,那么说明Nouveau显卡驱动已经被禁用了。

测试显卡

我们可以使用glmark2来测试显卡性能。

  1. 安装glmark2
1
sudo apt-get install glmark2
  1. 运行glmark2
1
glmark2

如果在终端中看到了类似以下的输出,那么说明显卡性能测试成功:

1
2
3
4
5
6
7
8
=======================================================
    glmark2 2021.02
=======================================================
    OpenGL Information
    GL_VENDOR:     NVIDIA Corporation
    GL_RENDERER:   NVIDIA GeForce RTX 4060 Ti/PCIe/SSE2
    GL_VERSION:    4.6.0 NVIDIA 555.58.02
=======================================================

并且会有一个窗口弹出来,显示正在测试的内容。测试完成后,终端中会显示测试的分数。

glmark2

游戏

Linux系统本来是不太适合玩游戏的,但是随着Steam的推广,越来越多的游戏可以通过Proton在Linux上运行。Proton是Valve开发的一个基于Wine的工具,可以在Linux上运行Windows游戏。

安装Steam

  1. 下载Steam安装包:
1
wget https://cdn.cloudflare.steamstatic.com/client/installer/steam.deb
  1. 安装Steam:
1
sudo dpkg -i steam.deb
  1. 安装可能缺失的依赖项:
1
sudo apt-get install -f
  1. 运行Steam:
1
steam
  1. 登录Steam账号

Steam

安装Proton

在Steam中,选择可以在Linux上运行的游戏,然后点击Settings,在Steam Play选项卡中,勾选Enable Steam Play for supported titlesEnable Steam Play for all other titles,然后在Steam Play下拉菜单中选择一个Proton版本,点击OK

等待Proton安装完成后,就可以在Linux上运行Windows游戏了。

安装游戏

如果你是第一次使用Steam,尚未购买任何游戏,你可以选择一些免费的游戏进行测试,例如《Dota 2》、《Counter-Strike: Global Offensive》等。

Dota 2

CUDA编程

CUDA是英伟达公司推出的并行计算平台和编程模型,可以利用GPU的并行计算能力,加速计算密集型应用程序。CUDA编程需要安装Nvidia显卡驱动和CUDA工具包。而且CUDA版本和Nvidia显卡驱动版本有一定的对应关系,需要根据自己的显卡驱动版本选择合适的CUDA版本。

安装CUDA

  1. 查看Nvidia显卡驱动需要的CUDA版本:
1
nvidia-smi

CUDA Version一行中,可以看到Nvidia显卡驱动需要的CUDA版本,例如CUDA Version: 12.5。即我们需要安装CUDA 12.5。

  1. 下载CUDA安装包:

Nvidia官网下载对应的CUDA安装包,选择合适的操作系统、架构、发行版、版本等。

CUDA

注意,我们需要安装的是CUDA 12.5,但进入官网之后默认显示的是12.6,不过这也没有关系。我们选择通过网络安装,会看到下面的安装指南:

CUDA

我们只需要把最后一行的命令改成我们需要的CUDA版本即可。

  1. 安装CUDA:
1
2
3
4
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get install cuda-toolkit-12-5
  1. 配置环境变量:

如果安装成功,你会在/usr/local/cuda-12.5目录下看到CUDA的安装文件。我们需要配置环境变量,使得CUDA可以被找到。

如果你使用bash,可以在~/.bashrc文件中添加以下内容:

1
2
3
echo 'export PATH=/usr/local/cuda-12.5/bin${PATH:+:${PATH}}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.5/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc
source ~/.bashrc

如果使用其他shell,可以将以上内容添加到对应的配置文件中。

  1. 测试CUDA:
1
nvcc --version

如果你看到了类似以下的输出,那么说明CUDA安装成功:

1
2
3
4
5
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Thu_Jun__6_02:18:23_PDT_2024
Cuda compilation tools, release 12.5, V12.5.82
Build cuda_12.5.r12.5/compiler.34385749_0

编译CUDA程序

可以使用Nvidia提供的CUDA示例程序来测试CUDA编程环境。

  1. 下载CUDA示例程序:
1
git clone https://github.com/NVIDIA/cuda-samples.git
  1. 编译CUDA示例程序:
1
2
cd cuda-samples
make
  1. 运行CUDA示例程序:
1
2
cd Samples/1_Utilities/deviceQuery
./deviceQuery

如果你看到了类似以下的输出,那么说明CUDA编程环境设置成功:

 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
./deviceQuery Starting...

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

Detected 1 CUDA Capable device(s)

Device 0: "NVIDIA GeForce RTX 4060 Ti"
  CUDA Driver Version / Runtime Version          12.5 / 12.5
  CUDA Capability Major/Minor version number:    8.9
  Total amount of global memory:                 7810 MBytes (8188919808 bytes)
  (034) Multiprocessors, (128) CUDA Cores/MP:    4352 CUDA Cores
  GPU Max Clock rate:                            2565 MHz (2.57 GHz)
  Memory Clock rate:                             9001 Mhz
  Memory Bus Width:                              128-bit
  L2 Cache Size:                                 33554432 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
  Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total shared memory per multiprocessor:        102400 bytes
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  1536
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 2 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device supports Managed Memory:                Yes
  Device supports Compute Preemption:            Yes
  Supports Cooperative Kernel Launch:            Yes
  Supports MultiDevice Co-op Kernel Launch:      Yes
  Device PCI Domain ID / Bus ID / location ID:   0 / 1 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 12.5, CUDA Runtime Version = 12.5, NumDevs = 1
Result = PASS

这里显示的是我的电脑上的显卡是GeForce RTX 4060 Ti,CUDA版本是12.5,还有显存大小、CUDA核心数、GPU时钟频率等信息。如果你看到了类似的输出,那么说明CUDA编程环境设置成功,

然后你就可以开始编写自己的CUDA程序了。

深度学习

深度学习是最常用的机器学习方法之一,可以用来解决图像识别、自然语言处理、推荐系统等问题。深度学习通常需要大量的数据和计算资源,因此使用GPU来加速深度学习训练是非常常见的。

安装深度学习框架

目前比较流行的深度学习框架有TensorFlow、PyTorch、Keras等,这些框架都支持GPU加速。在安装深度学习框架之前,我们需要先安装CUDA和cuDNN。

  1. 安装cuDNN:

cuDNN是Nvidia提供的深度学习库,可以加速深度学习框架的运行。我们需要在Nvidia官网下载对应的cuDNN安装包,然后安装。

  1. 安装深度学习框架:

在安装cuDNN之后,我们可以安装深度学习框架了。以PyTorch为例:

1
pip install torch torchvision torchaudio
  1. 测试深度学习框架:
1
2
import torch
print(torch.cuda.is_available())

如果你看到了True,那么说明PyTorch安装成功,并且可以使用GPU加速。

训练模型

现在你可以使用GPU来加速深度学习模型的训练了。例如我们可以下载PyTorch官方提供的例子来测试。

1
2
3
4
git clone https://github.com/pytorch/examples.git
cd examples/time_sequence_prediction
python generate_sine_wave.py
python train.py

这是一个利用长短期记忆网络(LSTM)来预测正弦波的例子,你可以根据自己的需求修改模型和数据。

Docker容器

我之前用Docker运行了不少应用,但都是运行在CPU上的,现在有了Nvidia显卡,我想在Docker容器中使用GPU加速,比如将之前运行的大语言模型迁移到GPU上。

安装Nvidia Container Toolkit

Nvidia Container Toolkit是Nvidia提供的一个工具,可以让Docker容器访问Nvidia显卡。

  1. 添加Nvidia Container Toolkit PPA源:
1
2
3
4
5
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
  1. 安装Nvidia Container Toolkit:
1
2
sudo apt-get install nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
  1. 重启Docker服务:
1
sudo systemctl restart docker

使用GPU加速Docker容器

现在我们可以在Docker容器中使用GPU加速了,例如:

1
docker run --gpus all nvidia/cuda:12.5-base nvidia-smi

我一般使用docker-compose来管理Docker容器,可以在docker-compose.yml文件中添加GPU配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
version: '3'

services:
  service-name:
    container_name: container-name
    image: image-source/image-name:tag
    environment:
      - SOME_ENV_VAR=some_value
    ports:
      - "host_port:container_port"
    deploy:
      resources:
        reservations:
          devices:
          - driver: nvidia
            capabilities: ["gpu"]
            count: all
    volumes:
      - /path/on/host:/path/in/container
    restart: always

这样就可以在Docker容器中使用GPU的计算能力了。

问题解决

我在第一次安装完Nvidia驱动后直接重启电脑,结果电脑无法进入桌面,卡在了命令行界面,而且我无法输入任何命令。我怀疑是Nouveau显卡驱动没有被禁用,导致Nvidia显卡驱动无法正常工作。

而且我似乎没有设置过恢复模式,所以没法进入恢复模式来修复问题。我又不想重装系统,因为原来的系统里有很多重要的东西。

最后我只能通过U盘启动了一个Ubuntu系统,挂载原来的系统分区,通过chroot命令进入原来的系统,然后卸载Nvidia驱动,再重启电脑。

但这一过程又出现了一些小插曲,因为我U盘中的Ubuntu系统是24.04,而我原来电脑里的系统是22.04,所以在chroot进入原来的系统后,apt-get update时似乎安装了一些错误的驱动,导致电脑重启后网络没了,无论是无线还是网线都无法连接。而且内核版本号也给我更新到了更新的版本,似乎也出现了一些兼容性的问题。

所以我只能在U盘里重新搞了一个22.04的Ubuntu系统,然后再次chroot进入原来的系统,使用apt-get update更新,再补上Linux相关的额外模块dpkg -s linux-modules-extra-$(uname -r) | grep status,最后更新启动时的初始化内存文件系统update-initramfs -u、更新启动项update-grub。重启电脑后终于恢复正常了,除了系统的内核更新到了一个新的版本,其他的应该恢复到了原来的状态。

最后重新安装Nvidia显卡驱动,这次不再重启电脑,而是先禁用Nouveau显卡驱动,再更新初始化内存文件系统和启动项,最后再重启电脑,终于成功安装了Nvidia显卡驱动。

comments powered by Disqus