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就是容器的“配方”。写得好,镜像小、构建快、安全高。
我总结了几条铁律:
- 选对基础镜像 —— 别用ubuntu:latest,用nvidia/cuda官方镜像
- 减少层数 —— 能用
&&连起来的命令就别分开写 - 清理缓存 —— 装完包记得删
/var/cache/apt - 指定版本 —— 别用
latest,哪天更新了你就哭了 - 多阶段构建 —— 编译和运行分开,最终镜像小很多
来看个实际例子。这是我给一个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工具包,再到拉取镜像和编写Dockerfile,最后得到一个可用的GPU容器环境。
你想想看,有了这套流程,团队里每个人都能在5分钟内搭好环境。再也不用“在我机器上能跑”这种鬼话了。
总结一下:
- Docker是基础,装好配好用户权限
- NVIDIA Container Toolkit是桥梁,让容器认识GPU
- 官方镜像省心,选对标签很重要
- Dockerfile讲究技巧,多阶段构建是王道
好了,这一章就到这。记住,容器化不是目的,稳定可复现的环境才是。