人工智能初学教程 - 基于MindSpore

人工智能初学教程 - 基于MindSpore

MindSpore 教案


介绍

目标: 提供对 MindSpore 的全面介绍,包括其架构、特性和安装方法。

目录
  1. 基本介绍
    • 什么是 MindSpore?
    • MindSpore 架构
  2. 自动微分
  3. 自动并行
  4. 安装
    • Pip 模式方法安装
    • 源代码编译安装
    • Docker 镜像
  5. 快速入门
  6. 文档和社区资源
    • 文档
    • 社区
    • 治理
    • 沟通
    • 贡献
    • 维护阶段
    • 维护状态
    • 发行说明
    • 许可证

基本介绍

什么是 MindSpore?

MindSpore 是一个新的开源深度学习训练/推理框架,可用于移动、边缘和云场景。MindSpore 旨在为数据科学家和算法工程师提供友好的设计和高效的执行体验,原生支持昇腾 AI 处理器,并实现软硬件协同优化。同时,MindSpore 作为全球 AI 开源社区,旨在进一步推动 AI 软件/硬件应用生态系统的发展和丰富。

MindSpore 架构

详细信息请参考我们的架构指南.

自动微分

目前,主流深度学习框架中有两种自动微分技术:

  1. 操作符重载 (OO): 重载编程语言的基本操作符以封装其梯度规则。在前向执行期间以操作符重载的方式记录网络的操作轨迹,然后应用链式法则到动态生成的数据流图实现自动微分。
  2. 源代码转换 (ST): 这种技术源于函数式编程框架,并以即时编译 (JIT) 的形式对中间表达式 (编译过程中的程序表达形式) 进行自动微分转换,支持复杂的控制流场景、高阶函数和闭包。

PyTorch 使用了操作符重载技术。与源代码转换相比,操作符重载在运行时生成梯度图,因此无需考虑函数调用和控制流,这使得开发更容易。然而,操作符重载不能在编译时进行梯度图优化,控制流必须在运行时展开,因此难以实现极限性能优化。

MindSpore 基于源代码转换实现了自动微分。一方面,它支持自动控制流的自动微分,因此构建模型非常方便。另一方面,MindSpore 可以对神经网络进行静态编译优化以实现卓越的性能。

自动并行

MindSpore 自动并行的目标是构建一种结合数据并行、模型并行和混合并行的训练方法。它可以自动选择最低成本的模型拆分策略,以实现自动分布式并行训练。

目前,MindSpore 使用精细粒度的操作符拆分策略,即图中的每个操作符被拆分到一个集群中完成并行操作。这个期间的拆分策略可能非常复杂,但作为一个倡导 Pythonic 的开发者,您不需要关心底层实现,只需确保顶层 API 计算效率即可。

安装

Pip 模式方法安装

MindSpore 提供了跨多个后端的构建选项:

硬件平台操作系统状态
Ascend910Ubuntu-x86✔️
Ubuntu-aarch64✔️
EulerOS-aarch64✔️
CentOS-x86✔️
CentOS-aarch64✔️
GPU CUDA 10.1Ubuntu-x86✔️
CPUUbuntu-x86✔️
Ubuntu-aarch64✔️
Windows-x86✔️

以 CPU 和 Ubuntu-x86 构建版本为例,使用 pip 安装:

  1. 从 MindSpore 下载页面下载 whl 文件,并安装该包。

    pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.2.0-rc1/MindSpore/cpu/ubuntu_x86/mindspore-1.2.0rc1-cp37-cp37m-linux_x86_64.whl
    
  2. 运行以下命令验证安装:

    import numpy as np
    import mindspore.context as context
    import mindspore.nn as nn
    from mindspore import Tensor
    from mindspore.ops import operations as Pcontext.set_context(mode=context.GRAPH_MODE, device_target="CPU")class Mul(nn.Cell):def __init__(self):super(Mul, self).__init__()self.mul = P.Mul()def construct(self, x, y):return self.mul(x, y)x = Tensor(np.array([1.0, 2.0, 3.0]).astype(np.float32))
    y = Tensor(np.array([4.0, 5.0, 6.0]).astype(np.float32))mul = Mul()
    print(mul(x, y))
    
  3. 预期输出:

    [ 4. 10. 18.]
    

更多关于不同环境下使用 pip 模式方法安装 MindSpore 的文档,请参考:

  • 使用 pip 模式方法在 Ascend 环境中安装 MindSpore
  • 使用 pip 模式方法在 GPU 环境中安装 MindSpore
  • 使用 pip 模式方法在 CPU 环境中安装 MindSpore
源代码编译安装

