1. 为什么现在还有人要在 CentOS 7 上装 CUDA 11.2先把场景说清楚。CentOS 7 这个系统2024 年 6 月 30 日已经走完了它的生命周期官方不再提供任何更新。但现实情况是大量企业的生产环境、高校实验室的算力节点、工业视觉设备至今仍然跑在 CentOS 7 上。原因很朴素系统稳定、驱动兼容性经过多年验证、迁移成本高。你不可能因为一个深度学习推理服务要上线就把整台服务器的操作系统换掉。CUDA 11.2 这个版本同样有它的特殊性。它发布于 2020 年底是最后一个官方支持 CentOS 7 且对驱动版本要求相对宽松的 CUDA 大版本之一。很多老卡——比如 Tesla V100、T4、甚至部分 GeForce 系列——在这个版本上跑得最稳。更关键的是PyTorch 1.8 到 1.10、TensorFlow 2.5 到 2.7 这些框架版本官方预编译包默认就是对着 CUDA 11.2 编译的。你如果直接上 CUDA 12反而要面对一堆依赖重编译的麻烦。所以这篇内容解决的核心问题就一个在一台干净的 CentOS 7 机器上从零把 CUDA 11.2 装好并且让 PyTorch 能正常调用 GPU。适合谁看运维工程师、算法部署工程师、实验室里管服务器的那位同学以及任何需要维护老算力节点的人。我假设你有基本的 Linux 命令行操作能力知道yum和vim怎么用但不需要你之前装过 CUDA。下面所有操作我都实际在虚拟机和物理机上跑过踩过的坑会单独标出来。整个流程分四块环境确认与依赖准备、驱动安装、CUDA Toolkit 安装、验证与框架对接。每一块我都会解释为什么这么做而不是只给你一串命令。2. 装之前必须搞清楚的几件事2.1 确认你的显卡和系统版本第一步不是急着下载而是确认硬件到底支不支持。CUDA 11.2 对显卡的计算能力有最低要求计算能力 3.5 以上的卡才能跑。你可以用这条命令看显卡型号lspci | grep -i nvidia如果这条命令没有任何输出说明系统根本没识别到 NVIDIA 显卡后面所有步骤都不用做了先去查硬件插槽和 BIOS 设置。如果能看到型号比如Tesla V100或GeForce RTX 2080记下型号去 NVIDIA 官方文档查它的计算能力。系统版本确认cat /etc/redhat-release uname -runame -r的输出很重要它告诉你当前内核版本。CentOS 7 常见的内核是3.10.0-1160系列。为什么要看这个因为后面装驱动的时候需要匹配对应的kernel-devel和kernel-headers包。版本对不上驱动编译会直接失败。注意如果你的内核被升级过而kernel-devel没跟着升级这是最常见的驱动安装失败原因。先跑yum update kernel把两者对齐再重启进新内核。2.2 关闭 Nouveau 驱动Nouveau 是 Linux 社区为 NVIDIA 显卡写的开源驱动CentOS 7 默认就加载它。问题是它和 NVIDIA 官方驱动冲突不关掉的话官方驱动装不上或者装上了也加载不了。关闭方法分两步。先创建黑名单文件vim /etc/modprobe.d/blacklist-nouveau.conf写入以下内容blacklist nouveau options nouveau modeset0然后重建 initramfs 并重启dracut --force reboot重启后验证是否关掉了lsmod | grep nouveau如果没有任何输出说明关闭成功。如果还有输出检查文件名是不是写错了或者dracut命令有没有报错。实操心得这一步我建议在装系统之后就立刻做而不是等到装驱动时才做。因为一旦你装了一堆图形界面相关的东西Nouveau 可能被其他模块依赖关起来更麻烦。另外如果你是通过 SSH 远程操作关掉 Nouveau 后重启图形界面可能会起不来但 SSH 不受影响别慌。2.3 安装编译工具和依赖库NVIDIA 驱动安装时需要现场编译内核模块所以必须要有gcc、make和内核头文件。CUDA Toolkit 本身还需要一些基础库。一次性装齐yum install -y gcc gcc-c make kernel-devel-$(uname -r) kernel-headers-$(uname -r) dkms yum install -y epel-release yum install -y dkms这里解释一下dkms的作用。DKMS 是动态内核模块支持它能在内核升级后自动重新编译 NVIDIA 驱动模块。对于生产环境来说这个包能省掉很多事后维护的麻烦。虽然 CUDA 11.2 的驱动安装器不强制要求 DKMS但我强烈建议装上。还有一个容易被忽略的依赖是libGL相关的库。如果你后续要用 OpenGL 做可视化缺了会报错yum install -y mesa-libGL mesa-libGL-devel装完后确认gcc版本gcc --versionCentOS 7 默认的gcc是 4.8.5这个版本编译 NVIDIA 驱动没问题不用升级。有些教程会让你升级到gcc 8或更高那是针对 CUDA 12 的11.2 不需要升级反而可能引入兼容性问题。3. 驱动安装选对版本比装得快更重要3.1 驱动版本怎么选CUDA 11.2 对驱动的最低要求是460.27.04。但最低要求不等于最佳选择。我一般推荐装460系列里较新的版本比如460.106.00或者直接用470系列的 LTS 驱动。为什么因为470是长期支持分支对老卡的兼容性经过了更长时间的验证而且它向下兼容 CUDA 11.2。这里有个关键概念要理清驱动版本和 CUDA Toolkit 版本是两回事。驱动是底层CUDA Toolkit 是上层开发工具。一个驱动可以支持多个 CUDA Toolkit 版本只要驱动版本号大于等于 Toolkit 要求的最低版本。所以你先装驱动再装 Toolkit顺序不能反。去 NVIDIA 官网下载驱动时选择方式有两种用.run文件手动装或者用yum仓库装。我推荐.run文件原因有三第一可控性强每一步都能看到第二不依赖网络仓库离线环境也能用第三卸载干净--uninstall一条命令搞定。yum方式虽然省事但一旦出问题排查起来很痛苦。下载地址在 NVIDIA 官方驱动下载页面选择对应的显卡型号和操作系统。下载下来是一个类似NVIDIA-Linux-x86_64-460.106.00.run的文件。3.2 安装驱动的完整步骤先把下载好的.run文件传到服务器上比如放到/root目录。然后给它执行权限chmod x NVIDIA-Linux-x86_64-460.106.00.run安装前确保没有图形界面在跑。如果你当前在图形界面下切换到文本模式systemctl isolate multi-user.target然后执行安装./NVIDIA-Linux-x86_64-460.106.00.run安装过程中会问你几个问题我逐个说明怎么选是否安装 DKMS 模块选 Yes。这样内核升级后驱动会自动重编译。是否安装 32 位兼容库如果你的机器只跑 64 位程序选 No。如果要用 32 位的 CUDA 程序选 Yes。一般选 No 就行。是否运行 nvidia-xconfig如果你需要图形界面选 Yes纯计算节点选 No。选 Yes 会修改 X11 配置有时候会导致图形界面起不来纯计算环境没必要。安装完成后验证驱动是否加载nvidia-smi正常的话你会看到一个表格显示显卡型号、驱动版本、显存使用情况、GPU 利用率等。如果报错说NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver说明驱动模块没加载成功。踩坑记录我遇到过一种情况nvidia-smi报错但lsmod | grep nvidia能看到模块。这通常是因为nvidia-uvm模块没加载。手动加载一下modprobe nvidia-uvm。如果还不行检查/var/log/nvidia-installer.log里面会有详细错误。3.3 驱动安装失败的常见原因驱动装不上九成是下面几个原因之一现象原因解决方法提示找不到 kernel headerskernel-devel 版本和当前内核不匹配yum install kernel-devel-$(uname -r)提示 Nouveau 冲突Nouveau 没关干净重新执行 2.2 节步骤确认lsmod无输出编译报错gcc 版本不兼容或缺少 make确认 gcc 和 make 已安装安装后 nvidia-smi 无输出模块未加载或设备文件缺失modprobe nvidia检查/dev/nvidia*提示 Secure Boot 阻止BIOS 开启了 Secure Boot进 BIOS 关闭 Secure Boot或给驱动签名Secure Boot 这个问题值得单独说。很多服务器默认开启 Secure Boot它会阻止未签名的内核模块加载。NVIDIA 的.run驱动默认没有签名所以会被拦。解决办法要么关 Secure Boot要么用mokutil给驱动签名。生产环境如果安全要求高建议走签名流程内部测试环境直接关掉更省事。4. CUDA Toolkit 11.2 安装与配置4.1 下载和安装方式选择CUDA Toolkit 11.2 的安装包有几种形式.run文件、.rpm包、以及yum仓库。在 CentOS 7 上我推荐用.run文件理由和驱动一样可控、离线可用、卸载干净。下载地址在 NVIDIA 的 CUDA Toolkit 归档页面找到 11.2 版本选择Linux-x86_64-CentOS-7-runfile (local)。下载下来的文件类似cuda_11.2.0_460.27.04_linux.run。注意文件名里的460.27.04这是这个 Toolkit 版本自带的最低驱动版本。如果你之前已经装了460.106.00或470安装 CUDA 时不要再装它自带的驱动否则会把你的驱动降级。安装命令chmod x cuda_11.2.0_460.27.04_linux.run ./cuda_11.2.0_460.27.04_linux.run安装器会先解压然后弹出一个文本界面。关键操作在这里在组件选择界面取消勾选 Driver。因为你已经装了更新的驱动不需要它自带的。保留 CUDA Toolkit 11.2、CUDA Samples 等组件。安装路径默认是/usr/local/cuda-11.2建议不要改。然后它会问你是否创建符号链接/usr/local/cuda选 Yes。这个链接很重要后面配置环境变量会用到。安装完成后你会看到一段提示告诉你需要把 CUDA 的路径加到环境变量里。4.2 环境变量配置编辑/etc/profile.d/cuda.sh这样对所有用户生效vim /etc/profile.d/cuda.sh写入export CUDA_HOME/usr/local/cuda export PATH$CUDA_HOME/bin:$PATH export LD_LIBRARY_PATH$CUDA_HOME/lib64:$LD_LIBRARY_PATH保存后让配置立即生效source /etc/profile.d/cuda.sh验证 CUDA 是否装好nvcc -V正常输出会显示 CUDA 版本为 11.2以及编译器的版本信息。如果提示nvcc: command not found说明 PATH 没配好检查/usr/local/cuda/bin下有没有nvcc这个文件。实操心得LD_LIBRARY_PATH这个变量我建议一定要配。很多深度学习框架在运行时需要动态链接 CUDA 的库比如libcudart.so。如果这个变量没设框架会报libcudart.so.11.0: cannot open shared object file。这个错误看起来吓人其实就是路径没配。4.3 编译 CUDA Samples 验证CUDA Toolkit 自带了一些示例程序编译并运行它们能验证整个工具链是否完整。进入 samples 目录cd /usr/local/cuda-11.2/samples/1_Utilities/deviceQuery make ./deviceQuery如果输出最后一行是Result PASS说明 CUDA 环境完全正常。这个程序会列出你的显卡型号、计算能力、显存大小等信息。再跑一个带宽测试cd /usr/local/cuda-11.2/samples/1_Utilities/bandwidthTest make ./bandwidthTest同样看到Result PASS就说明主机到设备的通信也正常。如果make报错说找不到gcc或g回到 2.3 节确认编译工具装好了。如果报错说找不到cuda_runtime.h说明CUDA_HOME没设对。5. 让 PyTorch 真正用上这块 GPU5.1 安装匹配的 PyTorch 版本CUDA 装好了不代表 PyTorch 就能用。PyTorch 的预编译包是针对特定 CUDA 版本编译的版本对不上要么装不上要么装上了torch.cuda.is_available()返回False。对于 CUDA 11.2对应的 PyTorch 版本是 1.8 到 1.10。我推荐用 1.10.2这是 1.10 系列的最后一个补丁版本稳定性最好。安装命令pip install torch1.10.2cu112 torchvision0.11.3cu112 torchaudio0.10.2 -f https://download.pytorch.org/whl/cu112/torch_stable.html注意cu112这个后缀它明确指定了 CUDA 11.2 的编译版本。如果你直接pip install torch默认会装最新版那个版本可能是针对 CUDA 12 编译的在你的环境里跑不起来。5.2 验证 GPU 是否可用装完后写一个最简单的测试脚本import torch print(PyTorch version:, torch.__version__) print(CUDA available:, torch.cuda.is_available()) print(CUDA version:, torch.version.cuda) print(Device count:, torch.cuda.device_count()) if torch.cuda.is_available(): print(Device name:, torch.cuda.get_device_name(0)) x torch.randn(3, 3).cuda() print(Tensor on GPU:, x)如果CUDA available输出True并且能成功创建一个 GPU 上的张量说明整条链路都通了。如果输出False按下面顺序排查nvidia-smi是否正常不正常说明驱动有问题回到第 3 节。nvcc -V是否正常不正常说明 CUDA Toolkit 有问题回到第 4 节。python -c import torch; print(torch.version.cuda)输出的是什么如果不是11.2说明装错了 PyTorch 版本。echo $LD_LIBRARY_PATH是否包含/usr/local/cuda/lib64没有的话补上。5.3 多卡环境下的注意事项如果你的机器有多张卡有几个点要特别注意。第一CUDA_VISIBLE_DEVICES这个环境变量可以控制哪些卡对程序可见。比如只想用第 0 和第 1 张卡export CUDA_VISIBLE_DEVICES0,1第二多卡训练时NCCL 库的版本要和 CUDA 匹配。PyTorch 1.10 自带的 NCCL 版本一般没问题但如果你手动编译过 NCCL要确认它是针对 CUDA 11.2 编译的。第三多卡环境下nvidia-smi显示的显存占用是每张卡独立的。如果发现某张卡显存满了但利用率是 0可能是之前的进程没退干净用nvidia-smi找到 PID 后kill掉。踩坑记录我曾经遇到一个诡异问题单卡跑得好好的多卡就报NCCL error。排查了半天发现是/etc/hosts里主机名解析有问题导致 NCCL 初始化时找不到正确的网络接口。解决办法是在/etc/hosts里把主机名和127.0.0.1绑定或者设置NCCL_SOCKET_IFNAME指定网卡。6. 常见问题速查与避坑指南6.1 安装过程中的高频报错下面这张表是我这些年遇到过的、出现频率最高的报错以及对应的解决思路。建议装之前先扫一眼心里有数。报错信息根本原因解决动作Unable to find the kernel source treekernel-devel 未安装或版本不匹配yum install kernel-devel-$(uname -r)ERROR: The Nouveau kernel driver is currently in useNouveau 未禁用执行 2.2 节重启后再装nvcc: command not foundPATH 未包含 CUDA bin 目录检查/etc/profile.d/cuda.sh并 sourcelibcudart.so.11.0: cannot open shared object fileLD_LIBRARY_PATH 未设置添加/usr/local/cuda/lib64到该变量torch.cuda.is_available() returns FalsePyTorch 版本与 CUDA 不匹配重装cu112版本的 PyTorchCUDA out of memory显存不足减小 batch size或清理僵尸进程no CUDA-capable device is detected驱动未加载或设备被占用nvidia-smi检查modprobe nvidia6.2 几个容易被忽略的细节第一个细节是时间同步。CUDA 和 NCCL 在某些操作里会依赖系统时间。如果服务器时间偏差太大多卡通信可能超时。装之前跑一下ntpdate或chronyd确保时间准确。第二个细节是文件句柄数限制。深度学习训练会打开大量文件句柄CentOS 7 默认的ulimit -n是 1024可能不够。修改/etc/security/limits.conf加上* soft nofile 65535 * hard nofile 65535第三个细节是SELinux。CentOS 7 默认开启 SELinux它可能阻止 NVIDIA 驱动加载某些模块。如果驱动死活装不上临时把 SELinux 设为 permissive 试试setenforce 0如果这样能装上说明是 SELinux 的问题再针对性配置策略而不是一直关着。6.3 卸载与重装有时候装乱了想推倒重来。卸载顺序很重要先卸 CUDA Toolkit再卸驱动。卸载 CUDA Toolkit/usr/local/cuda-11.2/bin/cuda-uninstaller如果没有这个脚本直接删目录rm -rf /usr/local/cuda-11.2 rm -f /usr/local/cuda卸载驱动/usr/bin/nvidia-uninstall或者用当初的.run文件./NVIDIA-Linux-x86_64-460.106.00.run --uninstall卸载完重启再按前面的步骤重新装。我建议每次重装前都重启一次避免残留模块干扰。实操心得重装驱动前先lsmod | grep nvidia确认没有 nvidia 相关模块在跑。如果有rmmod掉。顺序是nvidia-uvm-nvidia-drm-nvidia-modeset-nvidia。顺序反了会报模块正在使用。7. 生产环境部署的几点个人体会装 CUDA 这件事在测试环境里跑通一次不难难的是在生产环境里稳定运行几个月不出问题。我自己的经验是把下面几件事做到位能省掉大量半夜被叫起来处理故障的时间。第一把整个安装过程脚本化。不要手动一步步敲写一个install_cuda.sh把驱动安装、CUDA 安装、环境变量配置、验证步骤全部串起来。这样换一台机器跑一遍脚本就行也方便版本管理和回滚。第二记录版本矩阵。驱动版本、CUDA 版本、PyTorch 版本、Python 版本这四个的对应关系一定要记下来。我见过太多因为某个人随手升级了 Python 导致整个环境崩掉的案例。建议在服务器上放一个VERSIONS.md写清楚每个组件的版本和安装日期。第三驱动不要追新。生产环境的驱动稳定比新功能重要。470系列的 LTS 驱动能用就用它不要看到535出来了就升级。新驱动可能修复了一些 bug但也可能引入新的兼容性问题而你的老卡和老框架未必能受益。第四做好监控。nvidia-smi可以配合dmon模式做持续监控nvidia-smi dmon -s pucvmet -d 5这个命令每 5 秒刷新一次显示 GPU 利用率、显存、温度、功耗等。把它接到监控系统里GPU 温度过高或显存泄漏能提前发现。第五保留离线安装包。生产环境往往没有外网或者外网访问受限。把驱动.run文件、CUDA.run文件、PyTorch 的.whl包都提前下载好放在内网文件服务器上。这样新机器上线时不用临时去找包。最后分享一个我自己的小习惯每次装完 CUDA 环境我都会跑一个完整的基准测试包括deviceQuery、bandwidthTest、以及一个小的 PyTorch 训练脚本。把输出结果保存下来作为这台机器的基线。以后如果怀疑性能下降拿新结果和基线对比很快就能判断是硬件问题还是软件问题。这个习惯帮我定位过好几次显存带宽异常的问题比盲目重启有效得多。