Skip to content

05 - 高级专题

掌握深度学习工程化与优化技术,从研究到生产的完整链路。

模块概览

属性
前置要求01-04 模块, 熟悉 PyTorch/TensorFlow
学习时长2-3 周
Notebooks12+
难度⭐⭐⭐⭐ 高级

学习目标

完成本模块后,你将能够:

  • ✅ 使用 Optuna/Ray Tune 进行自动超参数优化
  • ✅ 掌握分布式训练技术 (DDP, FSDP)
  • ✅ 应用模型压缩技术 (量化、剪枝、蒸馏)
  • ✅ 使用 ONNX/TensorRT 部署模型到生产环境
  • ✅ 理解混合精度训练和梯度累积

子模块详解

01. 超参数优化

自动化搜索最优超参数配置。

方法原理工具
网格搜索穷举所有组合sklearn GridSearchCV
随机搜索随机采样sklearn RandomizedSearchCV
贝叶斯优化基于先验的智能搜索Optuna, Hyperopt
进化算法遗传算法优化Ray Tune
早停策略提前终止差的试验ASHA, Hyperband

Optuna 示例

python
import optuna

def objective(trial):
    # 定义搜索空间
    lr = trial.suggest_float('lr', 1e-5, 1e-2, log=True)
    hidden_dim = trial.suggest_int('hidden_dim', 64, 512)
    dropout = trial.suggest_float('dropout', 0.1, 0.5)
    optimizer_name = trial.suggest_categorical('optimizer', ['Adam', 'AdamW'])

    # 构建模型
    model = build_model(hidden_dim, dropout)
    optimizer = getattr(torch.optim, optimizer_name)(model.parameters(), lr=lr)

    # 训练并返回验证指标
    val_loss = train_and_evaluate(model, optimizer)
    return val_loss

# 创建研究并优化
study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=100, timeout=3600)

print(f"Best params: {study.best_params}")
print(f"Best value: {study.best_value}")

搜索空间设计建议

超参数推荐范围搜索方式
学习率1e-5 ~ 1e-2对数均匀
Batch Size16, 32, 64, 128离散
Hidden Dim64 ~ 1024整数
Dropout0.1 ~ 0.5均匀
Weight Decay1e-6 ~ 1e-2对数均匀

02. 分布式训练

多 GPU/多节点训练加速。

训练策略对比

策略原理适用场景
DataParallel (DP)单进程多线程单机多卡,简单场景
DistributedDataParallel (DDP)多进程,梯度同步单机/多机多卡
Fully Sharded DDP (FSDP)参数分片超大模型
DeepSpeed ZeRO优化器状态分片超大模型
Pipeline Parallelism模型层分布超深模型

DDP 示例

python
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP

def setup(rank, world_size):
    dist.init_process_group("nccl", rank=rank, world_size=world_size)
    torch.cuda.set_device(rank)

def train(rank, world_size):
    setup(rank, world_size)

    # 模型包装
    model = MyModel().to(rank)
    model = DDP(model, device_ids=[rank])

    # 分布式数据加载
    sampler = DistributedSampler(dataset, num_replicas=world_size, rank=rank)
    dataloader = DataLoader(dataset, sampler=sampler, batch_size=32)

    for epoch in range(num_epochs):
        sampler.set_epoch(epoch)  # 确保每个 epoch 数据打乱不同
        for batch in dataloader:
            # 训练步骤
            loss = model(batch)
            loss.backward()
            optimizer.step()

    dist.destroy_process_group()

# 启动多进程
torch.multiprocessing.spawn(train, args=(world_size,), nprocs=world_size)

通信原语

AllReduce: 所有进程求和/平均梯度
┌─────┐    ┌─────┐    ┌─────┐
│ GPU0│◄──►│ GPU1│◄──►│ GPU2│
│ g0  │    │ g1  │    │ g2  │
└──┬──┘    └──┬──┘    └──┬──┘
   │          │          │
   └──────────┼──────────┘

         g0+g1+g2 (广播到所有GPU)

03. 混合精度训练

使用 FP16/BF16 加速训练并减少显存。

精度对比

精度位数范围用途
FP3232±3.4e38默认精度
FP1616±65504混合精度训练
BF1616±3.4e38更大范围,Ampere+
INT88-128~127推理量化

PyTorch AMP 示例

python
from torch.cuda.amp import autocast, GradScaler

scaler = GradScaler()

for batch in dataloader:
    optimizer.zero_grad()

    # 自动混合精度前向传播
    with autocast():
        outputs = model(batch)
        loss = criterion(outputs, targets)

    # 缩放梯度并反向传播
    scaler.scale(loss).backward()

    # 梯度裁剪(可选)
    scaler.unscale_(optimizer)
    torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)

    # 更新参数
    scaler.step(optimizer)
    scaler.update()

