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

Date: 2020/11/22

Coder: CW

Foreword:

CW 近日在自己的机子上发现,nvcc --version 和 nvidia-smi 显示出来的CUDA版本不一致,其中前者显示的版本是10.2,而后者是11.0,但是深度学习相关的程序是能正常跑的,期间GPU也确实有在使用(通过nvidia-smi可以看出)。

由于个人一贯以来的“居安思危”风格,担心这种情况会埋坑,于是查阅了相关资料进行了解,正好也弥补了这部分知识的空白。本文会先解释下 nvcc --version 和 nvidia-smi 各自显示出来的版本号的意义,然后分享下多版本CUDA切换的经验,最后再补充下如何正确选择与CUDA版本匹配的Pytorch。


nvcc & nvidia-smi

nvcc 属于CUDA的编译器,将程序编译成可执行的二进制文件,nvidia-smi 全称是 NVIDIA System Management Interface ,是一种命令行实用工具,旨在帮助管理和监控NVIDIA GPU设备。

CUDA有 runtime api 和 driver api,两者都有对应的CUDA版本, nvcc --version 显示的就是前者对应的CUDA版本,而 nvidia-smi显示的是后者对应的CUDA版本。

用于支持driver api的必要文件由 GPU driver installer 安装,nvidia-smi就属于这一类API;而用于支持runtime api的必要文件是由 CUDA Toolkit installer 安装的。nvcc是与CUDA Toolkit一起安装的CUDA compiler-driver tool,它只知道它自身构建时的CUDA runtime版本,并不知道安装了什么版本的GPU driver,甚至不知道是否安装了GPU driver。

CUDA Toolkit Installer通常会集成了GPU driver Installer,如果你的CUDA均通过CUDA Tooklkit Installer来安装,那么runtime api 和 driver api的版本应该是一致的,也就是说, nvcc --version 和 nvidia-smi 显示的版本应该一样。否则,你可能使用了单独的GPU driver installer来安装GPU dirver,这样就会导致 nvidia-smi 和 nvcc --version 显示的版本不一致了。

通常,driver api的版本能向下兼容runtime api的版本,即 nvidia-smi 显示的版本大于nvcc --version 的版本通常不会出现大问题。


多版本CUDA切换

多版本CUDA下载地址

进入以上链接下载指定版本的CUDA,这里以 CUDA Toolkit 11.0 Update 1 为例:

选择自己的操作系统、架构以及对应的安装类型。

CUDA安装(i)

安装类型建议选择 runfile 安装,使用deb的方式可能会将已安装的较新的显卡驱动替换掉。

选择完毕后根据提示的命令进行安装。

CUDA安装(ii)

接下来会出现窗口进行一些安装选项的选择,若你本地已经有了Driver并且你不想替换掉,那么可以不选择Driver进行安装。

安装完毕后,会在 /usr/local/ 目录下出现相应版本的cuda文件夹,我这里是 /usr/local/cuda-11.0/。在前言中提到,我 nvcc --version 的版本是10.2,现在我要将其替换为刚下载的11.0,那么可以:

1. 编辑 ~/.bashrc 文件

2. 更改 PATH 和 LD_LIBRARY_PATH 环境变量:

export PATH=/usr/local/cuda-11.0:$PATH

export LD_LIBRARY_PATH=/usr/local/cuda-11.0/lib64:$LD_LIBRARY_PATH

3. 保存内容退出,使其生效:source ~/.bashrc

现在,使用 nvcc --version 可以看到显示的版本已经是11.0了,与 nvidia-smi 的一致。

在这种方式下,每次我想使用其它CUDA版本的runtime api时,都需要更改~/.bashrc文件,这里再介绍另一种避免更改环境变量的方式:

i). 首先确保 PATH 和 LD_LIBRARY_PATH 中含有 /usr/local/cuda 路径,注意是/cuda而不是/cuda-xxx

ii). 删除之前创建的软链接:rm -rf /usr/local/cuda

iii). 建立新的软链接:sudo ln -s/usr/local/cuda-10.2/ /usr/local/cuda/ (此处代表我想使用10.2版本)

这样之后,通过 nvcc --version 可以看到CUDA runtime api的版本又切换回10.2了。


如何选择与CUDA版本匹配的Pytorch

那么 nvcc --version 与 nvidia-smi 的版本不一致的情况下,有些朋友可能就会懵了:我该如何选择与CUDA版本匹配的Pytorch呢?(炼个丹也太南了吧~!)

