一文搞定cuda版本、显卡驱动及多CUDA版本管理

server/2024/9/18 8:54:07/ 标签: cuda, nvidia-smi

安装cuda是每个AI从业人员必经之路。网上关于cuda、显卡驱动已经相关命令很多都解释不清楚,于是本文梳理一下,既方便自己记忆,也方便小白学习。

CUDA

首先,CUDA版本,一般指cuda-toolkit,即cuda开发工具包,我们一般安装上层软件如pytorch等,都需要对应的toolkit版本就是指的CUDA版本。本机的CUDA版本,该怎么查询呢?

nvcc -V

这个命令,查到的就是本机正在用的cuda开发工具包的版本。注意,"nvidia-smi"查到的未必是最准确的本机cuda版本,后面我会给解释。

经过老黄团队的不懈努力,现在的cuda安装变得异常简单,有手就行。以cuda 11.3安装为例子,只需要简单搜索即可:

google search
我们很容易得到这个:

wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run
sudo sh cuda_11.3.0_465.19.01_linux.run

当然,还有一个很方便的途径来获得下载链接:
https://developer.nvidia.com/cuda-toolkit-archive

注意:通过这个方法一键安装cuda时,会有一个选项可以选择是否安装对应的显卡驱动。如果你本地有多个CUDA的时候,这个显卡驱动慎选。
CUDA Installer
安装完驱动以后,才可以使用"nvidia-smi",这个命令查询的是本机显卡驱动所对应的cuda版本,未必是现在用的cuda工具包的版本。于是,经常出现"nvidia-smi"和"nvcc -V"版本不一致的情况。

知识点
1, 一台机器可以有多个CUDA版本,多个CUDA版本可以通过软连接进行管理;
2,一台机器通常只能安装一个显卡驱动;
3,对于严格要求显卡驱动版本的项目(涉及底层编译),需要重新安装对应的显卡驱动以支持对应cuda版本;
4,对于不严格要求显卡驱动版本的项目,我们简单修改CUDA软连接即可切换CUDA版本,这个情况下"nvidia-smi"和"nvcc -V"版本不一致也不会影响项目的运行。

现在写一下具体操作:
所有的cuda默认安装路径是:“/usr/local/”
我们定一个软链接目标地址:“/usr/local/cuda”,将我们需要切换的cuda版本链接到这个目标地址即可。
我们需要在~/.bashrc(有的是"~/.zshrc")加入对应的软链接目标地址:

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

注意:这里不要加入版本号(如PATH=/usr/local/cuda-11.3/bin:$PATH),不然不好做多版本CUDA管理。
我们source一下,就能激活这两句命令:(zsh用户自动切换成zshrc)

source ~/.bashrc

完成这一步,就可以:

nvcc -V

可以看到准确的cuda开发工具包的版本了,我们pytorch等的安装参照这个版本对应即可。

如何切换CUDA版本呢?

cd /usr/local/
sudo rm cuda
sudo ln -s cuda-11.8 cuda
ll #查看是否切换成功
# cuda -> cuda-11.8

然后看一下nvcc -V,你就会发现,CUDA版本已经切换。不过,你用"nvidia-smi"时,会发现cuda version还是没变。

如何改变"nvidia-smi"中显示的cuda version呢? 答:重新显卡安装驱动。这里实在要注意的是:显卡驱动会影响本机显示器的显示,如果是带图形界面的linux需要先关闭图形界面。
关闭图形界面:

sudo service lightdm stop

卸载当前版本的显卡驱动:《卸载nvidia显卡驱动》

结论:我们在做多CUDA版本管理时,需要将多个CUDA版本安装到"/usr/local/"下,通过软链接切换。在涉及显卡驱动的更换时,我们需要将多个对应的显卡驱动安装文件,放到本地,随时准备安装这个版本的驱动。

