• 华为昇腾系列——入门学习


    概述

    昇腾(Ascend)是华为推出的人工智能处理器品牌,其系列产品包括昇腾910和昇腾310芯片等。

    生态情况

    众所周知,华为昇腾存在的意义就是替代英伟达的GPU。从事AI开发的小伙伴,应该明白这个替代,不仅仅是 Ascend-910加速卡的算力 达到了Nvidia-A100的算力,而是需要整个AI开发生态的替代。下面简单列一下,昇腾生态与英伟达生态的一些对标项。

    AscendNvidia
    加速卡Ascend-910、Ascend-310Nvidia-A100、Nvidia-H100...
    服务器Atlas 800 训练服务器NVIDIA DGX
    计算架构CANNCUDA cuDNN NVCC
    集合通信库HCCLNCCL

    入门使用

    假设原有基于GPU运行代码如下:

    1. # 引入模块
    2. import time
    3. import torch
    4. import torch.nn as nn
    5. from torch.utils.data import Dataset, DataLoader
    6. import torchvision
    7. # 初始化运行device
    8. device = torch.device('cuda:0')
    9. # 定义模型网络
    10. class CNN(nn.Module):
    11. def __init__(self):
    12. super(CNN, self).__init__()
    13. self.net = nn.Sequential(
    14. # 卷积层
    15. nn.Conv2d(in_channels=1, out_channels=16,
    16. kernel_size=(3, 3),
    17. stride=(1, 1),
    18. padding=1),
    19. # 池化层
    20. nn.MaxPool2d(kernel_size=2),
    21. # 卷积层
    22. nn.Conv2d(16, 32, 3, 1, 1),
    23. # 池化层
    24. nn.MaxPool2d(2),
    25. # 将多维输入一维化
    26. nn.Flatten(),
    27. nn.Linear(32*7*7, 16),
    28. # 激活函数
    29. nn.ReLU(),
    30. nn.Linear(16, 10)
    31. )
    32. def forward(self, x):
    33. return self.net(x)
    34. # 下载数据集
    35. train_data = torchvision.datasets.MNIST(
    36. root='mnist',
    37. download=True,
    38. train=True,
    39. transform=torchvision.transforms.ToTensor()
    40. )
    41. # 定义训练相关参数
    42. batch_size = 64
    43. model = CNN().to(device) # 定义模型
    44. train_dataloader = DataLoader(train_data, batch_size=batch_size) # 定义DataLoader
    45. loss_func = nn.CrossEntropyLoss().to(device) # 定义损失函数
    46. optimizer = torch.optim.SGD(model.parameters(), lr=0.1) # 定义优化器
    47. epochs = 10 # 设置循环次数
    48. # 设置循环
    49. for epoch in range(epochs):
    50. for imgs, labels in train_dataloader:
    51. start_time = time.time() # 记录训练开始时间
    52. imgs = imgs.to(device) # 把img数据放到指定NPU上
    53. labels = labels.to(device) # 把label数据放到指定NPU上
    54. outputs = model(imgs) # 前向计算
    55. loss = loss_func(outputs, labels) # 损失函数计算
    56. optimizer.zero_grad()
    57. loss.backward() # 损失函数反向计算
    58. optimizer.step() # 更新优化器
    59. # 定义保存模型
    60. torch.save({
    61. 'epoch': 10,
    62. 'arch': CNN,
    63. 'state_dict': model.state_dict(),
    64. 'optimizer' : optimizer.state_dict(),
    65. },'checkpoint.pth.tar')

    参考华为官方文档快速体验-PyTorch 网络模型迁移和训练-模型开发(PyTorch)-...-文档首页-昇腾社区 (hiascend.com)

    改造后,可以得到以下 用于在昇腾NPU上运行的训练代码(故意加多了全连接层的参数,以便看NPU使用情况):

    1. # 引入模块
    2. import time
    3. import torch
    4. import torch.nn as nn
    5. from torch.utils.data import Dataset, DataLoader
    6. import torchvision
    7. import torch_npu
    8. from torch_npu.npu import amp # 导入AMP模块
    9. from torch_npu.contrib import transfer_to_npu # 使能自动迁移
    10. # 初始化运行device
    11. device = torch.device('npu:0')
    12. # 定义模型网络
    13. class CNN(nn.Module):
    14. def __init__(self):
    15. super(CNN, self).__init__()
    16. self.net = nn.Sequential(
    17. # 卷积层
    18. nn.Conv2d(in_channels=1, out_channels=16,
    19. kernel_size=(3, 3),
    20. stride=(1, 1),
    21. padding=1),
    22. # 池化层
    23. nn.MaxPool2d(kernel_size=2),
    24. # 卷积层
    25. nn.Conv2d(16, 32, 3, 1, 1),
    26. # 池化层
    27. nn.MaxPool2d(2),
    28. # 将多维输入一维化
    29. nn.Flatten(),
    30. nn.Linear(32*7*7, 4000),
    31. # 激活函数
    32. nn.ReLU(),
    33. nn.Linear(4000, 10000),
    34. nn.ReLU(),
    35. nn.Linear(10000, 10)
    36. )
    37. def forward(self, x):
    38. return self.net(x)
    39. # 下载数据集
    40. train_data = torchvision.datasets.MNIST(
    41. root='mnist',
    42. download=True,
    43. train=True,
    44. transform=torchvision.transforms.ToTensor()
    45. )
    46. # 定义训练相关参数
    47. # batch_size = 64
    48. batch_size = 128
    49. model = CNN().to(device) # 定义模型
    50. train_dataloader = DataLoader(train_data, batch_size=batch_size) # 定义DataLoader
    51. loss_func = nn.CrossEntropyLoss().to(device) # 定义损失函数
    52. optimizer = torch.optim.SGD(model.parameters(), lr=0.1) # 定义优化器
    53. scaler = amp.GradScaler() # 在模型、优化器定义之后,定义GradScaler
    54. epochs = 20 # 设置循环次数
    55. # 设置循环
    56. for epoch in range(epochs):
    57. for imgs, labels in train_dataloader:
    58. start_time = time.time() # 记录训练开始时间
    59. imgs = imgs.to(device) # 把img数据放到指定NPU上
    60. labels = labels.to(device) # 把label数据放到指定NPU上
    61. with amp.autocast():
    62. outputs = model(imgs) # 前向计算
    63. loss = loss_func(outputs, labels) # 损失函数计算
    64. optimizer.zero_grad()
    65. # 进行反向传播前后的loss缩放、参数更新
    66. scaler.scale(loss).backward() # loss缩放并反向转播
    67. scaler.step(optimizer) # 更新参数(自动unscaling)
    68. scaler.update() # 基于动态Loss Scale更新loss_scaling系数
    69. # 定义保存模型
    70. torch.save({
    71. 'epoch': 10,
    72. 'arch': CNN,
    73. 'state_dict': model.state_dict(),
    74. 'optimizer' : optimizer.state_dict(),
    75. },'checkpoint.pth.tar')

     使用 "python train.py" 运行代码后,我们可以通过以下命令查看昇腾NPU的使用情况:

    watch -n 1 npu-smi info

  • 相关阅读:
    四十四、模板层
    【编译原理】编译器前端
    一文1700字使用Postman搞定各种接口token实战(建议收藏)
    ray-分布式计算框架-集群与异步Job管理
    L2 cache 表现行为理解
    wenet--学习笔记(1)
    创意电子学小知识:串联和并联
    计算机毕业设计之汽车销售管理系统
    Oracle SQL执行计划操作(5)——分区相关操作
    基于CNTK实现迁移学习-图像分类【附部分源码】
  • 原文地址:https://blog.csdn.net/chenxy02/article/details/136486972