这几年凡是做深度学习、跑仿真、搞跨平台编译的人最后基本都会被同一个问题拦住物理机上到底怎么干净地把 Ubuntu 18.04、CUDA、Anaconda 这套环境一次装明白。虚拟机里照着教程走很容易但一上真实训练和推理性能差异立刻见分晓。这个组合我在各种机器上来回装过不下十遍踩过开机黑屏、驱动冲突、conda 源超时、nvcc 找不到命令这些坑所以这次把完整步骤和背后的取舍逻辑都写下来让还没趟过浑水的人少走弯路。这篇文章适合三类人准备入深度学习但机器是主力机不敢乱动的新手在实验室或公司拿一台工作站、想快速搭环境的开发者以及那种“装了两天还在反复重装系统”的倒霉朋友。我不会只扔命令每个关键步骤都会说清楚为什么这么做、不这么做会怎样。照着走完一遍你应该能得到一套能编译 CUDA 程序、能跑 PyTorch/TensorFlow、又能用 Anaconda 隔离环境的物理机。1. 装之前先做决定物理机方案的取舍1.1 为什么非要用物理机虚拟机到底差在哪很多人觉得装个 Ubuntu 用虚拟机就行但如果你要跑 GPU 计算虚拟机的短板是致命的。虽然现在有不少方案能做显卡直通把物理显卡挂给虚拟机但配置复杂度高而且延迟和带宽损耗始终存在尤其多卡并行或者频繁读写显存时损耗会被放大。物理机直接让系统独占整块 GPU驱动模型简单生态兼容性最好像是nvidia-smi、CUDA samples、编译内核模块这些操作都不会出现奇怪的中间层问题。另一个现实是不少教程类项目、老版本框架、机器人操作系统中间件指定就是 Ubuntu 18.04。系统本身虽然已经不再有新的功能更新但大量长期支持仓库和工业项目还留在上面。你在新版本上编译老代码经常遇到依赖冲突而在 18.04 上反而顺风顺水。选这套组合不是因为它新是因为你迟早要陪它打交道。1.2 硬件自查清单与启动方式确认动手前先把硬件过一遍不然装到一半才发现显卡不支持或者启动盘模式不对返工成本极高。我整理了一个最简自查表项目要求原因显卡NVIDIA 独立显卡CUDA 只支持 NVIDIA 生态显存入门建议 4GB 以上模型训练显存占用远超预期内存建议 16GB 起步数据集加载、编译都吃内存硬盘建议 256GB 以上 SSD系统、CUDA、conda 包、数据集都不小CPUx86_64 架构即可兼容性最稳不折腾交叉编译启动方式UEFI 或 Legacy 二选一决定分区方案和引导器安装方式其中启动方式必须提前确认。开机进 BIOS看引导模式是 UEFI 还是 Legacy。现在新机器基本都是 UEFI不要和 Legacy 混用否则后面装完系统出现“找不到启动项”的概率极大。确认方法很简单进 BIOS 的 Boot 设置里找 UEFI/Legacy 选项如果有 Secure Boot建议暂时关掉很多驱动和引导工具在 Secure Boot 开启时会被拒之门外。1.3 单系统还是双系统别头脑发热这是第一个要认真做的决定。如果机器可以专门用来做实验、跑任务毫不犹豫选“清除整个磁盘并安装 Ubuntu”的单系统方案后面所有环境问题都更好解决。但如果你还有 Windows 下的软件、设计工具、网银依赖那就得双系统共存提前在 Windows 磁盘管理器里压缩出一个空闲分区容量至少 100GB最好 200GB因为 CUDA 工具链、Anaconda 环境、数据集加起来非常占地方。我的实际建议是主力工作机尽量别拿来又当实验机又当日常机。因为 CUDA、驱动程序、conda 环境这些一旦折腾起来很容易把引导器搞乱到时候 Windows 进不去更闹心。有条件就单独拿一台机器做 Linux 环境否则就认真做好双系统分区备份。2. 系统镜像、启动盘与分区规划2.1 镜像选择与启动盘制作Ubuntu 官方镜像站下载 Ubuntu 18.04.5 桌面版即可。注意不要下载桌面版和服务器版混用这里需要图形安装界面桌面版更适合。下载完以后不要直接解压复制到 U 盘必须用写盘工具把镜像写入整块 U 盘。我以前用老办法把 ISO 解压到 U 盘结果开机根本无法引导折腾半小时才反应过来。写盘工具推荐两个Windows 下用 Rufus跨平台用 balenaEtcher都支持刻录 ISO 到 U 盘。U 盘建议 8GB 以上容量太小装不下镜像。写入时会格式化 U 盘所以 U 盘里有重要数据先拷出来。写完以后插到目标机器开机按启动菜单快捷键常见的有 F12、F11、ESC具体看你机器主板直接进 BIOS 也行把 U 盘设为第一启动项。这里有个细节如果你的机器是 UEFI 模式U 盘写入时分区类型选 GPT如果是 Legacy 传统模式选 MBR。选错了最常见的表现是 U 盘启动后黑屏只有一个光标或者直接跳过 U 盘进了当前系统。2.2 分区方案怎么分不后悔安装到分区步骤时很多新手会犹豫。我给出两套常用方案你按自己情况抄就行。单系统干净安装方案挂载点大小说明/boot/efi512MBUEFI 引导必需格式选 EFI System Partitionswap16GB与内存相等即可不用太大/100GB系统根目录装软件、CUDA 都在这里/home剩余全部用户数据、conda 环境都在这里双系统共存方案就是在 Windows 压缩出的空闲空间上同样按上表创建分区只不过不要把整块磁盘清空。手动分区时先选中空闲空间点“”创建分区。如果你搞不清某个分区该不该建记住 UEFI 引导必须有 EFI 系统分区Legacy 引导则建议分一个 1GB 的 /boot避免大容量磁盘下引导器找不到内核。为什么推荐 /home 单独分区因为以后系统出问题重装只要重装时把 /home 挂载点指到原来的分区选择“不格式化”你的数据、conda 环境、代码全部还在。我自己的教训就是第一次没分 /home后来为了清理驱动问题重装系统代码和数据集全没了差点当场崩溃。2.3 U盘安装界面里的几个细节进入安装界面后建议先选“安装 Ubuntu”不要选“试用 Ubuntu 后再安装”。很多老显卡在安装时会出现花屏或卡在 logo这时候可以选中菜单项后按 E 编辑启动参数在quiet splash后面加一个空格再加nomodeset这样会临时关闭内核模式设置让安装界面能正常显示。注意这个参数只是安装阶段应急装完系统后真正的显卡驱动还是要单独装。网络连接建议优先用有线网无线网卡在 18.04 上识别率不一定好尤其部分新无线网卡需要额外驱动安装阶段没网会很被动。安装时可以勾选“为图形或无线硬件安装第三方软件”和“下载更新”虽然会多花点时间但能省掉后面不少补装驱动的麻烦。如果安装过程特别慢建议等安装完系统后统一换源再更新没必要在安装阶段干等。3. 装完系统后先别急着装CUDA3.1 让系统联网并更新重启进入 Ubuntu 桌面第一件事不是装 CUDA而是确认网络然后换源更新。默认源在国外服务器下载速度经常几十 KB让你怀疑人生。编辑/etc/apt/sources.list把里面的archive.ubuntu.com和security.ubuntu.com换成国内镜像站然后执行sudo apt update sudo apt upgrade -y换国内镜像源是一个非常实用的习惯。我在机器初始状态直接apt install curl都能卡半天换源之后就顺畅多了。这个步骤虽然不起眼但后续安装 CUDA、Anaconda 依赖都会受益。3.2 安装基础编译环境CUDA 工具链运行需要编译器、make 和内核头文件所以系统装完后必须先补齐基础环境sudo apt install build-essential sudo apt install linux-headers-$(uname -r)build-essential包含 gcc、g、make 等一整套编译工具后面安装 NVIDIA 驱动、编译 CUDA samples 都依赖它们。内核头文件尤其关键NVIDIA 驱动安装时默认要编译内核模块如果没有对应版本的头文件安装会直接报Kernel module compilation failed。有部分机器自带的是较老的 gcc比如 Ubuntu 18.04 默认 gcc 7。先不用着急CUDA 版本匹配后面会说。3.3 关于驱动你迟早要知道的nouveau这是整个安装过程中第一个大坑。Ubuntu 默认加载了一个名为 nouveau 的开源 NVIDIA 驱动模块它和 CUDA 根本不兼容而且还会阻止官方驱动正常工作。如果不把它禁用后面安装 NVIDIA 驱动时十有八九会出问题表现为安装报错、黑屏、循环登录。正确的做法是创建黑名单文件sudo bash -c echo blacklist nouveau /etc/modprobe.d/blacklist-nouveau.conf sudo bash -c echo options nouveau modeset0 /etc/modprobe.d/blacklist-nouveau.conf然后刷新内核镜像sudo update-initramfs -u重启后用这个命令验证 nouveau 是否不再加载lsmod | grep nouveau无输出就说明禁用成功。如果重启后黑屏不要慌按 CtrlAltF3 进入纯文本模式重新检查配置文件确认路径和内容没写错。4. NVIDIA驱动与CUDA Toolkit安装4.1 先装驱动还是直接用CUDA安装包网上的教程分成两派。一派建议直接用 CUDA 安装包里的驱动另一派建议手动先装驱动再装 CUDA Toolkit。我的实际经验是手动先装驱动CUDA 安装包里的 Driver 组件选择不装这样版本控制最清晰也最容易排查问题。如果你先装系统时已经通过“软件和更新”里的附加驱动装好了 N 卡驱动那也可以直接用但要确保版本不要过低。用nvidia-smi能看到驱动版本和它支持的 CUDA 版本号在这个基础上继续装 CUDA Toolkit 即可。最怕的是驱动版本太老比如 CUDA 11.x 要求驱动版本不低于某个阈值否则就算 Toolkit 装上了程序一跑就报CUDA driver version is insufficient。4.2 手动安装驱动的完整路径NVIDIA 官网下载和你显卡对应的 Linux 驱动.run文件。如果不确定用哪个版本先在终端跑一句ubuntu-drivers devices它会列出推荐驱动通常会有nvidia-driver-xxx的标记。准备好文件后给安装包执行权限chmod x NVIDIA-Linux-x86_64-xxx.run然后进入纯文本模式先停掉桌面管理器再安装避免 X 服务占用显卡sudo service gdm3 stop sudo sh NVIDIA-Linux-x86_64-xxx.run如果你的桌面管理器不同可能是 lightdm执行sudo service lightdm stop。安装过程中遇到Would you like to register the kernel module sources with DKMS选 YesInstall NVIDIAs 32-bit compatibility libraries按需选其余默认即可。装完重启执行nvidia-smi能看到类似Driver Version和CUDA Version的表头输出就是成功。有次我在图形界面直接跑安装脚本结果装完重启死循环在登录页后来进了 tty 重装才解决所以停桌面管理器这个步骤别省。4.3 CUDA版本选择与gcc匹配Ubuntu 18.04 不是所有 CUDA 版本都随随便便装。最重要的约束是 gcc 版本。我这里整理了常用版本匹配关系方便你对照CUDA 版本官方支持最高 gcc 版本适用说明CUDA 10.xgcc 7/8老项目、旧框架友好CUDA 11.0-11.2gcc 9用得较多、生态成熟CUDA 11.4gcc 10部分新版 PyTorch 需要CUDA 12.xgcc 12.x 或更新更适合新系统如果你不确定去查该版本官方文档里的系统兼容性表。在 Ubuntu 18.04 上如果安装或编译时报unsupported GNU version说明当前 gcc 版本高了需要降级。我之前用 CUDA 11.1 时机器默认 gcc 9倒是能过但装了某旧版本 CUDA 10.2 后就必须切成 gcc 7。多版本 gcc 切换用update-alternatives最省事sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 sudo update-alternatives --config gccg 同样处理。切换完成后查看gcc --version确认。4.4 runfile方式安装CUDA下载对应版本的 CUDA Toolkit 的.run文件不要选.deb安装包。runfile 能让你自主决定装哪些组件而 deb 包会直接把系统环境改掉如果和之前驱动冲突很难清理干净。给文件加执行权限后运行chmod x cuda_xxx_linux.run sudo sh cuda_xxx_linux.run第一次会显示协议文本长按 Q 或按 CtrlC 跳过然后输入accept接受条款。接下来它问是否安装 NVIDIA Driver这里选 No因为我们已经手动装好驱动了。其他组件比如 CUDA Toolkit、Samples、Documentation 选 Yes 或按需选。这里有个小细节如果选 Yes 让它装驱动它默认会覆盖你当前驱动装完重启后非常容易出现版本不一致的怪问题。我踩过一次驱动从 470 被覆盖成 515CUDA 程序反而不跑最后只能重新手动装回原版本。所以统一原则驱动单独装CUDA Toolkit 走 runfileDriver 组件一律 No。安装完成后检查目录ls -l /usr/local/cuda正常情况下会存在一个指向/usr/local/cuda-xx.x的软链接这样后续工具默认找/usr/local/cuda就行不用写死版本号。4.5 环境变量和验证双命令CUDA 装完不会自动进入 PATH必须手动配置环境变量。编辑~/.bashrc在末尾追加export PATH/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH然后source ~/.bashrc验证主要靠两个命令信息完全是两个层面nvcc -V nvidia-smi第一次看到这俩输出不一致不用慌。nvidia-smi显示的是驱动本身支持的最高 CUDA 版本而不是你实际安装的 Toolkit 版本nvcc -V显示的才是 CUDA Toolkit 版本。只要nvcc -V输出你安装的版本号就说明 Toolkit 装好了。很多人看到nvidia-smi里显示 CUDA 11.4nvcc却是 10.2以为自己没装对其实是概念理解问题。4.6 验证CUDA已真正可用光看版本号还不够要实际编译一个测试程序。CUDA 自带 samples使用也很简单cd /usr/local/cuda/samples/1_Utilities/deviceQuery sudo make ./deviceQuery最后出现Result PASS且能看到显卡型号和显存大小说明 CUDA 环境真的可用。另一个测试是带宽测试在1_Utilities/bandwidthTest目录下同样操作。如果编译报缺库最常见的错误是找不到 libcuda.so这时候检查LD_LIBRARY_PATH是否包含/usr/local/cuda/lib64或者建立软链接sudo ln -sf /usr/local/cuda/lib64/libcuda.so /usr/lib/x86_64-linux-gnu/libcuda.so但一般情况下环境变量配好就不会遇到这个问题。5. Anaconda安装与环境管理5.1 安装脚本的正确打开方式Anaconda 官网下载 Linux 版安装脚本通常是Anaconda3-xxx-Linux-x86_64.sh。这里有一个新手特别容易踩的坑不要用sudo bash去执行安装脚本。原因很简单Anaconda 默认把自己安装到当前用户的家目录比如/home/你的用户名/anaconda3权限属于普通用户。如果用 sudo 装文件会落在 root 目录或者需要 root 权限才能写的路径后面启动 conda、运行 pip 都会遇到权限问题。正确做法是bash Anaconda3-xxx-Linux-x86_64.sh安装过程中一路回车接受协议到了Do you wish the installer to initialize Anaconda3?时选 yes。这样安装器会自动往~/.bashrc写入初始化代码省得手动配 PATH。安装完重新打开终端或执行source ~/.bashrc验证命令conda --version如果提示command not found说明 conda 没有被加入 PATH。手动执行以下命令可以临时启用export PATH$HOME/anaconda3/bin:$PATH但我更建议重新运行安装脚本时选一次 yes让conda init帮你在.bashrc里写好环境变量后面每次启动终端都自动生效。5.2 配置conda和pip源Anaconda 默认使用官方源在国内网络环境下创建环境经常卡在Solving environment或者下载包时速度极慢甚至超时。强烈建议先换源再创建环境。命令行配置 conda 源把默认 channels 替换为国内镜像conda config --add channels https://mirrors.你的镜像站/anaconda/pkgs/main/ conda config --add channels https://mirrors.你的镜像站/anaconda/pkgs/free/ conda config --set show_channel_urls yespip 源也顺手配置pip config set global.index-url https://mirrors.你的镜像站/pypi/simple/这个操作看起来简单但能省非常多时间。我有一次在默认源下创建 Python 3.8 环境卡了二十多分钟没反应换源后不到五分钟就装完。换完源以后如果遇到 SSL 报错一般是镜像站证书问题可以用conda config --set ssl_verify false临时绕过改完后尽快恢复正常。5.3 创建独立虚拟环境的步骤Anaconda 最大的价值就是环境隔离。千万不要在 base 环境里直接装一堆框架依赖不同项目对 PyTorch、TensorFlow、Python 版本要求经常冲突把 base 搞乱以后一堆环境依赖没法收拾。创建一个独立环境conda create -n dl python3.8 conda activate dl进去以后正常安装你要用的深度学习库pip install numpy torch torchvision不同项目就再创建不同环境conda create -n tf2 python3.8 conda activate tf2 pip install tensorflow用完后conda deactivate退出。这样卸东西也很干净环境不要了直接conda env remove -n dl不会影响系统其他地方。我这里要特别强调一点conda 环境里的 Python 解释器和系统自带的 Python 是隔离的你在环境里装什么都不会破坏系统。日常管理用conda env list查看所有环境用conda info --envs看环境路径避免环境多了以后搞混。5.4 conda版cudatoolkit使用技巧如果你主要工作是跑 Python 深度学习框架系统级 CUDA Toolkit 其实可以装得更轻量。PyTorch 官方安装包运行时需要 CUDA 库但不需要你手动设置一堆环境变量通过 conda 安装对应的cudatoolkit和cudnn就足够conda install cudatoolkit11.2 cudnn8.2这和使用系统级 CUDA 的差别在于侧重点不同如果你需要写 C/C CUDA 扩展、编译自己的核函数那系统级/usr/local/cuda必不可少如果只是调框架接口、训练模型conda 环境里的 cudatoolkit 更省心版本切换也方便。我的习惯是系统级 CUDA 装一个稳定版本面向编译需求conda 环境按项目需要各自指定 cudatoolkit 版本两者互不干扰。这个组合在遇到“这个项目只要 CUDA 10.2那个项目要 CUDA 11.6”的需求时特别管用。6. 高频报错与排查速查这章结合我自己趟过的和帮别人排查过的实际问题整理了最常见的故障清单直接按表对照能少走很多弯路现象常见原因快速处理安装界面卡在 logo/花屏显卡模式问题启动参数加nomodeset重启后黑屏nouveau 未被禁用或驱动装失败纯文本模式检查黑名单重装驱动循环登录驱动与桌面管理器冲突CtrlAltF3 停桌面重装驱动nvcc -V找不到命令PATH 没配置查~/.bashrc是否写了 CUDA 路径并 source/usr/local/cuda不存在软链接缺失手动建软链接指向/usr/local/cuda-xx.x编译报unsupported GNU versiongcc 版本过高用update-alternatives切到对应 gccconda: command not foundconda 未初始化重新执行安装脚本选 yes 或手动补 PATHconda 创建环境超时网络源慢换国内镜像源再试运行程序报CUDA driver version is insufficient驱动版本不够新更新 NVIDIA 驱动到目标 CUDA 所需版本双系统开机进不了 LinuxUEFI 引导顺序错进 BIOS 确认启动项指向 Ubuntu 引导分区除了表格我想说两个经验。第一很多驱动相关的问题纯粹是因为没在 tty 模式下操作造成的。图形界面占用显卡几个小时后你再装驱动基本等于给运行中的系统换心脏不崩才怪。所以记住这一招任何驱动安装、卸载、降级都先进CtrlAltF3停掉桌面管理器再干。第二每次改配置后要重启而不是注销尤其内核模块相关的改动重启一下能验证很多不确定因素。还有一个容易被忽略的问题就是磁盘空间。CUDA 工具链加上 Anaconda 环境很容易把/分区占满尤其是在根目录放数据集、日志的项目。遇到“写入失败”“磁盘空间不足”时先用df -h看挂载点占用不要盲目往根目录塞数据。如果当初没分/home起码要学会用du -sh *定位大目录及时清理。另外对于“安装完 CUDA 重启后无法进入图形界面”的情况千万别急着重装系统。先在 tty 登录执行sudo apt remove --purge nvidia-* sudo reboot大概率就能回到桌面。再重新从驱动开始走一遍流程找到问题所在。这个内容后续还可以扩展的方向是搞一套无人值守安装脚本把apt源、驱动、CUDA、conda 环境全部自动化可以省掉每次重复操作的时间。我个人在实际操作中最深的感受是装环境这件事最怕的不是不会敲命令而是对着错的教程一路敲到坑里。只要理解了驱动、Toolkit、conda 环境这三层各自管什么、之间怎么配合绝大多数故障都能定位清楚。要是你按这个流程走下来还有问题建议回头逐节核对大概率是某一步的版本匹配或者引导参数没做对。