温馨提示×

Ubuntu如何利用PyTorch进行深度学习研究

小樊
36
2025-12-14 19:20:43
栏目: 智能运维

在 Ubuntu 上使用 PyTorch 开展深度学习研究的实操指南

一 环境准备与安装

  • 系统更新与基础工具
    • 更新软件源并安装基础编译工具与 Python:sudo apt update && sudo apt install -y build-essential python3 python3-pip
  • 选择 Python 环境管理
    • 原生虚拟环境:sudo apt install -y python3-venv;python3 -m venv ~/venvs/dl;source ~/venvs/dl/bin/activate
    • Miniconda:wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && bash Miniconda3-latest-Linux-x86_64.sh(按提示安装并初始化)
  • GPU 驱动与 CUDA/cuDNN(有 NVIDIA GPU 时)
    • 安装与驱动匹配的 CUDAcuDNN,并将 CUDA 加入环境变量(示例):echo ‘export PATH=/usr/local/cuda/bin:$PATH’ >> ~/.bashrc;echo ‘export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH’ >> ~/.bashrc;source ~/.bashrc
  • 安装 PyTorch(示例命令,优先使用官网生成命令以匹配 CUDA 版本)
    • CPU:pip install torch torchvision torchaudio
    • GPU(示例为 CUDA 11.x):pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu11x
  • 验证安装
    • python - <<‘PY’ import torch print(“torch:”, torch.version, “cuda:”, torch.cuda.is_available()) PY

二 数据、模型与训练的最小可运行示例

  • 任务与数据:使用 MNIST 手写数字分类;torchvision 内置数据集与常用归一化
  • 模型:两层全连接网络(784 → 128 → 10),ReLU 激活
  • 训练与评估:交叉熵损失 + Adam 优化器,训练 5 个 epoch,报告测试集准确率

代码示例:

  • python - <<‘PY’ import torch, torch.nn as nn, torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms

    1) 数据

    transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) train_ds = datasets.MNIST(root=‘./data’, train=True, download=True, transform=transform) test_ds = datasets.MNIST(root=‘./data’, train=False, download=True, transform=transform) train_loader = DataLoader(train_ds, batch_size=64, shuffle=True, num_workers=2) test_loader = DataLoader(test_ds, batch_size=1000, shuffle=False, num_workers=2)

    2) 模型

    class MLP(nn.Module): def init(self): super().init() self.flatten = nn.Flatten() self.fc1 = nn.Linear(28*28, 128) self.relu = nn.ReLU() self.fc2 = nn.Linear(128, 10) def forward(self, x): x = self.flatten(x) x = self.relu(self.fc1(x)) return self.fc2(x)

    device = torch.device(“cuda” if torch.cuda.is_available() else “cpu”) model = MLP().to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=1e-3)

    3) 训练与评估

    for epoch in range(5): model.train() running_loss = 0.0 for xb, yb in train_loader: xb, yb = xb.to(device), yb.to(device) optimizer.zero_grad() pred = model(xb) loss = criterion(pred, yb) loss.backward() optimizer.step() running_loss += loss.item() print(f"Epoch {epoch+1}: train loss {running_loss/len(train_loader):.4f}")

    model.eval()
    correct = total = 0
    with torch.no_grad():
        for xb, yb in test_loader:
            xb, yb = xb.to(device), yb.to(device)
            pred = model(xb).argmax(dim=1)
            total += yb.size(0)
            correct += (pred == yb).sum().item()
    print(f"Test accuracy: {100*correct/total:.2f}%")
    

    PY

三 GPU 训练与性能优化要点

  • 设备放置:model.to(device);数据与标签统一 .to(device);使用 pin_memory=True 的 DataLoader 加速主机到 GPU 传输
  • 混合精度训练:使用 torch.cuda.amp 提升吞吐(GTX 16 系/RTX 系列收益明显)
    • 示例:
      • python - <<‘PY’ from torch.cuda.amp import autocast, GradScaler scaler = GradScaler() for xb, yb in train_loader: xb, yb = xb.to(device), yb.to(device) optimizer.zero_grad() with autocast(): loss = criterion(model(xb), yb) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() PY
  • 数据管道:num_workers 设为 CPU 物理核心数的 2–4 倍;开启 prefetch_factor;尽量使用 SSD
  • 稳定性:设置 deterministic 训练(可能影响性能)以复现实验
    • torch.backends.cudnn.deterministic = True;torch.backends.cudnn.benchmark = False
  • 资源监控:nvidia-smi dmon 观察显存/功耗;torch.utils.benchmark 做微基准测试

四 进阶研究与工程化实践

  • 自定义模块与训练循环:继承 nn.Module,使用 DataLoader、学习率调度器(如 StepLR/CosineAnnealingLR)、早停与模型检查点
  • 分布式训练:单机多卡 DataParallel/DistributedDataParallel;多机使用 torchrunSLURM
  • 可视化与实验管理:使用 TensorBoard/Weights & Biases 记录损失、指标、权重直方图与样本可视化
  • 复现与配置:用 Hydra/JSON/YAML 管理超参;固定随机种子;记录环境依赖(pip freeze > requirements.txt)
  • 源码编译与定制(可选):当需要特定算子、最新特性或性能优化时,可从源码构建 PyTorch(需安装 CMake、匹配版本的 CUDA/cuDNN,执行 git clone --recursive、python setup.py install 等步骤)

五 常见问题排查清单

  • GPU 不可用:检查 nvidia-smi 输出、驱动版本与 CUDA 兼容性;确认 pip 安装的是带 cu11x/cu12x 的 PyTorch 包;核对环境变量 PATH/LD_LIBRARY_PATH 是否包含 /usr/local/cuda/bin 与 /usr/local/cuda/lib64
  • 内存不足 OOM:减小 batch_size;使用梯度累积;开启混合精度;清理缓存 torch.cuda.empty_cache()
  • DataLoader 卡顿:提高 num_workers;将 num_workers 设为 CPU 核心数的 2–4 倍;使用更快的存储(NVMe)
  • 结果不复现:设置随机种子、关闭 cuDNN benchmark、固定 DataLoader 的 worker_init_fn 与生成器种子
  • 依赖冲突:使用独立虚拟环境或 Conda 环境;定期升级/锁定关键库版本(torch、torchvision、numpy、pillow 等)

0