04. 模型压缩

减小模型体积,加速推理。

技术原理压缩率精度损失
量化降低数值精度2-4x
剪枝移除冗余参数2-10x
知识蒸馏小模型学习大模型可变
低秩分解矩阵分解2-5x

量化示例 (PyTorch)

python
import torch.quantization as quant

# 动态量化(推理时量化)
quantized_model = torch.quantization.quantize_dynamic(
    model,
    {nn.Linear, nn.LSTM},
    dtype=torch.qint8
)

# 静态量化(需要校准数据)
model.qconfig = quant.get_default_qconfig('fbgemm')
model_prepared = quant.prepare(model)

# 校准
with torch.no_grad():
    for batch in calibration_loader:
        model_prepared(batch)

# 转换
quantized_model = quant.convert(model_prepared)

知识蒸馏

python
def distillation_loss(student_logits, teacher_logits, labels, T=4.0, alpha=0.7):
    # 软标签损失
    soft_loss = F.kl_div(
        F.log_softmax(student_logits / T, dim=1),
        F.softmax(teacher_logits / T, dim=1),
        reduction='batchmean'
    ) * (T * T)

    # 硬标签损失
    hard_loss = F.cross_entropy(student_logits, labels)

    return alpha * soft_loss + (1 - alpha) * hard_loss

05. 模型部署

将模型部署到生产环境。

部署流程

训练模型 ──► 导出 ONNX ──► 优化 (TensorRT) ──► 部署服务
   │              │              │                │
PyTorch      标准格式       图优化/量化      REST API
TensorFlow                  算子融合        gRPC

ONNX 导出

python
import torch.onnx

# 导出模型
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(
    model,
    dummy_input,
    "model.onnx",
    input_names=['input'],
    output_names=['output'],
    dynamic_axes={'input': {0: 'batch_size'}, 'output': {0: 'batch_size'}},
    opset_version=13
)

# 验证导出
import onnx
onnx_model = onnx.load("model.onnx")
onnx.checker.check_model(onnx_model)

TensorRT 优化

python
import tensorrt as trt

# 构建引擎
logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(logger)
network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
parser = trt.OnnxParser(network, logger)

# 解析 ONNX
with open("model.onnx", "rb") as f:
    parser.parse(f.read())

# 配置优化
config = builder.create_builder_config()
config.set_flag(trt.BuilderFlag.FP16)  # 启用 FP16
config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 1 << 30)

# 构建引擎
engine = builder.build_serialized_network(network, config)

部署框架对比

框架特点适用场景
TorchServePyTorch 官方PyTorch 模型
TensorFlow ServingTF 官方,gRPCTensorFlow 模型
TritonNVIDIA,多框架GPU 推理
ONNX Runtime跨平台通用部署
FastAPI + Uvicorn轻量级快速原型

06. 实验管理

跟踪实验、管理模型版本。

工具特点适用场景
Weights & Biases云端,可视化强团队协作
MLflow开源,全流程企业部署
TensorBoardTF 官方,轻量快速实验
Neptune云端,元数据管理大规模实验

W&B 示例

python
import wandb

# 初始化
wandb.init(project="my-project", config={
    "learning_rate": 1e-4,
    "epochs": 100,
    "batch_size": 32
})

# 训练循环中记录
for epoch in range(epochs):
    train_loss = train_one_epoch()
    val_loss, val_acc = evaluate()

    wandb.log({
        "train_loss": train_loss,
        "val_loss": val_loss,
        "val_accuracy": val_acc,
        "epoch": epoch
    })

# 保存模型
wandb.save("model.pt")
wandb.finish()

实验列表

实验内容文件
Optuna 调参自动超参数搜索01_optuna_tuning.ipynb
DDP 训练分布式数据并行02_ddp_training.ipynb
混合精度AMP 训练加速03_mixed_precision.ipynb
模型量化INT8 量化部署04_quantization.ipynb
知识蒸馏模型压缩05_knowledge_distillation.ipynb
ONNX 导出模型格式转换06_onnx_export.ipynb
TensorRTGPU 推理优化07_tensorrt_inference.ipynb
W&B 实验实验追踪管理08_wandb_tracking.ipynb

参考资源

文档

论文

  • Hinton et al. (2015). Distilling the Knowledge in a Neural Network
  • Micikevicius et al. (2018). Mixed Precision Training
  • Li et al. (2020). PyTorch Distributed: Experiences on Accelerating Data Parallel Training

工具

Released under the MIT License.