写点什么

华为开发者空间 - MindSpore 魔法课堂:手把手教你玩转 AI 框架

  • 2025-05-30
    贵州
  • 本文字数:4051 字

    阅读完需:约 13 分钟

华为开发者空间 - MindSpore魔法课堂:手把手教你玩转AI框架

本文摘自华为开发者空间案例中心案例《MindSpore魔法课堂:手把手教你玩转AI框架》

一、概述

1. 案例介绍

华为开发者空间 Notebook,为开发者提供免费昇腾 NPU 算力资源,帮助开发者更好使用昇腾 NPU 进行 AI 应用的开发。


通过实际操作,让大家深入了解如何利用华为开发者空间 Notebook 及 MIndSpore 框架进行 AI 应用开发,加深开发者对 MIndSpore 框架的理解及应用。

2. 适用对象

  • 个人开发者

  • 高校学生

3. 案例时间

本案例总时长预计 40 分钟。

4. 案例流程


说明:


  1. 用户进入华为开发者空间;

  2. 打开 Notebook 进行环境配置;

  3. 打开 Notebook 进行代码实操。

二、环境配置

1. Notebook 配置

本案例中,使用华为开发者空间-Notebook进行代码编写、功能实现,华为开发者空间 Notebook 是一款面向开发者的一站式云端开发工具,主要用于 AI 开发、数据分析、模型训练等场景。


开发者直接进入到华为开发者空间工作台


进入到开发者空间工作台后,找打 AI Notebook,点击立即前往



进入到 AI Notebook 页面后,选择 NPU 环境点击立即启动



稍等片刻后点击查看 Notebook,前往 Notebook 主页面。



至此,成功打开 Notebook。

2. 运行环境配置

打开 Notebook 后,点击笔记下的 python 3,创建代码编写文件。



将以下命令复制到 Notebook 中,点击上方三角运行符号进行 MindSpore 框架的下载。


MindSpore 框架是面向“端-边-云”全场景设计的 AI 框架,旨在弥合 AI 算法研究与生产部署之间的鸿沟。在算法研究阶段,为开发者提供动静统一的编程体验以提升算法的开发效率;在生产阶段,自动并行可以极大加快分布式训练的开发和调试效率,同时充分挖掘异构硬件的算力;再部署阶段,基于“端-边=云”统一架构,应对企业级部署和安全可信方面的挑战。


pip install mindspore



下载完毕后,将以下命令复制到命令行中,进行 download 包的下载。


pip install download
复制代码


download:通过客户端(如浏览器、APP)向服务器发送请求,服务器将数据拆分为数据包,经网络传输到本地设备后重新组合完整文件。



注意,安装包安装完毕后需要手动重启内核来更新环境,点击内核>重启内核


三、代码编写

1. 网络构建

首先导入必要的工具包,将以下代码复制到命令行中,并点击上方三角符号运行。


(注:导入必要工具包后需要重启内核)


import mindspore
from mindspore import nn
from mindspore.dataset import vision, transforms
from mindspore.dataset import MnistDataset
复制代码



MindSpore 提供基于 Pipeline 的数据引擎,通过数据集(Dataset)实现高效的数据预处理,本次实操,我们使用 Mnist 数据集,自动下载完毕后,使用 mindspore.dataset 提供的数据变换进行预处理。


将以下代码复制到命令行中,并点击上方三角符号运行,进行数据集的下载。


\# Download data from open datasetsfrom download import downloadurl = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/" \\"notebook/datasets/MNIST_Data.zip"path = download(url, "./", kind="zip", replace=True)
复制代码



下载完毕后左侧会出现 MNIST_Data 文件夹。



数据集下载完毕后,将以下代码复制到命令行中,并点击上方三角运行符号运行,获取数据集对象。


train_dataset = MnistDataset('MNIST_Data/train')
test_dataset = MnistDataset('MNIST_Data/test')
复制代码



将以下代码复制到命令行中,并点击上方三角运行符运行,打印数据集中包含的列表名,用于 dataset 的预处理。


print(train_dataset.get_col_names())
复制代码



MindSpore 的 dataset 使用数据处理流水线,需指定 map、batch、shuffle 等操作。这里使用 map 对图像数据及标签进行变换处理,将输入的图像缩放为 1/255,根据均值 0.1307 和标准差 0.3081 进行归一化处理,然后将处理好的数据集打包为大小为 64 的 batch。


将以下代码复制到命令行中,并点击上方三角符号进行运行。


def datapipe(dataset, batch_size):    image_transforms = [        vision.Rescale(1.0 / 255.0, 0),        vision.Normalize(mean=(0.1307,), std=(0.3081,)),        vision.HWC2CHW()    ]    label_transform = transforms.TypeCast(mindspore.int32)
dataset = dataset.map(image_transforms, 'image') dataset = dataset.map(label_transform, 'label') dataset = dataset.batch(batch_size) return dataset
# Map vision transforms and batch datasettrain_dataset = datapipe(train_dataset, 64)test_dataset = datapipe(test_dataset, 64)
复制代码



将以下代码复制到命令行中,并点击上方三角符号运行,查看数据和标签的 shape 和 dataype。


