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

本文介绍了华为昇腾系列AI处理器,特别是Ascend910和310芯片,以及它们如何替代NvidiaGPU在AI开发中的角色。文章详细展示了如何将基于GPU的PyTorch代码迁移到昇腾NPU上进行训练,并提供了配置和运行指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

昇腾(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运行代码如下:

# 引入模块
import time
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
import torchvision

# 初始化运行device
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 epoch in range(epochs):
    for imgs, labels in train_dataloader:
        start_time = time.time()    # 记录训练开始时间
        imgs = imgs.to(device)    # 把img数据放到指定NPU上
        labels = labels.to(device)    # 把label数据放到指定NPU上
        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')

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

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

# 引入模块
import time
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
import torchvision

import torch_npu
from torch_npu.npu import amp # 导入AMP模块
from torch_npu.contrib import transfer_to_npu    # 使能自动迁移

# 初始化运行device
# 亲测,用'cuda:0'也可以
device = torch.device('npu: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, 4000), 
            # 激活函数
            nn.ReLU(),
            nn.Linear(4000, 10000), 
            nn.ReLU(),
            nn.Linear(10000, 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   
batch_size = 128
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 = 20  # 设置循环次数

# 设置循环
for epoch in range(epochs):
    for imgs, labels in train_dataloader:
        start_time = time.time()    # 记录训练开始时间
        imgs = imgs.to(device)    # 把img数据放到指定NPU上
        labels = labels.to(device)    # 把label数据放到指定NPU上
        
        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系数
        

# 定义保存模型
torch.save({
               'epoch': 10,
               'arch': CNN,
               'state_dict': model.state_dict(),
               'optimizer' : optimizer.state_dict(),
            },'checkpoint.pth.tar')

运用代码前,不要忘了先配置CANN的环境变量:

. /usr/local/Ascend/ascend-toolkit/set_env.sh

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

watch -n 1 npu-smi info

### 部署 DeepSeek 至华为升腾 910B #### 准备环境 为了确保 DeepSeek 能够顺利运行于华为升腾 910B 平台上,需先安装必要的依赖库并配置好开发环境。这通常涉及到 CANN (Compute Architecture for Neural Networks) 的设置以及 Python 开发包的准备[^1]。 #### 安装 CANN 及其组件 CANN 是专门为 Atlas 系列产品设计的一套完整的软件栈,它提供了从底层驱动到高层框架的支持。对于想要利用 Ascend NPU 进行推理或训练的应用程序来说,安装最新版本的 CANN 是必不可少的第一步。通过官方文档可以获取详细的安装指南和兼容性列表。 #### 获取预编译模型或转换现有模型 如果计划直接使用已经过优化处理过的预训练模型,则可以直接下载对应格式文件;而对于自定义创建的新模型,则可能需要借助工具链完成由 TensorFlow 或 PyTorch 到 MindSpore IR 表达形式之间的迁移工作。MindConverter 工具能够帮助简化这一过程。 #### 编写应用程序接口调用代码 一旦完成了上述准备工作之后,就可以着手编写具体的业务逻辑部分了。下面给出了一段简单的 Python 示例代码用于加载已有的 .om 文件并通过 AIPP 接口执行前向传播操作: ```python from mindspore import context, Tensor import numpy as np context.set_context(device_target="Ascend", device_id=0) def load_model_and_predict(input_data_path): graph = Graph() with open('model.om', 'rb') as f: model_content = f.read() session = Session(graph) input_tensor = Tensor(np.fromfile(input_data_path, dtype=np.float32).reshape((1, 3, 224, 224))) output_tensors = session.run([input_tensor]) return output_tensors[0].asnumpy().tolist() ``` 此段脚本展示了如何初始化上下文环境、读取 OM 模型数据流、构建会话对象并向其中传入输入张量以获得预测结果的过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值