asend-pytorch模型迁移

本文介绍了如何将使用PyTorch在GPU上训练的CNN模型迁移到昇腾NPU,包括环境准备、添加AMP模块以实现自动迁移和混合精度计算。通过修改原脚本,展示了迁移过程和训练示例。
摘要由CSDN通过智能技术生成

在介绍迁移和训练模型的步骤之前,本章节提供了一个简单的模型迁移样例,采用了最简单的自动迁移方法,帮助用户快速体验GPU模型脚本迁移到昇腾NPU上的流程,将在GPU上训练CNN模型识别手写数字的脚本代码进行修改,使其可以迁移到昇腾NPU上进行训练。

环境准备

请参考《CANN 软件安装指南》中的“安装须知”章节选择安装开发环境(Ascend-cann-toolkit),并参考不同OS对应的章节,完整安装依赖列表,在安装深度学习框架时选择安装PyTorch框架。

执行如下命令,配置CANN环境变量(以root用户默认安装路径为例):

. /usr/local/Ascend/ascend-toolkit/set_env.sh
原脚本代码

新建脚本train.py,写入以下原GPU脚本代码。

import time
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
import torchvision

device = torch.device('cuda:0')   

class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.net = nn.Sequential(
            nn.Conv2d(in_channels=1, out_channels=16,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=1),
            nn.MaxPool2d(kernel_size=2),
            nn.Conv2d(16, 32, 3, 1, 1),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(32*7*7, 16),
            nn.ReLU(),
            nn.Linear(16, 10)
        )
    def forward(self, x):
        return self.net(x)

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)    # 定义优化器
epochs = 10
for epo in range(epochs):
    for imgs, labels in train_dataloader:
        start_time = time.time()
        imgs = imgs.to(device)
        labels = labels.to(device)
        outputs = model(imgs)    # 前向计算
        loss = loss_func(outputs, labels)    # 损失函数计算
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
torch.save({
               'epoch': 10,
               'arch': CNN,
               'state_dict': model.state_dict(),
               'optimizer' : optimizer.state_dict(),
            },'checkpoint.pth.tar')
迁移体验

在train.py中做以下修改:

  1. 首先添加以下加粗部分库代码,导入混合精度模块(AMP)并使能自动迁移。
    import time
    import torch
    ......
    import torch_npu
    from torch_npu.npu import amp #导入AMP模块
    import transfer_to_npu    #使能自动迁移
  2. 使能AMP混合精度计算。由于昇腾910 AI处理器的架构特性限制,用户需要开启混合精度,可以提升模型的性能。具体介绍可参见概述。在模型、优化器定义之后,定义AMP功能中的GradScaler。
    ......
    loss_func = nn.CrossEntropyLoss().to(device)    # 定义损失函数
    optimizer = torch.optim.SGD(model.parameters(), lr=0.1)    # 定义优化器
    scaler = amp.GradScaler()    # 在模型、优化器定义之后,定义GradScaler
    epochs = 10
    这一部分我们在训练代码中添加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系数
  3. 配置执行训练脚本所需的环境变量。
    source {CANN包安装目录}/ascend-toolkit/set_env.sh
    export PYTHONPATH={CANN包安装目录}/ascend-toolkit/latest/tools/ms_fmk_transplt/torch_npu_bridge:$PYTHONPATH    #仅在自动迁移时需要配置
  4. 执行命令启动训练脚本(命令脚本名称可根据实际修改)。
    python3 train.py

    训练结束后生成如下图权重文件,则说明迁移训练成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值