彻底搞清楚CUDA和cuDNN版本问题

彻底搞清楚CUDA和cuDNN版本问题

1. 缘起

我的机器上以下三条指令输出的版本不相同。

nvcc -V  # 这个输出11.7
nvidia-smi  # 右上角显示12.3
import torch; torch.version.cuda  # 这个输出12.1

我想以此为契机,彻底搞清楚CUDA、cuDNN和torch之间的关系。

环境:

Ubuntu 22.04

torch==2.1.2

2. CUDA

CUDA的版本傻傻分不清楚?请看电子包浆一图流:

在这里插入图片描述

Driver是唯一能驱动GPU的,一般N卡都自带。它虽然也叫CUDA,但深度学习项目中所说的CUDA不是它。

RuntimeDriver的进一步封装,API更简洁。一般需要自己安装。它就是我们在深度学习项目中所说的CUDA,因为Runtimetorch+cu版本的必要依赖。

ps:其实这张图画得有问题。CUDA Application不能同时用RuntimeDriver的API,两者是互斥的。

3. 各命令的区别

1. nvidia-smi

这个命令是CUDA Driver的组件,也就是说基本所有有N卡的机器都能使用这个命令。

请添加图片描述

注意,nvidia-smi 不可查询CUDA版本!!!这张图最上面的Driver Version是实际的版本号,但CUDA Version不是实际的版本号,而是当前Driver支持的最高CUDA版本。CUDA向下兼容,你的CUDA必须要小于等于这个版本号。

这里贴个nvidia-smi 命令的详细用法

2. nvcc -V

很简单,nvcc是CUDA Runtime的编译器。输出的版本号就是机器上CUDA Runtime的版本号。如下图第四行的末尾:

请添加图片描述

3. torch.version.cuda

它的输出不是当前CUDA的版本号!!!而是当前torch支持的最高CUDA版本!!!

上源码:
请添加图片描述
源码里的torch.version 都是用字符串写定的,根本没有去检查CUDA版本。

4. torch.backends.cudnn.version()

torch/cudnn/__init__.py 第八十行有源码(下图),但仅仅是一个封装了一个api,不知道输出究竟是什么逻辑。注意94行还有一个我们常用的is_available()请添加图片描述
再找__cudnn.version是怎么来的(下图)。第27行显示是_cudnn.getVersionInt(),注意到第十行,找到torch._C的目录(记得is_available()吗,同样是这个目录)。请添加图片描述
打开torch/_C全部是python存根。__init__.pyi里没有getVersionInt() ,有两个常量:_has_cuda_has_cudnn,只规定了bool类型。torch/_C中存在_cudnn.pyi,如下图:请添加图片描述
第5行所写的torch/csrc/cuda/shared/cudnn.cpp是空的。到这线索就断了。

结论

虽然没有找到可读的源码,但我们已经可以得出一些有效的结论:

##################################################### 
############ 以下的命令是反映机器上真实环境的 ############ 
##################################################### 
$ nvcc -V  # 查询CUDA Runtime版本
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Mon_Apr__3_17:16:06_PDT_2023
Cuda compilation tools, release 12.1, V12.1.105
Build cuda_12.1.r12.1/compiler.32688072_0>>> torch.backends.cudnn.is_available()  # 查询cuDNN是否可用
True>>> torch.backends.cudnn.version()  # cudnn的版本(输出代表8.9.02版本)
8902####################################################################### 
############ 以下命令输出只提示版本对应的关系,不代表机器上真实环境 ############
#######################################################################
$ nvidia-smi  # 输出省略>>> torch.version.cuda  
'12.1'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/517764.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

this关键字

定义:this是Java的一个关键字,表示 某个对象。 应用方式:不可以出现在类方法中 ,可出现在实例方法和构 造方法中。 在类的构造方法中 → 代表使用该构造方法所创建的对象 。 在实例方法中 → 代表正在调用该方法的 当前对象。 …

