ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Ubuntu 18.04物理机安装CUDA与Anaconda:驱动配置、环境搭建及常见坑排查

Ubuntu 18.04物理机安装CUDA与Anaconda:驱动配置、环境搭建及常见坑排查

这几年,凡是做深度学习、跑仿真、搞跨平台编译的人,最后基本都会被同一个问题拦住:物理机上到底怎么干净地把 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 Partition
swap16GB与内存相等即可,不用太大
/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. 装完系统后先别急着装CUDA

3.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 modeset=0' >> /etc/modprobe.d/blacklist-nouveau.conf"

然后刷新内核镜像:

sudo update-initramfs -u

重启后用这个命令验证 nouveau 是否不再加载:

lsmod | grep nouveau

无输出就说明禁用成功。如果重启后黑屏,不要慌,按 Ctrl+Alt+F3 进入纯文本模式,重新检查配置文件,确认路径和内容没写错。

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选 Yes,Install NVIDIA's 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.4+gcc 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 gcc

g++ 同样处理。切换完成后查看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 或按 Ctrl+C 跳过,然后输入accept接受条款。接下来它问是否安装 NVIDIA Driver,这里选 No,因为我们已经手动装好驱动了。其他组件比如 CUDA Toolkit、Samples、Documentation 选 Yes 或按需选。

这里有个小细节:如果选 Yes 让它装驱动,它默认会覆盖你当前驱动,装完重启后非常容易出现版本不一致的怪问题。我踩过一次,驱动从 470 被覆盖成 515,CUDA 程序反而不跑,最后只能重新手动装回原版本。所以统一原则:驱动单独装,CUDA Toolkit 走 runfile,Driver 组件一律 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.4,nvcc却是 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 yes

pip 源也顺手配置:

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 python=3.8 conda activate dl

进去以后,正常安装你要用的深度学习库:

pip install numpy torch torchvision

不同项目就再创建不同环境:

conda create -n tf2 python=3.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 cudatoolkit=11.2 cudnn=8.2

这和使用系统级 CUDA 的差别在于侧重点不同:如果你需要写 C/C++ CUDA 扩展、编译自己的核函数,那系统级/usr/local/cuda必不可少;如果只是调框架接口、训练模型,conda 环境里的 cudatoolkit 更省心,版本切换也方便。

我的习惯是:系统级 CUDA 装一个稳定版本,面向编译需求;conda 环境按项目需要各自指定 cudatoolkit 版本,两者互不干扰。这个组合在遇到“这个项目只要 CUDA 10.2,那个项目要 CUDA 11.6”的需求时特别管用。

6. 高频报错与排查速查

这章结合我自己趟过的和帮别人排查过的实际问题,整理了最常见的故障清单,直接按表对照能少走很多弯路:

现象常见原因快速处理
安装界面卡在 logo/花屏显卡模式问题启动参数加nomodeset
重启后黑屏nouveau 未被禁用或驱动装失败纯文本模式检查黑名单,重装驱动
循环登录驱动与桌面管理器冲突Ctrl+Alt+F3 停桌面,重装驱动
nvcc -V找不到命令PATH 没配置查~/.bashrc是否写了 CUDA 路径并 source
/usr/local/cuda不存在软链接缺失手动建软链接指向/usr/local/cuda-xx.x
编译报unsupported GNU versiongcc 版本过高用update-alternatives切到对应 gcc
conda: command not foundconda 未初始化重新执行安装脚本选 yes 或手动补 PATH
conda 创建环境超时网络源慢换国内镜像源再试
运行程序报CUDA driver version is insufficient驱动版本不够新更新 NVIDIA 驱动到目标 CUDA 所需版本
双系统开机进不了 LinuxUEFI 引导顺序错进 BIOS 确认启动项指向 Ubuntu 引导分区

除了表格,我想说两个经验。第一,很多驱动相关的问题,纯粹是因为没在 tty 模式下操作造成的。图形界面占用显卡几个小时后,你再装驱动基本等于给运行中的系统换心脏,不崩才怪。所以记住这一招:任何驱动安装、卸载、降级,都先进Ctrl+Alt+F3,停掉桌面管理器再干。第二,每次改配置后要重启而不是注销,尤其内核模块相关的改动,重启一下能验证很多不确定因素。

还有一个容易被忽略的问题,就是磁盘空间。CUDA 工具链加上 Anaconda 环境很容易把/分区占满,尤其是在根目录放数据集、日志的项目。遇到“写入失败”“磁盘空间不足”时,先用df -h看挂载点占用,不要盲目往根目录塞数据。如果当初没分/home,起码要学会用du -sh *定位大目录,及时清理。

另外,对于“安装完 CUDA 重启后无法进入图形界面”的情况,千万别急着重装系统。先在 tty 登录,执行:

sudo apt remove --purge nvidia-* sudo reboot

大概率就能回到桌面。再重新从驱动开始走一遍流程,找到问题所在。

这个内容后续还可以扩展的方向是:搞一套无人值守安装脚本,把apt源、驱动、CUDA、conda 环境全部自动化,可以省掉每次重复操作的时间。我个人在实际操作中最深的感受是,装环境这件事,最怕的不是不会敲命令,而是对着错的教程一路敲到坑里。只要理解了驱动、Toolkit、conda 环境这三层各自管什么、之间怎么配合,绝大多数故障都能定位清楚。要是你按这个流程走下来还有问题,建议回头逐节核对,大概率是某一步的版本匹配或者引导参数没做对。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进