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

290
我对运行which nvccnvidia-smi所显示的不同CUDA版本感到非常困惑。我在我的ubuntu 16.04上安装了cuda9.2和cuda10。现在我将路径设置为指向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 Toolkit,而我已经这样做了。

100
我想我在过去几天看到过完全相同的问题,但现在似乎找不到重复的了。答案是:nvidia-smi会显示您的驱动程序支持的CUDA版本。您安装的最近的410.x驱动程序支持CUDA 10。驱动程序支持的版本与您编译和链接程序使用的版本无关。支持CUDA 10.0的驱动程序也能运行为CUDA 9.2构建的应用程序... - Michael Kenzel
1
@MichaelKenzel 我明白了,谢谢你的澄清!我想我会使用CUDA9.2。 - yuqli
这里有一个类似的问题链接。如果你想添加答案,我会点赞 @MichaelKenzel。 - Robert Crovella
1
@RobertCrovella 是的,那就是我在寻找的答案。我只是从你的评论中学到了答案,所以如果有人应该得到点赞的话,那就是你自己 ;) - Michael Kenzel
8个回答

374
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 Driver API版本报告。
这与已安装的CUDA运行时版本没有关联。
CUDA工具包安装时安装的CUDA编译器驱动程序工具nvcc将始终报告其构建用于识别的CUDA运行时版本。它不知道已安装哪个驱动程序版本,甚至不知道是否安装了GPU驱动程序。
因此,按设计,这两个数字不一定匹配,因为它们反映了两个不同的事物。
如果您想知道为什么nvcc -V显示了您不希望看到的CUDA版本(例如,它显示了一个与您认为安装的版本不同的版本),或者根本没有显示任何版本信息,那么可能是因为您在cuda linux install guide的步骤7(CUDA 11之前)(或CUDA 11 linux安装指南中的步骤6)中没有遵循强制性说明。
请注意,尽管这个问题主要涉及linux,但同样的概念也适用于windows CUDA安装。驱动程序有一个与之关联的CUDA驱动程序版本(例如可以使用nvidia-smi查询)。CUDA运行时也有一个与之关联的CUDA运行时版本。两者在某些情况下不一定匹配。
在大多数情况下,如果nvidia-smi报告的CUDA版本与nvcc -V报告的版本相等或更高,则这不是一个值得关注的问题。这是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实用程序(请使用man页面学习如何操作)来找到您的nvcc可执行文件并解决问题。假设只有一个,则可以使用其路径来修复PATH环境变量。 CUDA linux install guide还解释了如何设置此内容。您可能需要调整PATH变量中的CUDA版本以匹配所需/安装的实际CUDA版本。
同样,在使用Docker时,nvidia-smi命令通常会报告基本机器上安装的驱动程序版本,而其他版本方法(如nvcc --version)将报告在Docker容器内安装的CUDA版本。
同样,如果您已使用Anaconda等CUDA“工具包”的另一种安装方法,则可能会发现Anaconda指示的版本与nvidia-smi指示的版本不“匹配”。但是,上述评论仍然适用。通过Anaconda安装的旧CUDA工具包可以与nvidia-smi报告的更新版本一起使用,并且nvidia-smi报告比Anaconda安装的版本更高的CUDA版本并不意味着您有安装问题。

这里有一个类似的问题。上面的解答并不意味着只有在您有意或无意地安装了多个CUDA版本时才适用。这种情况会在任何安装CUDA时出现。由nvccnvidia-smi报告的版本可能不匹配,这是预期的行为,在大多数情况下非常正常。


5
根据英伟达公司的说明,驱动程序API和运行时API之间的区别在于:驱动程序API是用于对CUDA设备进行底层硬件访问和控制,而运行时API则提供了更高级别的抽象,可使开发人员更轻松地编写CUDA应用程序。 - HongboZhu
1
@Rober Crovella 非常感谢您解释得这么清楚。我遇到了同样的情况,nvidia-smi 显示 CUDA 版本为 10.1,而 nvcc 显示为 9.1。现在可以直接训练网络还是需要重新安装? - Dhiren Hamal
2
该评论很有帮助,但并没有解释如果nvcc报告的版本比nvidia-smi高(比如10.2),会发生什么情况。在这种情况下,Cuda会尝试将其编译为10.2并尝试在10.1上运行它。这通常会导致运行时错误,例如"RuntimeError: CUDA error: no kernel image is available for execution on the device" - TheSaurus
令人惊叹的解释,我一直在苦苦思索为什么conda显示的版本与nvidia-smi不同,你的帖子解释了一切。 - Raymond
@RobertCrovella,您能否抽出一些时间看一下:https://dev59.com/ElI8sIgBPY-HTNNjTPVJ?谢谢! - velenos14
显示剩余3条评论

