最近帮客户调一批Tesla A100的深度学习服务器,光驱动就折腾了两天,中间还踩了好几个坑。网上关于A100驱动安装的教程不少,但大多数要么只讲runfile一条路走到底,要么压根没提MIG和GPUDirect这些A100专有特性的前置要求。这篇我把完整的安装思路、操作步骤、版本匹配逻辑和排障记录都整理出来,希望能帮后来的人少走点弯路。
先明确一点,A100是数据中心级GPU,安装驱动的方法和普通GeForce游戏卡不一样,对内核版本、驱动版本、CUDA版本的配套要求更高,而且很多服务器是纯UEFI启动加Secure Boot开启的状态,这会让驱动安装的坑比想象中多得多。本文以Ubuntu 20.04/22.04 LTS系统为主,涵盖了在线安装、离线安装、故障排查和MIG配置四大部分。
1. 装机前的准备工作:确认硬件与系统环境
1.1 如何确认GPU型号与架构
拿到机器第一件事,不是急着下载驱动,而是先确认GPU是否真的被系统识别。A100有PCIe版和SXM版两种形态,SXM版通常出现在HGX整机或DGX系列里,由NVSwitch互联,驱动安装逻辑一致,但功耗和散热策略略有不同。确认方法很简单:
lspci | grep -i nvidia如果输出里能看到类似NVIDIA Corporation GA100 [A100 PCIe 40GB]或者A100 SXM4 40GB的字样,说明PCIe枚举正常,GPU硬件层面没问题。如果这条命令没有任何输出,先别急着装驱动,优先检查物理插槽和供电,服务器里GPU没供电或者松了的时候lspci是看不到设备的。
看到GPU之后,再看系统架构。A100是Ampere架构,对应微架构代号GA100,这决定了驱动版本的下限。
表:A100关键参数与驱动要求
| 项目 | 参数 |
|---|---|
| GPU架构 | Ampere(GA100) |
| 显存规格 | 40GB / 80GB HBM2e |
| 计算能力 | 8.0 |
| 最低驱动版本要求 | 450.80.02(含CUDA 11.0) |
| 推荐生产环境驱动版本 | 470+ / 525+ / 535+ |
| 支持的系统 | Linux x86_64(主流) / ARM Server |
1.2 驱动、CUDA与系统版本的匹配逻辑
很多人装驱动失败,根本原因不是命令敲错,而是版本匹配的思路没理顺。A100要求驱动版本最低不能低于450.80.02,否则连设备都认不出来。而驱动版本又决定了能支持到哪个CUDA版本,举例来说,535.xx版本的驱动支持到CUDA 12.3,如果你搭配CUDA 12.0,那没问题;但如果你用470版本去配CUDA 11.4,虽然也能跑,但性能特性支持就不完整。
这里分享一个实用的选型经验:
- 从NVIDIA官方驱动页面下载驱动时,页面上会列出一个“Supported CUDA Version”,这个值代表该驱动最高支持的CUDA版本。更推荐用
nvidia-smi工具进行实际版本验证(而不是仅依赖页面的版本信息)。所以如果你的CUDA框架需要12.1,就选支持CUDA 12.1或更高的驱动。 - Ubuntu 20.04和22.04的内核版本差异较大,20.04默认内核是5.4/5.8,22.04默认内核是5.15/5.19。新版驱动(535+)对老内核的支持没有明显问题,但如果是Red Hat系内核,就要额外注意open-dkms模块的编译兼容性。
- 如果机器用于生产环境,建议不要追最新驱动,选NVIDIA官方的长期维护分支版本,比如535系列已经比较成熟,性能和稳定性都经过验证。
1.3 禁用nouveau与关闭Secure Boot
这是整个安装流程里最容易踩坑的两个地方。
禁用nouveau这一步非常重要。Ubuntu系统自带的nouveau开源驱动会和NVIDIA官方驱动抢设备节点,如果不禁用,安装程序在加载NVIDIA内核模块的时候会报Failed to initialize NVML: Driver/library version mismatch或者直接hang住。禁用方法是在内核启动参数里加上模块黑名单:
sudo bash -c "echo 'blacklist nouveau' >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf" sudo bash -c "echo 'options nouveau modeset=0' >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf" sudo update-initramfs -u修改之后必须重启,重启后执行lsmod | grep nouveau看一下有没有输出。如果有输出说明没禁用干净,通常是内核模块还在被占用,需要再检查一下图形桌面服务。
关闭Secure Boot是另一个大坑。A100服务器大多数是UEFI启动,出厂时Secure Boot默认开启。如果Secure Boot开着,NVIDIA驱动内核模块没有签名,内核会拒绝加载,安装过程可能完全正常,但一重启就回到原点,nvidia-smi报错说驱动不存在。处理方法有两种:
- 在BIOS里关闭Secure Boot(简单粗暴,适合自有服务器)。
- 保留Secure Boot,给驱动模块签名(适合有安全合规要求的机房环境,流程较长,需要在BIOS里进入MOK管理流程)。
提示:如果你装的是带桌面环境的Ubuntu,建议用runfile方式安装时加入
--no-opengl-files参数,避免NVIDIA驱动把系统的OpenGL库替换掉,导致图形界面无法启动。A100本身不带显示输出,但机器上可能还插了其他亮机卡。
2. A100驱动的三种安装方式对比与选型
A100驱动安装有下面几种主流方式,各有利弊,我分别说一下真实使用感受。
2.1 runfile方式:手动可控,适合精细调参
这种是NVIDIA官方提供的.run可执行文件安装包,也是我这次实际采用最多的方式。runfile的优点是可以精确控制安装路径、不看发行版源里的旧版本脸色、排障方便,缺点是升级和卸载需要额外维护。
wget https://us.download.nvidia.com/tesla/535.154.05/NVIDIA-Linux-x86_64-535.154.05.run sudo chmod +x NVIDIA-Linux-x86_64-535.154.05.run sudo ./NVIDIA-Linux-x86_64-535.154.05.run --silent --dkms--dkms参数非常关键,它会注册DKMS支持,让驱动在以后的内核升级中自动重新编译,不用每次升级内核都手动装一遍驱动。
2.2 apt源方式:适合快速部署,但版本容易落后
Ubuntu的官方源和NVIDIA的CUDA apt源里都有nvidia-driver包。这种方式的优点是安装简单,apt install一套搞定,缺点就是版本可能偏旧。比如你做深度学习用PyTorch,官方Release可能要配CUDA 11.8或12.1,apt源里可能只到535分支,对于A100来说535是够用的,但如果你想试最新的CUDA 12.4特性,apt源就不太行了。
sudo apt update sudo apt install -y nvidia-driver-535如果要用apt方式,建议先把NVIDIA官方CUDA源加上,这样拿到的版本更新一些:
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt update2.3 使用CUDA Toolkit捆绑驱动
CUDA Toolkit安装包里自带了对应版本的NVIDIA驱动,这种方式对于刚接触的新手比较友好,因为驱动和CUDA版本天然配套,少了很多匹配的烦恼。命令是:
sudo apt install -y cuda-toolkit-12-1或者用runfile版的CUDA安装包,在交互界面里取消driver那一项不打勾就行。但我个人建议:如果机器已经装了另一个版本的驱动,安装CUDA Toolkit时千万不要让它再装一次驱动,否则容易出现版本冲突,设备节点被反复重新加载。经验做法是用CUDA Toolkit只装CUDA runtime和编译器,驱动单独用官方runfile维护。
2.4 离线安装思路
不少内网机器和外网隔离,没法直接wget。这时候就需要提前准备好离线依赖包。注意,runfile本身可以离线安装,这算是一个优势:驱动部分只需要一个.run文件就够了。但内核编译需要的依赖(如gcc、make、dkms、内核头文件)必须在离线环境下提前装好。可以在一台联网机器上用apt的--download-only选项下载所有的 .deb 依赖,再拷贝进内网安装。
# 联网机器上收集依赖包 mkdir -p nvidia-driver-offline cd nvidia-driver-offline apt-get download dkms build-essential linux-headers-$(uname -r) gcc make # 把整个文件夹拷进内网机器后执行 sudo dpkg -i *.deb sudo ./NVIDIA-Linux-x86_64-535.154.05.run --silent --dkms主要一点,离线机器的内核版本和收集依赖包时那台机器不一致,会造成内核头文件版本对应不上,所以离线包最好在相同系统的干净环境里准备。如果机器有apt代理也可以考虑,但大部分隔离内网没这个条件。
3. 实操步骤:从下载驱动到nvidia-smi正常输出
3.1 驱动选型与下载
驱动选型这一步看起来简单,但恰恰是很多人翻车的地方。NVIDIA驱动下载页面里,Tesla A100归在“Data Center Driver”,不是GeForce Driver。千万不要下错成GeForce Game Ready驱动,否则安装程序会直接报不支持的硬件,这是最常见的初坑。
遇到风控严格的内网环境,连NVIDIA官网都访问不了的,只能用离线包拷贝进去。装的时候用--silent参数静默安装可以减少很多交互卡点,但第一次安装建议还是不加--silent,这样可以在交互界面确认一下组件选择。
3.2 禁用开源驱动与内核准备
在动手装驱动之前,还有一个内核准备动作。执行:
sudo apt install -y gcc make dkms linux-headers-$(uname -r)这串命令把编译内核模块的工具链和当前内核的头文件都备齐了。DKMS是重点,有了它,驱动模块可以在系统内核升级后自动rebuild,否则每次升级内核都要手动重做一遍,非常麻烦。
然后按照1.3节的方式禁用nouveau并重启。重启之后,进入命令行模式(如果桌面环境不好关,可以直接用Ctrl+Alt+F3切到纯tty),关闭图形服务:
sudo systemctl isolate multi-user.target这样能保证没有任何进程占用GPU设备,安装驱动时模块才能顺畅加载。
3.3 runfile安装完整流程
我以535.154.05版本为例,给出完整命令序列。如果你是其他版本,把文件名换成你自己的即可。
# 1. 进入下载目录,赋予执行权限 cd /opt sudo chmod +x NVIDIA-Linux-x86_64-535.154.05.run # 2. 执行安装,这里我习惯加上 --no-opengl-files,保持系统OpenGL稳定 sudo ./NVIDIA-Linux-x86_64-535.154.05.run --silent --dkms --no-opengl-files # 3. 确认内核模块已加载 sudo modprobe nvidia # 4. 查看安装结果 nvidia-smi安装过程中如果卡住,可以用--verbose参数看详细输出,能定位到具体的依赖缺失项。整个安装大概持续3-5分钟,如果编译模块时间特别长(超过15分钟),大概率是内核头文件不匹配或者磁盘IO太慢。
3.4 验证与配置持久化
安装完成后,nvidia-smi应该输出一张GPU信息表格,显示A100的型号、显存容量、驱动版本和CUDA版本。如果能看到这张表,说明基本OK了。
但工作站重启之后还有几个隐藏雷:
- nvidia-persistenced服务:数据中心GPU建议常驻这个服务,把GPU状态保持住,避免每次有新进程访问GPU时重新初始化。启动命令:
sudo systemctl enable nvidia-persistenced sudo systemctl start nvidia-persistenced- 设备节点权限:如果是给普通用户跑训练任务,一定要确保
/dev/nvidia*设备节点对用户有访问权限。通常NVIDIA驱动会创建nvidia组,把运行用户加进这个组就行:
sudo usermod -aG nvidia username sudo udevadm control --reload-rules && sudo udevadm trigger之后sudo reboot重启一次,再次确认nvidia-smi能正常输出。到这里驱动部分就装好了,接下来可以继续装CUDA Toolkit和cuDNN。
4. 常见故障排查:nvidia-smi报错、模块加载失败怎么办
安装A100驱动遇到问题是常态,心态要放平。这节我把实际过程中遇到的高频报错和排查思路完整列出来,建议直接当成速查表用。
4.1 nvidia-smi报错:couldn't communicate with the nvidia driver
这是网上搜得最多的错误,几乎一搜就是一堆结果。它的出现往往意味着内核模块没有正确加载或者加载的版本和用户态工具不一致。
第一步,先确认模块状态:
lsmod | grep nvidia如果没有输出,说明模块没加载。手动加载试试:
sudo modprobe nvidia如果手动加载时报Required key not available,那就是Secure Boot的问题。如果提示找不到模块,说明驱动编译产物没装进去,重装驱动通常能解决。
第二步,看系统日志:
dmesg | grep -i nvidia如果日志里有NVRM: failed to initialize the NVIDIA kernel module,大概率是驱动版本与内核不兼容。最常见的原因是升级内核后DKMS没有把新模块编出来,重新执行/usr/bin/dkms autoinstall就好。
sudo /usr/bin/dkms autoinstall sudo modprobe nvidia第三步,如果以上都试过还是报错,检查驱动版本是不是下错成GeForce分支了,A100必须用Data Center Driver。
表:nvidia-smi无法通信的排查路径
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| lsmod无输出,modprobe报找不到模块 | 驱动未安装或安装产物缺失 | 重装对应版本驱动 |
| modprobe报 Required key not available | Secure Boot拦截未签名模块 | 关闭Secure Boot或给模块签名 |
| dmesg里有 NVRM init失败 | 内核头文件不匹配 / DKMS未编译 | 安装对应内核头文件,执行dkms autoinstall |
| nvidia-smi输出Driver/library mismatch | 驱动升级后未重启 | 重启系统或完全卸载旧驱动后重装 |
4.2 报错:NVRM: can't find an IRQ for your NVIDIA card
这个问题相比前面那个更隐蔽,它不是驱动本身的问题,而是中断资源分配的问题。A100作为PCIe设备,如果BIOS没有给它分配正确的MSI中断,驱动初始化就会失败。
实际排查中发现,这类问题通常是PCIe ACS或IOMMU设置造成的。在BIOS中把IOMMU改成Disabled或者Passthrough模式下可能解决一部分问题,但这个操作需要谨慎,尤其对有多GPU的机器,改IOMMU会影响PCIe设备分组。
另一类可能原因是通过PCIe转接卡连接的GPU,某些转接卡供电或链路协商有问题,导致MSI中断无法建立。如果机器上有多个插槽,可以尝试把GPU换一个槽位再测。也可以试试在grub启动参数里加pci=noacpi或者acpi=off,但这属于不得已的办法,会影响整个系统的ACPI功能,不推荐在生产环境用。
4.3 驱动装了但重启后失效
这是仅次于nvidia-smi无通信的第二大高频问题。很多人的表现是:刚装完驱动一切正常,所有测试都过了,一重启就回到原点,nvidia-smi又开始报错。
排查这个问题的思路很简单:先确认是不是Secure Boot在作恶。执行:
mokutil --sb-state如果输出是SecureBoot enabled,而你的模块没有签名,那这个问题算是坐实了。最简单的处理方式是进入BIOS关闭Secure Boot;如果有合规要求必须开着,就需要走MOK(Machine Owner Key)签名流程,在第一次重启时进入蓝紫色MOK管理界面选择Enroll key,输入密码确认。
另一个可能导致重启失效的原因是内核更新。比如这一次开机用的是5.15.0-86内核,驱动模块编译基于这个版本。后面apt自动升级到5.15.0-91,如果DKMS编译失败,驱动就没了。这时候手动执行dkms autoinstall重新编译即可,长期方案是把内核版本锁定在某个稳定版本:
sudo apt-mark hold linux-image-generic linux-headers-generic4.4 多卡机器部分GPU识别不到
A100服务器经常是8卡满配,但有时候安装完之后nvidia-smi只识别出其中4张卡,另外几张消失得无影无踪。这时候先看硬件层的PCIe枚举:
lspci | grep -i nvidia如果PCIe层能看到,但nvidia-smi看不到,可能是驱动对某个卡初始化失败,看dmesg里有针对某张卡的报错。最常见是供电阻塞或者NVLink链路训练失败。有条件的话把GPU顺序换一下或者交叉验证,能快速判断是卡本身问题还是槽位问题。
如果PCIe层都看不到,大概率就是物理接触不良或者供电没插到位。A100 PCIe版的辅助供电是8pin,SXM版则依赖底板的供电规范,整机供电不足时会出现部分GPU掉卡,这时候优先检查电源单元策略。
5. A100专有特性的前置配置:MIG与GPUDirect
驱动装好只是第一步。A100区别于普通游戏卡的另一大卖点是MIG(多实例GPU)和GPUDirect RDMA能力。这两块在驱动版本选择上有特殊要求。
5.1 MIG多实例GPU的启用
MIG可以把一张A100切成最多7个独立的GPU实例,每个实例有自己独立显存和计算核心,适合多租户场景。但MIG功能不是安装好驱动就默认开启的,需要手动在GPU上启用MIG模式。
在A100上启用MIG的操作:
# 查看当前GPU是否支持MIG,以及当前MIG状态 nvidia-smi -i 0 --query-gpu=name,mig.mode.current --format=csv # 在GPU 0上启用MIG模式 sudo nvidia-smi -i 0 --mig-mode=1MIG启用成功后,可以用nvidia-smi mig -lgi查看已有的实例配置。一个比较常见的切分方案是把40GB的A100切成两个20GB实例,或者切成1个16GB加2个8GB之类的组合,具体看业务需求。
MIG和GPUDirect同时使用时,需要注意MIG实例的端口资源分配,禁止用没有配置足够的DMA资源。
重要提示:MIG模式下,
nvidia-smi展示的显存大小会和物理显存不一样,这是正常现象。另外,MIG模式不支持通过CUDA_VISIBLE_DEVICES直接选择子实例,需要用CUDA_MPS_PIPE_DIRECTORY或者MIG的UUID对应关系来调度。
5.2 GPUDirect RDMA注意事项
GPUDirect RDMA是A100在HPC和AI训练场景里的核心价值所在,它允许网卡或存储设备绕过CPU直接读写GPU显存,大幅降低数据拷贝延迟。如果机器上配置了Mellanox InfiniBand网卡,想充分发挥A100的通信性能,驱动版本至少需要满足官方GPUDirect RDMA的最低要求。
配置GPUDirect的核心动作是检查网卡和GPU是否位于同一个PCIe switch或者同一个NUMA节点,并开启网卡驱动的RDMA模式。常用的验证命令:
nvidia-smi topo -m这个命令会列出GPU之间以及GPU与网卡之间的拓扑关系,如果显示NV#或NODE这种高位连接,说明走的是NVLink或同一ROOT,GPUDirect性能会更好;如果显示PHB或SYS,说明要跨CPU访问,性能会有损。
GPUDirect的驱动配置通常在网卡驱动侧完成,NVIDIA驱动侧只要保证版本够新就行。535版本对GPUDirect的支持已经很完善,实测带宽和延迟表现都稳定。
6. 写在最后的几句体会
A100驱动安装本身不算难,难的是版本匹配和系统环境清理。我在整个过程中最大的体会就是:装驱动之前,先把内核版本、Direct版本换好再动手。装驱动过程中,各种命令行界面上最安静,但也最容易忽略的就是nvidia-persistenced服务。这个服务不启动,A100在频繁被访问的时候,GPU初始化时间会更长,进程启动会变慢,某些监控程序甚至会误报超时。
另外,如果你和我一样需要在几台配置完全相同的机器上批量部署,建议装好一台之后,把/etc/modprobe.d/blacklist-nvidia-nouveau.conf、/etc/modprobe.d/nvidia.conf、/usr/share/kernel/postrm.d/nvidia这些配置文件都备份出来,用Ansible这类工具统一分发。真的能省下大量重复排障时间。
最后分享一个实用小技巧:升级驱动之前,不用急着卸载旧驱动,直接在旧驱动基础上运行新版runfile安装,它会自动处理模块替换。但如果升级后出现诡异问题,先别怀疑新驱动有问题,回退到纯命令行模式,卸载旧驱动后干净重装一次,大概率能解决。我就是这样排查掉了一个困扰半天的NVLink带宽异常问题。