直接给结论:如果你追求“开箱即用”和稳定性,Ubuntu 20.04 (Focal Fossa) 依然是目前 CUDA/PyTorch 生态中踩坑最少、兼容性最好的选择。但如果你必须用新硬件(如 RTX 4090)或依赖较新的 GCC 版本,Ubuntu 22.04 (Jammy Jellyfish) 是更好的长期方案,前提是你愿意折腾驱动加载机制。
下面从实际开发场景拆解原因:
1. CUDA Toolkit 与 PyTorch 的官方支持策略
NVIDIA 和 PyTorch 团队在发布新版本时,往往优先保证对 Ubuntu 20.04 的支持。
- CUDA 11.x 系列:这是目前大多数生产环境稳定运行的版本区间。NVIDIA 的 runfile 安装器和 deb 包对 20.04 的支持最为成熟。
- CUDA 12.x 系列:虽然开始支持 22.04,但在早期版本中存在一些库依赖冲突(尤其是
libcudnn和libnccl)。 - PyTorch Pre-built Wheels:PyTorch 官方提供的 pip/conda 预编译包,通常基于特定的 glibc 和 gcc 版本构建。Ubuntu 20.04 使用的 glibc 2.31 是一个经过充分验证的“甜蜜点”。Ubuntu 22.04 使用 glibc 2.35,某些老旧的第三方 C++ 扩展库(如旧版 transformers 中的某些算子)可能会因为 ABI 不兼容而报错。
2. 显卡驱动加载机制的差异(关键痛点)
这是两个系统最大的区别,也是导致 22.04 “问题多”的主要原因:
- Ubuntu 20.04:默认允许用户通过
apt install nvidia-driver-*或 NVIDIA 官方 runfile 安装专有驱动,并且可以禁用 Nouveau 开源驱动。这个过程虽然需要重启,但路径清晰,社区教程海量。 - Ubuntu 22.04:默认启用 DKMS (Dynamic Kernel Module Support) 和更严格的内核模块签名策略。当你尝试安装 NVIDIA 专有驱动时,如果内核更新(例如你用了 HWE 内核),DKMS 可能重建失败,导致登录后黑屏或无法进入图形界面。此外,22.04 对 Secure Boot 的检查更严,很多开发者在非白名单密钥下安装驱动会遭遇权限拒绝。
注意:22.04.1 之后这个问题有所缓解,但依然比 20.04 敏感。
3. GCC 版本与编译依赖
许多深度学习框架(如 TorchVision, TorchText, Detectron2, MMDetection)需要从源码编译 C++ 扩展。
- Ubuntu 20.04:默认 GCC 9。这个版本足够应对绝大多数 PyTorch 扩展的编译需求,且与 CUDA 11.x 的 nvcc 编译器兼容性极佳。
- Ubuntu 22.04:默认 GCC 11。GCC 11 引入了更多警告和严格检查,有时会导致原本在 GCC 9 上能编译通过的代码出现
error: ISO C++ ...类错误。你需要手动降级 GCC 或使用-Wno-error等 workaround,增加了配置复杂度。
4. 容器化部署(Docker)的影响
如果你主要使用 Docker 运行 PyTorch:
- NVIDIA Container Toolkit 在两种系统上都工作良好。
- 但是,基础镜像的选择很重要。
nvidia/cuda:11.8.0-base-ubuntu20.04这类镜像经过大量测试,体积适中,依赖稳定。 - 对应 22.04 的基础镜像 (
nvidia/cuda:12.1.0-base-ubuntu22.04) 虽然可用,但部分轻量级工具链(如某些版本的glibc缺失)可能在最小化容器中引发运行时错误(undefined symbol)。
✅ 推荐方案
场景 A:你是新手 / 追求稳定 / 使用 RTX 30 系及以下显卡
👉 选 Ubuntu 20.04 LTS
- 安装 CUDA 11.7/11.8 + cuDNN 8.6
- 使用 conda 创建虚拟环境,直接
pip install torch torchvision torchaudio - 几乎不会遇到驱动崩溃、内核不匹配、编译失败等问题。
- 社区资源最多,StackOverflow 上的解决方案覆盖率高。
场景 B:你必须用 RTX 40 系显卡 / 需要最新 Python 版本 / 计划长期使用
👉 选 Ubuntu 22.04 LTS
- 重要提示:不要使用桌面版自动更新的 HWE 内核!建议锁定到标准内核(
linux-generic-hwe-22.04或更早的稳定内核)。 - 安装 NVIDIA 驱动时,推荐使用 PPA 源 而非 runfile,以避免 DKMS 问题:
sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update sudo apt install nvidia-driver-535 # 或更高版本 - 对于 CUDA,建议使用 deb (local) 方式安装,而不是 runfile,以便更好地集成到系统包管理中。
- 如果遇到 GCC 编译问题,可临时安装 GCC 9:
sudo apt install gcc-9 g++-9 export CC=gcc-9 export CXX=g++-9
🛠️ 避坑指南(无论哪个系统)
-
永远不要用
sudo apt install cuda
这种方式安装的 CUDA 版本极老,且容易与系统库冲突。务必去 NVIDIA 官网 下载.run或.deb(local)包手动安装。 -
避免混合安装 PyTorch 来源
不要同时用 pip 和 conda 安装不同版本的 PyTorch。推荐全部使用 conda 管理,或全部使用 pip。 -
检查
nvidia-smi和nvcc --version是否一致
这是最常见的错误源头。nvidia-smi显示的是驱动支持的最高 CUDA 版本,而nvcc是 toolkit 的实际版本。两者不必完全相同,但 toolkit 版本不能超过驱动支持的上限。 -
禁用 Nouveau 驱动(仅适用于 20.04)
编辑/etc/modprobe.d/blacklist-nouveau.conf,添加:blacklist nouveau options nouveau modeset=0然后执行
sudo update-initramfs -u并重启。这一步在 22.04 中通常由图形界面设置处理,但仍需确认。
总结
| 维度 | Ubuntu 20.04 | Ubuntu 22.04 |
|---|---|---|
| CUDA 兼容性 | ⭐⭐⭐⭐⭐ (最成熟) | ⭐⭐⭐⭐ (良好,但需注意版本) |
| 驱动安装难度 | ⭐⭐⭐⭐ (简单) | ⭐⭐⭐ (中等,需注意 DKMS) |
| GCC 编译友好度 | ⭐⭐⭐⭐⭐ (GCC 9 稳定) | ⭐⭐⭐ (GCC 11 可能报错) |
| 新硬件支持 | ❌ 不支持 RTX 40 系 | ✅ 支持 RTX 40 系及更新 CPU |
| 社区资源 | 极其丰富 | 正在增长 |
最终建议:
除非你有明确的理由必须使用 22.04(如新硬件、新内核特性、公司强制要求),否则 Ubuntu 20.04 是更稳妥、更少问题的选择。它像一个“经过充分测试的工业级平台”,而 22.04 更像是一个“前沿实验平台”,虽然功能更强,但需要你花更多时间调试底层依赖。
云技术博客