4. 容器化环境搭建

容器化,说白了就是把你的GPU环境打包成一个“快递箱”。

我刚开始做GPU集群时,最头疼的就是环境不一致。开发机跑得好好的,到生产环境就崩了。后来用了Docker,嗯,这问题基本绝迹了。

4.1 Docker安装与配置

先装Docker。不同系统命令不一样,我列个表给你参考:

操作系统 安装命令
Ubuntu 20.04+ sudo apt install docker.io
CentOS 7+ sudo yum install docker
官方脚本 curl -fsSL https://get.docker.com | bash

装完后记得启动服务:

sudo systemctl start docker
sudo systemctl enable docker
小技巧: 把当前用户加入docker组,就不用每次sudo了。
sudo usermod -aG docker $USER
然后退出重新登录。

验证一下:

docker --version
docker run hello-world

看到“Hello from Docker!”就对了。

4.2 NVIDIA Container Toolkit

光有Docker还不够。要让容器里用上GPU,得装NVIDIA Container Toolkit。

为什么?因为Docker默认不认识NVIDIA驱动。这个工具就是搭桥的。

安装步骤:

# 添加NVIDIA仓库
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

# 安装
sudo apt-get update
sudo apt-get install -y nvidia-docker2

# 重启Docker
sudo systemctl restart docker
注意: 我曾经遇到过装完nvidia-docker2后,旧容器启动报错。原因是Docker运行时配置变了。建议装完后重启所有容器,或者干脆重启机器。

验证GPU是否可用:

docker run --rm --gpus all nvidia/cuda:11.8-base nvidia-smi

看到GPU信息就说明通了。

4.3 拉取与运行官方镜像

NVIDIA官方提供了很多CUDA镜像。我一般去 Docker Hub 上挑。

常用镜像标签:

标签 说明 大小
11.8-base 最小化,只有CUDA运行时 ~1.2GB
11.8-runtime 包含CUDA工具包 ~2.5GB
11.8-devel 开发版,含头文件和编译器 ~3.8GB

拉取命令:

docker pull nvidia/cuda:11.8-devel

运行容器:

docker run -it --gpus all --name my_cuda nvidia/cuda:11.8-devel bash

进去后可以跑个测试:

nvcc --version
nvidia-smi
个人经验: 我习惯用devel镜像做开发,因为里面带了gcc和nvcc。但生产环境用runtime就够了,能省不少空间。

4.4 Dockerfile编写最佳实践

Dockerfile就是容器的“配方”。写得好,镜像小、构建快、安全高。

我总结了几条铁律:

  1. 选对基础镜像 —— 别用ubuntu:latest,用nvidia/cuda官方镜像
  2. 减少层数 —— 能用&&连起来的命令就别分开写
  3. 清理缓存 —— 装完包记得删/var/cache/apt
  4. 指定版本 —— 别用latest,哪天更新了你就哭了
  5. 多阶段构建 —— 编译和运行分开,最终镜像小很多

来看个实际例子。这是我给一个PyTorch训练任务写的Dockerfile:

# 第一阶段:编译
FROM nvidia/cuda:11.8-devel AS builder

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 第二阶段:运行
FROM nvidia/cuda:11.8-runtime

WORKDIR /app
COPY --from=builder /usr/local/lib/python3.8/dist-packages /usr/local/lib/python3.8/dist-packages
COPY . .

CMD ["python", "train.py"]

你看,第一阶段装依赖,第二阶段只拷贝产物。最终镜像只有1.5GB,比单阶段小了快一半。

避坑指南: 我曾经在Dockerfile里写RUN pip install torch,结果每次构建都重下。后来改成--no-cache-dir,构建速度快了3倍。

另一个常见坑是apt-get update和install分开写。这样每次修改都会重新update,浪费时间。正确写法:

RUN apt-get update && apt-get install -y \
    libgl1-mesa-glx \
    libglib2.0-0 \
    && rm -rf /var/lib/apt/lists/*

嗯,这样一层搞定,还清理了缓存。

4.5 本章知识体系

我把整个流程画了张图,方便你理解:

容器化环境搭建流程 Docker安装 NVIDIA Container Toolkit 拉取官方镜像 Dockerfile编写最佳实践 多阶段构建 减少层数 ✅ 可用的GPU容器环境

这张图把整个流程串起来了。从Docker安装开始,到NVIDIA工具包,再到拉取镜像和编写Dockerfile,最后得到一个可用的GPU容器环境。

你想想看,有了这套流程,团队里每个人都能在5分钟内搭好环境。再也不用“在我机器上能跑”这种鬼话了。

总结一下:
  • Docker是基础,装好配好用户权限
  • NVIDIA Container Toolkit是桥梁,让容器认识GPU
  • 官方镜像省心,选对标签很重要
  • Dockerfile讲究技巧,多阶段构建是王道

好了,这一章就到这。记住,容器化不是目的,稳定可复现的环境才是。