PyTorch 混合精度训练
什么是混合精度训练?
混合精度训练(Mixed Precision Training)是一种通过结合使用单精度(FP32)和半精度(FP16)浮点数来加速深度学习模型训练的技术。它不仅可以显著减少显存占用,还能提高训练速度,尤其是在现代GPU(如NVIDIA的Volta、Turing和Ampere架构)上表现尤为突出。
在混合精度训练中,大部分计算使用FP16进行,而某些关键操作(如权重更新)仍然使用FP32,以确保数值稳定性。
为什么使用混合精度训练?
- 显存占用减少:FP16占用的显存是FP32的一半,因此可以训练更大的模型或使用更大的批量大小。
- 训练速度提升:现代GPU对FP16的计算速度更快,因此可以加速训练过程。
- 能源效率提高:由于计算速度的提升和显存占用的减少,混合精度训练可以降低能源消耗。
PyTorch 中的混合精度训练
PyTorch通过torch.cuda.amp
模块提供了对混合精度训练的支持。amp
代表自动混合精度(Automatic Mixed Precision),它可以自动管理FP16和FP32之间的转换。
基本用法
以下是一个简单的示例,展示如何在PyTorch中使用混合精度训练:
import torch
import torch.nn as nn
import torch.optim as optim
from torch.cuda.amp import GradScaler, autocast
# 定义一个简单的模型
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc = nn.Linear(10, 1)
def forward(self, x):
return self.fc(x)
# 初始化模型、优化器和损失函数
model = SimpleModel().cuda()
optimizer = optim.SGD(model.parameters(), lr=0.01)
criterion = nn.MSELoss()
# 初始化GradScaler
scaler = GradScaler()
# 训练循环
for epoch in range(10):
for data, target in dataloader:
optimizer.zero_grad()
# 使用autocast进行前向传播
with autocast():
output = model(data.cuda())
loss = criterion(output, target.cuda())
# 使用scaler进行反向传播和优化
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
代码解释
autocast()
:这个上下文管理器会自动将模型的前向传播中的操作转换为FP16,以提高计算效率。GradScaler
:由于FP16的数值范围较小,梯度可能会下溢(即变得非常小)。GradScaler
通过缩放损失值来防止梯度下溢,并在更新权重之前将梯度缩放回FP32。