2. 环境搭建与配置
说实话,环境搭建这事儿,看着简单,但坑是真不少。我见过太多团队,模型写得漂亮,结果卡在环境配置上,一卡就是好几天。今天咱们就把这块彻底捋清楚。
1. NVIDIA驱动:别小看这个基础
驱动是GPU和操作系统之间的翻译官。版本不对,后面全白搭。
我个人习惯用 nvidia-smi 检查驱动状态。如果输出正常,能看到GPU型号和驱动版本,那就基本没问题。
# 查看驱动版本和GPU信息
nvidia-smi
# 输出示例
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.85.05 Driver Version: 525.85.05 CUDA Version: 12.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla A100 On | 00000000:00:04.0 Off | 0 |
| 0% 35C P0 45W / 400W| 0MiB / 40960MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
2. CUDA:版本匹配是门学问
CUDA是NVIDIA的并行计算平台。说白了,它就是让GPU干活的那个“语言”。
这里有个关键点:CUDA版本要和驱动版本兼容。怎么查?看NVIDIA官方的兼容性矩阵。
| CUDA版本 | 最低驱动版本 | 推荐驱动版本 |
|---|---|---|
| CUDA 11.8 | 520.61.05 | 525.85.05 |
| CUDA 12.0 | 525.60.13 | 530.30.02 |
| CUDA 12.1 | 530.30.02 | 535.54.03 |
# 检查CUDA版本
nvcc --version
# 输出示例
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Wed_Nov_22_10:17:15_PST_2023
Cuda compilation tools, release 12.0, V12.0.140
3. cuDNN:深度学习加速器
cuDNN是NVIDIA针对深度学习优化的库。它专门加速卷积、池化、归一化这些操作。
安装cuDNN其实很简单:下载对应CUDA版本的cuDNN,然后解压到CUDA目录下。
# 安装cuDNN示例(以CUDA 12.0为例)
tar -xzvf cudnn-linux-x86_64-8.9.0.131_cuda12-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-12.0/include
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-12.0/lib64
sudo chmod a+r /usr/local/cuda-12.0/include/cudnn*.h /usr/local/cuda-12.0/lib64/libcudnn*
4. PyTorch/TensorFlow分布式环境配置
分布式训练环境配置,说白了就是让多张GPU能协同工作。这里我重点讲PyTorch的分布式配置,因为它在业界用得最多。
4.1 PyTorch分布式配置
PyTorch的分布式训练主要靠 torch.distributed 包。初始化方式有两种:
- NCCL后端:GPU通信专用,速度快,推荐使用
- GLOO后端:CPU通信用,GPU也能用但慢
# PyTorch分布式初始化示例
import torch
import torch.distributed as dist
# 初始化进程组
dist.init_process_group(
backend='nccl', # GPU通信用NCCL
init_method='env://', # 从环境变量读取配置
world_size=8, # 总GPU数
rank=0 # 当前进程编号
)
# 创建模型并移到GPU
model = MyModel().cuda()
model = torch.nn.parallel.DistributedDataParallel(model)
# 创建分布式数据加载器
train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)
train_loader = torch.utils.data.DataLoader(
train_dataset,
batch_size=32,
sampler=train_sampler
)
torchrun 而不是手动写启动脚本。它自动处理了环境变量设置和进程管理,省心很多。
# 使用torchrun启动8卡训练
torchrun --nproc_per_node=8 train.py
4.2 TensorFlow分布式配置
TensorFlow的分布式配置相对简单,主要用 tf.distribute.MirroredStrategy。
# TensorFlow分布式配置示例
import tensorflow as tf
# 创建分布式策略
strategy = tf.distribute.MirroredStrategy()
print('Number of devices: {}'.format(strategy.num_replicas_in_sync))
# 在策略范围内创建模型
with strategy.scope():
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10)
])
model.compile(loss='sparse_categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
# 训练
model.fit(train_dataset, epochs=10)
5. Docker与Kubernetes环境
容器化部署是分布式训练的标配。为什么?因为环境一致性太重要了。你想想看,开发环境跑得好好的,到生产环境就报错,这种痛苦我经历过太多次。
5.1 Docker环境配置
Docker配置的核心是NVIDIA Container Toolkit。它让容器能访问GPU。
# 安装NVIDIA Container Toolkit
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
sudo systemctl restart docker
# 测试GPU是否可用
docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi
nvidia/cuda:12.0-cudnn8-devel-ubuntu22.04,这样能保证兼容性。
# Dockerfile示例
FROM nvidia/cuda:12.0-cudnn8-devel-ubuntu22.04
# 安装Python和依赖
RUN apt-get update && apt-get install -y python3 python3-pip
# 安装PyTorch
RUN pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 复制代码
COPY train.py /workspace/
WORKDIR /workspace
CMD ["python3", "train.py"]
5.2 Kubernetes环境配置
Kubernetes(K8s)是容器编排工具。在分布式训练中,它负责管理多个GPU节点的调度。
配置K8s GPU环境,核心是安装NVIDIA Device Plugin。
# 安装NVIDIA Device Plugin
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.0/nvidia-device-plugin.yml
# 验证GPU是否被识别
kubectl get nodes -o json | jq .items[].status.allocatable
然后就可以在Pod中请求GPU资源了:
# Pod YAML示例
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
containers:
- name: pytorch-container
image: my-pytorch-image:latest
resources:
limits:
nvidia.com/gpu: 4 # 请求4张GPU
command: ["torchrun", "--nproc_per_node=4", "train.py"]
hostNetwork: true 或者配置Service来暴露端口。否则节点间通信会出问题。
6. 环境验证:别等跑起来才发现问题
配置完环境后,我建议先跑一个简单的验证脚本。别一上来就跑大模型,先确认基础环境没问题。
# 环境验证脚本
import torch
import torch.distributed as dist
# 1. 检查CUDA是否可用
print(f"CUDA available: {torch.cuda.is_available()}")
print(f"CUDA version: {torch.version.cuda}")
print(f"cuDNN version: {torch.backends.cudnn.version()}")
# 2. 检查GPU数量和型号
print(f"GPU count: {torch.cuda.device_count()}")
for i in range(torch.cuda.device_count()):
print(f"GPU {i}: {torch.cuda.get_device_name(i)}")
# 3. 测试简单的张量运算
x = torch.randn(1000, 1000).cuda()
y = torch.randn(1000, 1000).cuda()
z = torch.matmul(x, y)
print(f"Tensor operation test: {z.shape}")
# 4. 测试分布式通信(如果有多卡)
if torch.cuda.device_count() > 1:
dist.init_process_group(backend='nccl', init_method='tcp://localhost:23456',
world_size=2, rank=0)
print("Distributed communication test passed!")
dist.destroy_process_group()
7. 避坑指南
- 驱动版本不一致:我曾经在一个集群上,有的节点驱动是525,有的是530。结果NCCL通信时断时续。解决方案:统一驱动版本。
- CUDA路径混乱:多版本CUDA共存时,
LD_LIBRARY_PATH设置不对会导致链接错误。我建议用module load或者conda管理环境。 - Docker GPU权限:容器内跑
nvidia-smi报错?检查--gpus all参数和NVIDIA Container Toolkit是否安装。 - K8s GPU调度失败:Pod一直Pending?检查Node是否有GPU资源,以及NVIDIA Device Plugin是否正常运行。
环境搭建这事儿,说白了就是细心活。把每一步都验证好,后面训练才能顺顺利利。嗯,今天就先聊到这儿。