Skip to content

深度学习工程实践

深度学习框架负责张量计算、自动微分、硬件加速、模型组织和分布式训练。理解框架的目标不是记住 API,而是能把数据、模型、损失、优化和评估串成可复现流程。

训练程序的五部分

python
for inputs, targets in train_loader:
    optimizer.zero_grad()
    outputs = model(inputs)
    loss = criterion(outputs, targets)
    loss.backward()
    optimizer.step()

这段循环背后还需要:

  1. 数据集读取、清洗和增强。
  2. 模型结构与预训练权重。
  3. 训练和验证模式切换。
  4. 指标统计和日志。
  5. 检查点保存、恢复和版本记录。

训练与验证模式

model.train()model.eval() 会影响 Dropout、BatchNorm 等层。验证时还应关闭梯度记录,减少显存和计算:

python
model.eval()
with torch.no_grad():
    for inputs, targets in valid_loader:
        outputs = model(inputs)

忘记切换模式会导致评估结果抖动或与线上推理不一致。

设备与数据形状

模型和输入必须在同一设备。排错时优先打印:

  • Tensor shape。
  • dtype。
  • device。
  • 数值最小值、最大值和缺失值。
  • 标签范围与类别映射。

大量训练错误不是架构问题,而是维度顺序、数据类型或预处理不一致。

迁移学习

数据量有限时,优先使用预训练模型:

python
model = load_pretrained_model()
for param in model.backbone.parameters():
    param.requires_grad = False

model.head = TaskHead(...)

先训练新任务头,确认链路正确,再逐步解冻靠后的网络层。全部参数一开始就用较大学习率微调,容易破坏预训练表示。

实验可复现

至少记录:

  • 代码提交版本。
  • 数据集和切分版本。
  • 模型结构与预训练权重。
  • 随机种子和超参数。
  • 软件环境与硬件。
  • 训练曲线、最终指标和检查点。

随机种子不能消除所有硬件非确定性,但能减少无意义差异。

性能优化顺序

  1. 先用 Profiler 找到数据加载、计算还是通信瓶颈。
  2. 调整 Batch 和数据加载并发。
  3. 使用混合精度降低显存和提高吞吐。
  4. 单卡稳定后再做多卡并行。
  5. 部署前评估量化、编译和模型导出。

不要在训练逻辑尚未验证时先做复杂分布式优化。

从训练到部署

模型文件只是部署的一部分。生产推理还需要固定:

  • 输入 schema 和预处理版本。
  • 模型权重与运行时版本。
  • 输出后处理和阈值。
  • 并发、Batch、超时和资源限制。
  • 监控指标和回滚版本。

训练和推理使用不同的图片缩放、文本分词或类别映射,是常见的线上错误来源。

最小实践建议

选择一个公开小数据集,完成下面的闭环:

  1. 建立简单基线。
  2. 训练一个小网络。
  3. 绘制训练和验证曲线。
  4. 保存并重新加载模型。
  5. 写一个独立推理脚本。
  6. 分析至少 20 个错误样本。
  7. 记录一次模型或参数调整前后的对比。

完成这个闭环,比只运行大型模型示例更能建立深度学习工程能力。

别急,先让缓存热一下。