如何摆脱水印困扰?三款神器助您清爽无烦恼!

水印常常成为我们图片处理的一大难题,让我们苦恼不已。那么,如何能轻松摆脱这些烦人的水印呢?本文将向您推荐三款强大的去水印工具,让您清爽无烦恼,图片重焕光彩! 1. 水印云 如何快速而准确地去除各类水印…

实时智能应答数字人搭建

语音驱动口型的算法 先看效果: 你很快就可以帮得上我了 FACEGOOD 决定将语音驱动口型的算法技术正式开源,这是 AI 虚拟数字人的核心算法,技术开源后将大程度降低 AI 数字人的开发门槛。FACEGOOD是一家国际领先的3D基础软件开发商,…

解决/sys/kernel/debug/下没有任何文件的

问题: /sys/kernel/debug目录下没有任何信息 解决: 首先检查Debug Filesystem是否选中,其位置是: Kernel hacking -> Compile-time checks and compiler options -> Debug Filesystem 打开configs文件查看是否为y: arch/arm…

SpringCloud微服务-RabbitMQ快速入门

文章目录 RabbitMQ快速入门1、什么是MQ?2、RabbitMQ概述3、RabbitMQ的结构和概念4、常见消息模型5、HelloWorld RabbitMQ快速入门 1、什么是MQ? MQ (MessageQueue),中文是消息队列,字面来看就是存放消息的…

element多选框select下拉框数据回显的问题value.push is not a function

文章目录 问题描述 问题描述 今天在使用Element UI el-select组件遇到了一个问题,如下图: 下拉框里的值选中了,但是文本框里没有值 这是 el-select组件代码,我这里是用了一个多选框,options的值是在后端查询的,form.we…

太阳能模拟系统全光谱老化箱主要用于哪些行业

在科技日新月异的今天,产品的质量和耐用性成为了消费者关注的焦点。而太阳能模拟系统全光谱老化箱,作为一种模拟自然环境条件下材料老化的重要设备,正广泛应用于各个行业,为产品质量的保驾护航发挥着重要的作用。那么,…

『操作系统OS笔记』MAC(m1芯片)电脑安装FFmpeg

MAC(m1芯片)电脑安装FFmpeg mac电脑安装ffmpeg两种方法 文章目录 1. brew安装FFmpeg2. 官网下载FFmpeg压缩包3. 使用FFmpeg将音频和视频合并 1. brew安装FFmpeg brew install ffmpeg # 需要等比较久的时间,安装很多东西,安装过程中如果遇到报错对应解决…

2024 年 AI 辅助研发趋势:从研发数字化到 AI + 开发工具 2.0,不止于 Copilot

在上一年里,已经有不少的企业在工具链上落地了生成式 AI,结合我们对于这些企业的分析,以及最近在国内的一些 “新技术” 趋势,诸如于鸿蒙原生应用的初步兴起。从这些案例与趋势中,我们也看到了一些新的可能方向。 结合…

【JavaEE】_Spring MVC 项目单个及多个参数传参

目录 1. 传递单个参数 1.1 关于参数名的问题 2. 传递多个参数 2.1 关于参数顺序的问题 2.2 关于基本类型与包装类的问题 1. 传递单个参数 现创建Spring MVC项目,.java文件内容如下: package com.example.demo.controller;import org.springframewo…

机器人编程学习有哪些好处?

机器人编程学习有许多好处,无论是对个人还是对社会都具有重要意义。以下是机器人编程学习的一些好处: 1. **培养计算思维:** 通过机器人编程学习,可以培养逻辑思维、问题解决能力和创新思维。编程过程中需要分析问题、设计算法、…

使用数据库实现增删改查

#include<myhead.h>//定义添加数据函数int do_add(sqlite3 *ppDb) {//1.准备sql语句,输入要添加的信息int add_numb; //工号char add_name[20]; //姓名char add_sex[10]; //性别double add_score; //工资printf("请输入要添加的工号:")…