典型场景

典型场景是开启混合精度进行一般模型训练的场景。

导入AMP模块

在构建神经网络前,我们需要torch_npu中导入AMP模块。

import time
import torch
import torch.nn as nn
import torch_npu
from torch_npu.npu import amp    # 导入AMP模块
from torch.utils.data import Dataset, DataLoader
import torchvision

device = torch.device('npu:0')    # 用户请自行定义训练设备
...... # 如样例代码所示,定义一个简单的神经网络

定义训练参数和数据

这一部分我们从torchvision中获取训练数据集,设置训练相关的参数batch_size、epochs,并在模型、优化器定义之后,定义AMP功能中的GradScaler。

train_data = torchvision.datasets.MNIST(
    root='mnist',
    download=True,
    train=True,
    transform=torchvision.transforms.ToTensor()
)

batch_size = 64
model = CNN().to(device)
train_dataloader = DataLoader(train_data, batch_size=batch_size)    # 定义DataLoader
loss_func = nn.CrossEntropyLoss().to(device)    # 定义损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)    # 定义优化器
scaler = amp.GradScaler()    # 在模型、优化器定义之后,定义GradScaler
epochs = 10

开启AMP进行训练

这一部分我们在训练代码中添加AMP功能相关的代码开启AMP,运行整个脚本进行训练。
for epo in range(epochs):
    for imgs, labels in train_dataloader:
        imgs = imgs.to(device)
        labels = labels.to(device)
        with amp.autocast():
            outputs = model(imgs)    # 前向计算
            loss = loss_func(outputs, labels)    # 损失函数计算
        optimizer.zero_grad()
        # 进行反向传播前后的loss缩放、参数更新
        scaler.scale(loss).backward()    # loss缩放并反向转播
        scaler.step(optimizer)    # 更新参数(自动unscaling)
        scaler.update()    # 基于动态Loss Scale更新loss_scaling系数