在不同环境中使用源代码编译方法安装 MindSpore,请参考以下文档:

  • 使用源代码编译方法在 Ascend 环境中安装 MindSpore
  • 使用源代码编译方法在 GPU 环境中安装 MindSpore
  • 使用源代码编译方法在 CPU 环境中安装 MindSpore
Docker 镜像

MindSpore Docker 镜像托管在 Docker Hub 上,目前支持以下容器化构建选项:

硬件平台Docker 镜像仓库标签描述
CPUmindspore/mindspore-cpux.y.z预安装 MindSpore x.y.z CPU 版本的生产环境。
devel开发环境,提供从源码构建 MindSpore(使用 CPU 后端),请参考 https://www.mindspore.cn/install/zh-cn 了解安装详情。
runtime提供安装 MindSpore 二进制包(使用 CPU 后端)的运行时环境。
GPUmindspore/mindspore-gpux.y.z预安装 MindSpore x.y.z GPU 版本的生产环境。
devel开发环境,提供从源码构建 MindSpore(使用 GPU CUDA10.1 后端),请参考 https://www.mindspore.cn/install/zh-cn 了解安装详情。
runtime提供安装 MindSpore 二进制包(使用 GPU CUDA10.1 后端)的运行时环境。

注意: 对于 GPU 开发镜像,不建议在构建后直接安装 whl 包,我们强烈建议您在 GPU 运行时镜像中传输并安装 whl 包。

CPU:

对于 CPU 后端,可以使用以下命令直接拉取并运行最新的稳定镜像:

docker pull mindspore/mindspore-cpu:1.1.0
docker run -it mindspore/mindspore-cpu:1.1.0 /bin/bash

GPU:

对于 GPU 后端,请确保预先安装了 nvidia-container-toolkit,以下是 Ubuntu 用户的安装指南:

