当前位置:   article > 正文

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

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

概述

昇腾(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

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/196912
推荐阅读
相关标签
  

闽ICP备14008679号