努力
加油

CUDA和PyTorch在Ubuntu 22.04与20.04上的安装差异大吗?

差异确实存在,但核心逻辑没变。如果你是从 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 版本过高时,可能会遇到以下问题:

  1. C++ ABI 不匹配:某些依赖库(如 libstdc++)的版本差异可能导致链接错误。
  2. 自定义算子编译失败:如果你要自己写 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。

这意味着:

  1. 如果你用 Python 3.10+:在 22.04 上安装 PyTorch 会更顺畅,没有历史包袱。
  2. 如果你必须用 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. 最佳实践建议

  1. 优先使用 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
  2. 驱动先行,CUDA 后置:
    先确保显卡驱动正确安装并生效(nvidia-smi 能看到 GPU 信息),再安装 CUDA Toolkit。不要试图让 CUDA 驱动管理器去覆盖系统驱动,除非你非常清楚自己在做什么。

  3. 对于新项目,直接选 22.04:
    20.04 将在 2025 年 4 月结束标准支持(ESM 之前还有 Extended Support,但社区活跃度下降)。22.04 的软件包更新、内核更新、Python 新版本支持都更好。除非你有遗留的、无法迁移的老代码(比如依赖特定 GCC 8 的旧 CUDA 代码),否则没必要纠结 20.04。

  4. 验证安装:
    无论哪个版本,装完后务必跑一下测试:

    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 上安装反而更规范、更少遇到奇奇怪怪的依赖冲突。