差异确实存在,但核心逻辑没变。如果你是从 20.04 迁移到 22.04,或者在两者之间做选择,主要需要关注以下几个“坑”和变化点。简单来说:驱动层更省心了,环境层更严格了,旧版兼容性要注意。
下面我从实际踩坑的角度,拆解一下这两个版本在安装 CUDA 和 PyTorch 时的具体差异。
1. 系统底层与 GCC 版本(最大的隐形杀手)
这是最容易被忽视,但导致编译失败或运行报错的根本原因。
- Ubuntu 20.04: 默认使用 GCC 9。
- Ubuntu 22.04: 默认使用 GCC 11/12(取决于具体小版本)。
影响:
PyTorch 的预编译二进制包(Wheel)通常是针对特定版本的 GCC 构建的。虽然 NVIDIA 和 PyTorch 官方会尽量保证向后兼容,但当你的系统 GCC 版本过高时,可能会遇到以下问题:
- C++ ABI 不匹配:某些依赖库(如
libstdc++)的版本差异可能导致链接错误。 - 自定义算子编译失败:如果你要自己写 CUDA Kernel 或者安装像
xformers、flash-attn这种需要现场编译 C++/CUDA 代码的库,GCC 11/12 对语法检查更严,一些旧的代码可能直接报错。
建议:
在 22.04 上,如果为了兼容性,可以安装低版本 GCC:
sudo apt install gcc-9 g++-9
# 并在编译时指定编译器
export CC=gcc-9
export CXX=g++-9
但对于大多数纯 Python 调用 PyTorch 的场景,只要用官方 Wheel,通常不需要手动干预 GCC。
2. CUDA Toolkit 的安装方式差异
NVIDIA 官方已经不再强烈推荐 .run 文件安装方式,而是主推 APT Repository 或 Container 方式。这一点在 20.04 和 22.04 上是一致的,但操作细节有微调。
A. 显卡驱动(Driver)
- 20.04: 你可能习惯去 NVIDIA 官网下载
.run包,或者用ubuntu-drivers autoinstall。 - 22.04: 强烈建议使用 PPA 源安装驱动。因为 22.04 的内核更新更快,
.run包容易因为内核头文件缺失而安装失败。sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update sudo apt install nvidia-driver-535 # 或最新推荐版本注意:驱动版本必须 >= CUDA Toolkit 要求的最低版本。例如,CUDA 12.1 要求驱动至少是 550.xx(具体查 NVIDIA 文档)。
B. CUDA Toolkit
- 20.04: 很多人喜欢用
.deb本地包安装。 - 22.04: 推荐使用 NVIDIA APT Repository。这样你可以方便地切换不同版本的 CUDA(通过
cuda-toolkit-xx-x包名),且能自动处理依赖。# 以 CUDA 12.1 为例 sudo apt install cuda-toolkit-12-1关键点:安装后,你需要将
/usr/local/cuda/bin加入 PATH,并将/usr/local/cuda/lib64加入 LD_LIBRARY_PATH。这一步在两个系统上都一样,但 22.04 的 shell 配置(bash vs zsh)可能需要你更仔细地检查~/.bashrc或~/.zshrc。
3. PyTorch 安装的差异
PyTorch 本身是跨平台的,它的安装命令在两个系统上几乎完全一样,都是基于 Python 版本和 CUDA 版本来选择对应的 Wheel。
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
真正的差异在于 Python 版本:
- Ubuntu 20.04: 默认 Python 3.8。很多老项目依赖 3.8,PyTorch 对 3.8 的支持非常好。
- Ubuntu 22.04: 默认 Python 3.10。PyTorch 从 1.13+ 开始逐步放弃对 3.8 的支持,转向 3.9/3.10/3.11。
这意味着:
- 如果你用 Python 3.10+:在 22.04 上安装 PyTorch 会更顺畅,没有历史包袱。
- 如果你必须用 Python 3.8:在 22.04 上你需要手动安装 pyenv 或从源码编译 Python,这增加了复杂度。而在 20.04 上,它就在系统里。
4. 常见坑点总结
| 问题 | Ubuntu 20.04 | Ubuntu 22.04 | 解决方案 |
|---|---|---|---|
| 驱动冲突 | 较少见,.run 包稳定 |
常见,内核更新快导致 .run 失败 |
使用 ppa:graphics-drivers 安装驱动 |
| CUDA 路径 | /usr/local/cuda 符号链接可能指向旧版 |
同上,但多版本共存管理更频繁 | 使用 update-alternatives 或软链接明确指定 |
| Python 兼容性 | 默认 3.8,老库支持好 | 默认 3.10,新库支持好,老库需适配 | 根据项目需求选择 Python 版本,必要时用 conda |
| glibc 版本 | 2.31 | 2.35 | 某些闭源商业软件或旧版 TensorFlow 可能在 22.04 上因 glibc 版本过高而报错 |
5. 最佳实践建议
-
优先使用 Conda 管理 Python 环境:
不管是在 20.04 还是 22.04,都建议用 Miniconda/Mamba 创建独立环境。这样可以隔离 Python 版本和依赖库,避免系统级 Python 带来的麻烦。conda create -n pytorch_env python=3.10 conda activate pytorch_env pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 -
驱动先行,CUDA 后置:
先确保显卡驱动正确安装并生效(nvidia-smi能看到 GPU 信息),再安装 CUDA Toolkit。不要试图让 CUDA 驱动管理器去覆盖系统驱动,除非你非常清楚自己在做什么。 -
对于新项目,直接选 22.04:
20.04 将在 2025 年 4 月结束标准支持(ESM 之前还有 Extended Support,但社区活跃度下降)。22.04 的软件包更新、内核更新、Python 新版本支持都更好。除非你有遗留的、无法迁移的老代码(比如依赖特定 GCC 8 的旧 CUDA 代码),否则没必要纠结 20.04。 -
验证安装:
无论哪个版本,装完后务必跑一下测试:import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.version.cuda)确保输出一致,且
is_available()为 True。
结论:
差异不大,主要是系统默认组件版本(GCC, Python, glibc)的变化带来的间接影响。只要按照“驱动 -> CUDA -> PyTorch”的标准流程,并使用现代工具链(APT + Conda/Pip),在 22.04 上安装反而更规范、更少遇到奇奇怪怪的依赖冲突。
云技术博客