Appearance
深度学习工程实践
深度学习框架负责张量计算、自动微分、硬件加速、模型组织和分布式训练。理解框架的目标不是记住 API,而是能把数据、模型、损失、优化和评估串成可复现流程。
训练程序的五部分
python
for inputs, targets in train_loader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()这段循环背后还需要:
- 数据集读取、清洗和增强。
- 模型结构与预训练权重。
- 训练和验证模式切换。
- 指标统计和日志。
- 检查点保存、恢复和版本记录。
训练与验证模式
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(...)先训练新任务头,确认链路正确,再逐步解冻靠后的网络层。全部参数一开始就用较大学习率微调,容易破坏预训练表示。
实验可复现
至少记录:
- 代码提交版本。
- 数据集和切分版本。
- 模型结构与预训练权重。
- 随机种子和超参数。
- 软件环境与硬件。
- 训练曲线、最终指标和检查点。
随机种子不能消除所有硬件非确定性,但能减少无意义差异。
性能优化顺序
- 先用 Profiler 找到数据加载、计算还是通信瓶颈。
- 调整 Batch 和数据加载并发。
- 使用混合精度降低显存和提高吞吐。
- 单卡稳定后再做多卡并行。
- 部署前评估量化、编译和模型导出。
不要在训练逻辑尚未验证时先做复杂分布式优化。
从训练到部署
模型文件只是部署的一部分。生产推理还需要固定:
- 输入 schema 和预处理版本。
- 模型权重与运行时版本。
- 输出后处理和阈值。
- 并发、Batch、超时和资源限制。
- 监控指标和回滚版本。
训练和推理使用不同的图片缩放、文本分词或类别映射,是常见的线上错误来源。
最小实践建议
选择一个公开小数据集,完成下面的闭环:
- 建立简单基线。
- 训练一个小网络。
- 绘制训练和验证曲线。
- 保存并重新加载模型。
- 写一个独立推理脚本。
- 分析至少 20 个错误样本。
- 记录一次模型或参数调整前后的对比。
完成这个闭环,比只运行大型模型示例更能建立深度学习工程能力。