DISTRIBUTION=$(. /etc/os-release; echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$DISTRIBUTION/nvidia-docker.list | tee /etc/apt/sources.list.d/nvidia-docker.listsudo apt-get update && sudo apt-get install -y nvidia-container-toolkit nvidia-docker2
sudo systemctl restart docker

然后编辑文件 daemon.json

vim /etc/docker/daemon.json
{"runtimes": {"nvidia": {"path": "nvidia-container-runtime","runtimeArgs": []}}
}

再次重启 Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

然后可以使用以下命令拉取并运行最新的稳定镜像:

docker pull mindspore/mindspore-gpu:1.1.0
docker run -it -v /dev/shm:/dev/shm --runtime=nvidia --privileged=true mindspore/mindspore-gpu:1.1.0 /bin/bash

要测试 Docker 镜像是否正常工作,请执行以下 Python 代码并检查输出:

import numpy as np
import mindspore.context as context
from mindspore import Tensor
from mindspore.ops import functional as Fcontext.set_context(mode=context.PYNATIVE_MODE, device_target="GPU")x = Tensor(np.ones([1, 3, 3, 4]).astype(np.float32))
y = Tensor(np.ones([1, 3, 3, 4]).astype(np.float32))
print(F.tensor_add(x, y))

输出应为:

[[[ 2.  2.  2.  2.],[ 2.  2.  2.  2.],[ 2.  2.  2.  2.]],[[ 2.  2.  2.  2.],[ 2.  2.  2.  2.],[ 2.  2.  2.  2.]],[[ 2.  2.  2.  2.],[ 2.  2.  2.  2.],[ 2.  2.  2.  2.]]]

如果您想了解更多关于 MindSpore Docker 镜像构建过程的信息,请查看 Docker 仓库 了解详细信息。

快速入门

请参阅快速入门 以实现图像分类。

文档和社区资源

文档

更多关于安装指南、教程和 API 的详细信息,请参阅用户文档。


这个教案涵盖了 MindSpore 的基本介绍、架构、自动微分和自动并行技术、安装方法、快速入门指南以及文档和社区资源。通过这个教案,初学者可以全面了解 MindSpore,并快速上手进行深度学习开发。

基本介绍

人工智能(AI)和深度学习是当前最热门的技术领域之一。MindSpore是华为推出的开源深度学习框架,旨在帮助开发者快速、高效地构建AI模型。本教程将带领初学者从基础知识入门,逐步掌握使用MindSpore进行深度学习的技能。


快速入门MindSpore

1. 数据集处理

MindSpore提供了基于Pipeline的数据引擎,通过Dataset和Transforms实现高效的数据预处理。在本教程中,我们使用MNIST数据集,并通过MindSpore的数据变换来预处理数据集。

下载数据集
from mindspore.dataset import MnistDatasettrain_dataset = MnistDataset('MNIST_Data/train')
test_dataset = MnistDataset('MNIST_Data/test')
数据变换
from mindspore.dataset import vision, transformsdef 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 datasettrain_dataset = datapipe(train_dataset, 64)
test_dataset = datapipe(test_dataset, 64)
迭代数据集
for image, label in test_dataset.create_tuple_iterator():print(f"Image shape: {image.shape}, Label shape: {label.shape}")

2. 构建网络

使用mindspore.nn类作为构建所有网络的基类。在构建网络时,可以继承nn.Cell类并重写__init__和construct方法。

class 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 logitsmodel = Network()

3. 训练模型

loss_fn = nn.CrossEntropyLoss()
optimizer = nn.SGD(model.trainable_params(), 1e-2)def forward_fn(data, label):logits = model(data)loss = loss_fn(logits, label)return loss, logitsgrad_fn = mindspore.value_and_grad(forward_fn, None, optimizer.parameters, has_aux=True)def train_step(data, label):(loss, _), grads = grad_fn(data, label)optimizer(grads)return lossdef 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(), batchprint(f"loss: {loss:>7f}  [{current:>3d}/{size:>3d}]")epochs = 3
for t in range(epochs):print(f"Epoch {t+1}\n-------------------------------")train(model, train_dataset)

4. 保存和加载模型

mindspore.save_checkpoint(model, "model.ckpt")
model = Network()
param_dict = mindspore.load_checkpoint("model.ckpt")
param_not_load, _ = mindspore.load_param_into_net(model, param_dict)

以上是一个简单的MindSpore模型的快速实现教程。

以上教程涵盖了从基础入门到实际应用的多个方面,旨在帮助初学者快速掌握MindSpore的使用,并应用于各种深度学习任务。通过这些实践,你将能够深入理解深度学习的原理和应用,并具备实际项目开发的能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/30004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion 3 Medium 正式开源

Stable Diffusion 3 Medium 正式开源 Stability AI宣布Stable Diffusion 3 Medium现已开源,这是最新的文本生成图像AI模型,被官方声称为“迄今为止最先进的开源模型”,其性能超过了Midjourney 6。 这款Stable Diffusion 3 Medium模型拥有2…

【SpringBoot项目常见细化错误】(保姆级教程)Result Maps collection already contains value for

SpringBoot项目常见错误 1.当Mybatis报错 Result Maps collection already contains value for一、重复点击Mybatis-Generator导致配置文件重复生成XML二、正确配置Yml仔细检查有没有多了或者少了一个空格三、spring boot mybatis四、应该用resultMap来接收返回值,…

邦芒解析:新人入职后存在的三种职场心理误区

​​多数职场新人会认为自己工作不快乐,不能正确处理职场人际关系。尤其是新人入职后在处理人际关系方面更明显,下面简述新人入职后主要存在的三种职场心理误区。 误区一:面对对上司的恐惧 学会和上司沟通,新人要采用上司容易接受…

Blazor的SSR服务端渲染是不是交互式的

从.NET8开始,Blazor引入了SSR服务端渲染,归功于MVC和RazePage的沉淀,虽然来得晚,但一经发布,就将Blazor推向了新的高度。从今年开始,Youtube上关于Blazor的优质教学视频,以肉眼可见的速度在增加…

[保姆级教程]uniapp实现接口请求和请求方法二次封装

文章目录 新建文件配置方法发送请求使用 新建文件 现在src中新建一个api目录 新建index.js和request.js文件 配置方法发送请求 request.js中输入以下内容 const http {baseUrl: http://127.0.0.1:8000,request(config) {config beforeRequest(config)config.url this…

前端工具篇

在线工具 https://tool.lu/ 程序员工具箱 http://tool.pfan.cn/apitest 配色 https://webkul.github.io/coolhue/ 在线字符串和16进制互转 https://kw360.net/ox2str/ 代码美化截图 https://carbon.now.sh/?bgrgba 菜鸟工具 https://www.jyshare.com/ 文件格式转换 htt…

C++智能指针auto_ptr(有缺陷已废弃)

一、auto_ptr不能共享所有权 auto_ptr类没有拷贝构造函数。可以看出将Right对象的资源释放掉了。 在下面的操作中,ptr1的值给ptr2,那么此时ptr1的值将会为nullptr。在构造和赋值都发生了所有权的转移。调用函数的时候,接收参数的时候同样也会…

Rapidfuzz,一个高效的 Python 模糊匹配神器

目录 01初识 Rapidfuzz 什么是 Rapidfuzz? 为什么选择 Rapidfuzz? 安装 Rapidfuzz 配置 Rapidfuzz 02基本操作 简单比率计算 03高级功能 查找单个最佳匹配 查找多个最佳匹配 使用阈值优化性能 04实战案例…

IPython大师课:提升数据科学工作效率的终极工具

IPython是一个增强的Python交互式shell,它提供了丰富的功能和易用性改进,特别适合进行数据分析、科学计算和一般的Python开发。本文将全面介绍IPython的基本概念、使用方法、主要作用以及注意事项。 一、IPython简介 1. IPython的起源 IPython最初由Fe…

【Android】使用Binder(AIDL)实现利用自定义Bean进行的进程间通信(二)

项目前置 这是我之前写的关于Binder的一些知识点和使用基本数据类型在通信的文章,感兴趣的可以看一下: Binder(一)Binder的介绍和AIDL使用Binder的实例 项目目标 在两个APP之间进行数据传递,使用Android推荐的Binder通讯&#…

PKCS和X.509标准的区别是什么?

PKCS(Pulic Key Cryptography Standards)和X.509标准都是与公钥加密和数字证书相关的标准,但它们的主要职责和关注点略有不同: 1. PKCS(Public Key Cryptography Standards) PKCS是一系列标准,由RSA Security开发&am…

使用Flink接受kafka中的数据并对数据进行ETL

做这个开发是因为:在实际开发操作中,你的kafka主题中会有大量的数据但是需求并不需要所有数据,所有我们要对数据进行清洗,把需要的数据保存在flink流中,为下流的开发做好数据保障! 首先创建工具类 再写一…

Golang | Leetcode Golang题解之第151题反转字符串中的单词

题目&#xff1a; 题解&#xff1a; import ("fmt" )func reverseWords(s string) string {//1.使用双指针删除冗余的空格slowIndex, fastIndex : 0, 0b : []byte(s)//删除头部冗余空格for len(b) > 0 && fastIndex < len(b) && b[fastIndex]…

NLP之实体抽取

简介 实体抽取(Entity Extraction)是自然语言处理(NLP)领域中一项重要的技术,它的目的是从非结构化的文本数据中识别并提取出有意义的实体。 实体是指文本中表示某种具体事物的词语或短语,通常包括以下几类: 人名&#xff1a;如"马云"、“比尔盖茨” 地名&#xf…

封装组件防抖

common.js 建立throttle.js文件 import Vue from vue //按钮节流 const preventReClick Vue.directive(preventReClick, {inserted: function (el, binding) {el.addEventListener(click, () > {if (!el.disabled) {el.disabled truesetTimeout(() > {el.disabled fa…

视频与音频的交响:探索达摩院VideoLLaMA 2的技术创新

一、简介 文章&#xff1a;https://arxiv.org/abs/2406.07476 代码&#xff1a;https://github.com/DAMO-NLP-SG/VideoLLaMA2 VideoLLaMA 2是由阿里巴巴集团的DAMO Academy团队开发的视频大型语言模型&#xff08;Video-LLM&#xff09;&#xff0c;旨在通过增强空间-时间建模…

高考分数线一分一段统计汇总(熟练SQL窗口函数)

高考分数线一分一段统计汇总(使用SQL窗口函数) select 总分数&#xff0c; 一分一段人数&#xff0c; sum(一分一段人数) over( order by 总分数 desc) as 累计排名 from( select 总分数&#xff0c; count(考生号) as 一分一段人数 from &#xff08; select 考生号&…

Java数组的声明和使用方法是什么?

在Java中&#xff0c;数组是一种用于存储相同类型数据的常用数据结构。声明和使用Java数组的方法如下&#xff1a; 数组的声明 声明数组的基本语法是&#xff1a; dataType[] arrayName; 例如&#xff0c;声明一个整型数组可以写为&#xff1a; int[] numbers; 这种方式推…

大咖专栏 | AI 时代下,我们可以拥有怎样的数据库?

Hi&#xff0c;各位朋友们&#xff0c;我是 KaiwuDB 高级架构师赵衎衎。 KaiwuDB 始于万物互联时代下千万条数据洪流中&#xff0c;我们持续打磨构造了更加灵活兼容的分布式多模架构&#xff0c;实现了海量异构数据高性能、低成本的集中管理… …这些底层特性都在为后续提供更…

多线程与高并发- Synchronized锁

简介 synchronized 是 Java 语言的一个关键字&#xff0c;它允许多个线程同时访问共享的资源&#xff0c;以避免多线程编程中的竞争条件和死锁问题。synchronized可以用来给对象或者方法进行加锁&#xff0c;当对某个对象或者代码块加锁时&#xff0c;同时就只能有一个线程去执…