第二章:深度学习环境配置——从裸机到炼丹炉
说实话,环境配置这件事,看着不起眼,但坑起来真要命。我见过太多同学花了两周调模型,结果发现是CUDA版本不对——这种冤枉路,咱们不走。
这一章,我把这些年踩过的坑、总结的经验,一次性说清楚。
2.1 CUDA/cuDNN:GPU的“驱动程序”
CUDA是什么?说白了,就是NVIDIA给GPU写的“翻译官”。你的PyTorch代码说人话,GPU只懂机器码,CUDA在中间做翻译。
cuDNN呢?它是CUDA的“加速包”。专门优化卷积、池化这些深度学习常用操作。没有它,训练速度能慢3-5倍。
安装步骤(我习惯的流程)
- 查显卡驱动:终端输入
nvidia-smi,看右上角CUDA Version。比如显示11.8,那你就装CUDA 11.x系列。 - 下载CUDA Toolkit:去NVIDIA官网,选对应版本。我建议用runfile安装,别用deb,容易出依赖问题。
- 配置环境变量:在
~/.bashrc里加两行:export PATH=/usr/local/cuda-11.8/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH - 验证安装:
nvcc --version看到版本号就对了。 - 装cuDNN:下载对应版本的tar包,解压后把文件复制到CUDA目录下。记得给权限。
2.2 PyTorch vs TensorFlow:我选哪个?
这个问题,几乎每个学生都问过我。我的回答很直接:
| 对比项 | PyTorch | TensorFlow |
|---|---|---|
| 上手难度 | 低,像写Python | 中,概念多 |
| 调试体验 | 好,能直接print | 一般,得用tf.print |
| 部署生态 | 一般,但Triton支持了 | 强,TF Serving成熟 |
| 学术圈 | 主流,论文代码多是PyTorch | 偏工业 |
| 动态图 | 原生支持 | 2.x后支持,但有点别扭 |
我个人习惯:研究阶段用PyTorch,生产部署用TensorFlow。但说实话,现在PyTorch的部署工具也越来越好了,你选一个深入学就行。
2.3 Docker环境搭建:一次配置,到处运行
为什么要用Docker?你想想看,你在一台机器上配好了环境,换台机器又要重来。而且不同项目可能依赖不同版本的CUDA——这时候Docker就是救星。
我常用的Dockerfile长这样:
FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04
RUN apt-get update && apt-get install -y \
python3.8 python3-pip git vim
RUN pip3 install torch==2.0.0 torchvision==0.15.0
WORKDIR /workspace
CMD ["/bin/bash"]
构建命令:docker build -t mydl:latest .
运行命令:docker run --gpus all -it --rm mydl:latest
--gpus all,否则容器里看不到GPU。我第一次用Docker就忘了这个,查了半天为什么训练这么慢。
2.4 多GPU配置:让训练飞起来
单卡训练太慢?那就上多卡。但多GPU不是简单插上就能用,需要配置。
PyTorch多卡训练(我常用的方式)
import torch
import torch.nn as nn
# 方式1:DataParallel(简单,但慢)
model = nn.DataParallel(model)
# 方式2:DistributedDataParallel(推荐,快很多)
torch.distributed.init_process_group(backend='nccl')
model = nn.DistributedDataParallel(model)
为什么推荐DDP?因为它每个GPU独立计算梯度,然后同步。DataParallel是主卡收集再分发,主卡容易成为瓶颈。
lr * sqrt(num_gpus) 来调。
2.5 实验管理工具:WandB vs TensorBoard
训练模型时,你是不是也这样:跑了一晚上,第二天忘了参数,或者想对比两次实验找不到日志?
实验管理工具就是解决这个问题的。
TensorBoard(本地轻量级)
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter('runs/exp1')
for epoch in range(100):
loss = train()
writer.add_scalar('Loss/train', loss, epoch)
启动:tensorboard --logdir=runs
WandB(云端协作)
import wandb
wandb.init(project='my_project', config={
'lr': 0.001,
'batch_size': 32
})
for epoch in range(100):
loss = train()
wandb.log({'loss': loss})
我个人习惯:本地调试用TensorBoard,正式实验用WandB。WandB的好处是能在线看曲线,还能和团队共享。有一次我出差,用手机看WandB发现模型过拟合了,远程改了参数——这种体验,TensorBoard给不了。
wandb.init() 里把config写全。我见过有人忘了记录学习率,结果复现不了——那叫一个痛苦。
本章知识体系
下面这张图,是我梳理的环境配置核心逻辑。你照着这个顺序来,基本不会出错。
嗯,环境配置这部分,说难不难,说简单也不简单。关键是要有耐心,一步一步来。我刚开始配环境时,也经常搞到半夜。但只要你按照上面的流程走一遍,后面就顺了。
记住:环境配好了,后面调参才有效率。别急着跑模型,先把地基打牢。
公众号:蓝海资料掘金营,微信deep3321