典型场景是开启混合精度进行一般模型训练的场景。
在构建神经网络前,我们需要torch_npu中导入AMP模块。
# 引入模块 import time import torch import torch.nn as nn import torch_npu # 导入AMP模块 from torch_npu.npu import amp from torch.utils.data import Dataset, DataLoader import torchvision #指定运行Device,用户请自行定义训练设备 device = torch.device('npu:0') ...... # 如样例代码所示,定义一个简单的神经网络
在模型、优化器定义之后,定义AMP功能中的GradScaler。
# 数据集获取 train_data = torchvision.datasets.MNIST( root = 'mnist', download = True, train = True, transform = torchvision.transforms.ToTensor() ) # 定义训练相关参数 batch_size = 64 model = CNN().to(device) # 把模型放到指定NPU上 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功能适配代码。最后运行整个脚本进行混合精度训练。
for epoch in range(epochs): for imgs, labels in train_dataloader: imgs = imgs.to(device) # 把img数据放到指定NPU上 labels = labels.to(device) # 把label数据放到指定NPU上 with amp.autocast(): # 设置amp 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系数