如何获得对应CUDA版本的显卡驱动?答:直接运行CUDA runfile(即上文提到的cuda_11.3.0_465.19.01_linux.run),我们可以看到对应的nvidia驱动版本,然后到网上search对应的NVIDIA-Linux-x86_64-xxxx.run运行即可。当然,这一步也需要研究一下本机显卡的是否支持这个版本的驱动。
操作过程如下:

sudo chmod a+x NVIDIA-Linux-x86_64-465.19.01.run # 变成可执行文件
sudo ./NVIDIA-Linux-x86_64-465.19.01.run  --no-opengl-files # 执行安装

有一种说法(ChatGPT也这么说):

新版本的驱动会兼容老版本的CUDA。所以理论上我们安装一个最新的nvidia driver,就可以通过软链接来切换CUDA使用。我目前用这种方法,没出现太大的问题,仅供参考~

本文全部由本人整理,转发请询得同意,有问题欢迎留言交流~


http://www.ppmy.cn/server/42730.html

相关文章

JetBrains DataGrip 2024 for Mac:数据库管理的革命者

在数字化时代,数据库管理成为了企业运营和个人工作不可或缺的一部分。然而,如何高效地管理数据库,确保数据的准确性和安全性,一直是业界面临的重要挑战。JetBrains DataGrip 2024 for Mac,作为一款全新的数据库管理工具…

高中数学:平面向量-正交分解、坐标表示、坐标运算

一、正交分解 二、坐标表示 这里注意一点 坐标A(x,y)与向量 a → \mathop{a}\limits ^{\rightarrow} a→的坐标记作: a → \mathop{a}\limits ^{\rightarrow} a→(x,y),表示方式的区别 引申 三、加减运算的坐标表示 四、数乘运算的坐标表示 引申 两向量…

深入解析文华量化交易策略---交易指令如何选择

随着金融投资的迅猛发展,自动化策略模型已逐渐成为现代投资领域的一股重要力量。量化交易模型均以数据为驱动,通过运用数学模型和算法,对期货、黄金等投资市场走势进行精准预测和高效交易。 艾云策略整理了量化策略相关资料,希望通…

SQLite 如何导出某些SQLite3表的数据

https://deepinout.com/sqlite/sqlite-questions/44_sqlite_how_do_i_dump_the_data_of_some_sqlite3_tables.html 要导出整个SQLite3数据库的数据,可以使用SQLite3的.dump命令。首先,打开终端或命令提示符,并进入SQLite3终端会话。然后&…

React 组件创建以及使用

1.创建和嵌套组件 React 应用程序是由 组件 组成的。一个组件是 UI(用户界面)的一部分,它拥有自己的逻辑和外观。组件可以小到一个按钮,也可以大到整个页面。 React 组件是返回标签的 JavaScript 函数: function My…

PTK密钥传递攻击

一. PTK密钥传递攻击原理 1. PTK介绍 PTK(Pass The key),中文叫密钥传递攻击,PTH传递中,使用的是NTLM-HASH值,PTK使用 AES256或者AES128的方式进行传递,PTK 攻击只能用于kerberos认证中,NTLM认证中没有! 2.PTK的原理…

STM32HAL(四)中断与NVIC解析

目录 中断 中断作用与意义 NVIC 中断向量表 基本概念 功能和作用 NVIC工作原理 STM32中断优先级 1. 优先级分组 2. 优先级设置 3. 中断服务程序执行顺序 4. 配置方法 STM32 NVIC的使用 1,设置中断分组 2,设置中断优先级 3,使…

力扣226. 翻转二叉树(DFS的两种思路)

Problem: 226. 翻转二叉树 文章目录 题目描述思路复杂度Code 题目描述 思路 涉及二叉树的递归解法时往往需要考虑两种思路: 1.在递归遍历时执行题目需要的具体要求; 2.将一个大问题分解为多个小子问题 具体到本体: 思路1:遍历 先…

windows2008修改远程桌面端口,如何果断修改远程桌面端口,确保系统安全无忧!

在数字化时代的浪潮中,Windows 2008系统以其卓越的稳定性和可靠性,赢得了众多企业和个人的青睐。然而,随着网络安全问题的日益严峻,如何确保远程桌面连接的安全,成为了摆在我们面前的一道难题。今天,我将为…

