介绍
CUDA是英伟达(NVIDIA)推出的一种GPU编程平台和API,它允许开发者使用C/C++、Fortran等编程语言在NVIDIA的GPU上进行通用计算。CUDA最初是为了加速图形和图像处理而设计的,但随着GPGPU技术的发展,它已经成为了一种广泛应用于科学计算、数据分析、机器学习等领域的计算平台。
CUDA的主要特点包括:
- 并行计算:CUDA允许开发者使用GPU的大量核心进行并行计算,以加速各种计算密集型任务。
- 高效内存管理:CUDA提供了高效的内存管理机制,包括全局内存、共享内存、常量内存等,可以最大限度地利用GPU的内存资源。
- 强大的工具支持: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 | jean@jean-ubuntu:~$ lsb_release -a |
查看是否安装了gcc
执行命令:
gcc -v1
2
3jean@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
11jean@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
5blacklist 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
2sudo update-initramfs -u
sudo reboot重启后执行命令
lsmod | grep nouveau,如果没有屏幕输出,说明禁用 nouveau 成功1
2jean@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
23jean@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
21jean@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
2jean@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.解决方案:
查看当前驱动版本,执行命令:
ls /usr/src/ | grep nvidia1
2jean@jean-ubuntu:~$ ls /usr/src/ | grep nvidia
nvidia-535.113.01字符串nvidia-后面的部分都是驱动版本,查看驱动是存在的
编译nvidia驱动模块,执行命令如下:
1
2sudo apt-get install dkms
dkms install -m nvidia -v 535.113.01-v后跟显卡版本号
加载驱动模块,执行命令:
sudo modprobe nvidia完成以上步骤,在执行
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
9jean@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
10jean@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
25jean@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
25jean@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
18jean@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
3Please 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
2export 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
6jean@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 | jean@jean-ubuntu:~$ nvidia-smi |
表格参数详解:
- 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 |