其实,只要上去Pytorch官网瞄瞄,细心的你应该能够发现在命令中指定CUDA版本时,用的是 cudatoolkit,而 nvcc --version 显示的版本就是通过CUDA Toolkit Installer在安装时决定的,因此,我们应该选择与 nvcc --version 对应的CUDA版本匹配的Pytorch。

Pytorch官网页面

相对而言,nvidia-smi 显示的是driver api对应的CUDA版本,若使用了单独的GPU driver Installer来安装驱动,那么nvidia-smi显示的版本与CUDA Toolkit所安装的版本就很可能不一致了。


END

许多炼丹爱好者可能都只注重花里胡哨的深度学习知识, 选择性地无视了关于硬件、GPU、计算芯片等方面的知识,这样,自己的短板就未免过于明显了。虽然不要求洋洋精通,但只要是与你从业领域相关的知识都应或多或少有所涉猎,这样做起事来才能得心应手。

另外,关于GPU与CUDA的知识可参考这篇文章 GPU与CUDA知识揭秘 ,内容全面同时也叙述简洁,非常棒,感恩乐于分享知识的朋友!




【CUDA】nvcc和nvidia-smi显示的版本不一致? - 简书 

### Windows 10 远程桌面连接 Windows 11 凭证不工作解决方案 当使用 Windows 10 的远程桌面功能连接至 Windows 11 设备,可能会遇到“你的凭据不工作”的错误提示。以下是可能的原因以及对应的解决方案: #### 可能原因分析 1. **凭据输入错误** 首先需确认输入用户名密码是否正确[^2]。即使看似简单,也应仔细核对。 2. **Windows 安全设置冲突** 如果凭据无误但仍无法正常连接,则可能是目标设备的安全设置阻止了该操作。例如,某些安全策略可能导致凭据验证失败[^3]。 3. **NTLM 身份验证问题** 默认情况下,现代操作系统会禁用较旧的身份验证协议(如 NTLM)。如果源设备与目标设备之间的身份验证方式存在差异,也可能引发此问题[^4]。 --- #### 解决方案 ##### 方法一:检查并重新输入凭据 确保在远程桌面客户端中使用的账户名格式正确。对于域环境下的用户,建议采用 `域名\用户名` 者 `计算机名\用户名` 的形式输入账号名称。 ##### 方法二:调整目标设备上的安全设置 在 Windows 11 上修改本地组策略以支持更宽松的身份验证机制: 1. 打开运行窗口 (`Win + R`)输入 `gpedit.msc` 启动本地组策略编辑器; 2. 导航路径为:`计算机配置 -> 管理模板 -> 系统 -> 凭据分配`; 3. 查找名为 “允许分配保存的凭据用于仅 NTLM 服务器身份验证” 的策略项,并将其状态设为启用; 4. 在弹出对话框中添加条目 `TERMSRV/*`,表示允许存储所有远程终端服务的相关凭据; 5. 应用更改后重启目标设备强制刷新组策略(`gpupdate /force`)。 ##### 方法三:更新网络适配器属性中的高级安全性选项 有网络级别的加密需求也会干扰正常的认证流程。可以通过以下步骤降低这些限制条件的影响程度: - 修改注册表键值来控制 RDP 加密级别。具体来说就是定位到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa 下新增 DWORD 类型的数据项 ForceGuest 和 DisableLoopbackCheck ,分别赋值为数值 1 表明接受较低强度保护模式的同忽略循环回送地址检测逻辑[^1]. ##### 方法四:切换其他第三方工具代替内置 Remote Desktop Client 假如上述办法均未能奏效的话,可以考虑改用 TeamViewer、AnyDesk 等跨平台兼容性强的应用程序完成类似的任务处理过程而无需担心复杂的权限校验环节带来的麻烦. --- ### 注意事项 尽管以上措施能够帮助缓解大部分场景下发生的此类异常状况,但在实际部署过程中仍需要注意平衡便利性和数据安全保障之间关系的重要性 。特别是针对企业内部敏感资料访问求而言更是如此——任何放宽准入门槛的行为都应该经过充分评估后再谨慎施行 。 ```python # 示例代码片段展示如何通过命令行快速同步最新版组策路设定 import os os.system('gpupdate /force') print("Group Policy has been successfully updated.") ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值