
想在一台刚装好CentOS 8的机器上老老实实跑起深度学习环境你大概率会被三个东西轮流折磨NVIDIA驱动、CUDA Toolkit、还有Anaconda。这三样单拎出来每一个都不算难但它们彼此之间又带着版本依赖加上CentOS 8早已停止维护国内源和官方源的变更也把很多人挡在门外。我自己在两台CentOS 8服务器上配过环境也在帮朋友调工作站时反反复复踩过坑所以这篇把完整过程、版本选择的思路、还有那些文档里不会写的排错经验一并聊透。这篇东西适合谁适合准备在CentOS 8上装NVIDIA显卡驱动、CUDA和Anaconda的开发者也适合那些机器上还没决定好用rpm还是runfile、怕装完开机黑屏、或者装完驱动却发现cuda和conda互相不认的新手。我会按实际动手顺序讲尽量让每一步都有据可查而不是无脑贴命令。1. 环境与版本选型先想清楚再动手1.1 为什么这类安装教程总在NVIDIA驱动上翻车很多人的第一反应是直接去NVIDIA官网下载.run驱动然后甩开袖子就装。但CentOS 8不是Ubuntu它的内核、模块加载机制、还有默认自带的nouveau开源驱动都会跟NVIDIA闭源驱动打架。如果事前没搞清楚内核版本和驱动版本的适配关系装完重启大概率会遇到两种情况要么停在登录界面循环要么直接黑屏。这不是运气问题而是选型逻辑漏了。我在安装前会先跑一条命令看内核版本uname -r比如输出4.18.0-477.el8.x86_64说明你用的是RHEL 8.6以上的内核。NVIDIA官方驱动对内核版本有最低要求特别是较新版本驱动往往需要较新的内核和GCC。如果你是在旧版本的内核上强装新驱动编译模块时就会出现类似unable to determine the version of the kernel或头文件缺失的错误。CentOS 8还有一个特殊背景2021年12月31日之后官方仓库停止了维护默认源里的软件包版本陈旧而且很多镜像站已经不再同步。所以第一步必须把yum源切到可用的镜像这一步如果跳过后面连kernel-devel、gcc、make都装不上。1.2 版本匹配的三个关键口径很多人以为装驱动、装CUDA就是分别下载最新版本其实这里存在三套版本体系必须打通才能正常干活显卡驱动版本由NVIDIA发布例如535.104.05。它负责操作系统层面的GPU调度是后面所有东西的地基。CUDA Toolkit版本例如11.8、12.1。它包含编译器、库和运行时组件。PyTorch/TensorFlow等框架版本它们要求CUDA Toolkit的某个小版本范围比如PyTorch 2.0对应CUDA 11.7/11.8PyTorch 2.1对应CUDA 12.1。有个关键误区安装CUDA时安装包会自带一个匹配的显卡驱动。如果你选择安装rpm形式的CUDA包它会顺带把你机器上原本存在的NVIDIA驱动替换成官方捆绑的版本。这么做看似省事但一旦你驱动版本和CUDA版本不匹配比如想用CUDA 12.1却装了自带535驱动的runfile然后手动更新驱动到550就有可能出现驱动和CUDA运行库不一致的隐患。所以我更推荐的方式是先单独安装显卡驱动再在安装CUDA时选择“不安装驱动”只装Toolkit。这里给一个我实际测过比较稳健的组合供参考内核版本驱动版本CUDA版本说明4.18.0-372及以上535.104.0511.8PyTorch 2.0时代常用组合4.18.0-477及以上535.154.0512.1PyTorch 2.1常用组合4.18.0-513及以上550.54.1512.4新驱动对新架构支持更好需要说明的是CentOS 8的官方内核版本停留在4.18系列即使使用较新的驱动内核版本依旧受限。只要驱动还支持4.18内核就可以正常编模块。我一般在选型时优先看CUDA版本的驱动需求表而不是盲目追新。1.3 依赖环境准备别让仓库源拖后腿CentOS 8停止维护后原有的mirrorlist.centos.org地址会失效直接导致yum install报错。我们需要先把源切换到可用的镜像站。我试过阿里云、腾讯云、清华源的vault路径核心步骤如下# 删除默认源配置 rm -rf /etc/yum.repos.d/CentOS-*.repo # 使用阿里云vault镜像 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo # 更新缓存 yum clean all yum makecache如果你系统版本是8.5.2111就用上面的vault仓库如果是8.4等其他小版本需要替换URL中的版本号。这里有个小技巧可以用cat /etc/redhat-release查看具体版本。依赖源可用之后安装驱动所需的基础工具一块儿装上yum install -y gcc make kernel-devel kernel-headers dkms elfutils-libelf-devel libstdc-devel注意kernel-devel版本必须与uname -r完全一致否则驱动模块编译时找不到当前内核头文件。我遇到过很多人装上kernel-devel后重启内核升级了头文件没跟上这时候需要重新安装匹配版本。# 查看当前内核版本对应devel包 yum install -y kernel-devel-$(uname -r)把源切好、依赖装齐环境里的坑基本填掉一半。2. 驱动篇禁用nouveau、装kernel-devel、跑NVIDIA安装脚本2.1 第一步确认显卡型号和推荐驱动版本安装驱动之前务必要确认自己的显卡是不是NVIDIA卡别拿着AMD的卡装NVIDIA驱动那样一点意义都没有。用lspci | grep -i nvidia可看到类似01:00.0 VGA compatible controller: NVIDIA Corporation TU104 [GeForce RTX 2080 SUPER] (rev a1) 01:00.1 Audio device: NVIDIA Corporation TU104 High Definition Audio Controller (rev a1)如果没有这个输出检查一下是不是主板关闭了PCIe插槽识别。如果确认是NVIDIA卡接着查推荐驱动版本如果是GeForce系列消费级显卡可以去NVIDIA官网根据型号查最新驱动如果是数据中心卡A100、V100等直接用nvidia-smi在别人正常的机器上看到的版本作为参考。实际上最稳妥的方式是先在NVIDIA官网找到驱动下载页填入显卡型号和操作系统它会给出一个推荐版本。比如RTX 3090在Linux 64-bit下的推荐版本可能是535.x或550.x。我们可以通过网页下载也可以在命令行直接wget对应的.run文件。需要注意的是下载链接要选对否则可能拿到一个不适用于CentOS 8的版本。NVIDIA官方提供的.run文件是通用二进制格式通常文件名里带Linux-x86_64字样可以直接在终端下载。2.2 正确禁用nouveau并重建initramfs这是整个步骤中最容易遗漏的一环。CentOS 8默认加载的nouveau是NVIDIA的开源驱动它在内核模块层会和闭源驱动发生冲突。如果不禁用安装时会出现ERROR: The Nouveau kernel driver is currently in use by your system的报错。禁用nouveau的方法是创建一个黑名单文件cat /etc/modprobe.d/blacklist-nouveau.conf EOF blacklist nouveau options nouveau modeset0 EOF然后重建initramfsmv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak dracut /boot/initramfs-$(uname -r).img $(uname -r)重建完之后建议立刻重启。重启后检查nouveau是否真正不再加载lsmod | grep nouveau如果没有任何输出说明禁用成功。这里有个坑很多人执行dracut时没有指定内核版本导致重建的是默认内核的initramfs而当前运行内核的initramfs还是旧的。我建议参照上面的命令带上$(uname -r)这样才能确保当前内核的initramfs被更新。2.3 用官方runfile安装驱动附无人值守参数禁掉nouveau后就可以运行NVIDIA的.run安装脚本了。我习惯用--no-opengl-files --no-x-check --silent参数组合。原因如下--no-opengl-files避免覆盖系统OpenGL库否则可能引起图形界面问题尤其是GNOME桌面--no-x-check跳过X server检查避免当前在图形界面下安装失败--silent静默安装便于脚本化运行。完整命令示例chmod x NVIDIA-Linux-x86_64-550.54.15.run ./NVIDIA-Linux-x86_64-550.54.15.run --no-opengl-files --no-x-check --silent安装完成后nvidia-smi可能还不能直接使用需要确认一下/usr/bin/nvidia-smi是否已经被创建。如果找不到可以手动指定安装路径一般默认是/usr/bin/nvidia-smi库目录是/usr/lib64/nvidia。遇到问题可以查看/var/log/nvidia-installer.log这是排查驱动安装失败的第一入口。2.4 驱动装完立刻验证nvidia-smi的输出代表什么驱动安装成功的标志是nvidia-smi能正常打印出显卡信息表类似----------------------------------------------------------------------------- | NVIDIA-SMI 550.54.15 Driver Version: 550.54.15 CUDA Version: 12.4 | |--------------------------------------------------------------------------- | GPU Name Persistence-Mode | Bus-Id Disp.A | Volatile Uncorr. ECC | |--------------------------------------------------------------------------- | 0 GeForce RTX 3090 Off | 00000000:01:00.0 On | N/A | ---------------------------------------------------------------------------注意这里的CUDA Version: 12.4指的是该驱动支持的CUDA最高版本而不是说你机器上已经装了CUDA Toolkit。它只是驱动与CUDA运行时之间兼容性的标记真正的CUDA工具链需要下一步安装。如果nvidia-smi报错couldnt communicate with the nvidia driver多半是以下原因nouveau没禁用干净内核模块没有正确编译可以检查/lib/modules/$(uname -r)/kernel/drivers/video/nvidia.koSecure Boot拦截了模块签名需要关闭Secure Boot或给模块签名。我自己的经验是CentOS 8服务器版默认不开图形界面Secure Boot的影响在部分工作站上确实存在。如果是在双系统或开启了Secure Boot的机器上安装请在BIOS里临时关闭Secure Boot否则模块加载会被系统阻隔。3. CUDA篇选择runfile而非rpm把控制权握在自己手里3.1 CUDA到底是运行时、工具包还是驱动先分清概念很多新朋友容易把CUDA理解为一个“安装包”但实际它包含三个层次NVIDIA驱动负责GPU硬件操作由上一节安装CUDA Runtime应用运行时环境包含libcudart.soCUDA Toolkit开发工具集合包含nvcc、nvrtc、cuBLAS、cuDNN等库和编译工具。通常我们说“安装CUDA”默认是指安装CUDA Toolkit因为运行时往往会跟随相关Python包自动安装。但如果我们想手动编译CUDA程序或者让PyTorch能调用编译工具链就必须装好Toolkit并配置好PATH和LD_LIBRARY_PATH。3.2 runfile安装步骤与环境变量配置CUDA官网会给出多种安装方式包括debUbuntu或rpmRHEL/CentOS以及runfile。在CentOS 8上我优先推荐runfile因为rpm方式会依赖NVIDIA的官方yum仓库而且CentOS 8 EOL后这套源经常出问题。runfile是最自包含的方式只是需要手动配置环境变量。以下载CUDA 11.8为例wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run chmod x cuda_11.8.0_520.61.05_linux.run ./cuda_11.8.0_520.61.05_linux.run --toolkit --no-opengl-libs --silent注意--toolkit参数表示只安装Toolkit不安装驱动。这个参数的完整写法是--toolkit但在新版本安装器中称为--toolkit如果你担心版本参数不一致可以先运行./cuda_*.run --help查看可用选项。加上--no-opengl-libs可避免OpenGL库冲突。安装目录默认在/usr/local/cuda-11.8同时/usr/local/cuda是一个软链接。接下来配置环境变量写入/etc/profile.d/cuda.shcat /etc/profile.d/cuda.sh EOF export PATH/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH export CUDA_HOME/usr/local/cuda EOF source /etc/profile.d/cuda.sh这里要提醒一个常见误区CUDA Toolkit安装完成后nvcc --version的输出只是编译器版本而nvidia-smi输出的是驱动支持的最大CUDA版本。两者版本可以不匹配只要驱动支持的最大版本不低于Toolkit版本即可。3.3 多版本CUDA共存与切换的实操方案深度学习框架的更新速度比CUDA版本快经常会出现同一个服务器上某个项目需要CUDA 11.8另一个项目需要12.1的情况。我强烈推荐使用runfile安装多个版本CUDA然后用软链接切换。例如安装CUDA 11.8和CUDA 12.1后/usr/local下会存在cuda-11.8和cuda-12.1两个目录/usr/local/cuda默认指向其中一个最新的版本。我们需要手动切换# 查看当前指向 ls -l /usr/local/cuda # 切换到11.8 rm -f /usr/local/cuda ln -s /usr/local/cuda-11.8 /usr/local/cuda切换之后nvcc --version会立即变成对应版本。但也有一个注意点如果环境变量里LD_LIBRARY_PATH已经完全指定了/usr/local/cuda/lib64而该路径是软链接切换没问题但如果某些编译缓存或已安装的库已经链接到具体版本路径切换后需要重新编译。所以在多版本环境里我更建议在项目内通过source设置局部的CUDA_HOME而不要全局频繁切换。比如在conda环境中就用conda环境变量来管理。3.4 踩坑gzip invalid compressed data和驱动冲突CUDA安装最常见的两个错误都和文件完整性或驱动冲突有关。第一个是runfile解压时报gzip: stdin: invalid compressed>file cuda_11.8.0_520.61.05_linux.run正常输出应该是ELF 64-bit LSB executable如果显示HTML或ASCII text说明下载的是错误页面。第二个是驱动冲突。CUDA的runfile默认带有驱动如果你在执行安装时没有加--toolkit参数它会覆盖你之前单独装的驱动。覆盖后如果驱动版本不匹配可能导致nvidia-smi消失。解决办法就是卸载所有NVIDIA组件重装yum remove -y *nvidia*然后重装匹配版本驱动和Toolkit。所以再次强调先装好匹配驱动再在CUDA安装时严格使用--toolkit参数。4. Anaconda篇下载、换源、建环境一条龙4.1 用清华镜像下载Anaconda只是第一步Anaconda官网下载速度在国外国内拉取很慢。清华TUNA镜像提供了Anaconda安装包地址是wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2023.09-0-Linux-x86_64.sh其实无论从官网还是镜像站下载安装逻辑都一样。我习惯于先校验SHA256防止安装包在传输过程中损坏。将下载好的.sh文件放到/opt目录下准备安装。4.2 静默安装与自动初始化conda你可以用交互式安装但我更推荐静默安装便于自动化。命令bash Anaconda3-2023.09-0-Linux-x86_64.sh -b -p /opt/anaconda3-b静默模式-p指定安装路径我选/opt/anaconda3避免污染用户主目录。安装完成后需要初始化shellconda默认会修改~/.bashrc。如果你在静默模式下没让它初始化需要手动执行/opt/anaconda3/bin/conda init之后重新打开终端或者source ~/.bashrc就能直接使用conda命令。如果你不想默认激活base环境可以设置conda config --set auto_activate_base false这个设置对服务器多用户环境很友好不会一进去就自动进入conda的base环境干扰系统Python。4.3 conda换源和pip换源稳定安装的隐形前提Anaconda默认从官方源下载包速度在国内很不稳定。我通常会配置conda使用清华镜像源conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --set show_channel_urls yes还可以添加conda-forgeconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/同样pip也需要换源在用户目录下创建~/.pip/pip.conf[global] index-url https://mirrors.aliyun.com/pypi/simple/ trusted-host mirrors.aliyun.com注意conda和pip是两套独立的包管理机制混用时要小心优先用conda安装编译好的包如果conda找不到再用pip安装到conda环境中。但不要频繁混用否则容易出现.so链接版本冲突。4.4 将CUDA和Anaconda整合到PyTorch环境Anaconda装好后我们创建一个独立的深度学习环境。我一般会明确指定Python版本和PyTorch版本以PyTorch 2.1 CUDA 12.1为例conda create -n dl python3.10 conda activate dl pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121这里有个关键点PyTorch将CUDA相关运行库已经打进wheel包所以你并不需要把CUDA Toolkit完整装到conda环境里。只要系统的NVIDIA驱动支持对应CUDA版本PyTorch就能正常使用GPU。系统级CUDA Toolkit只是供你编译自定义CUDA扩展用的。为了验证环境和系统的CUDA、驱动是否匹配可以运行python -c import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))如果输出True且能看到显卡型号说明整合成功。如果torch.cuda.is_available()返回False常见原因是PyTorch编译时对应的CUDA版本高于驱动支持的最大CUDA版本。5. 验证与排错从零开始搭建后的必测清单5.1 验证链路驱动、CUDA工具包、conda环境、PyTorch调用装完所有组件后我建议按顺序执行一套“冒烟测试”确认每个环节都正常。完整的测试链路如下第一步验证驱动nvidia-smi输出驱动版本和显卡型号。第二步验证CUDA Toolkitnvcc --version输出CUDA编译器版本。再检查库文件echo $LD_LIBRARY_PATH | grep cuda第三步验证conda环境和GPU可用性source /opt/anaconda3/etc/profile.d/conda.sh conda activate dl python -c import torch; print(torch.cuda.is_available())注意在非交互环境下使用conda activate可能需要先sourceconda脚本。很多人在定时任务里跑Python脚本时没激活conda环境导致访问不到对应库这个要特别留意。另外如果你想测试GPU计算是否真的正常可以跑一个矩阵运算import torch x torch.randn(10000, 10000, devicecuda) y torch.mm(x, x) print(y.sum().item())如果能够输出一个数值而非报错说明CUDA计算通路可用。5.2 常见错误与修复逻辑我把自己遇到过以及帮别人查过的高频问题整理成了一张对照表按“症状→原因→修复”的方式记录症状原因修复方式nvidia-smi: command not found驱动未正确安装或PATH未设置检查/usr/bin/nvidia-smi重装.run文件并加--silentCouldnt communicate with the NVIDIA driver内核模块未加载或nouveau未禁用lsmodgcc: error: unrecognized command line optionGCC版本过新与旧驱动不兼容安装多个GCC版本并在编译前设置CC/usr/bin/gcc-9等CUDA error: no kernel image available驱动支持的最高CUDA版本低于PyTorch所需版本升级驱动到匹配版本或改用低CUDA版PyTorch/lib64/libstdc.so.6: version GLIBCXX_3.4.30 not found系统libstdc版本偏老通过conda环境安装libstdc-ng12conda: command not foundconda未初始化执行/opt/anaconda3/bin/conda init重新登录shell修这一类问题有个基本套路就是先看日志。驱动安装失败看/var/log/nvidia-installer.logCUDA安装失败看终端输出中的错误行conda包冲突看conda的solve过程。不要盲目重装先定位是哪一层的问题。5.3 我的实际操作体会和两个容易被忽略的细节最后说说我实际操作中得到的经验。第一点是不要在已经打开图形界面的情况下装NVIDIA驱动。如果你的CentOS 8装了GNOME最好切换到multi-user.target即命令行模式再安装否则X server占用了GPU资源驱动模块很难正常加载。临时切换命令是systemctl isolate multi-user.target装完驱动再切回图形界面systemctl isolate graphical.target当然对于纯服务器环境保持multi-user模式就足够。第二点是所有的重量级软件最好都放在统一目录下比如我把Anaconda放在/opt/anaconda3CUDA放在/usr/local/cuda-*这样在写环境变量时不容易乱。很多人在主目录下装了一堆机器换人或者权限调整后路径全变就再也跑不起来了。第三个容易踩的细节是CUDA Toolkit自带的驱动版本和官方最新驱动版本之间偶尔存在不一致。安装CUDA时如果选择不装驱动那么一定要确保驱动版本大于或等于CUDA Toolkit要求的驱动最小版本。判断方法是查看NVIDIA官网驱动页的“支持CUDA版本”一栏或者直接运行nvidia-smi右上角的CUDA Version来对比。通过这些步骤一台全新的CentOS 8机器可以顺利变成可用的深度学习工作站。这套流程不仅适用于CentOS 8也适用于RHEL 8、Rocky Linux 8、AlmaLinux 8等衍生系统只是仓库源的地址略有不同。后面你如果遇到新硬件驱动失败、多卡通信异常、或者conda与系统Python冲突等问题可以顺着这篇的验证链路一层层排查基本都能找到方向。