ubuntu当前登录用户IP验证

设置一个白名单列表检查到登录用户IP信息不在白名单,发送信息到指定邮箱 #!/bin/bash# 定义常用IP地址列表文件 KNOWN_IP_FILE"/path/to/known_ips.txt" # 替换为实际路径# 定义邮件接收者 EMAIL_TO"test163.com"# 定义日志文件 LOG_FILE&quo…

作家百度百科怎么做出来的 怎么创建作家百科词条才能通过

创建作家百度百科词条需要遵循一定的步骤,并注意一些关键点,以确保词条能够顺利通过审核。以下是伯乐网络传媒pouquan根据经验结果得出的详细指导: 准备工作 注册百度账号:在创建任何百度百科词条之前,您需要先注册一…

学习前端第四十四天(浏览器事件简介)

一、事件处理程序 对事件作出响应&#xff0c;可以分配一个 处理程序 &#xff0c; 一个在事件发生时运行的函数 1、HTML特性绑定事件处理函数 <button id"btn1" οnclick"fn();console.log(xc)">保存1</button> 2、DOM属性绑定事件处理函数…

【数据结构和算法】-傅里叶变换

傅里叶变换&#xff08;Fourier Transform&#xff09;是一种强大的数学工具&#xff0c;用于将一个信号&#xff08;如声音、图像、时间序列数据等&#xff09;从时域&#xff08;或空间域&#xff09;转换到频域进行分析。 那我们先了解&#xff0c;什么是时间域、空间域和频…

【Python设计模式13】抽象工厂模式

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供一个接口&#xff0c;用于创建一系列相关或依赖的对象&#xff0c;而无需指定它们具体的类。抽象工厂模式通过对产品类的抽象&#xff0c;使客户端可以使用抽象工厂来创建…

深度学习之基于YoloV5钢材表面缺陷检测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在钢铁生产过程中&#xff0c;钢材表面的缺陷检测是一个至关重要的环节。传统的检测方法往往依…

Spring 事务源码分析

前言&#xff1a; 我们知道 Spring 声明式事务是通过 AOP 来实现的&#xff0c;日常项目开发中我们只需要使用 Transactional 注解就可以实现声明式事务&#xff0c;那你知道通过 Transactional 注解怎样实现事务的吗&#xff1f;本篇我们将从源码来分析 Spring 声明式事务的执…

Java入门基础教程- Java介绍

系列文章目录 文章目录 系列文章目录一、Java背景知识1.1 Java语言的历史1.2 Java能做什么1.3 Java是哪家公司的产品1.4 Java名称的来历1.5 Java的创始人1.6 Java的技术体系 一、Java背景知识 1.1 Java语言的历史 ​ Java语言的历史可以追溯到20世纪90年代&#xff0c;当时硬…

SpringBoot 实现图片防盗链功能

前言 出于安全考虑&#xff0c;我们需要后端返回的图片只允许在某个网站内展示&#xff0c;不想被爬虫拿到图片地址后被下载。或者&#xff0c;不想浏览器直接访问图片链接。 出于性能考虑&#xff0c;不想要别人的网站&#xff0c;拿着我们的图片链接去展示&#xff0c;白白…

C++的数据结构(十三):图的深度优先遍历(DFS)

在计算机科学中&#xff0c;图是一种非线性数据结构&#xff0c;由顶点和边组成。图的遍历是图论中的一个基本问题&#xff0c;而深度优先遍历&#xff08;DFS&#xff09;是其中的一种重要方法。 深度优先遍历的核心思想是尽可能深地搜索图的分支。它通常使用递归或栈来实现。…

Go 发送邮件的两种方式

使用 net/smtp发送邮件 package mainimport ("fmt""log""net/mail""net/smtp""strconv""strings" )func main() {/*IMAP/SMTP 设置方法用户名/帐户&#xff1a; 你的QQ邮箱完整的地址密码&#xff1a; 生成的授权…