为什么/usr/local下有多个前缀为cuda的目录?

/usr/local目录下拥有多个 CUDA 目录的原因是为了在同一系统中支持不同版本的 CUDA 工具包。CUDA 是 NVIDIA 开发的并行计算平台和编程模型,用于 GPU 加速计算。它提供一组库、工具和 API,使得开发人员能够创建高性能应用程序并在 NVIDIA GPU 上运行。每个 CUDA 工具包版本都可能需要不同的库、头文件和二进制文件等文件。因此,在同一系统上安装多个 CUDA 工具包版本是很常见的,以支持不同的应用程序或使用场景。
默认情况下,CUDA 工具包安装在/usr/local/cuda目录中。然而,为了支持多个版本,可以使用不同的目录,例如/usr/local/cuda-11.0用于版本 11.0,/usr/local/cuda-10.2用于版本 10.2。这允许单独安装不同版本的 CUDA,并确保每个应用程序可以找到所需的特定 CUDA 版本的适当库和二进制文件。
总之,/usr/local 目录下拥有多个 CUDA 目录可以更方便地管理不同的 CUDA 安装,并确保每个应用程序都可以访问其所需的正确版本的工具包。

安装/更新CUDA

安装Nvidia驱动

在正式安装CUDA之前,需要先安装Nvidia驱动,也可以直接下载对应驱动。
打开,选择Latest Production Branch Version即可,下载后sudo sh NVIDIA-Linux-x86_64-$DRIVER_VERSION.run即可。

安装CUDA

以 X86_64 的 Ubuntu 18.04 系统为例,要安装 CUDA Toolkit,可以按照以下步骤进行操作:

  1. 访问 CUDA Toolkit Downloads 网页。
  2. 选择相应的操作系统、体系结构和发行版本。在此示例中,选择 Linux 操作系统、X86_64 架构和 Ubuntu 18.04 发行版本。
  3. 在页面下方,找到 “Installation Instructions” 部分,并复制提供的安装命令。
  4. 在终端窗口中粘贴复制的安装命令,并按照命令行提示进行操作。
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda-repo-ubuntu1804-12-1-local_12.1.0-530.30.02-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-12-1-local_12.1.0-530.30.02-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu1804-12-1-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda

务必记得重新启动设备。

如何维护多版本CUDA?

您可以使用以下命令来查看/usr/local目录下所有以 cuda 为前缀的目录:

ls -d /usr/local/cuda*
# /usr/local/cuda  /usr/local/cuda-12.1

通常情况下,在/usr/local目录下可能会存在多个以 cuda 为前缀的目录,这是由于在安装或更新 CUDA 工具包时,可能会创建不同版本的目录。在/usr/local目录下,有多个以cuda为前缀的目录。其中,**/usr/local/cuda**目录是当前版本的软链接,它指向包含当前正在使用的 CUDA 工具包的文件和目录的cuda目录,也称为cuda-。

ls -dla $(readlink -f /usr/local/cuda)

其他以cuda为前缀的目录可能是旧版本或备份,根据实际需求可以选择是否删除这些目录。您也可以使用nvidia-smi命令来确认当前 CUDA 版本,以便确定是否存在其他旧版本的 CUDA 目录。
如果需要删除旧版本的 CUDA,可以按照以下步骤进行操作:

  1. 确认当前 CUDA 版本:使用nvidia-smi命令查看当前 CUDA 版本,以便确定需要删除哪些旧版本的 CUDA 目录。
  2. 使用命令ls -d /usr/local/cuda*列出所有 CUDA 目录。这将显示当前在 /usr/local 中存在的所有 CUDA 目录。
  3. 确定要删除的 CUDA 目录(切记不能删除cuda和cuda-目录)。
  4. 使用命令sudo rm -rf <cuda-directory-name>删除该目录。例如,如果要删除 CUDA 10.0 目录,可以使用命令 sudo rm -rf cuda-10.0。
  5. 对于您要删除的任何其他旧 CUDA 目录,请重复步骤 4。

使用 rm 命令时需要谨慎,因为它会永久删除文件和目录,无法恢复。因此,在使用该命令删除目录之前,请确保已确定正确的目录。
如果误删了CUDA目录或者文件,可能会导致系统无法正常使用CUDA功能,此时可以通过重新安装CUDA来解决问题。

排错

Failed to initialize NVML: Driver/library version mismatch

在运行nvidia-smi命令时,出现了"Failed to initialize NVML: Driver/library version mismatch"错误。而在运行程序时,出现了"kernel version 520.61.5 does not match DSO version 530.30.2 – cannot find working devices in this configuration"的错误提示。通常情况下,这种错误发生在cuda更新后未重新启动系统时调用程序。解决这个问题的方法很简单,只需要重启系统即可。

sudo reboot

现在,我们可以分析一下错误提示所提供的信息,以"kernel version 520.61.5 does not match DSO version 530.30.2 – cannot find working devices in this configuration"为例。这个错误提示表明,内核版本和DSO(动态共享对象)版本之间存在版本不匹配,导致设备配置方面出现了问题。
内核版本是指操作系统的核心,它负责管理系统的硬件资源并为所有其他部分提供基本服务,我们可以通过cat /proc/driver/nvidia/version查看。而DSO是一个共享库,在运行时加载,并由多个应用程序使用。
在此情况下,内核版本为520.61.5(即cat /proc/driver/nvidia/version结果),而DSO版本为530.30.2,是一个较新的版本。这种版本不匹配可能会导致内核和DSO之间的兼容性问题,进而影响设备的配置。要解决这个问题,尝试重启,通常能够解决该问题。

cat /proc/driver/nvidia/version的用处

cat /proc/driver/nvidia/version命令的作用是显示当前系统上安装的 NVIDIA 图形驱动程序的版本。
执行该命令时,会读取 “/proc/driver/nvidia” 目录中的 “version” 文件,其中包含 NVIDIA 内核模块版本、NVIDIA 驱动程序版本和 NVIDIA CUDA 版本等信息。命令的输出通常类似于以下内容:

NVRM version: NVIDIA UNIX x86_64 Kernel Module  530.30.02  Wed Feb 22 04:11:39 UTC 2023
GCC version:  gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1) 

第一行显示当前加载到 Linux 内核中的 NVIDIA 内核模块版本。第二行显示用于构建内核模块的 GCC 编译器版本,第三行显示当前系统安装的 CUDA 工具包版本。
总体而言,cat /proc/driver/nvidia/version命令是一个有用的工具,可以快速检查 Linux 系统上安装的 NVIDIA 图形驱动程序的版本。

Loaded runtime cuDNN library: 8.1 but source was compiled with: 8.6

这个错误提示表示系统加载了 CuDNN 8.1 的运行时库,但是代码是使用 CuDNN 8.6 编译的。由于版本不匹配,所以出现了错误。
为了解决这个问题,可以尝试以下方法:

  • 更新运行时库:可以将系统中的 cuDNN 运行时库更新到 8.6 版本,以便与源代码版本匹配。如果无法解决问题,可以尝试更新 CUDA。
  • 重新编译源代码:如果不方便更新运行时库,可以尝试重新编译使用了 cuDNN 的源代码,以便使用 8.1 运行时库进行编译,以便与当前加载的运行时库版本匹配。
  • 回退到使用 8.1 版本的 cuDNN:如果更新运行时库或重新编译源代码不可行,可以考虑回退到使用 8.1 版本的 cuDNN,以便与当前加载的运行时库版本匹配。

需要注意的是,为了确保不会出现版本不匹配的问题,建议在开发环境中使用相同版本的运行时库和源代码进行开发和测试。这可以避免由版本不匹配引起的问题。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