10

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}}

请确保先存在以下两个路径:/usr/local/cuda-10.1/bin 和 /usr/local/cuda-10.1/NsightCompute-2019.1(Nsight Compute的路径根据所安装版本略有不同)。更新$LD_LIBRARY_PATH(即将以下行添加到您的~/bashrc中)。
export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64\
                         ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

完成这项操作后,nvccnvidia-smi (或者 nvtop) 均会报告相同的 CUDA 版本...


这是因为$PATH$指定了使用CUDA 10。但有些软件需要不同版本的CUDA。 - yuqli
在CUDA 10.0中,NsightCompute-2019.1被称为NsightCompute-1.0 - Astrid
2
我按照后安装步骤进行了操作,但是nvcc和nvidia-smi仍然显示不同的cuda版本。 - BeingMIAkashs
每次我打开终端时,都必须运行两个路径命令(来自CUDA安装步骤7中的后续安装)。有没有办法让状态持久化,而不必反复运行路径命令? - monti
@monti 是的,你可以将命令写入 .bashrcbash_profile 中,这样它就会在每个 bash 会话中自动加载。请参见此处:https://dev59.com/5WUq5IYBdhLWcg3wQ-Xk - yuqli

6
为了人们制作了这个图,希望能使它更清晰。我现在终于明白为什么nvidia-smi的版本可以比nvcc的版本更高,因为nvidia-smi显示的是驱动程序的版本(这是最底层的)。nvcc是高级别的,所以较低的版本对它来说不是问题。
基于@Robert Crovella给出的得票最高的答案。

enter image description here


2

nvidia-smi 可以显示与 nvcc 报告的“不同的 CUDA 版本”。因为它们报告了两个不同的东西:

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

简而言之

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


1
这个回答也是正确的,为什么会被踩呢?nvidia-smi只是显示驱动程序支持的最大CUDA版本,并不能真正暗示CUDA是否已安装。 - Alex Punnen

2
由于“nvcc --version”和“nvidia-smi”报告了您系统的CUDA设置的不同方面,因此导致了CUDA版本之间的差异。
“nvcc --version”报告的是您安装的CUDA工具包的版本。这是用于编译CUDA代码的版本。
另一方面,“nvidia-smi”报告的是您的GPU驱动程序支持的最大CUDA版本。
在您的情况下,“nvcc --version”报告的是CUDA 10.1,因为这是您安装的CUDA工具包的版本。“nvidia-smi”报告的是不同的版本,因为您的GPU驱动程序可以支持该CUDA版本。
当您运行一个CUDA程序时,使用的CUDA版本取决于用于编译程序的CUDA工具包的版本。然而,程序使用的CUDA版本也必须得到您的GPU驱动程序的支持。如果您的GPU驱动程序不支持程序使用的CUDA版本,您将遇到错误。

0
长话短说,这是因为安装了两个不同版本的CUDA工具包,其中一个是旧版本并且仍然在路径上。例如,我的发行版预装的版本位于/usr/bin/nvcc。在我安装新版本后,默认路径变为/usr/local/cuda/bin/nvcc。使用which nvcc命令可以找到您系统上的路径。
不用担心,您可以通过在.bashrc文件中添加以下内容来解决这个问题:
export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}

-1
在Robert Crovella的答案上添加...
设备驱动程序和运行时驱动程序的区别在于,使用设备驱动程序可以运行编译后的CUDA C代码。也就是说,您可以下载CUDA支持的应用程序,并能够成功地在您的GPU上执行它们的代码。
而使用运行时驱动程序,则可以编译CUDA C代码,然后在设备驱动程序的帮助下在您的GPU上执行。 第2.2.3节 - CUDA开发工具包

-3

如果您正在使用cuda 10.2:

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

这可能有所帮助,因为当我检查时,cuda-10.2中没有nsight-compute目录。我不确定这是否只是我的问题,否则为什么官方文档中不提到呢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接