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

Posted

技术标签:

【中文标题】nvcc 和 NVIDIA-smi 显示的不同 CUDA 版本【英文标题】:Different CUDA versions shown by nvcc and NVIDIA-smi 【发布时间】:2019-04-24 15:11:24 【问题描述】:

我对运行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 |

那么我是按照which nvcc 的建议使用cuda9.2,还是按照nvidia-smi 的建议使用cuda10?我saw this answer 但它并没有直接解决这个困惑,它只是要求我们重新安装我已经做过的 CUDA 工具包。

【问题讨论】:

我想在过去的几天里我已经多次看到这个确切的问题出现了。但我现在似乎找不到重复的。答案是:nvidia-smi 显示您的驱动程序支持的 CUDA 版本。您安装了支持 CUDA 10 的最新 410.x 驱动程序之一。驱动程序支持的版本与您编译和链接程序的版本无关。支持 CUDA 10.0 的驱动程序也将能够运行为 CUDA 9.2 构建的应用程序…… @MichaelKenzel 我明白了。感谢您的澄清!猜猜我用的是CUDA9.2.. 一个类似的问题是here。 @MichaelKenzel,如果您想添加我会投票的答案。 @RobertCrovella 是的,这就是我要找的那个。我只是从你那里的评论中得知答案,所以如果有人值得投票,那就是你自己;) 【参考方案1】:

CUDA 有 2 个主要 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 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.1 时实际安装了 CUDA 10.2”

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

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

同样,如果你使用过其他的CUDA“工具包”如Anaconda的安装方式,你可能会发现Anaconda指示的版本与nvidia-smi指示的版本不“匹配”。但是,上述 cmets 仍然适用。 Anaconda 安装的旧 CUDA 工具包可以与 nvidia-smi 报告的较新版本一起使用,nvidia-smi 报告的 CUDA 版本比 Anaconda 安装的更新/更高这一事实并不意味着您有安装问题。

Here 是另一个涵盖类似领域的问题。上述处理绝不表明此答案仅适用于您有意或无意安装了多个 CUDA 版本。 任何时候安装 CUDA 时都会出现这种情况。 nvccnvidia-smi 报告的版本可能不匹配,这是预期行为,在大多数情况下很正常。

【讨论】:

Difference between the driver and runtime APIs 根据 Nvidia。 @Rober Crovella 感谢您的澄清。我有同样的情况 nvidia-smi 显示 CUDA 版本 10.1 而 nvcc 显示 9.1。现在可以训练网络还是安装还可以? 我按照安装后的步骤进行操作,但 nvcc 和 nvidia-smi 仍然显示不同的 cuda 版本 完全有可能。如果您安装了最新的驱动程序(导致 nvidia-smi 当前显示 CUDA 10.2)但较早版本的 CUDA(例如 10.1),那么与 nvcc 相比,nvidia-smi 报告的差异会有所不同。在这种情况下,这不是问题。 该评论很有帮助,但没有解释如果 nvcc 报告的版本(比如 10.2)比 nvidia-smi(比如 10.1)更高会发生什么。在这种情况下,Cuda 会尝试将其编译为 10.2 并尝试在 10.1 上运行它。这通常会导致运行时错误,以"RuntimeError: CUDA error: no kernel image is available for execution on the device" 为例。【参考方案2】:

nvcc 位于 CUDA bin 文件夹中 - 因此请检查 CUDA bin 文件夹是否已添加到您的 $PATH

具体来说,确保您已执行 CUDA 安装后操作(例如来自 here):

    将 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 计算版本,NsightCompute 路径的结尾可能略有不同...

    更新$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。 NsightCompute-2019.1 在 CUDA 10.0 中被称为 NsightCompute-1.0 我按照安装后的步骤进行操作,但 nvcc 和 nvidia-smi 仍然显示不同的 cuda 版本 每次打开终端时,我都必须运行两条路径命令(来自步骤 7 中的 cuda 安装后)。有没有办法可以保持状态而不必重复运行路径命令? @monti 是的,您可以将命令写入.bashrcbash_profile,以便为每个 bash 会话自动加载。见这里:***.com/questions/14637979/…【参考方案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 目录。 我不确定这是否只是我的问题,或者他们为什么不在官方文档中提及它。

【讨论】:

【参考方案4】:

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

nvidia-smi 显示了 GPU 驱动程序对 CUDA 版本的最大可用支持。 nvcc -V 报告的第二件事是您的系统有一个支持 CUDA 9.2(系统实际使用的 CUDA 版本)的 CUDA 工具包。

【讨论】:

以上是关于nvcc 和 NVIDIA-smi 显示的不同 CUDA 版本的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

nvcc和nvidia-smi显示的版本不一致?

nvcc和nvidia-smi显示的版本不一致?

nvcc和nvidia-smi显示的版本不一致?