PyTorch自动混合精度训练

torch.cuda.amp.GradScaler 是 PyTorch 中的一个用于自动混合精度(Automatic Mixed Precision, AMP)训练的工具。AMP 允许在训练深度学习模型时动态切换浮点数的精度(例如,使用半精度浮点数 float16 而非 float32),以减少显存占用和加速计算,同时保持模型的精度。

1. GradScaler 的作用

在混合精度训练中,模型的某些部分以半精度(float16)计算,而其他部分仍然以全精度(float32)计算。使用 float16 进行计算可以显著提高计算速度和减少显存占用,但也可能导致数值不稳定或梯度下溢(gradient underflow)。GradScaler 通过动态缩放损失值来缓解这些问题,并在反向传播过程中对缩放后的梯度进行适当调整,确保训练过程稳定。

2. 混合精度训练的基本步骤

2. 1. 初始化 GradScaler
复制代码
scaler = torch.cuda.amp.GradScaler()
2. 2. 在前向传播中使用 autocast 上下文管理器

在模型的前向传播中,使用 torch.cuda.amp.autocast 上下文管理器将部分计算切换到半精度。

复制代码
with torch.cuda.amp.autocast():
    outputs = model(inputs)
    loss = criterion(outputs, targets)

在 PyTorch 中,autocast是一个用于自动混合精度训练的上下文管理器。

2. 3 使用 scaler.scale 缩放损失并反向传播

在计算损失并调用 backward() 前,通过 scaler.scale() 对损失进行缩放。

复制代码
scaler.scale(loss).backward()
2. 4 使用 scaler.step 进行优化器更新

使用 scaler.step() 来执行优化器的 step() 操作。

复制代码
scaler.step(optimizer)

2.5 调用 scaler.update : 通过 scaler.update() 来更新缩放因子,并根据需要调整精度。

复制代码
scaler.update()

3. 完整的示例代码

复制代码
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()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.001)

# 初始化 GradScaler
scaler = GradScaler()

# 假设你有输入和目标
inputs = torch.randn(64, 10).cuda()
targets = torch.randn(64, 1).cuda()

# 训练循环中的一次前向和反向传播
for epoch in range(10):
    optimizer.zero_grad()

    # 前向传播,使用 autocast 进行混合精度计算
    with autocast():
        outputs = model(inputs)
        loss = criterion(outputs, targets)

    # 反向传播,使用 scaler 进行梯度缩放
    scaler.scale(loss).backward()

    # 使用 scaler 进行优化器步进
    scaler.step(optimizer)

    # 更新缩放因子
    scaler.update()

    print(f"Epoch [{epoch+1}/10], Loss: {loss.item()}")

4. 总结

  • torch.cuda.amp.GradScaler 是用于混合精度训练的工具,通过动态缩放损失值来提高数值稳定性。
  • 使用 autocast 上下文管理器来自动处理前向传播中的精度切换。
  • 在反向传播和优化器更新时,通过 scaler 来处理损失缩放和梯度计算。

混合精度训练能够在现代 GPU 上显著提升训练速度和效率,同时通过 GradScaler 保持模型的稳定性和精度。

相关推荐
专注于ai算法的踩坑小达人2 分钟前
TabFM(Google Tabular Foundation Model)完整部署手册(PyTorch GPU版)
人工智能·python
Seoyoneh4 分钟前
呼叫中心云原生架构实战:微服务拆分与弹性扩容技术解析
人工智能·信息与通信·通信
AI工具测评家4 分钟前
降AI后参考文献错位、三线表变乱码?快降重vs快将AI实测:谁能降重后完整保住Word原生排版
人工智能·降重·ai检测·查重·降ai·知网检测
Geek-Chow7 分钟前
Hidden Reasoning Tokens Are Silently Truncating Your Structured JSON Output
人工智能
子非鱼eva8 分钟前
昇腾开源仓Issue分析解答-CANN精选(二)
人工智能·ai
墨林陌10 分钟前
AI 热点日报(2026-09-17):谷歌 Gemini 3.8 Live 双模型发布,OpenAI 联手 Anthropic 共商 AI 安全
人工智能
AI行业应用研究11 分钟前
会务问答机器人落地拆解:三级路由、知识库组织与防幻觉——会务小程序能自己回答参会者提问吗?
大数据·人工智能·安全·小程序·架构
海宇服务11 分钟前
零信任架构实战:基于海宇公安二要素认证即时版构建自动化号码发卡网关
运维·人工智能·架构·自动化
合米AI SOP系统14 分钟前
医疗器械|组件组装工位,合米科技AI SOP视觉防错系统满足高合规要求下的精益生产
大数据·人工智能·科技
bullkingluo15 分钟前
从零到一搭建企业级智能问答系统:Ch05 · 向量库
人工智能·架构