第二章:深度学习环境配置——从裸机到炼丹炉

说实话,环境配置这件事,看着不起眼,但坑起来真要命。我见过太多同学花了两周调模型,结果发现是CUDA版本不对——这种冤枉路,咱们不走。

这一章,我把这些年踩过的坑、总结的经验,一次性说清楚。

2.1 CUDA/cuDNN:GPU的“驱动程序”

CUDA是什么?说白了,就是NVIDIA给GPU写的“翻译官”。你的PyTorch代码说人话,GPU只懂机器码,CUDA在中间做翻译。

cuDNN呢?它是CUDA的“加速包”。专门优化卷积、池化这些深度学习常用操作。没有它,训练速度能慢3-5倍。

安装步骤(我习惯的流程)

  1. 查显卡驱动:终端输入 nvidia-smi,看右上角CUDA Version。比如显示11.8,那你就装CUDA 11.x系列。
  2. 下载CUDA Toolkit:去NVIDIA官网,选对应版本。我建议用runfile安装,别用deb,容易出依赖问题。
  3. 配置环境变量:在 ~/.bashrc 里加两行:
    export PATH=/usr/local/cuda-11.8/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH
  4. 验证安装nvcc --version 看到版本号就对了。
  5. 装cuDNN:下载对应版本的tar包,解压后把文件复制到CUDA目录下。记得给权限。
⚠️ 我曾经踩过的坑:CUDA版本和显卡驱动不匹配。有一次我装了CUDA 12.0,但驱动只支持到11.8,结果训练到一半直接崩了。记住:先查驱动,再选CUDA

2.2 PyTorch vs TensorFlow:我选哪个?

这个问题,几乎每个学生都问过我。我的回答很直接:

对比项 PyTorch TensorFlow
上手难度 低,像写Python 中,概念多
调试体验 好,能直接print 一般,得用tf.print
部署生态 一般,但Triton支持了 强,TF Serving成熟
学术圈 主流,论文代码多是PyTorch 偏工业
动态图 原生支持 2.x后支持,但有点别扭

我个人习惯:研究阶段用PyTorch,生产部署用TensorFlow。但说实话,现在PyTorch的部署工具也越来越好了,你选一个深入学就行。

💡 我的建议:如果你是新手,无脑选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是主卡收集再分发,主卡容易成为瓶颈。

⚠️ 注意:多GPU训练时,batch size要按GPU数量翻倍。比如单卡batch size=32,4卡就设128。学习率也要相应调大——我一般按 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可以记录超参数、模型权重、甚至代码版本。每次实验前,记得 wandb.init() 里把config写全。我见过有人忘了记录学习率,结果复现不了——那叫一个痛苦。

本章知识体系

下面这张图,是我梳理的环境配置核心逻辑。你照着这个顺序来,基本不会出错。

深度学习环境配置核心流程 1. 硬件检查 GPU型号 / 驱动版本 2. CUDA/cuDNN 版本匹配 / 环境变量 3. 框架选择 PyTorch / TensorFlow 4. Docker容器 环境隔离 / 可复现 5. 多GPU配置 DDP / 负载均衡 6. 实验管理 WandB / TensorBoard 验证 跑通demo 顺序执行,每一步验证通过后再进行下一步 遇到问题先查版本兼容性,再查环境变量

嗯,环境配置这部分,说难不难,说简单也不简单。关键是要有耐心,一步一步来。我刚开始配环境时,也经常搞到半夜。但只要你按照上面的流程走一遍,后面就顺了。

记住:环境配好了,后面调参才有效率。别急着跑模型,先把地基打牢。


公众号:蓝海资料掘金营,微信deep3321