跑 LLM 微调(Fine-tuning),尤其是全量微调或者 LoRA/QLoRA 这种大显存压力的任务,Ubuntu 的版本选择不仅仅是“新与旧”的问题,更关乎底层驱动、内核调度以及软件栈的兼容性。
从 20.04 LTS 升级到 22.04 LTS,对于深度学习工作负载来说,有几个非常实在的改进点,直接决定了你训练时的稳定性和效率:
1. CUDA 和 NVIDIA 驱动的原生支持度更高
这是最直接的痛点。LLM 微调重度依赖 NVIDIA GPU。
- 20.04 LTS:默认仓库里的 GCC 版本较老(通常是 9.x),虽然可以通过 PPA 安装新版 GCC,但配置麻烦。更重要的是,NVIDIA 官方在较新的驱动中开始逐步收紧对老旧内核的支持。如果你要跑最新的 PyTorch 版本(比如 2.0+),它往往要求更新的 CUDA Toolkit(如 11.8 或 12.x)。
- 22.04 LTS:自带更新的内核(5.15 系列)和更新的编译器链(GCC 11/12)。这意味着当你通过
apt或 NVIDIA 官方源安装最新版的 CUDA 11.8 或 12.1 时,遇到编译报错、库冲突的概率大幅降低。特别是对于使用 Ampere (A10/A100/H100) 架构显卡的用户,22.04 提供的内核模块加载机制更加稳定,减少了NVRM: Xid这类奇奇怪怪的驱动崩溃问题。
2. 内核调度器优化:针对高并发 IO 和 NUMA 感知
LLM 微调不是单纯的计算密集型,它是计算 + IO + 内存带宽的混合负载。
- CFS 调度器改进:Linux 5.15 内核(22.04 默认)相比 5.4(20.04 默认),在 CFS(完全公平调度器)上做了大量优化,特别是在处理大规模多线程并行任务时,上下文切换的开销更低。这对于多卡并行训练(DDP/FSDP)至关重要,能减少 GPU 等待 CPU 数据预处理的空转时间。
- NUMA 绑定更智能:在拥有多路 CPU 和多张 GPU 的服务器上(比如 8x A100 节点),22.04 的内核对 NUMA(非统一内存访问)拓扑的识别和自动亲和性绑定更准确。你可以更轻松地使用
numactl将进程绑定到特定的 NUMA 节点,避免跨 Socket 访问内存带来的延迟抖动。在微调过程中,这种延迟抖动会导致训练 Loss 曲线出现不必要的波动。
3. Python 环境和包管理的现代化
- Python 3.10 默认:22.04 默认 Python 是 3.10,而 20.04 是 3.8。虽然你可以手动升级,但 3.10 在性能上有小幅提升(约 5-10%),且对现代 C++ 扩展(如 PyTorch 中的 ATen 库)有更好的支持。
- pip 和 venv 行为更规范:22.04 的系统级 Python 隔离做得更好,减少了全局包污染的风险。对于使用
conda或venv管理虚拟环境,22.04 下的动态链接库(.so)路径解析更清晰,减少了类似ImportError: libpython3.8.so cannot open shared object file这种低级错误。
4. 安全模块与资源限制(cgroups v2)
- cgroups v2 原生支持:22.04 全面转向 cgroups v2。这在容器化部署(Docker/Kubernetes)中尤为重要。LLM 微调经常需要限制单个容器的内存或 GPU 使用量,cgroups v2 提供了更细粒度的控制,避免了因内存泄漏导致的 OOM Kill 误杀其他进程的问题。
- AppArmor 默认策略更完善:虽然 AppArmor 可能增加一点调试复杂度,但它能有效防止某些恶意或 buggy 的 Python 脚本意外修改系统关键文件,提升了生产环境的稳定性。
5. 网络栈优化:适合分布式训练
如果你的微调任务涉及多机多卡(Multi-node Multi-GPU),网络通信是瓶颈。
- TCP/IP 栈增强:5.15 内核引入了更高效的 TCP 拥塞控制算法(如 BBRv2 的更好集成),在高带宽低延迟(RoCEv2 或 InfiniBand)的网络环境下,能更好地利用带宽,减少梯度同步阶段的等待时间。
- RDMA 支持更好:对于使用 NVLink 或 InfiniBand 进行 NCCL 通信的场景,22.04 的内核对 RDMA 网卡驱动的集成更紧密,减少了丢包率和重传次数。
实际建议
如果你是新建服务器:
毫不犹豫选择 Ubuntu 22.04 LTS。它能无缝对接最新的 CUDA 12.x、PyTorch 2.x、TensorRT-LLM 等前沿工具链。很多新兴的 LLM 框架(如 vLLM, TGI)在文档中也明确推荐 22.04 作为基础镜像。
如果你已有 20.04 集群:
除非遇到以下问题,否则不必强行升级整个集群:
- 你需要使用 CUDA 12.1+ 且无法通过独立安装解决兼容性问题。
- 你频繁遇到与内核相关的 GPU 驱动崩溃或 NCCL 通信超时。
- 你计划使用基于 Docker 的容器化部署,且基础镜像已迁移至 Ubuntu 22.04。
注意:
无论哪个版本,对于 LLM 微调,关闭 Swap 是必须的!LLM 微调极易触发 OOM,Swap 会极大拖慢速度甚至导致死锁。在 /etc/fstab 中注释掉 swap 分区,并设置 vm.swappiness=0。
最后,别忘了检查 BIOS 设置,确保 Above 4G Decoding 和 Resizable BAR 已开启,这对多 GPU 系统的显存寻址效率有显著提升,尤其是在 22.04 的新内核下表现更佳。
云技术博客