nvcc和NVIDIA-smi显示的不同CUDA版本

我对运行which nvccnvidia-smi所显示的不同CUDA版本感到非常困惑。我在ubuntu 16.04上安装了cuda9.2和cuda10。现在我将PATH设置为cuda9.2。所以当我跑的时候

$ which nvcc
/usr/local/cuda-9.2/bin/nvcc

然而,当我跑步的时候

$ nvidia-smi
Wed Nov 21 19:41:32 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.72       Driver Version: 410.72       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 106...  Off  | 00000000:01:00.0 Off |                  N/A |
| N/A   53C    P0    26W /  N/A |    379MiB /  6078MiB |      2%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1324      G   /usr/lib/xorg/Xorg                           225MiB |
|    0      2844      G   compiz                                       146MiB |
|    0     15550      G   /usr/lib/firefox/firefox                       1MiB |
|    0     19992      G   /usr/lib/firefox/firefox                       1MiB |
|    0     23605      G   /usr/lib/firefox/firefox                       1MiB |

所以我是使用cuda9.2作为which nvcc建议,还是使用cuda10作为nvidia-smi建议?我看到了这个答案,但它没有提供直接的答案的混乱,它只是要求我们重新安装CUDA工具包,这是我已经做的。

162814 次浏览

CUDA有两个主要的API,运行时API和驱动程序API。两者都有相应的版本(例如8.0、9.0等)。

驱动程序API的必要支持(例如linux上的libcuda.so)由GPU驱动程序安装程序安装。

运行时API的必要支持(例如linux上的libcudart.so,以及nvcc)由CUDA工具包安装程序安装(其中可能还捆绑了GPU驱动程序安装程序)。

在任何情况下,(安装的)驱动程序API版本可能并不总是与(安装的)运行时API版本相匹配,特别是如果你安装了一个独立于安装CUDA(即CUDA工具包)的GPU驱动程序。

nvidia-smi工具由GPU驱动程序安装程序安装,通常GPU驱动程序在视图中,而不是CUDA工具包安装程序安装的任何东西。

最近(在linux上的驱动程序版本介于410.48和410.73之间)NVIDIA的当权者决定在nvidia-smi的输出中添加驱动程序安装的CUDA驱动API版本的报告。

这与已安装的CUDA运行时版本没有连接。

nvcc,与CUDA工具包一起安装的CUDA编译驱动工具,将始终报告它构建时要识别的CUDA运行时版本。它不知道安装了什么驱动程序版本,甚至不知道是否安装了GPU驱动程序。

因此,根据设计,这两个数字不一定匹配,因为它们反映了两种不同的东西。

如果你想知道为什么nvcc -V显示了一个你不期望的CUDA版本(例如,它显示了一个不同于你认为你安装的版本)或根本不显示任何东西,版本方面,这可能是因为你没有遵循Cuda Linux安装指南的第7步(在CUDA 11之前)(或CUDA 11 linux安装指南中的第6步)中的强制性说明

注意,虽然这个问题主要是针对linux,但同样的概念也适用于窗户 CUDA安装。驱动程序有一个与之关联的CUDA驱动程序版本(例如,可以用nvidia-smi查询)。CUDA运行时也有一个与之相关的CUDA运行时版本。这两者并不一定在所有情况下都匹配。

在大多数情况下,如果nvidia-smi报告的CUDA版本在数值上等于或高于nvcc -V报告的CUDA版本,则无需担心。这是CUDA中定义的兼容路径(新的驱动程序/驱动程序API支持“旧的”;CUDA工具包/运行时API)。例如,如果nvidia-smi报告CUDA 10.2,而nvcc -V报告CUDA 10.1,通常不需要担心。它应该只是工作,这并不一定意味着你“实际上安装CUDA 10.2当你打算安装CUDA 10.1"

如果nvcc命令根本没有报告任何东西(例如Command 'nvcc' not found...),或者如果它报告了一个意外的CUDA版本,这也可能是由于不正确的CUDA安装,即上面提到的强制步骤没有正确执行。你可以通过使用像findlocate这样的linux实用程序(请使用手册页学习如何)来找到你的nvcc可执行文件来解决这个问题。假设只有一个,那么可以使用它的路径来修复path环境变量。CUDA linux安装指南也解释了如何设置它。您可能需要在PATH变量中调整CUDA版本,以匹配您所需/安装的实际CUDA版本。

类似地,当使用docker时,nvidia-smi命令通常会报告安装在基础机器上的驱动程序版本,而其他版本方法,如nvcc --version将报告安装在docker容器内的CUDA版本。

同样,如果您使用了CUDA“工具箱”的另一种安装方法;例如Anaconda,你可能会发现Anaconda所指示的版本并不“匹配”;由nvidia-smi指定的版本。然而,上述评论仍然适用。Anaconda安装的较旧的CUDA工具包可以与nvidia-smi报告的新版本一起使用,而nvidia-smi报告的CUDA版本比Anaconda安装的版本更新/更高的事实并不意味着你有安装问题。

在这里是另一个类似的问题。上述处理并不以任何方式表明此答案仅适用于有意或无意地安装了多个CUDA版本的情况。这种情况自己呈现出来。nvccnvidia-smi报告的版本可能不匹配,这是预期行为,在大多数情况下非常正常。

nvcc在CUDA bin文件夹中-因此检查CUDA bin文件夹是否已添加到你的$PATH中。

具体来说,确保你已经执行了CUDA安装后操作(例如,从在这里):

  1. 将CUDA Bin添加到$PATH(即将以下行添加到你的~/.bashrc)
export PATH=/usr/local/cuda-10.1/bin:/usr/local/cuda-10.1/NsightCompute-2019.1${PATH:+:${PATH}}

PS.确保上面的两个路径首先存在:/usr/local/cuda-10.1/bin/usr/local/cuda-10.1/NsightCompute-2019.1 (NsightCompute路径可能会有稍微不同的结尾,这取决于安装的Nsight计算版本…

  1. 更新$LD_LIBRARY_PATH(即将以下行添加到你的~/bashrc中)。
export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64\
${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

在此之后,nvccnvidia-smi(或nvtop)报告相同的CUDA版本…

如果你正在使用cuda 10.2:

export PATH=/usr/local/cuda-10.2/bin:/opt/nvidia/nsight-compute/2019.5.0${PATH:+:${PATH}}

可能有帮助,因为当我检查时,cuda-10.2中没有sight-compute目录。 我不确定这只是我的问题,或者为什么他们不在官方文件中提到它

nvidia-smi可以显示与nvcc报告的“不同的CUDA版本”。因为他们报告了两件不同的事情:

nvidia-smi显示给定GPU驱动程序的最大可用CUDA版本支持。 nvcc -V报告的第二件事是系统当前正在使用的CUDA版本

简而言之

nvidia-smi显示您的驱动程序支持的CUDA的最高版本。nvcc -V显示当前CUDA安装的版本。只要驱动程序支持的版本比安装的版本高,就没问题。你甚至可以同时安装几个版本的CUDA。

加上罗伯特·克罗维拉的答案……

设备驱动程序和运行时驱动程序之间的区别在于,使用设备驱动程序,您将能够运行编译好的CUDA C代码。也就是说,你可以下载CUDA驱动的应用程序,它们将能够成功地在你的GPU上执行它们的代码。

然而,使用运行时驱动程序,你将能够编译CUDA C代码,然后在GPU上的设备驱动程序的帮助下执行。

第2.2.3节- Cuda开发工具包