混合精度依旧是目前主推的方案,不仅可以降显存,进一步依靠高 Batch 压榨并行性

同时,还能加速某些算子的计算,在某些计算卡上的加速效果很明显(V100)

同时,还能配合编译、其余加速方案提升计算性能

而上述方案基本不会对训练结果产生过大影响(理论上),基本没有缺点

注:实际加速效果和硬件关系较大

注:BF16 效果上略优于 FP16,但其通用性不高,较早的架构不支持该类型计算

其代码书写格式往往如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import torch
from torch import nn, optim
from torch.cuda.amp import autocast, GradScaler

# 模型 & 优化器
model = nn.Linear(1024, 1024).cuda()
optimizer = optim.Adam(model.parameters(), lr=1e-3)
criterion = nn.MSELoss()

# 混合精度梯度缩放器
scaler = GradScaler()

for epoch in range(10):
for data, target in dataloader:
data, target = data.cuda(), target.cuda()

optimizer.zero_grad()

# 前向 + 计算 loss 在 autocast 下执行
with autocast(dtype=torch.float16): # 常见用 torch.float16 或 bfloat16
output = model(data)
loss = criterion(output, target)

# 反向传播时用 scaler
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()

补注:

1.针对 BP16、FP16 的效果差异仍需调研,需要记录效果以及效果的影响因素

2.针对 FP32、FP16、BP16 做消融实验,确定其对效果的影响,同时确定效果的影响因素

3.针对组合加速方案进行一些实验确认,确认其效果,确认其效果的影响因素

4.显存变动和混合精度的原理上面仍需一定调研,确定其对显存的影响和相关影响因素