for image, label in test_dataset.create_tuple_iterator():    print(f"Shape of image [N, C, H, W]: {image.shape} {image.dtype}")    print(f"Shape of label: {label.shape} {label.dtype}")    break
复制代码


for data in test_dataset.create_dict_iterator():    print(f"Shape of image [N, C, H, W]: {data['image'].shape} {data['image'].dtype}")    print(f"Shape of label: {data['label'].shape} {data['label'].dtype}")    break
复制代码



将以下代码复制到命令行中,进行网络构建。


# Define modelclass Network(nn.Cell):    def __init__(self):        super().__init__()        self.flatten = nn.Flatten()        self.dense_relu_sequential = nn.SequentialCell(            nn.Dense(28*28, 512),            nn.ReLU(),            nn.Dense(512, 512),            nn.ReLU(),            nn.Dense(512, 10)        )
def construct(self, x): x = self.flatten(x) logits = self.dense_relu_sequential(x) return logits
model = Network()print(model)

复制代码


2. 模型训练

在模型训练中,一个完整的训练过程需要实现以下三步:


1. 正向计算:模型预测结果,并与正确标签求预测损失;


2. 反向传播:利用自动微分机制,自动求模型参数对于 loss 的梯度;


3. 参数优化:将梯度更新到参数上。


MindSpore 使用函数式自动微分机制,因此针对上述步骤需要实现:


1. 定义正向计算函数;


2. 使用 value_and_grad 通过函数变换获得梯度计算函数;


3. 定义训练函数,使用 set_train 设置为训练模式,执行正向计算、反向计算和参数优化。


将以下代码复制到命令行中,并点击上方三角符号运行。


# Instantiate loss function and optimizerloss_fn = nn.CrossEntropyLoss()optimizer = nn.SGD(model.trainable_params(), 1e-2)
# 1. Define forward functiondef forward_fn(data, label): logits = model(data) loss = loss_fn(logits, label) return loss, logits
# 2. Get gradient functiongrad_fn = mindspore.value_and_grad(forward_fn, None, optimizer.parameters, has_aux=True)
# 3. Define function of one-step trainingdef train_step(data, label): (loss, _), grads = grad_fn(data, label) optimizer(grads) return loss
def train(model, dataset): size = dataset.get_dataset_size() model.set_train() for batch, (data, label) in enumerate(dataset.create_tuple_iterator()): loss = train_step(data, label)
if batch % 100 == 0: loss, current = loss.asnumpy(), batch print(f"loss: {loss:>7f} [{current:>3d}/{size:>3d}]")
复制代码



将以下代码复制到命令行中,并点击上方三角符号运行,进行测试函数定义,用于评估模型性能。


def test(model, dataset, loss_fn):    num_batches = dataset.get_dataset_size()    model.set_train(False)    total, test_loss, correct = 0, 0, 0    for data, label in dataset.create_tuple_iterator():        pred = model(data)        total += len(data)        test_loss += loss_fn(pred, label).asnumpy()        correct += (pred.argmax(1) == label).asnumpy().sum()    test_loss /= num_batches    correct /= total    print(f"Test: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")
复制代码



训练过程需要多次迭代数据集,一次完整的迭代成为一轮(epoch)。在每一轮遍历训练集进行训练,结束后使用测试集进行预测。


将以下代码复制到命令行中,并点击上方三角符号进行运行。


epochs = 3for t in range(epochs):    print(f"Epoch {t+1}\n-------------------------------")    train(model, train_dataset)    test(model, test_dataset, loss_fn)print("Done!")
复制代码



模型训练完成后需要将其参数进行保存,将以下代码复制到命令行中进行模型保存,模型保存成功后,在左侧文件夹目录下会出现 model.ckpt 文件,代表模型保存成功。


# Save checkpointmindspore.save_checkpoint(model, "model.ckpt")print("Saved Model to model.ckpt")
复制代码



加载保存的模型权重分为两步:


1.重新实例化模型对象,构造模型;


2.加载模型参数,并将其加载至模型上。


将以下代码复制到命令行中,并点击上方三角符号运行。


# Instantiate a random initialized modelmodel = Network()# Load checkpoint and load parameter to modelparam_dict = mindspore.load_checkpoint("model.ckpt")param_not_load, _ = mindspore.load_param_into_net(model, param_dict)print(param_not_load)
复制代码


说明:param_not_load 是未被加载的参数列表,为空时代表所有参数均加载成功。



加载完毕后的模型可以直接用于预测推理,将以下代码复制到命令行中,并点击上方三角符号进行运行。


model.set_train(False)for data, label in test_dataset:    pred = model(data)    predicted = pred.argmax(1)    print(f'Predicted: "{predicted[:10]}", Actual: "{label[:10]}"')    break
复制代码



运行完毕后可以直接看到输出真实预测标签和真实标签,表示模型成功进行了预测推理。


至此,MindSpore 魔法课堂:手把手教你玩转 AI 框架案例结束。


更多开发者空间技术干货与活动请关注:开发者空间官网 开发者空间案例中心 开发者空间活动专题


用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
华为开发者空间 - MindSpore魔法课堂:手把手教你玩转AI框架_Jupyter Notebook_华为云开发者联盟_InfoQ写作社区