缘起
最近买了一块Nvidia RTX 4060 Ti (8GB)显卡,为了物尽其用,我想在Ubuntu上使用这块显卡进行游戏、CUDA编程、深度学习等。但是在Ubuntu上使用Nvidia显卡并不是一件容易的事情,需要进行一些设置,下面记录一下我在Ubuntu上使用Nvidia显卡的相关设置。
Ubuntu安装Nvidia显卡驱动
查看显卡信息
首先,我们需要查看一下我们的显卡信息,打开终端,输入以下命令:
如果你的电脑上安装了英伟达的显卡,你会看到类似以下的输出:
1
|
01:00.0 VGA compatible controller: NVIDIA Corporation Device 2803 (rev a1)
|
不知道为啥,我的电脑上显示的是NVIDIA Corporation Device 2803
,而不是RTX 4060 Ti
,不过没关系,我们只需要知道这是一块英伟达的显卡就行了。
安装Nvidia显卡驱动
- 首先删除可能已经安装的Nvidia显卡驱动:
1
2
3
|
sudo apt-get remove --purge '^nvidia-.*'
sudo apt-get remove --purge '^libnvidia-.*'
sudo apt-get remove --purge '^cuda-.*'
|
- 安装可能缺失的依赖项:
1
|
sudo apt-get install linux-headers-$(uname -r)
|
- 添加Nvidia显卡驱动PPA源并更新:
1
2
|
sudo add-apt-repository ppa:graphics-drivers
sudo apt-get update
|
- 安装Nvidia显卡驱动:
1
|
sudo ubuntu-drivers autoinstall
|
-
重启电脑
-
确认显卡驱动是否安装成功:
如果你看到了类似以下的输出,那么恭喜你,你的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显卡驱动。
- 查看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
|
- 禁用Nouveau显卡驱动:
1
|
cat <<EOF | sudo tee /etc/modprobe.d/blacklist-nouveau.conf\nblacklist nouveau\noptions nouveau modeset=0\nEOF
|
- 更新initramfs:
然后我们需要更新启动时加载的内核模块:
1
|
sudo update-initramfs -u
|
-
重启电脑
-
确认Nouveau显卡驱动是否被禁用:
如果没有任何输出,那么说明Nouveau显卡驱动已经被禁用了。
测试显卡
我们可以使用glmark2
来测试显卡性能。
- 安装
glmark2
:
1
|
sudo apt-get install glmark2
|
- 运行
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
=======================================================
|
并且会有一个窗口弹出来,显示正在测试的内容。测试完成后,终端中会显示测试的分数。
游戏
Linux系统本来是不太适合玩游戏的,但是随着Steam的推广,越来越多的游戏可以通过Proton在Linux上运行。Proton是Valve开发的一个基于Wine的工具,可以在Linux上运行Windows游戏。
安装Steam
- 下载Steam安装包:
1
|
wget https://cdn.cloudflare.steamstatic.com/client/installer/steam.deb
|
- 安装Steam:
- 安装可能缺失的依赖项:
1
|
sudo apt-get install -f
|
- 运行Steam:
- 登录Steam账号
安装Proton
在Steam中,选择可以在Linux上运行的游戏,然后点击Settings
,在Steam Play
选项卡中,勾选Enable Steam Play for supported titles
和Enable Steam Play for all other titles
,然后在Steam Play
下拉菜单中选择一个Proton版本,点击OK
。
等待Proton安装完成后,就可以在Linux上运行Windows游戏了。
安装游戏
如果你是第一次使用Steam,尚未购买任何游戏,你可以选择一些免费的游戏进行测试,例如《Dota 2》、《Counter-Strike: Global Offensive》等。
CUDA编程
CUDA是英伟达公司推出的并行计算平台和编程模型,可以利用GPU的并行计算能力,加速计算密集型应用程序。CUDA编程需要安装Nvidia显卡驱动和CUDA工具包。而且CUDA版本和Nvidia显卡驱动版本有一定的对应关系,需要根据自己的显卡驱动版本选择合适的CUDA版本。
安装CUDA
- 查看Nvidia显卡驱动需要的CUDA版本:
在CUDA Version
一行中,可以看到Nvidia显卡驱动需要的CUDA版本,例如CUDA Version: 12.5
。即我们需要安装CUDA 12.5。
- 下载CUDA安装包:
在Nvidia官网下载对应的CUDA安装包,选择合适的操作系统、架构、发行版、版本等。
注意,我们需要安装的是CUDA 12.5,但进入官网之后默认显示的是12.6,不过这也没有关系。我们选择通过网络安装,会看到下面的安装指南:
我们只需要把最后一行的命令改成我们需要的CUDA版本即可。
- 安装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
|
- 配置环境变量:
如果安装成功,你会在/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,可以将以上内容添加到对应的配置文件中。
- 测试CUDA:
如果你看到了类似以下的输出,那么说明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编程环境。
- 下载CUDA示例程序:
1
|
git clone https://github.com/NVIDIA/cuda-samples.git
|
- 编译CUDA示例程序:
- 运行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。
- 安装cuDNN:
cuDNN是Nvidia提供的深度学习库,可以加速深度学习框架的运行。我们需要在Nvidia官网下载对应的cuDNN安装包,然后安装。
- 安装深度学习框架:
在安装cuDNN之后,我们可以安装深度学习框架了。以PyTorch为例:
1
|
pip install torch torchvision torchaudio
|
- 测试深度学习框架:
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提供的一个工具,可以让Docker容器访问Nvidia显卡。
- 添加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
|
- 安装Nvidia Container Toolkit:
1
2
|
sudo apt-get install nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
|
- 重启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显卡驱动。